Генерация кода: заметки дилетанта

Персональный блог одноименного форумчанина. Человека и парохода, не побоюсь этого сравнения :)

Модератор: tyomitch

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Генерация кода: заметки дилетанта

Сообщение tyomitch » 26.05.2006 (Пт) 20:49

* Нет ничего сложного в том, чтобы сгенерировать работоспособный машинный код.

Программа, как легко понять, состоит из выражений (включающих вызовы функций) и операторов (ветвления, циклы и т.п.) Операторы переводятся в машинный код без проблем. Определённая сложность возникает с выражениями.

Рассмотрим выражение A+(B-C)+D*E
Оно безо всяких проблем, и безо всякого искусственного интеллекта, переводится, скажем, в MSIL:

Код: Выделить всё
A  ld A
B  ld B
C  ld C
-  sub
+  add
D  ld D
E  ld E
*  mul
+  add

Слева -- обратная польская запись, справа -- некое подобие MSIL, инструкция ld -- это либо ldloc, либо ldc, в зависимости от сущности аргумента. Видно соответствие ОПЗ и MSIL один к одному.


* Можно даже перевести эту программу с MSIL на ассемблер x86:
Код: Выделить всё
A  push A
B  push B
C  push C
-  pop reg
-  sub [sp], reg
+  pop reg
+  add [sp], reg
D  push D
E  push E
*  pop ax
*  mul [sp]
*  mov [sp], ax
+  pop reg
+  add [sp], reg

Здесь уже одному члену ОПЗ может соответствовать несколько машинных команд. (reg -- любой из регистров x86.) Наконец, можно применить чуть-чуть искусственного интеллекта, и заменить пары push/pop инструкциями mov:
Код: Выделить всё
A  push A
B  push B
C- mov reg, C
-  sub [sp], reg
+  pop reg
+  add [sp], reg
D  push D
E* mov ax, E
*  mul [sp]
*  mov [sp], ax
+  pop reg
+  add [sp], reg


* Этот код, вполне вероятно, даже будет работать -- почему бы и нет? Но он отвратителен. Единственное его достоинство -- что для его генерации не потребовалось ничего сложнее последовательных текстовых замен в обратной польской записи выражения.

В следующей заметке я рассчитываю предложить придуманные мной методы дальнейшей высокоинтеллектуальной обработки кода, при которой должно получиться что-нибудь более приятное глазу.
Последний раз редактировалось tyomitch 27.05.2006 (Сб) 6:41, всего редактировалось 1 раз.
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 26.05.2006 (Пт) 23:56

Тёмыч, в любой книжке про построение компиляторов уже понаписано столько методов... Посмотри, может кто-нибудь тебя обскакал :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.05.2006 (Сб) 0:01

Дык, а куда именно смотреть?
Пытался смотреть в Ахо-Сети-Ульмана, но отразился... Буков много, и все непонятные :oops:
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 27.05.2006 (Сб) 12:10

Ну да, есть там такое дело... Можно посмотреть Вирта (если не ошибаюсь у него есть книжка или большая глава в Алгоритмах, не помню сейчас точно). Плюс, на SourceForge можно посмотреть наброски в коде, так, иногда, гораздо понятнее.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Tyomitch

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron