Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Что проще - найти или написать самому транслятор небольшого языка?

74K
31 октября 2011 года
418ImATeapot
11 / / 31.10.2011
Здравствуйте, все!

Мне понадобился транслятор с какого-нибудь языка типа Small-C или Pascal-S на FASM. Требования:
  • Есть исходник на C с комментами.
  • Генерирует код на FASM32 не ассоциированный с какой-либо платформой.
  • Может транслировать сам себя (в переводе) - т. е. в дальнейшем понадобиться раскрутка.
  • Транслирует за один проход.
  • Без malloc и прочей библиотечной ерунды (или, по крайней мере, malloc можно убрать).
  • Ввод-вывод кода через консоль.
  • Ок. 1000 строк.

С таким списком проще, конечно самому написать.
Но может кто знает? Хотя бы чтобы подглядывать, когда буду писать свой.
412
31 октября 2011 года
grgdvo
323 / / 04.07.2007
Забыли важное требование: СРОКИ?

Ответ на этот вопрос, даст приблизительно ответ на ваш вопрос.
74K
31 октября 2011 года
418ImATeapot
11 / / 31.10.2011
Совершенно не важны, т. к. пишу я для себя. Спасибо.
360
31 октября 2011 года
P*t*
474 / / 15.02.2007
Я бы посоветовал почитать что-то вроде этого: http://it-books.net.ru/p/1242368512 (за хорошесть книги не поручусь - первая попавшаяся из гугла), а потом написать самому.
5.9K
10 ноября 2011 года
assign
60 / / 13.12.2005
Цитата: P*t*
Я бы посоветовал почитать что-то вроде этого: http://it-books.net.ru/p/1242368512 (за хорошесть книги не поручусь - первая попавшаяся из гугла), а потом написать самому.



А ещё лучше вот это: http://progbook.ru/technologiya-programmirovaniya/798-sverdlov-yazyki-programmirovaniya-i-metody.html

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

5
14 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 418ImATeapot
Здравствуйте, все!

Мне понадобился транслятор с какого-нибудь языка типа Small-C или Pascal-S на FASM. Требования:
  • Есть исходник на C с комментами.
  • Генерирует код на FASM32 не ассоциированный с какой-либо платформой.
  • Может транслировать сам себя (в переводе) - т. е. в дальнейшем понадобиться раскрутка.
  • Транслирует за один проход.
  • Без malloc и прочей библиотечной ерунды (или, по крайней мере, malloc можно убрать).
  • Ввод-вывод кода через консоль.
  • Ок. 1000 строк.

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



1) Использование Си в деле написания трансляторов - верный способ так и не завершить проект.
2) Прямая гненерация кода для стеково-регистровой машины - верный способ взорвать себе мозг и не завершить проект (особенно при условии пункта 1).
3) Зачем вам раскрутка?
4) Однопроходная трансляция - утопия. В нормальных компиляторах используется множество проходов, на вскидку: разбор исходников и построение AST, типизация полученного AST (связывание, вывод типов), трансляция типизированного AST в абстрактный код машины стековой архитуектуры (тоже своего рода дерево), трансляция полученного кода в требуемую архитектуру. В целом же работает правило: чем сложнее язык - тем больше проходов.
5) Неясное требование про маллоки :)
6) С таким количеством кода нужно смотреть на ФП-шные трансляторы.

Предлагаю начать отсюда.

5
14 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: P*t*
Я бы посоветовал почитать что-то вроде этого: http://it-books.net.ru/p/1242368512 (за хорошесть книги не поручусь - первая попавшаяся из гугла), а потом написать самому.


Кстати, я по циклу этих статей учился :) Подход описанный в ней сильно устарел.

87
15 ноября 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase

4) Однопроходная трансляция - утопия. В нормальных компиляторах используется множество проходов, на вскидку: разбор исходников и построение AST, типизация полученного AST (связывание, вывод типов), трансляция типизированного AST в абстрактный код машины стековой архитуектуры (тоже своего рода дерево), трансляция полученного кода в требуемую архитектуру. В целом же работает правило: чем сложнее язык - тем больше проходов.



Думаю, что ты заблуждаешься. Поясню на примере. Да, мы даже ассемблер в машинный код не переведём за один проход, так как есть goto с меткой, адрес которой не известен, так как она появится позже. Нужно хотя бы два прохода.

