C++ реализован на простом C
Я несколько раз читал, что ранние компиляторы C++ переводили первый код C++ в простой C перед его компиляцией (или, возможно, требовался сторонний компилятор C).
Играя себя с полями грамматики / языка / компиляции, мне любопытно посмотреть, как C++ был реализован в простом C, особенно в том, что может быть одним из способов реализации наследования классов и вызова [виртуального] метода.
Не могли бы вы указать мне на такой компилятор, который все еще будет доступен в настоящее время?
Я знаю, что ОО-код может быть смоделирован / эмулирован в простом C с помощью указателей структур и функций, но я хотел бы увидеть фактическую реализацию языка C++ в C.
5 ответов
Вы можете попробовать cfront. Вы можете скачать старые версии здесь. Но он поддерживает только очень ограниченное подмножество C++. Некоторые функции, такие как исключения, не могут быть реализованы таким образом.
Обновление: как отметил Максим Егорушкин, исключения могут быть реализованы с помощью setjmp/longjmp. Но если я правильно помню, исключения не могут быть реализованы в виде библиотеки в C++. Они должны быть частью основного языка.
Если вы просто хотите увидеть, как C++ может быть переведен в C, у вас есть несколько вариантов, и в разделе часто задаваемых вопросов по C++ есть раздел, который описывает это здесь. Он охватывает все основные варианты, которые я когда-либо видел предложенные, и должен быть обновлен, когда появятся новые опции.
Компилятор Comeau работает таким образом. В свое время все хвалили его соответствие стандарту и использовали Comeau онлайн для тестирования фрагментов кода, но лишь немногие использовали его для создания производственных кодов.
Веб-интерфейс EDGE также работает таким образом. Я слышал, что он используется компилятором Intel C++ и Comeau.
Первый компилятор Microsoft C++ был именно таким, как вы описали, я знаю, потому что я помню, как использовал его. Из моей памяти я думаю, что это была версия 7 их компилятора Си. Это было бы около 1992 года (плюс / минус 2 года).
Обновление: см. http://en.wikipedia.org/wiki/Visual_C%2B%2B, тот, на который я ссылаюсь, действительно был выпущен в 1992 году и назывался "C/C++ 7.0".
Вот как оригинальная реализация C++, называемая cfront
, работал. Это был интерфейс для компилятора Си. Это не так часто в наши дни, хотя внешний интерфейс EDG C++ может быть сконфигурирован с бэкэндом C, так что он генерирует C-код. Это полезно, когда вы запускаете новый компилятор, но в производственном компиляторе это пустой шаг, поэтому коммерческие компиляторы обычно переходят непосредственно к предпочтительной форме целевой платформы. И вы действительно не хотите отлаживать вашу программу, читая сгенерированный C-код. Я не делал этого для C++, но когда я работал в Dinkumware, мы реализовали базовые библиотеки Java в сочетании с разработкой EDG Java. Код на C логически структурирован, но очень похож на LISP: множество адских глупых скобок.