Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Философия программирования > Принцип компилятора


Автор: Cashey 1.9.2005, 19:50
Заинтерисовал меня вопрос: а что есть компилятор? Ну в смысле как его использовать и что получается в результате его работы это всем известно. А вот как он из символов языков высокоуровнего программирования переводит все в понятные машине коды мне не понятно.
Как я понимаю сам по себе принцип работы компилятора не зависит от конкретного языка программирования. Однако, почиму-то некоторые языки его не имеют, но используют так называемый интерпритатор, а по сути используют, по средствам механизмов обмена windows, откомпилированные библиотеки поддержки в режиме real-time. С чем это может быть связано? Или не на каждый язык программирования можно разработать компилятор?

Автор: Mayk 1.9.2005, 21:20
Цитата(Cashey @ 1.9.2005, 23:50)
а что есть компилятор?

Транслятор с какого-либо языка на ассемблер.

Цитата(Cashey @ 1.9.2005, 23:50)
А вот как он из символов языков высокоуровнего программирования переводит все в понятные машине коды мне не понятно.

Этого не расскажешь в двух словах. За подробностями беги в книжный. Если в общем - используется построение всяких бинарных деревьев и таблиц(вопрос сродни "как построить машину?"). Лучше скажи, что тебе конкретно не понятно.

Цитата(Cashey @ 1.9.2005, 23:50)
С чем это может быть связано?

С целями языка. Писать компилятор на batники очень не здравая идея.

Цитата(Cashey @ 1.9.2005, 23:50)
Или не на каждый язык программирования можно разработать компилятор?

На каждый. Если язык можно отинтерпретировать, то его можно и откомпилировать. Даже на мой любимый brainfuck компилятор можно сделать, но нафиг?

зы. В частности в книжном можешь поискать Донована "Системное программирование". Глава 8 называется "компиляторы". Только говорю сразу, что навряд ли её найдешь - она в 70ых вышла(PL/1, MULTICS и всё такое).
Другие книги по написанию компиляторов не читал.. Поиск по озону выдал http://www.ozon.ru/context/detail/id/111137/ и http://www.ozon.ru/context/detail/id/146264/?from=buyalso_111137.
Но Донована всё-таки следовало бы почитать. В качестве исторической справки так скзать smile

Автор: Cashey 1.9.2005, 21:32
Если в кратце, решил выяснить можно ли своими силами написать компилятор для ФоксПро

Автор: Mayk 1.9.2005, 21:52
Совет - на компилятор забей.
Пиши транслятор с фокса на с++/пас/ява. Быстрее получится.
Во-всяком случае запустить хелло ворлд можно будет не через полгода.

Автор: Fin 1.9.2005, 22:25
Есть довольно фундаментальная книга: Альфред Ахо, Рави Сети, Джеффри Ульман "Компиляторы. Принципы, технологии, инструменты" . В русском варианте выпустило издательство "Вильямс" в 2003 году. В сети скачивал как то в электронном виде. Но то место шас закрыто.
Компилятор или транслятор можно написать, на написание первой версии Фортрана было потрачено 18 человеко/лет.
Кстати вот определение из книги, что есть компилятор:
Цитата

Компилятор - это программа, которая считывает текст программы, написанной на одном языке - исходном, и транслирует (переводит) его в эквивалентный текст на другом языке - целевом.

Автор: Sardar 1.9.2005, 22:31
Цитата(Mayk @ 1.9.2005, 20:52)
Пиши транслятор с фокса на с++/пас/ява. Быстрее получится.

В Java байткод высокоуровневый, твой язык по сути же будет обьектно ориентированным. В принципе это благо, модно и удобно smile К тому же богатая стандартная библиотека и куча софта помогут встать на ноги быстрей.

Транслировать в C++/pascal очень сложно. Разобрать твоё выражение на десяток атомных инструкций(асм) проще чем собрать аналогичное выражение в другом языке.

Интерпретатор построить легче чем компилятор, т.к. нужно знать архитектурую машины под которую будешь компилить. Интерпретатор - это машина, что ты придумаешь сам smile Естественно потребуеться масса теории(стек, регистры, множество опкодов, работа с памятью, частые вызовы функций и т.п.)

