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

Является ли первичная реализация * любого * популярного переводчика языка программирования, написанного на С++?

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

Но мне было интересно, это основная реализация &mdash, потому что, конечно, люди сделали версии многих интерпретаторов, используя язык, отличный от того, который используется оригинальными авторами. любого популярного в настоящее время интерпретатора языка программирования, написанного на С++

И, если нет, есть ли веская причина не писать интерпретатор в С++? Я понимаю, что код С++, если он написан правильно, может быть очень переносимым и потенциально скомпилирован для работы так же быстро, как скомпилированный код C, который делает то же самое.

4b9b3361

Ответ 1

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

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

Я просто должен был сначала использовать python (или lua или любой другой готовый интерпретатор, который может быть легко встроен и имеет разумное лицензирование)... Мое единственное оправдание в том, что я не знал о python или lua в то время.

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

С++ по-прежнему является языком низкого уровня, и, хотя вы можете получить некоторую помощь, например, на стороне обработки памяти, основным предположением языка является то, что ваш код на 100% прав, поскольку ошибка во время выполнения поможет вам (только демоны поведения undefined).

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

Ответ 2

Если вы написали текущую версию и, как вы сказали в своем комментарии, она:

неуклюжая обработка символов и многочисленные утечки памяти

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

Update: Я думаю, комментарий > объясняет, почему многие языки реализованы на C, а не на С++. На тему полных переписаний прислушался к словам Джоэла Спольского.

Ответ 3

Да, многие. IIRC Hotspot Java VM написан на С++, Haskells ghc,...

Как много здесь отметили, вы действительно должны взглянуть на LLVM, это инструментарий для создания компилятора, интерпретатора и виртуального машины. В основном вы выполняете работу с внешним интерфейсом (например, анализируете свой язык + семантический анализ + codegen в LLVM IR), и LLVM немедленно предоставит вам возможность создавать разные платформы, jit, оптимизацию, компиляцию в собственный код,... Он также имеет некоторые инструменты для анализа и AST, а также обработку ошибок и уведомление (но, возможно, это часть подпроекта Clang.)

Ответ 4

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

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

Ответ 5

Google Chrome V8 Javascript Engine реализует ECMA-262, и это очень быстро. Возможно, вы могли бы переписать его на С++, но вы подумали о других функциях, таких как реализовать спецификацию байт-кода, вместо этого переписывая автоматизацию на С++. Перепишите это просто поможет организовать код (что отлично для групповой работы), но ничего не работает.

Ответ 6

Фонд GNU только что объявил о том, что все новые версии gcc будут записаны в С++.

Ответ 7

Tamarin - интерпретатор Adobe и Mozilla ECMAScript написан на С++. Будучи тем, за кого автор оригинального языка несет ответственность, его можно считать первичным (IIRC-эталонная реализация ECMA написана в OCaml, но это фактически не используется, кроме как ссылка)

Ответ 8

Если утечка памяти - это единственная проблема с вашей текущей программой, тогда попробуйте valgrind. У меня никогда не было утечки памяти в моем программном обеспечении, которое valgrind не смог найти для меня. На самом деле это спасло мою задницу так много раз.

Вот учебник

http://www.cprogramming.com/debugging/valgrind.html

Ответ 9

Реализация Sun Java, по-видимому, написана на основном языке С++.

Ответ 10

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

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

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

Тем не менее, многие языки начинают свою первую версию, написанную на С++, первый простой компилятор, а затем записывают следующую версию в этой простой версии ( "bootstrapping" ). Это имеет то преимущество, что вы можете использовать свой собственный язык для его расширения. Чтобы перенести его, они затем модифицируют только свой компилятор для кросс-компиляции на нужную платформу, а затем создают компилятор с этим кросс-компилятором, а результат является родной версией полного языка для новой платформы.

Языки, которые, как правило, не делают этого, обычно - это, главным образом, языки сценариев, которые, как правило, остаются как интерпретированные языки С++, хотя другие упоминают популярные исключения).

Другой распространенной причиной выбора С++ является существующая инфраструктура. Например. если вы хотите привязываться к существующим системным фреймворкам, вам часто приходится опускаться до С++ или если вы хотите использовать существующие компиляторы (например, LLVM, написанные на С++) или даже если они используют только C, часто С++ является наиболее подходящим языком OO-подобной реализации, который может легко разговаривать с частями C системы.

Итак, вопрос, который вы хотите задать себе, скорее всего: каковы мои потребности и какой язык лучше всего подходит им?

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