Подтвердить что ты не робот

Язык общего назначения для создания компилятора для

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

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

Я намерен настроить таргетинг на CLR.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Еще один момент в пользу схемы: для новичков практично писать компилятор для самостоятельного хостинга, например, Kragen Sitaker Ur-Scheme, его первый компилятор. Есть несколько других компиляторов 'tutorial', достаточно мощных для компиляции (хотя есть некоторые указатели на ссылку). Это приносит больше реализма и интерес к проблеме.

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

В терминах простоты FORTH станет одним из самых легких языков для разработки. Он пронизывал интерпретацию, а не компилировал ее, но вы все равно будете разбираться с разбором, переменным хранилищем и т.д.

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

Ответ 12

Напишите мозговой или четвертый компилятор. BASIC, возможно, также является таким языком, который не слишком богат функциями. Я думаю, что C будет умеренно тяжелым. Не завидуйте целевой арке. Используйте все, что у вас есть.

Если вы не хотите внедрять ассемблер, тогда поставьте свой код сборки для сборки компилятора и нажмите его на газ или nasm.

Ответ 13

Я бы рекомендовал написать компилятор brainf ** k. Это очень просто и полезно для первого компилятора. И временная шкала была бы больше похожа на полтора часа. Некоторые другие хорошие языки: Forth, Logo и Lisp.