Начиная простой (возможно, самый простой) компилятор C? - PullRequest
40 голосов
/ 28 февраля 2010

Я сталкивался с этим: Написание компилятора с использованием Turbo Pascal

Мне любопытно, есть ли какие-нибудь учебники или ссылки, объясняющие, как создать простой компилятор Си. Я имею в виду, что достаточно, если он выведет меня на уровень понимания арифметических операций. Я стал действительно любопытным после прочтения этой статьи Кеном Томпсоном . Идея написать что-то, что понимает сама себя, кажется захватывающей.

Почему я поставил этот вопрос вместо того, чтобы задавать вопрос Google? Я попробовал Google, и Pascal был первой ссылкой. Остальное не показалось мне актуальным и добавило к этому ... Я не являюсь мажором CS (поэтому мне все еще нужно узнать, что делают все эти инструменты, такие как yacc), и я хочу изучить это, делая и надеюсь, что люди с большим опытом всегда лучше, чем Google. Я хочу прочитать статью, написанную в том же духе, что я перечислил выше, но ту, в которой освещаются как минимум начальные этапы построения простого компилятора Си.

Кроме того, я не знаю лучший способ учиться. Должен ли я начать с компилятора C на C или на другом языке? Я пишу компилятор C или другой язык? Я чувствую, что на такие вопросы лучше ответить, когда у меня есть какое-то направление для изучения. Есть предложения?

Есть предложения?

Ответы [ 12 ]

3 голосов
/ 28 февраля 2010

Компилятор - очень большой проект, хотя я полагаю, попробовать не мешало бы.

Я знаю, по крайней мере, один компилятор C, написанный на Паскале, так что это не большинство безумных вещей, которые вы могли бы сделать. Лично я бы выбрал более современный язык, на котором реализует мой проект компилятора C, как для простоты (легко делать пакеты для Python, Ruby, C, C ++ или Java), так и потому, что выглядеть лучше в вашем резюме.

Однако, чтобы сделать компилятор проектом для начинающих, вам нужно выпить все Agile kool-aid .

Всегда что-то работает, даже если оно ничего не делает. Добавляйте вещи в ваш компилятор только небольшими шагами. («Частые выпуски».) Выберите очень маленькое подмножество языка и осуществите его первым. (Сначала поддержите только i = 0; и оттуда все расширяйте.)

2 голосов
/ 08 марта 2014

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

Инструменты для создания компиляторов и синтаксических анализаторов великолепны, но проблема заключается в том, чтобы действительно быть сокращенной записью. Если вы не знаете, как создать компилятор от руки, сокращение будет казаться загадочным, излишне ограничительным и т. Д. Итак, сначала напишите свой собственный простой компилятор, а затем продолжайте. Я также рекомендую вам не начинать генерировать фактический машинный код, если вы не будете есть и дышать ассемблером. Создайте свой собственный интерпретатор байт-кода с виртуальной машиной.

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

Я много писал о языках программирования, поэтому вы можете найти здесь несколько полезных сообщений: http://orangejuiceliberationfront.com/category/language-design/

В частности, http://orangejuiceliberationfront.com/how-to-write-a-compiler/ является отправной точкой для анализа парсинга общих конструкций и генерации чего-то полезного из этого, а также http://orangejuiceliberationfront.com/generating-machine-code-at-runtime/, в котором говорится о том, чтобы фактически выплевывать инструкции Intel, которые что-то делают.

О, что касается начальной загрузки компилятора: вы, вероятно, не сможете сделать это с самого начала. Существует немало работы, связанной с созданием компилятора. Таким образом, для написания загрузочного компилятора нужно не только написать компилятор (на каком-либо другом языке), но, как только он у вас появится, вам придется написать вторую версию компилятора, использующего сам себя. Это вдвое больше работы, плюс отладка, необходимая в существующем и загруженном новом компиляторе, пока все не заработает. Тем не менее, если у вас есть работающий компилятор, это хороший способ проверить его полноту. Хорошо, может быть, не вдвое больше работы, но больше работы. Сначала я бы пошел к легким успехам, а затем пошел дальше.

В любом случае, получайте удовольствие!

...