Как создаются компиляторы - PullRequest
1 голос
/ 08 ноября 2011

Когда компилятор создается для определенного языка, люди, разрабатывающие компилятор, определяют язык и его команды с самого начала, как будто язык никогда не существовал (это кажется нереальным)?или есть способ использовать предыдущие компиляторы?или как еще они это делают?

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Либо они определяют [домен-специфический] язык, либо реализуют какой-то уже существующий язык.

Язык обычно пишется в определенной форме, называемой BNF

Один методЧтобы создать компилятор (или, по крайней мере, лексер и парсер), нужно использовать инструмент, есть несколько инструментов, таких как yacc / lex, ANTLR и т. д., которые можно использовать для генерации необработанного кода для компилятора, токенизации файла и анализа токенов.Посмотрите antlr.org , где приведены примеры довольно простого в использовании инструмента, который генерирует синтаксический анализатор / лексеры кода C #, Java или C.

2 голосов
/ 08 ноября 2011

Полагаю, вы предполагаете, что компилятор написан на том же языке, что и компилируемый. Это не вариант. Процесс называется bootstrapping . Первый компилятор C # был написан на C ++. Первый компилятор C ++ был написан на C. Первый компилятор C был написан на B. Первый компилятор B был написан на BCPL. За которым становится нечеткой древняя история и все такое. В конечном итоге это возвращается к тому, кто вводит программу в машину с тумблерами.

Обращаясь к первой части вашего вопроса: да. Никто не собирается писать компилятор без очень четкого определения грамматики языка. Это можно решить на бумаге.

0 голосов
/ 08 ноября 2011

Оценка языка началась с момента рождения компьютера, а первый компилятор оптимизации появился примерно в 1960-х годах.

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

поддержка компилятора для стандарта C ++ 0x

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

0 голосов
/ 08 ноября 2011

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

Я лично сделал несколько компиляторов для небольших языков , которые я придумал сам и создал компиляторы с нуля. Иногда с помощью таких инструментов, как lex и Yacc , иногда путем ручного кодирования всего этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...