Но почему же трансляция должна производиться в машинный код? Мы же можем транслировать код одного диалекта ассемблера в код другого. Тут проблемы с goto может не быть и будет возможен один проход.

А если посмотреть на C, то видно, что он не так уж и далеко ушел от ассемблера. Так что не очевидно, что не удастся его транслировать в ассемблер за один проход. Могут возникнуть проблемы с оптимизацией, но это тонкости. В общем, надо смотреть что во что транслируем перед тем как про утопии говорить.

5
15 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Думаю, что ты заблуждаешься. Поясню на примере. Да, мы даже ассемблер в машинный код не переведём за один проход, так как есть goto с меткой, адрес которой не известен, так как она появится позже. Нужно хотя бы два прохода.

Ассемблер транслируется в машкод (соответствующий ему) в один проход - при достижении метки просто возвращаемся назад и вставляем адрес. ;)

Надобы конкретизировать что понимается под проходом. Проход компиляции - это обход AST компилируемой программы.

Цитата: Kogrom
А если посмотреть на C, то видно, что он не так уж и далеко ушел от ассемблера. Так что не очевидно, что не удастся его транслировать в ассемблер за один проход. Могут возникнуть проблемы с оптимизацией, но это тонкости. В общем, надо смотреть что во что транслируем перед тем как про утопии говорить.

Си транслировать в машкод в один проход можно. Именно для этого в Си есть идиотизм с #include-ами и форвард объявлениями функций. Просто язык проектировался в то время, когда "один проход" считался комильфо.

260
15 ноября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: hardcase
Просто язык проектировался в то время, когда "один проход" считался комильфо.


А сейчас, комильфо, это вприсядку и с комбинаторным взрывом грамматики?

PS: 418ImATeapot, используйте существующие решения, возможно, с модификацией.

87
15 ноября 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Ассемблер транслируется в машкод (соответствующий ему) в один проход - при достижении метки просто возвращаемся назад и вставляем адрес. ;)



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

Цитата: hardcase
Надобы конкретизировать что понимается под проходом. Проход компиляции - это обход AST компилируемой программы.



Если взять грубое определение, то при однопроходной трансляции каждую строку входного кода можем сразу транслировать в выходной код (при том, что помним данные предыдущих строк). То есть возвращаться назад не надо. В многопроходной трансляции надо несколько раз анализировать программу (модуль) целиком, получая в каждом проходе промежуточный код. Как-то так.

Цитата: hardcase
Си транслировать в машкод в один проход можно. Именно для этого в Си есть идиотизм с #include-ами и форвард объявлениями функций. Просто язык проектировался в то время, когда "один проход" считался комильфо.



Так это и требовалось автору темы.

5
16 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Ramon
А сейчас, комильфо, это вприсядку и с комбинаторным взрывом грамматики?


Вприсядку - это если парсер руками и весь анализ в одном проходе на языке без сопоставления с образцом :) Ааа, ты про рукопашный недо-PEG Из цикла D.Mon-а? Такие вещи элементарно решаются мемоизацией (что в статье и было сделано), которую в той или иной форме применяют все нормальные PEG генераторы парсеров (лично написал PEG-грамматику C# 4.0, по которой сгенерировался вполне шустрый парсер).

74K
16 ноября 2011 года
418ImATeapot
11 / / 31.10.2011
Раскрутка мне нужна, потому что я пишу для своей недо-ОС. Т. е. хочу потом на этом языке писать ОС и программы под нее. Поэтому, кстати и вывод в FASM и требование насчет маллоков и однопроходности. В общем уровень языка не выше TP 1.0.

Решил использовать два прохода:
Code->Inv. Polish->FASM

Уже начал писать, всем спасибо, кто ответил.
76K
21 ноября 2011 года
exoticious
7 / / 17.11.2011
Сообщение от Ramon


А сейчас, комильфо, это вприсядку и с комбинаторным взрывом грамматики?



Вприсядку - это если парсер руками и весь анализ в одном проходе на языке без сопоставления с образцом Ааа, ты про рукопашный недо-PEG Из цикла D.Mon-а? Такие вещи элементарно решаются мемоизацией (что в статье и было сделано), которую в той или иной форме применяют все нормальные PEG генераторы парсеров (лично написал PEG-грамматику C# 4.0, по которой сгенерировался вполне шустрый парсер).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог