|
|
@@ -72,26 +72,26 @@
|
|
|
`( -> @фикс x)`
|
|
|
|
|
|
```prolet
|
|
|
-(асм.Сохр x сп)
|
|
|
+(вм.Сохр x сп)
|
|
|
(// Поместить значение в стек)
|
|
|
|
|
|
(если (Сравнить c == e)
|
|
|
тогда (...))
|
|
|
-(асм.ИдтиЕслиНе рег0)
|
|
|
+(вм.ИдтиЕслиНе рег0)
|
|
|
|
|
|
(// Порядок инструкций — порядок времени)
|
|
|
(n -> @фикс v)
|
|
|
-(асм.Сохр рег0 v)
|
|
|
+(вм.Сохр рег0 v)
|
|
|
|
|
|
(// Организация стекового кадра)
|
|
|
(f a)
|
|
|
-(асм.Сохр а сп)
|
|
|
-(асм.Вызов f)
|
|
|
-(асм.Загр рег0)(// Извлечение результат)
|
|
|
+(вм.Сохр а сп)
|
|
|
+(вм.Вызов f)
|
|
|
+(вм.Загр рег0)(// Извлечение результат)
|
|
|
|
|
|
(// Передача управления)
|
|
|
-(асм.Авария m)
|
|
|
-(асм.ВызовВектор m) (// Маскируемое прерывание)
|
|
|
+(вм.Авария m)
|
|
|
+(вм.ВызовВектор m) (// Маскируемое прерывание)
|
|
|
```
|
|
|
|
|
|
**IL** — не потеря смысла, а его трансляция в форму, пригодную для машинной практики.
|
|
|
@@ -146,15 +146,15 @@
|
|
|
- Контроль потока — через метки и переходы, как в `(если ...)`
|
|
|
|
|
|
```prolet
|
|
|
-(асм.Сохр [х] сп) (// На стэк отправить ссылку на х)
|
|
|
-(асм.Сохр рег0 сп) (// На стэк значение регистра)
|
|
|
-(асм.Сохр у сп)(// На стэк содержимое значения)
|
|
|
-(асм.Загр сп рег0)(// Со стека -- значение у)
|
|
|
-(асм.Дек сп)(// Вытолкнуть с стека)
|
|
|
-(асм.Загр сп рег1)(// Со стека -- значение х)
|
|
|
-(асм.Дек сп)
|
|
|
-(асм.Слож рег1 рег0)(// Сложить рег1 и рег0 с результатом в рег0)
|
|
|
-(асм.Возврат) (// Возврат из функции)
|
|
|
+(вм.Сохр [х] сп) (// На стэк отправить ссылку на х)
|
|
|
+(вм.Сохр рег0 сп) (// На стэк значение регистра)
|
|
|
+(вм.Сохр у сп)(// На стэк содержимое значения)
|
|
|
+(вм.Загр сп рег0)(// Со стека -- значение у)
|
|
|
+(вм.Дек сп)(// Вытолкнуть с стека)
|
|
|
+(вм.Загр сп рег1)(// Со стека -- значение х)
|
|
|
+(вм.Дек сп)
|
|
|
+(вм.Слож рег1 рег0)(// Сложить рег1 и рег0 с результатом в рег0)
|
|
|
+(вм.Возврат) (// Возврат из функции)
|
|
|
```
|
|
|
|
|
|
Это — не ассемблер, это — чертёж диалектического процесса, выраженный иными средствами.
|
|
|
@@ -181,20 +181,20 @@
|
|
|
компилируется в **IL**:
|
|
|
|
|
|
```prolet
|
|
|
-(асм.Загр сп [x])(// Загрузить значение с вершины стэка, по ссылке в х)
|
|
|
-(асм.Дек сп)
|
|
|
-(асм.Сохр 0 сп)
|
|
|
-(асм.Срав сп 0) (// РЕзультат сравнения в рег0)
|
|
|
-(асм.ЕслиЛожь МеткаЕслиНет)
|
|
|
-(асм.Вызов МеткаЕслиДа)
|
|
|
-
|
|
|
-(асм.Метка МеткаЕслиНет)
|
|
|
-(асм.Вызов ПечатьЕслиНет)
|
|
|
-(асм.Возврат)
|
|
|
-
|
|
|
-(асм.Метка МеткаЕслиДа)
|
|
|
-(асм.Вызов ПечатьЕслиДа)
|
|
|
-(асм.Возврат)
|
|
|
+(вм.Загр сп [x])(// Загрузить значение с вершины стэка, по ссылке в х)
|
|
|
+(вм.Дек сп)
|
|
|
+(вм.Сохр 0 сп)
|
|
|
+(вм.Срав сп 0) (// РЕзультат сравнения в рег0)
|
|
|
+(вм.ЕслиЛожь МеткаЕслиНет)
|
|
|
+(вм.Вызов МеткаЕслиДа)
|
|
|
+
|
|
|
+(вм.Метка МеткаЕслиНет)
|
|
|
+(вм.Вызов ПечатьЕслиНет)
|
|
|
+(вм.Возврат)
|
|
|
+
|
|
|
+(вм.Метка МеткаЕслиДа)
|
|
|
+(вм.Вызов ПечатьЕслиДа)
|
|
|
+(вм.Возврат)
|
|
|
```
|
|
|
|
|
|
→ **ВМ** интерпретирует или **JIT**-компилирует в машинный код.
|