Автор: Akina 1.9.2005, 23:10
Цитата(Mayk @ 1.9.2005, 22:20)
Транслятор с какого-либо языка на ассемблер.

Неверно. Скажем компилятор VB6 или там Java совсем даже и не байт-код генерят...

Автор: Mayk 2.9.2005, 06:38
Цитата(Akina @ 2.9.2005, 03:10)
Неверно. Скажем компилятор VB6 или там Java совсем даже и не байт-код генерят...

Насчет VB6 не знаю, я его видел только издали, но .exe он вроде делал, а байткод явы(если javac делает не байткод, то что же он вообще делает?) и есть собсно ассемблер(да, да, машинный и байт код это не ассемблер, но разницы большой нет. Говорю "машинный код" подразумеваю "ассемблер", грю "ассемблер", подразумеваю "машинный код"). Набери в гугле java bytecode assembler. Увидишь массу ссылок.


Добавлено @ 06:39
Цитата(Fin @ 2.9.2005, 02:25)

Компилятор - это программа, которая считывает текст программы, написанной на одном языке - исходном, и транслирует (переводит) его в эквивалентный текст на другом языке - целевом.

Это транслятор.

Автор: Akina 2.9.2005, 08:21
Цитата(Mayk @ 2.9.2005, 07:38)
Насчет VB6 не знаю, я его видел только издали, но .exe он вроде делал,

Его ЕХЕ вообще-то всего лишь вызывает стандартную либу, которая интерпретирует предкомпилированный код в теле ЕХЕ.

Цитата(Mayk @ 2.9.2005, 07:38)
байткод явы(если javac делает не байткод, то что же он вообще делает?) и есть собсно ассемблер(да, да, машинный и байт код это не ассемблер, но разницы большой нет. Говорю "машинный код" подразумеваю "ассемблер", грю "ассемблер", подразумеваю "машинный код").

Да? а как один и тот же класс работает на разных платформах? когда системные вызовы совершенно по-разному организованы?

Или еще пример - .Net. Intermedialte Language, JIT-compiler - это все для на зачем?

Автор: batigoal 2.9.2005, 08:25
Цитата(Cashey @ 1.9.2005, 20:50)
Заинтерисовал меня вопрос: а что есть компилятор? Ну в смысле как его использовать и что получается в результате его работы это всем известно. А вот как он из символов языков высокоуровнего программирования переводит все в понятные машине коды мне не понятно.
Как я понимаю сам по себе принцип работы компилятора не зависит от конкретного языка программирования. Однако, почиму-то некоторые языки его не имеют, но используют так называемый интерпритатор, а по сути используют, по средствам механизмов обмена windows, откомпилированные библиотеки поддержки в режиме real-time. С чем это может быть связано? Или не на каждый язык программирования можно разработать компилятор?

Могу из дома выложить фрагмент институтского конспекта. По-моему, я его даже уже где-то здесь выкладывал. Там рассказывается о двухпроходной схеме работы компилятора, таблицах машинных команд и псевдокоманд и т.п.

Автор: Mayk 2.9.2005, 13:52
Цитата(Akina @ 2.9.2005, 12:21)
го ЕХЕ вообще-то всего лишь вызывает стандартную либу, которая интерпретирует предкомпилированный код в теле ЕХЕ.

smile Либа - это та vbXXX.dll, которая постоянно требуются?

Цитата(Akina @ 2.9.2005, 12:21)
и еще пример - .Net. Intermedialte Language, JIT-compiler - это все для на зачем?

Цитата(Akina @ 2.9.2005, 12:21)
Да? а как один и тот же класс работает на разных платформах?

Как, как. Берется и перегоняется житом в местный асм с портируемого байткода.
Не понимаю чем тебя смущает перегон с байткода на асм.
Не понимаю как наличие VB.DLL/JIT превращает асм в не асм. Проге написанной на си требуется libc, так что же - гнус не является компилятором? Является. В таком случае и бэсик является компилером - "Как ваш тор может быть более вывернут, чем мой?" (с) Барр.



Добавлено @ 13:52
Lamer George
Выкладывай smile

Автор: Sardar 2.9.2005, 14:47
Цитата(Mayk @ 2.9.2005, 12:52)
Не понимаю чем тебя смущает перегон с байткода на асм.

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

