Язык общего назначения для построения компилятора для - PullRequest
12 голосов
/ 20 января 2009

Вдохновленный интервью Эрика Синка на подкасте stackoverflow Я хотел бы создать полный компилятор в свободное время для обучения. Сначала я думал создать компилятор C, но я не уверен, что это займет слишком много времени.

Мне интересно, есть ли меньший язык общего назначения, который будет более подходящим для реализации в качестве первого усилия компилятора? Или реализация C возможна в разумные сроки (200 часов)?

Я намерен нацелиться на ЦПР.

Ответы [ 13 ]

13 голосов
/ 20 января 2009

Вы будете самыми счастливыми в написании компиляторов для более старых и небольших языков. Pascal , например, были разработаны как средства обучения. Язык Паскаля маленький и элегантный; компилятор может быть написан довольно просто.

Даже компилятор Oberon или Modula-2 похож по сложности на Pascal; их дизайн вел тот же человек, Никлаус Вирт.

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

9 голосов
/ 20 января 2009
8 голосов
/ 20 января 2009

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

4 голосов
/ 20 января 2009

Если вам нужен учебник по compact , почему бы не рассмотреть конструкцию компилятора Wirth's (pdf). Исходный язык (Oberon-0) достаточно прост, чтобы компилятор был понятным. Язык реализации (Оберон) должен быть доступен для чтения любому, кто занимался программированием.

Какой язык использовать для реализации компилятора. Используйте то, что вам знакомо. Если вы сомневаетесь, выберите язык, который не излишне усложнит попытку: что-то со сборкой мусора. Что-то, что позволяет легко распечатывать или иным образом сбрасывать внутренние структуры данных для проверки. Питон , Схема и Луа все приходят на ум.

И последнее, что нужно target с вашим компилятором. Я уверен, что виртуальные машины JVM и CLR были упомянуты. Вы могли бы пойти по этому пути. Это может быть проще для первой попытки использовать симулятор для урезанного RISC-процессора в качестве вашей цели. (Это делает компилятор Вирта.)

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

3 голосов
/ 21 января 2009

Еще один момент в пользу Scheme: для новичка практично написать для него сам хостинг компилятор, такой как Ur-Scheme Крагена Ситакера, его первый компилятор. Есть немного других «обучающих» компиляторов, достаточно мощных, чтобы компилировать себя (хотя на ссылке есть несколько указателей). Это приносит больше реализма и интереса к проблеме.

2 голосов
/ 20 января 2009

Паскаль уже упоминался, но я хотел бы добавить, что книга Никлауса Вирта Алгоритмы + структуры данных = Программы содержит полную реализацию небольшого языка, подобного Паскалю, использующего рекурсивный спуск. Если вы ищете теорию интенсивного обсуждения синтаксического анализа, ищите в другом месте; но если вам нужен простой код, который позволит вам учиться на практике, я бы порекомендовал A + DP = P.

2 голосов
/ 20 января 2009

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

Конечно, если ваша цель - по-настоящему познакомиться с конкретным языком, вам нужно полностью реализовать компилятор для этого языка.

1 голос
/ 03 мая 2010

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

1 голос
/ 20 января 2009

Я не могу вспомнить ни одного языка, достаточно простого для использования в качестве первого упражнения для написания компилятора. Я не думаю, что я попробую C для первого разреза. Почему бы не изобрести свой собственный язык? Может быть, это будет настоящий хит.

1 голос
/ 20 января 2009

Какой бы язык вы ни выбрали, вы можете подумать о компиляции на промежуточный язык (IL), чтобы настроить Common Language Runtime (CLR). Я предполагаю, что ориентация на виртуальную машину Java (JVM) будет аналогичной для не-Windows, или, возможно, для реализации CLR в Mono? Это, вероятно, значительно упростит работу и позволит вам получить что-то, что хорошо с самого начала. Позже вы перенастроитесь на конкретную архитектуру, если захотите пойти дальше.

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