Как создаются компиляторы

#compiler-construction

#компилятор-конструирование

Вопрос:

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

Ответ №1:

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

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

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

Ответ №2:

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

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

Комментарии:

1. Я не предполагаю этого, и я не говорю о создании первого компилятора для нового языка, я говорю о создании компилятора для уже существующего языка.

2. Тогда я не знаю, о чем вы спрашиваете. Особенно сбивает с толку комментарий «это кажется нереальным».

3. @Sameh, итак, вы говорите об «уже существующем языке» и в то же время «определяете language..as «если язык никогда не существовал»: похоже на противоречие, из-за которого трудно ответить на этот вопрос.

4. Я говорю, что нереально, что разработчикам компилятора придется переопределять язык каждый раз, когда они создают компилятор для этого языка.

5. @SamehHany: Если бы они переопределили язык, они бы создали компилятор не для этого существующего языка, а для немного другого (и, следовательно, отличного) языка. Язык не определен ни одним компилятором.

Ответ №3:

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

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

Ответ №4:

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

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

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

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