Цитата(Mayk @ 2.9.2005, 12:52)
Проге написанной на си требуется libc, так что же - гнус не является компилятором?

Это стандартная библиотека, "репозиторий кода". В идеале C прогу можно написать с нуля, не используя никаких внешних библиотек, компилятор вложит только базовые функции работы с числами и массивами.

Автор: Mayk 2.9.2005, 16:02
Цитата(Sardar @ 2.9.2005, 18:47)
Байт код зачастую высокоуровневый

Ну и что? P IV по сравнению с Z80 гораздо высокоуровнее. В последнем float'ов не было.
Цитата(Sardar @ 2.9.2005, 18:47)
'создать обьект'

Ну подумаешь, на локальном асме пришлось бы делать
Код

call createObject
call initFromPoolOfConstants


Цитата(Sardar @ 2.9.2005, 18:47)
За памятью не следишь ибо все уже поняли, что сборщик мусора это благо.

Тот же сборщик можно и на плюсах накатать, везде используя шибко умные указатели с подсчетом ссылок.

Цитата(Sardar @ 2.9.2005, 18:47)
Окружение(виртуальная машина) не тупо компилирует байт код в нативные инструкции, оно предлагает основные механизмы ввода/вывода, работа с памятью и т.п.

Короче то же самое, что и стандартные либы. По мне так без разницы как создаётся объект -
call createObject
int 0x73
new #2
То что часть этого выполняется программно... Ну на то машина явы и названа виртуальной.

Автор: batigoal 2.9.2005, 22:12
Мда. Посмотрел записи. Наверное, не стоит выкладывать - там без поллитры не разберешься.

Автор: dvamaster 2.9.2005, 22:30
Разрешите тоже поспрорить, мне тут понравилось.

Цитата
Компилятор - это программа, которая считывает текст программы, написанной на одном языке - исходном, и транслирует (переводит) его в эквивалентный текст на другом языке - целевом.


Цитата
Это транслятор.


Начну сначала, текст ASM в текст битовый, байтовый..., т.е. машинный код. Блин, опять транслятор получается! КАКОЙ ДОЛЖЕНА БЫТЬ ЦЕЛЬ В ДАННОМ СЛУЧАЕ? Голову сейчас сломаю, но что-нидь придумаю.

Проц есть транслятор машинных кодов, во что?

Тоже вопрос!

Автор: batigoal 3.9.2005, 09:18
Цитата(dvamaster @ 2.9.2005, 23:30)
КАКОЙ ДОЛЖЕНА БЫТЬ ЦЕЛЬ В ДАННОМ СЛУЧАЕ?

Оттранслировать в машинный код (или другой формат, пригодный для исполнения процессором).

Автор: Fin 3.9.2005, 13:09
Цитата

Компилятор - это программа, которая считывает текст программы, написанной на одном языке - исходном, и транслирует (переводит) его в эквивалентный текст на другом языке - целевом.

Эта фраза взята из первой главы вышеупомянутой книги. Мне лично нет разници, как это будет называться. Лиш бы работало. В конечном счете все команды преврашаются в коды процессора в том или ином виде. Просто уже вопрос будет стоять, насколько эффективно.


Автор: allex 5.9.2005, 15:00
Часто транслятором называют инструмент, который один язык высокого уровня переводит в другой. А компилятором - инструмент, который переводит язык высокого уровня в машинный - ассемблер, байт-код.
Транслятор написать легче, чем компилятор. Простой компилятор написать легче, чем оптимизирующий.
Конкретные вопросы будут или вообще непонятно с чего начать?
По минимуму: Распознавание входного текста и построение внутреннего представления (дерева абстрактного синтаксиса) -> проверка семантических ограничений языка (можно не полностью) и сбор информации о типах и т.п. -> генерация кода.

Автор: Гость_The Master 6.9.2005, 06:07
Простым языком компилятор это такое существо которое переводит код программы в машинный код. smile
Не путайте пожалуйста с рабочей средой!

Автор: Fin 10.9.2005, 00:19
Вот пример транслятора http://www.softcraft.ru/ppp/download.shtml#src . Авторы сделали язык O2M.

Автор: Janus 31.12.2005, 21:00
Кошмар... Все в одно смешали...

