Загрузочный компилятор: почему?

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

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

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

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

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

Ответ 1

Там есть принцип, называемый "есть свой собственный dogfood". Используя инструмент, вы демонстрируете полезность инструмента.

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

У Bootstrapping есть еще одно преимущество: если ваш язык хорош, вы можете сэкономить время, написав свой компилятор в < insert language here > чем в let say C. Например, компилятор С# был написан на С++, но теперь они переписывают его на С#, что позволяет им (среди прочего) использовать инфраструктуру потоков из CLR вместо того, чтобы сворачивать свои собственные в С++ ( и следить за лидерами Mono, а также, мудрый маркетинг, Моно был в лучшем положении, будучи в состоянии сказать, что наш компилятор С# на самом деле написан на С#).

Ответ 10

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

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

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

Ответ 11

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

  • Ваш компилятор генерирует больше оптимизированный код, чем другие компиляторы на платформе загрузки.
  • Ваш компилятор генерирует более правильные кода, чем другие компиляторы на загрузочная платформа.
  • Ты эгоистичный рывок, который что один из правда, хотя это не так.
  • Не существует компилятора на вашей платформы (это был GCC оригинальная логика, потому что многие у платформ не было компилятора C в тот же день).
  • Вы хотите доказать, что ваш компилятор может справиться с этим (это, в конце концов, на самом деле довольно хороший тест компилятора).