Почему многие виртуальные машины написаны на C, когда они выглядят так, как будто имеют функции C ++? - PullRequest
4 голосов
/ 23 апреля 2009

Я заметил некоторые не очень старые языки VM, такие как Lua, NekoVM и Potion, написанные на C.

Похоже, что они реализуют многие функции C ++.

Есть ли смысл писать их на C, а не на C ++?

Ответы [ 9 ]

23 голосов
/ 23 апреля 2009

Я кое-что знаю о Луа.

  • Lua написан на чистом стандарте ANSI C и компилируется на любой платформе ANSI без ошибок и предупреждений. Таким образом, Lua работает практически на любой платформе в мире , включая такие вещи, как камеры Canon PowerShot . Сложнее заставить C ++ работать на странных маленьких встроенных платформах.

  • Lua - это высокопроизводительная виртуальная машина, и поскольку C не может выражать вызовы методов (которые могут быть виртуальными или нет) и перегрузку операторов, намного проще прогнозировать производительность кода C просто посмотрев на код. C ++, особенно с библиотекой шаблонов, позволяет слишком легко записывать ресурсы, не зная об этом. (Полная реализация Lua, включающая не только ВМ, но и библиотеки, умещается в 145 КБ объектного кода x86. Весь язык умещается даже в крошечный кэш 256 КБ, который вы найдете на L2 на Intel i7 и L1 на старых чипах. вы делаете, гораздо сложнее написать C ++, который компилируется во что-то такое маленькое.)

Это две веские причины для написания виртуальной машины на C.

6 голосов
/ 23 апреля 2009

Похоже, что они реализуют многие функции C ++.

Вы предлагаете реализовать полиморфизм в C ++ легче, чем в C? Я думаю, что вы сильно ошибаетесь.

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

5 голосов
/ 23 апреля 2009

Один очевидный ответ - совместимость. Каждый раз, когда язык X должен вызывать функции, определенные на языке Y, вы обычно должны убедиться, что X или Y - это C (то есть язык C)

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

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

5 голосов
/ 23 апреля 2009

Люди привыкли к C. Я должен признать, что я с большей вероятностью напишу C для своих собственных проектов, хотя я писал C ++ начиная с cfront 1.0.

Если вам нужен полный контроль над вещами, C немного проще.

3 голосов
/ 23 апреля 2009

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

3 голосов
/ 23 апреля 2009

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

0 голосов
/ 24 апреля 2009

Еще одно замечание: вам стоит взглянуть на CLR (Rotor-incarnation) и исходные коды Java, и вы заметите, что это гораздо больше C ++ - as-C, чем современный или хороший C ++. Таким образом, у него есть параллель, и это побочный эффект абстрагирования для игрушек и доведения его до средней производительности для толпы на управляемых языках.

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

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

Степанов признал это достижение, когда прибил STL, а Бьярне прибил его с помощью шаблонов. Об этих трех вещах всегда стоит задуматься, поскольку у вас нет приличного воплощения их в популярных управляемых языках, не до такой выразительности и сила. Все это прошло более 20 лет, что замечательно и все еще загружается с помощью C / C ++. Наследие добра (но я не защищаю код C темного века 'темного века' c1982-2000, просто идея, что вы можете злоупотреблять чем угодно ).

0 голосов
/ 23 апреля 2009

Во многих случаях код на C может быть намного быстрее, чем C ++. Например, большинство функций в библиотеке stdio.c работают быстрее, чем iostream. scanf быстрее cin, printf быстрее cout и т. д.

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

0 голосов
/ 23 апреля 2009

C ++ реализован на C. Я подозреваю, что все следовали подходу C ++.

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

Два примера.

  • Указатели в дополнение к ссылкам полностью из-за C. Ссылки являются достаточными, и так работают Java, Python и Ruby.

  • Классы не являются первоклассными объектами, которые существуют во время выполнения, потому что класс является лишь способом определения атрибутов и функций метода в базовом коде C. Объекты класса существуют во время выполнения в Java, Python и Ruby, и ими можно манипулировать.

...