2009-07-23 3 views
7

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

Как родился новый язык? Этот новый язык NEW должен быть написан на старом языке OLD (например, C++ был написан на C на начальных этапах), или как это создается? И как этот язык NEW может работать сам, если для него нет компилятора? Значит, для этого должен быть какой-то компилятор? Кто пишет для этого компилятор?

Итак, как все это работает вместе, новый язык и его компилятор, отношение нового языка со старым базовым языком?

+1

Спасибо всем за такие быстрые ответы. Думаю, курс по дизайну компилятора - это то, что мне нужно. Но мне было интересно/интересно, как все вы можете так быстро ответить, я имею в виду в течение 1-2 минут, что очень удивительно? –

+2

Мы все умираем за очки репутации. Продвиньте нас, пожалуйста! :-) –

+0

@Norman: Я новичок в SO и мало знаю о репутации. Обязательно проверьте все это, когда я свободен. Наверное, ты счастлив. :) –

ответ

5

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

Вот как это работает.

Редактировать: Чтобы уточнить, комментаторы этого ответа также верны. Компилятор не должен быть написан на новом языке, если вы этого не хотите. Как сказано, некоторые не идут по этому маршруту и ​​остаются с оригинальным языком реализации.

+0

Да, это все в двух словах. Есть те, которые не верят, что это настоящий язык, если он не может быть использован для написания собственного компилятора :) – wcm

+0

Чтобы добавить к ответу Scyllinice: не все языки могут идти по этому маршруту, конечно, много вариаций LISP являются чистыми переводчики без возможности создания исполняемого файла как такового, а компилятор LISP может быть написан практически на любом языке. Языки OLD и NEW не обязательно должны иметь какое-либо реальное соединение друг с другом. – Mike

+0

, однако вам необязательно переносить исходный язык реализации. Например, Tcl и многие (большинство?) Языков сценариев используют язык программирования C или C++ задолго до того, как новый язык стал зрелым и стабильным. –

2

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

1

Сердце любого языка - это компоновщик и компилятор, который преобразует исходный код в посредника, очень близко к машинным кодам, коду. С этого момента линкеры используются для присоединения к другим двоичным файлам, таким как библиотеки и т. Д. После того, как двоичные файлы связаны со всеми логическими частями, они становятся исполняемым файлом в машинный код (или переводным промежуточным кодом, как и с .NET/Java).

Самый переводимый с «человеческого» английского происходит в компиляторе, и есть большие статьи о том, как это делается ... но большинство из них находится в сфере сверхъестественного, поскольку организационные навыки, необходимые для написать рабочий компилятор огромны.

Вы можете видеть типы переводов на уровне поверхности и ознакомиться с тем, как работают компиляторы, изучая определения языка («Язык программирования C++» Бьярна Страуструпа », Microsoft Press« Язык программирования C# »), где оба приложения и наперёд - лексические фрагменты или правила, которые компилятор будет использовать для перевода ваших слов в машинный код очень логичным образом.

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

+0

Я не согласен с утверждением: «организационные навыки, необходимые для написания рабочего компилятора, огромны». Назад, когда мне было всего несколько лет в колледже и я никогда не принимал класс компилятора, мне удалось создать язык специального назначения, используя lex и yacc. Хотя это было трудно, это было далеко не очень сложно. Это было действительно полезно. –

+0

@ Брайан: Это зависит. С современными инструментами генерации компилятора можно легко создать небольшой язык (например, многие языки, специфичные для домена), но @Sprague принимает что-то более мясистое. Как только вы добавите во все оптимизации, генерации кода и т. Д., Необходимые для основного языка программирования, такого как Python, Java или C#, работа может стать очень требовательной. Затем есть вспомогательные задачи, такие как дизайн VM, алгоритмы GC, стандартные библиотеки, ... –

0

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

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

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

1

Отличный вопрос!

  • Иногда компилятор для нового языка написан на старом языке.

  • Если компилятор для нового языка N записывается в N, существует множество стратегий, все из которых вовлекают найти какой-нибудь способ для запуска программы на языке N когда вы еще не имеете компилятор.

    1. Напишите интерпретатор для языка N, скажем, в C (на самом деле язык по вашему выбору), а затем использовать интерпретатор интерпретировать компилятор компиляции себя.

      • Написать действительно ужасающее компилятор для N, скажем, в C, а затем использовать его для компиляции первой версии компилятора.

      • Скомпилируйте первую версию компилятора в код сборки или код C, как правило, вручную.

Моя любимая стратегия # 1, но все они работают.

Если вы хотите, чтобы это решение было подробно объяснено, обратите внимание на короткую бумагу Эндрю Аппеля Axiomatic Bootstrapping: A Guide for Compiler Hackers, которая свободна от веб-сайта Princeton. Эта статья является очень математической, но в разделе связанной работы вы найдете ссылки на старые статьи, в том числе те, которые показывают процесс начальной загрузки с использованием T-диаграмм, которые многие люди находят очень интуитивными.

Смежные вопросы