Является ли основная реализация * любого * популярного интерпретатора языка программирования написанным на C ++? - PullRequest
12 голосов
/ 06 июля 2010

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

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

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

Ответы [ 10 ]

8 голосов
/ 06 июля 2010

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

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

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

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

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

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

5 голосов
/ 06 июля 2010

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

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

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

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

4 голосов
/ 06 июля 2010

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

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

2 голосов
/ 06 июля 2010

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

2 голосов
/ 06 июля 2010

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

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

1 голос
/ 07 июля 2010

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

Вот учебник

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

1 голос
/ 06 июля 2010

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

1 голос
/ 06 июля 2010

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

0 голосов
/ 22 апреля 2017

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

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

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

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

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

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

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

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

0 голосов
/ 06 июля 2010

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

...