Транслятор - это программа или устройство, которое преобразует правильный текст, написанный на одном языке в правильный текст с той же семантикой, но написанный на другом языке.

Проще говоря, транслятор переводит текст с одного языка на другой. Если всмотреться в слово, то это и будет "переводчик" (англ).

Компилятор - это транслятор, в котором языком назначения является язык машинных кодов.

Каждый компилятор - есть транслятор, но не каждый транслятор является компилятором. Например, транслятор с языка ассемблер fasm - компилятор, а транслятор заголовочных файлов С++ (.h) в модули Pascal (.pas) не является компилятором.

На самом деле, компилятор написать довольно сложно, проще написать транслятор в .asm и использовать внешний компилятор с ассемблера. Еще сложнее написать транслятор с одного языка высокого уровня на другой. Ну например, как преобразовать класс-шаблон из С++ в конструкцию на Pascal'е?

Что касается интерпретаторов, то тут все проще и сложнее. К слову, не для каждого языка можно написать интерпретатор. Кроме того, тут появляется очень много проблем с выделением памяти, размещением и исполнением кода и т.п.

Автор: Void 1.1.2006, 01:12
Цитата(Janus @ 31.12.2005, 23:00)
На самом деле, компилятор написать довольно сложно, проще написать транслятор в .asm и использовать внешний компилятор с ассемблера.

Суть одно и то же, разница чисто терминологическая.

Цитата(Janus @ 31.12.2005, 23:00)
Еще сложнее написать транслятор с одного языка высокого уровня на другой. Ну например, как преобразовать класс-шаблон из С++ в конструкцию на Pascal'е?

По собственному опыту говорю: проще. И то, что первые компиляторы C++ работали именно как препроцессоры в Си, подтверждает это.
Оптимизирующий компилятор в нативный код - это очень, очень сложно.

Автор: Cashey 2.1.2006, 18:53
Цитата(Mayk @ 2.9.2005, 06:38)
да, да, машинный и байт код это не ассемблер, но разницы большой нет.

ничего себе нет нет разницы, нолики и единички читать гораздо сложнее чем комманды ассемблера

Автор: batigoal 2.1.2006, 20:18
Цитата(Cashey @ 2.1.2006, 19:53)
ничего себе нет нет разницы, нолики и динички читать гораздо сложнее чем комманды ассемблера

На самом деле, привыкаешь довольно быстро. В институте приходилось немного делать подобное на стендах. Сначала писалась программа на ассемблере, компилировалась в машинные коды и вводилась руками в память стенда. так через пару занятий мы небольшие изменения уже сразу писали в память, компилируя их в уме smile

Автор: Void 2.1.2006, 20:47
Lamer George
Это справедливо для простой системы команд. Что-то вроде 8080 запомнить можно. С x86 будут большие проблемы. Декодировать в уме маш. код IA-64 (как и любой VLIW) вообще вряд ли кто-то сможет.

Автор: Fin 3.1.2006, 18:00
Как не крути, самое полезное, что производит компьютер, это тепло. smile Все остальное вторично.

Автор: Larrr 13.7.2006, 00:20
Для написания компилятора нужен лексический, синтаксический и семантический анализатор, которые в итогде генерируют intermidiate code а потом и final code. Реально написать можно компилятор ко всему, из тулов понадобится генератор сканнеров(Bison,ANTLR) и парсеров(я пользовала flex), возможно генератор генераторов кода(Mono JIT).
За всем этим довольно сложная теория - правые, левые грамматики, регулярные выражения, автоматы... Если интересно, можно погуглить на тему LL, LR, LL(1), LARL - должно выкинуть на страничку теории компиляторов...
  

Автор: Void 13.7.2006, 01:31
Цитата(Larrr @  13.7.2006,  02:20 Найти цитируемый пост)
з тулов понадобится генератор сканнеров(Bison,ANTLR) и парсеров(я пользовала flex)

Немного перепутала: flex — это сканер (aka лексер), bison и ANTLR — синтаксические анализаторы (aka парсеры), правда последний может генерировать и лексеры.
Цитата(Larrr @  13.7.2006,  02:20 Найти цитируемый пост)
генерируют intermidiate code

Порой даже не одного вида на разных стадиях smile 

