LINUX.ORG.RU

История изменений

Исправление 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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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
Ну а goto и так понятно, в
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:
  ;