Имеет основная реализация *кто-либо* популярный интерпретатор языка программирования, записанный в C++?

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

Но я задавался вопросом, основная реализация — потому что, конечно, люди сделали версии многих интерпретаторов с помощью языка кроме того, используемого исходными авторами — какого-либо популярного интерпретатора языка программирования, использующегося в настоящее время сегодня записанный в C++?

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

12
задан Thomas Larsen 6 July 2010 в 10:56
поделиться

9 ответов

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

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

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

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

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

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

8
ответ дан 2 December 2019 в 06:25
поделиться

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

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

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

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

5
ответ дан 2 December 2019 в 06:25
поделиться

Да, многие. IIRC, виртуальная машина Java Hotspot написана на C ++, Haskells ghc, ...

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

4
ответ дан 2 December 2019 в 06:25
поделиться

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

1
ответ дан 2 December 2019 в 06:25
поделиться

Google Chrome V8 Javascript Engine Implements ECMA-262 and it's extremely fast. Возможно, вы могли бы переписать его на C++, но вам стоит подумать о других возможностях, например, о реализации спецификации байткода, вместо того, чтобы переписывать свои автоматы на C++. Переписывание только поможет упорядочить код (что очень полезно для групповой работы), но ничего не даст в плане производительности.

2
ответ дан 2 December 2019 в 06:25
поделиться

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

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

2
ответ дан 2 December 2019 в 06:25
поделиться

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

1
ответ дан 2 December 2019 в 06:25
поделиться

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

Вот учебник

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

1
ответ дан 2 December 2019 в 06:25
поделиться

Кажется, что Java-реализация Sun в основном написана на C ++.

0
ответ дан 2 December 2019 в 06:25
поделиться