Автор: Sardar 13.7.2006, 11:19
Цитата(Larrr @  12.7.2006,  23:20 Найти цитируемый пост)
енерируют intermidiate code а потом и final code

По моему наиболее популярно генерить код через GCC. Back-end'ов у него много, постояннор развиваеться. Обычно можно генерить со своего языка AST и все его развёртки вплоть до SSA (single assigment satements) или на прямую RTL для back-end'ов. Плюсы подхода в готовой многоплатформенности,  не надо заморачиваться с чипами (есессно если язык компилируем). Чем более высокоуровневое представление, тем больше трансформаций оно пройдёт, тем больше оптимизаций (по по моему самые аггресивные в SSA и RTL формах) будет применено.

Конечно генерть байткод под Java/.Net лучше если делаешь что то "реальное на жизнь", а не исследовательскую работу smile

Популярно писать трансляторы язык -> C, ибо C это высокуровневый ассемблер smile
C-- также разрабатываеться специально как целевая форма для более высокоуровневых компилеров, его сравнение с C, а также масса инфы + ссылки на интересное чтиво здесь:  http://www4.in.tum.de/~pizka/mp00a.pdf
На странице чела не пропустите MoDi-OS и INSEL + идеи за ними, торкает не хуже травки smile 

Автор: Larrr 15.7.2006, 18:54
Цитата(Void @ 13.7.2006,  01:31)
Немного перепутала: flex — это сканер (aka лексер), bison и ANTLR — синтаксические анализаторы (aka парсеры), правда последний может генерировать и лексеры.

Именно так, спасибо!  smile 

Автор: nerezus 10.9.2006, 13:44
Цитата

На каждый
 А как же eval()?

Автор: Void 10.9.2006, 16:17
smile
Давать цитату из двух слов на две страницы назад без указания автора…

Для менее терпеливых:
Цитата
Или не на каждый язык программирования можно разработать компилятор?

На каждый. Если язык можно отинтерпретировать, то его можно и откомпилировать. Даже на мой любимый brainfuck компилятор можно сделать, но нафиг?

В исполняемый файл попросту зашивается компилятор со всеми потрохами. При этом код, не использующий eval, компилируется в нормальный машинный код. Так делают некоторые компиляторы Лиспа.

Автор: maggot 18.1.2007, 23:01
Цитата(nerezus @ 10.9.2006,  13:44)
Цитата

На каждый
 А как же eval()?

А что мешает делать таблицу идиентификаторов?
Или под eval() имеется ввиду не получение переменной по имени, а выполнение любого кода?

Автор: Void 18.1.2007, 23:13
Цитата(maggot @  19.1.2007,  01:01 Найти цитируемый пост)
выполнение любого кода

Автор: nerezus 18.1.2007, 23:21
Цитата

При этом код, не использующий eval, компилируется в нормальный машинный код.

Но если результаты этого кода будут использованы в последующих рассчетах?

например:

Код

// a неопределена
// s вводится с клавы. Например в нее ввели a
eval(eval(s) + "= 1")
print с




Я вот не догнал, как скомпилить print с, если самого c еще нету?

Автор: Void 18.1.2007, 23:28
Цитата(nerezus @  19.1.2007,  01:21 Найти цитируемый пост)
Я вот не догнал, как скомпилить print с, если самого c еще нету? 

Никак. Опять динамика, т.е. вшитый транслятор языка. Всё-таки даже в самых «отъявленных» динамических языках такой код составляет лишь небольшую долю.

Автор: nerezus 19.1.2007, 10:48
Цитата

Всё-таки даже в самых «отъявленных» динамических языках такой код составляет лишь небольшую долю. 
 Если честно, то такого кода нет(кроме как у новичков) =)
Однако это делать можно.

Однако если это будет динамикой, то при чем тогда компилер в натив?
Ведь использование утилит, сшивающих скрипт и среду выполнения - это ведь не компиляция?

P.S. Если это все-таки компиляция, то мы создали компилятор PHP  smile 

Автор: Void 19.1.2007, 18:12
При том, что не весь код будет интерпретироваться. Во многих случаях можно осуществить статический анализ, вывод типов и скомпилировать какой-то локальный участок кода или функцию, как если бы она была написана на статически типизированном языке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)