![]() |
|
Модераторы: Се ля ви |
![]()
|
|
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Заинтерисовал меня вопрос: а что есть компилятор? Ну в смысле как его использовать и что получается в результате его работы это всем известно. А вот как он из символов языков высокоуровнего программирования переводит все в понятные машине коды мне не понятно.
Как я понимаю сам по себе принцип работы компилятора не зависит от конкретного языка программирования. Однако, почиму-то некоторые языки его не имеют, но используют так называемый интерпритатор, а по сути используют, по средствам механизмов обмена windows, откомпилированные библиотеки поддержки в режиме real-time. С чем это может быть связано? Или не на каждый язык программирования можно разработать компилятор? -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Mayk |
|
||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Транслятор с какого-либо языка на ассемблер.
Этого не расскажешь в двух словах. За подробностями беги в книжный. Если в общем - используется построение всяких бинарных деревьев и таблиц(вопрос сродни "как построить машину?"). Лучше скажи, что тебе конкретно не понятно.
С целями языка. Писать компилятор на batники очень не здравая идея.
На каждый. Если язык можно отинтерпретировать, то его можно и откомпилировать. Даже на мой любимый brainfuck компилятор можно сделать, но нафиг? зы. В частности в книжном можешь поискать Донована "Системное программирование". Глава 8 называется "компиляторы". Только говорю сразу, что навряд ли её найдешь - она в 70ых вышла(PL/1, MULTICS и всё такое). Другие книги по написанию компиляторов не читал.. Поиск по озону выдал Системное программирование. Основы построения трансляторов и Компиляторы. Принципы, технологии, инструменты. Но Донована всё-таки следовало бы почитать. В качестве исторической справки так скзать Это сообщение отредактировал(а) Mayk - 1.9.2005, 21:21 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||
|
|||||||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Если в кратце, решил выяснить можно ли своими силами написать компилятор для ФоксПро
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Совет - на компилятор забей.
Пиши транслятор с фокса на с++/пас/ява. Быстрее получится. Во-всяком случае запустить хелло ворлд можно будет не через полгода. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Fin |
|
|||
|
Unregistered |
Есть довольно фундаментальная книга: Альфред Ахо, Рави Сети, Джеффри Ульман "Компиляторы. Принципы, технологии, инструменты" . В русском варианте выпустило издательство "Вильямс" в 2003 году. В сети скачивал как то в электронном виде. Но то место шас закрыто.
Компилятор или транслятор можно написать, на написание первой версии Фортрана было потрачено 18 человеко/лет. Кстати вот определение из книги, что есть компилятор:
|
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
В Java байткод высокоуровневый, твой язык по сути же будет обьектно ориентированным. В принципе это благо, модно и удобно Транслировать в C++/pascal очень сложно. Разобрать твоё выражение на десяток атомных инструкций(асм) проще чем собрать аналогичное выражение в другом языке. Интерпретатор построить легче чем компилятор, т.к. нужно знать архитектурую машины под которую будешь компилить. Интерпретатор - это машина, что ты придумаешь сам -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Неверно. Скажем компилятор VB6 или там Java совсем даже и не байт-код генерят... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Насчет VB6 не знаю, я его видел только издали, но .exe он вроде делал, а байткод явы(если javac делает не байткод, то что же он вообще делает?) и есть собсно ассемблер(да, да, машинный и байт код это не ассемблер, но разницы большой нет. Говорю "машинный код" подразумеваю "ассемблер", грю "ассемблер", подразумеваю "машинный код"). Набери в гугле java bytecode assembler. Увидишь массу ссылок. Добавлено @ 06:39
Это транслятор. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Его ЕХЕ вообще-то всего лишь вызывает стандартную либу, которая интерпретирует предкомпилированный код в теле ЕХЕ.
Да? а как один и тот же класс работает на разных платформах? когда системные вызовы совершенно по-разному организованы? Или еще пример - .Net. Intermedialte Language, JIT-compiler - это все для на зачем? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
Могу из дома выложить фрагмент институтского конспекта. По-моему, я его даже уже где-то здесь выкладывал. Там рассказывается о двухпроходной схеме работы компилятора, таблицах машинных команд и псевдокоманд и т.п. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Как, как. Берется и перегоняется житом в местный асм с портируемого байткода. Не понимаю чем тебя смущает перегон с байткода на асм. Не понимаю как наличие VB.DLL/JIT превращает асм в не асм. Проге написанной на си требуется libc, так что же - гнус не является компилятором? Является. В таком случае и бэсик является компилером - "Как ваш тор может быть более вывернут, чем мой?" (с) Барр. Добавлено @ 13:52 Lamer George Выкладывай -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Это не всегда просто и не всегда возможно(в смсыле что сложно
Это стандартная библиотека, "репозиторий кода". В идеале C прогу можно написать с нуля, не используя никаких внешних библиотек, компилятор вложит только базовые функции работы с числами и массивами. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Ну и что? P IV по сравнению с Z80 гораздо высокоуровнее. В последнем float'ов не было.
Ну подумаешь, на локальном асме пришлось бы делать
Тот же сборщик можно и на плюсах накатать, везде используя шибко умные указатели с подсчетом ссылок.
Короче то же самое, что и стандартные либы. По мне так без разницы как создаётся объект - call createObject int 0x73 new #2 То что часть этого выполняется программно... Ну на то машина явы и названа виртуальной. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
Мда. Посмотрел записи. Наверное, не стоит выкладывать - там без поллитры не разберешься.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| dvamaster |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 30.6.2004 Где: Россия : Курган Репутация: нет Всего: 10 |
Разрешите тоже поспрорить, мне тут понравилось.
Начну сначала, текст ASM в текст битовый, байтовый..., т.е. машинный код. Блин, опять транслятор получается! КАКОЙ ДОЛЖЕНА БЫТЬ ЦЕЛЬ В ДАННОМ СЛУЧАЕ? Голову сейчас сломаю, но что-нидь придумаю. Проц есть транслятор машинных кодов, во что? Тоже вопрос! -------------------- Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/ Что же я сделал не так? /Король Лир/ Я делаю это для твоего же блага! /Любой родитель и палач/ PKUNZIP.ZIP /неизвестный/ |
||||
|
|||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
Оттранслировать в машинный код (или другой формат, пригодный для исполнения процессором). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Fin |
|
|||
|
Unregistered |
Эта фраза взята из первой главы вышеупомянутой книги. Мне лично нет разници, как это будет называться. Лиш бы работало. В конечном счете все команды преврашаются в коды процессора в том или ином виде. Просто уже вопрос будет стоять, насколько эффективно. |
|||
|
||||
| allex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 5.9.2005 Репутация: нет Всего: нет |
Часто транслятором называют инструмент, который один язык высокого уровня переводит в другой. А компилятором - инструмент, который переводит язык высокого уровня в машинный - ассемблер, байт-код.
Транслятор написать легче, чем компилятор. Простой компилятор написать легче, чем оптимизирующий. Конкретные вопросы будут или вообще непонятно с чего начать? По минимуму: Распознавание входного текста и построение внутреннего представления (дерева абстрактного синтаксиса) -> проверка семантических ограничений языка (можно не полностью) и сбор информации о типах и т.п. -> генерация кода. |
|||
|
||||
| Гость_The Master |
|
|||
|
Unregistered |
Простым языком компилятор это такое существо которое переводит код программы в машинный код.
Не путайте пожалуйста с рабочей средой! |
|||
|
||||
| Fin |
|
|||
|
Unregistered |
Вот пример транслятора http://www.softcraft.ru/ppp/download.shtml#src . Авторы сделали язык O2M.
|
|||
|
||||
| Janus |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 26.9.2005 Репутация: нет Всего: 1 |
Кошмар... Все в одно смешали...
Транслятор - это программа или устройство, которое преобразует правильный текст, написанный на одном языке в правильный текст с той же семантикой, но написанный на другом языке. Проще говоря, транслятор переводит текст с одного языка на другой. Если всмотреться в слово, то это и будет "переводчик" (англ). Компилятор - это транслятор, в котором языком назначения является язык машинных кодов. Каждый компилятор - есть транслятор, но не каждый транслятор является компилятором. Например, транслятор с языка ассемблер fasm - компилятор, а транслятор заголовочных файлов С++ (.h) в модули Pascal (.pas) не является компилятором. На самом деле, компилятор написать довольно сложно, проще написать транслятор в .asm и использовать внешний компилятор с ассемблера. Еще сложнее написать транслятор с одного языка высокого уровня на другой. Ну например, как преобразовать класс-шаблон из С++ в конструкцию на Pascal'е? Что касается интерпретаторов, то тут все проще и сложнее. К слову, не для каждого языка можно написать интерпретатор. Кроме того, тут появляется очень много проблем с выделением памяти, размещением и исполнением кода и т.п. Это сообщение отредактировал(а) Janus - 31.12.2005, 21:02 --------------------
Проект "Репликатор" |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Суть одно и то же, разница чисто терминологическая.
По собственному опыту говорю: проще. И то, что первые компиляторы C++ работали именно как препроцессоры в Си, подтверждает это. Оптимизирующий компилятор в нативный код - это очень, очень сложно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
ничего себе нет нет разницы, нолики и единички читать гораздо сложнее чем комманды ассемблера Это сообщение отредактировал(а) Cashey - 2.1.2006, 21:33 -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
На самом деле, привыкаешь довольно быстро. В институте приходилось немного делать подобное на стендах. Сначала писалась программа на ассемблере, компилировалась в машинные коды и вводилась руками в память стенда. так через пару занятий мы небольшие изменения уже сразу писали в память, компилируя их в уме -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Lamer George
Это справедливо для простой системы команд. Что-то вроде 8080 запомнить можно. С x86 будут большие проблемы. Декодировать в уме маш. код IA-64 (как и любой VLIW) вообще вряд ли кто-то сможет. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Fin |
|
|||
|
Unregistered |
Как не крути, самое полезное, что производит компьютер, это тепло.
|
|||
|
||||
| Larrr |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 29.1.2006 Где: Прага Репутация: нет Всего: 2 |
Для написания компилятора нужен лексический, синтаксический и семантический анализатор, которые в итогде генерируют intermidiate code а потом и final code. Реально написать можно компилятор ко всему, из тулов понадобится генератор сканнеров(Bison,ANTLR) и парсеров(я пользовала flex), возможно генератор генераторов кода(Mono JIT).
За всем этим довольно сложная теория - правые, левые грамматики, регулярные выражения, автоматы... Если интересно, можно погуглить на тему LL, LR, LL(1), LARL - должно выкинуть на страничку теории компиляторов... Это сообщение отредактировал(а) Larrr - 13.7.2006, 00:21 |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Немного перепутала: flex — это сканер (aka лексер), bison и ANTLR — синтаксические анализаторы (aka парсеры), правда последний может генерировать и лексеры. Порой даже не одного вида на разных стадиях -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
По моему наиболее популярно генерить код через GCC. Back-end'ов у него много, постояннор развиваеться. Обычно можно генерить со своего языка AST и все его развёртки вплоть до SSA (single assigment satements) или на прямую RTL для back-end'ов. Плюсы подхода в готовой многоплатформенности, не надо заморачиваться с чипами (есессно если язык компилируем). Чем более высокоуровневое представление, тем больше трансформаций оно пройдёт, тем больше оптимизаций (по по моему самые аггресивные в SSA и RTL формах) будет применено. Конечно генерть байткод под Java/.Net лучше если делаешь что то "реальное на жизнь", а не исследовательскую работу Популярно писать трансляторы язык -> C, ибо C это высокуровневый ассемблер C-- также разрабатываеться специально как целевая форма для более высокоуровневых компилеров, его сравнение с C, а также масса инфы + ссылки на интересное чтиво здесь: http://www4.in.tum.de/~pizka/mp00a.pdf На странице чела не пропустите MoDi-OS и INSEL + идеи за ними, торкает не хуже травки -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Larrr |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 29.1.2006 Где: Прага Репутация: нет Всего: 2 |
Именно так, спасибо! |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Давать цитату из двух слов на две страницы назад без указания автора… Для менее терпеливых:
В исполняемый файл попросту зашивается компилятор со всеми потрохами. При этом код, не использующий eval, компилируется в нормальный машинный код. Так делают некоторые компиляторы Лиспа. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| maggot |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 15.1.2007 Репутация: нет Всего: нет |
А что мешает делать таблицу идиентификаторов? Или под eval() имеется ввиду не получение переменной по имени, а выполнение любого кода? |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Но если результаты этого кода будут использованы в последующих рассчетах? например:
Я вот не догнал, как скомпилить print с, если самого c еще нету? |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Никак. Опять динамика, т.е. вшитый транслятор языка. Всё-таки даже в самых «отъявленных» динамических языках такой код составляет лишь небольшую долю. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Однако это делать можно. Однако если это будет динамикой, то при чем тогда компилер в натив? Ведь использование утилит, сшивающих скрипт и среду выполнения - это ведь не компиляция? P.S. Если это все-таки компиляция, то мы создали компилятор PHP |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
При том, что не весь код будет интерпретироваться. Во многих случаях можно осуществить статический анализ, вывод типов и скомпилировать какой-то локальный участок кода или функцию, как если бы она была написана на статически типизированном языке.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Правила раздела "Философия программирования": | |
|
|
Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО: • вопросы перспективного развития методов написания ПО; • изменяющиеся языки и методологии программирования; Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Философия программирования | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |