История изменений
Исправление MOPKOBKA, (текущая версия) :
Но я так понимаю, такое поведение как раз ближе к Forth, чем (к) Python.
Нет, в Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
#2 goto
, на деле это будет в ассемблере x86 jmp #2
, то есть ровно одна инструкция. Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth в одну строчку.
Исправление MOPKOBKA, :
Но я так понимаю, такое поведение как раз ближе к Forth, чем (к) Python.
Нет, в Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
#2 goto
, на деле это будет в ассемблере x86 jmp #2
, то есть ровно одна инструкция. Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth элементарно.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
#2 goto
, на деле это будет в ассемблере x86 jmp #2
, то есть ровно одна инструкция. Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth элементарно.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
#2 goto
, на деле это будет jmp #2
, то есть ровно одна инструкция. Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth элементарно.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth элементарно.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Кстати, что goto, что goto-if-true определяются через сам Forth элементарно.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz #addr
jmp #addr
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию (смотря как определяется false)
jnz/jz #addr
jmp #addr
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Сам goto-if-true преобразуется в ассемблерную инструкцию
jnz/jz #addr
jmp #addr
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Все другие конструкции условий или циклов тоже можно через goto определить и сделать immediate словами.
Исправление MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
#2 goto
#1:
." false"
#2:
;
Исходная версия MOPKOBKA, :
В Forth есть метки, goto, и слово goto-if-true, которое срабатывает только если значение true. А if-else-then помечены как immediate слова, и компилируются в этот набор goto. Никаких переменных и проверки else в рантайме.
Было:
: example
if
." true"
else
." false"
then ;
После компиляции стало
: example
not #1 goto-if-true
." true"
goto #2
#1:
." false"
#2:
;