2009-09-29 2 views
26

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

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

Например, это имело бы смысл для начальной загрузки компилятор C++ - это потенциально может быть гораздо легче поддерживать компилятор, когда ООП используется должным образом, в отличие от использования обычного C.

С другой стороны, MATLAB, конечно, делает матричную математику намного проще, чем обычную C, но я не вижу никаких очевидных преимуществ от написания компилятора/интерпретатора MATLAB в MATLAB - похоже, что это станет less ремонтопригодным. Аналогичный взгляд можно применить к языку программирования R. Или довольно экстремальный пример будет загрузочный Whitespace, который написан в Haskell - определенно массивный супер набор Whitespace.

Это единственная причина для самонастройки, чтобы воспользоваться возможностями нового языка? Я знаю, что есть и «потому что мы можем» рассуждать, но это не то, что я ищу :)

+4

Простые пробелы на самом деле довольно удобные. Вам просто нужно использовать подсветку синтаксиса. :) – BobbyShaftoe

ответ

28

Существует принцип, называемый «есть свой собственный дог». Используя инструмент, вы демонстрируете полезность инструмента.

Часто задают вопрос: «Если компилятор для языка X не написан на языке X, почему я должен его использовать?»

Это, конечно, относится только к языкам, подходящим для области написания компилятора.

+3

Я думаю, что почти каждый * хороший * язык, который я использовал, был разработан и написан в сочетании с программой, которая его использует. Иногда это его собственный компилятор, иногда нет, но компилятор - отличный первый случай. В дополнение к тому, чтобы быть сразу же полезным, компилятор представляет собой довольно сложную программу (или может быть), и если вы можете написать свой собственный компилятор, скорее всего, он будет иметь более простые проблемы на завтрак! – Ken

9

Это можно рассматривать как бар, который отделяет «игрушечные» языки от «настоящих» языков. Если язык недостаточно богат, чтобы реализовать себя, он все еще игрушка. Но это, вероятно, отношение от давно ушедшей эпохи, учитывая количество популярных сегодня языков, которые реализованы в C.

+13

Я не согласен с категоризацией «игрушек» против «реального». Языки служат целям. Некоторые из них - языки общего назначения, такие как C, VB и т. Д., Которые могут быть использованы для изобретения. Другие, такие как MATLAB, специализируются на решении конкретных классов проблем. Это не делает их «игрушечными» языками, просто специализированными. – NotMe

+1

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

7

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

+1

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

+0

Вы можете быть удивлены. Я говорю на нескольких языках, но когда мне приходилось пытаться поддерживать систему, которая была задокументирована в двух, которые я знаю лучше всего (на английском и немецком языках), я обнаружил, что это было как минимум в 10 раз сложнее, чем поддержание полностью на английском языке. Небольшие несоответствия импеданса действительно складываются. – Ken

13

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

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

2

Вы не загружаете компилятор для DSL. Вы не пишете компилятор SQL-запросов в SQL. MATLAB может выглядеть как язык общего назначения, но на самом деле это не так - это язык, предназначенный для численных расчетов.

3

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

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

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

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

2

Бутстрапирование имеет также еще одно преимущество: если ваш язык хорошо, вы можете сэкономить время написания компилятора в < языке вставить здесь >, чем, скажем, С. Так, например, C# компилятор был написан на C++, но теперь они переписывают его на C#, что позволяет им (среди прочего) использовать структуру потоков из CLR вместо того, чтобы сворачивать свои собственные на C++ (и следить за лидерами Mono, а также, мудрый маркетинг, Mono был в лучшем потому что мы можем сказать, что наш C# -компилятор написан на C#).

1

Есть несколько причин, вы можете сделать это (теоретически):

  1. Ваш компилятор генерирует более оптимизированный код, чем другие компиляторы на начальной загрузки платформы.
  2. Ваш компилятор генерирует более правильный код , чем другие компиляторы на платформе загрузки .
  3. Вы эгоистичный рывок, который убежден, что один из указанных выше - , правда, хотя это не так.
  4. Существует не компилятор доступен на вашей платформы (это оригинальную логика GCC, потому что многие платформа не имеет компилятора Си обратно в тот же день).
  5. Вы хотите доказать, что ваш компилятор может обрабатывать его (это, в конце концов, на самом деле довольно хороший тест компилятора).
4

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

Однако, если ваш язык не предназначен для решения тех же проблем, что и для компиляции, то самонастройка только соблазнит вас загромождать ваш язык функциями, связанными с компиляцией, но не с вашей целевой проблемой. Самокомпиляция с помощью Matlab или SQL была бы смешной; У Matlab нет причин включать сильные функции манипуляции строками, и у SQL нет причин поддерживать генерацию кода. Результирующий язык будет ненужным и загроможденным.

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

10

Кен Томсон Reflections on Trusting Trust объясняет одну из лучших причин для самонастройки. По сути, ваш компилятор изучает новые вещи для каждой версии компилятора в цепочке самонастройки, которую вам никогда не придется учить этому.

В случае, о котором он упоминает, в первом компиляторе (C1), который вы пишете, должно быть явно указано, как обращаться с обратным слэшем. Однако второй компилятор (C2) скомпилирован с использованием C1, поэтому обратная обработка обратного слэша обрабатывается.

Основой его беседы является возможность того, что вы могли бы научить компилятора добавлять бэкдор к программам, а будущим компиляторам, скомпилированным с компрометацией компромисса, также была предоставлена ​​эта возможность, а он никогда не появлялся в источнике !

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

Потратьте минутку, чтобы понять последствия.

[edit]: Это довольно ужасный способ создания компилятора, но крутой фактор - через крышу. Интересно, можно ли управлять с помощью правильной структуры?

2

В качестве конкретного примера, в version 1.5 (выпущено августа 2015 года), Go включается в быть полностью бутстрапированным языком [1][2]. Они перечислены следующие причины:

  • Go проще написать (правильно), чем C.
  • Go легче отлаживать, чем C (даже отсутствует отладчик).
  • Перейти - это единственный язык, который вам нужно будет знать; поощряет вклады.
  • Go имеет лучшую модульность, оснащение, тестирование, профилирование, ...
  • Go выполняет параллельное выполнение тривиально.

Из них единственный, который будет храниться для всех языков, состоит в том, что вам нужно знать только один язык, чтобы внести свой вклад в компилятор. Другие аргументы можно резюмировать следующим образом: «Наш новый язык лучше старого». Скорее всего, это правда, почему еще вы напишете новый язык?

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