Ответ 1
Мое предложение - выбрать свой любимый язык. Знания, которые вы в него вносите, перевесят трудность написания компилятора для него, как правило.
Вдохновленный интервью Эрика Синка в подкасте stackoverflow, я хотел бы построить полный компилятор в свое свободное время для изучения. Моя первоначальная мысль заключалась в создании компилятора C, но я не уверен, потребуется ли это слишком много времени.
Мне интересно, есть ли более общий язык общего назначения, который будет более подходящим для реализации в качестве первого усилия компилятора? Или это выполнение на C в разумные сроки (200 часов)?
Я намерен настроить таргетинг на CLR.
Мое предложение - выбрать свой любимый язык. Знания, которые вы в него вносите, перевесят трудность написания компилятора для него, как правило.
Вы будете счастливее писать компиляторы для более старых, более мелких языков. Pascal, например, были разработаны как инструменты обучения. Язык Паскаля маленький и элегантный; компилятор может быть написан достаточно просто.
Даже Oberon или Modula-2 компилятор похож по сложности на Pascal; их дизайн был основан одним и тем же человеком, Никлаусом Виртом.
Языки, подобные C, которые органично развивались, слишком полны причуд, чтобы быть хорошим опытом обучения.
Напишите компилятор схемы.
Если вам нужен компактный учебник, почему бы не рассмотреть Wirth Compiler Construction (pdf). Исходный язык (Oberon-0) достаточно прост, чтобы компилятор был понятен. Язык реализации (Oberon) должен быть доступен для всех, кто сделал некоторые программы.
О том, какой язык использовать для реализации компилятора. Используйте то, с чем вы знакомы. Если вы сомневаетесь, выберите язык, который не будет излишне усложнять попытку: что-то с сборкой мусора. Что-то, что позволяет легко печатать или иным образом удалять внутренние структуры данных для проверки. Python, Scheme и Lua все приходят в голову.
Последнее соображение - это то, что нужно настроить с помощью вашего компилятора. Я уверен, что виртуальные машины JVM и CLR. Вы можете пойти по этому маршруту. Для первой попытки использовать симулятор для урезанного RISC-процессора в качестве вашей цели может быть проще. (Книга компилятора Wirth делает это.)
Я бы не рекомендовал таргетинг x86 для вашего первого компилятора, поскольку он отвратительный, чем слова. Я также не буду ориентироваться на высокий уровень языка, например C, потому что вы пропустите множество интересных деталей, например, как реализовать семантику коротких замыканий для булевых операторов и т.п.
Еще один момент в пользу схемы: для новичков практично писать компилятор для самостоятельного хостинга, например, Kragen Sitaker Ur-Scheme, его первый компилятор. Есть несколько других компиляторов 'tutorial', достаточно мощных для компиляции (хотя есть некоторые указатели на ссылку). Это приносит больше реализма и интерес к проблеме.
Какой бы язык вы ни выбрали, помните, что вы можете определить свой собственный набор поддерживаемых функций, чтобы настроить его в соответствии с вашими целями обучения. Если вы хотите узнать о компиляторах (что похоже на то, что вы делаете), тогда вы можете написать компилятор C, но просто отказаться от поддержки какой-либо случайной функции, например, указатели или реализовать только подмножество ключевых слов, чтобы сделать это более управляемым.
Конечно, если ваша цель - стать действительно интимным с определенным языком, вам нужно полностью реализовать компилятор для этого языка.
Паскаль уже упоминался, но я хотел бы добавить, что книга Никлауса Вирта Алгоритмы + Структуры данных = Программы содержит полную реализацию небольшого Pascal-языка, использующего рекурсивный спуск. Если вы ищете теоретическую дискуссию по разбору, смотрите в другом месте; но если вам нужен простой код, который позволяет вам учиться, я бы рекомендовал A + DP = P.
Какой бы язык вы ни выбрали, вы можете подумать о компиляции на промежуточном языке (IL) для таргетинга на Common Language Runtime (CLR). Я предполагаю, что таргетинг на виртуальную машину Java (JVM) будет похож на не-Windows или, возможно, на реализацию CLR в Mono? Это, вероятно, значительно упростит работу и позволит вам иметь что-то, что хорошо сработало. Вы позже перенацеливаете определенную архитектуру, если хотите продолжить.
Я не могу придумать ни одного языка, который достаточно прост для использования в качестве первого упражнения для написания компилятора. Я не думаю, что попробую С для первого разреза. Почему бы не изобрести свой собственный язык? Может быть, это будет настоящий удар.
В курсе компилятора мы написали компиляторы для подмножества C (мне нравилось думать о нем как C--). Это было не так сложно, так как вы знали, где ваши границы. Вы всегда можете реорганизовать и добавить дополнительные функции позже.
В терминах простоты FORTH станет одним из самых легких языков для разработки. Он пронизывал интерпретацию, а не компилировал ее, но вы все равно будете разбираться с разбором, переменным хранилищем и т.д.
Для компилятора я бы пошел с C или Pascal, оба из которых довольно компактны и имеют источник для доступных компиляторов.
Напишите мозговой или четвертый компилятор. BASIC, возможно, также является таким языком, который не слишком богат функциями. Я думаю, что C будет умеренно тяжелым. Не завидуйте целевой арке. Используйте все, что у вас есть.
Если вы не хотите внедрять ассемблер, тогда поставьте свой код сборки для сборки компилятора и нажмите его на газ или nasm.
Я бы рекомендовал написать компилятор brainf ** k. Это очень просто и полезно для первого компилятора. И временная шкала была бы больше похожа на полтора часа. Некоторые другие хорошие языки: Forth, Logo и Lisp.