Стек байтового кода против трех адресов
при разработке интерпретатора байтового кода существует ли консенсус в эти дни о том, стек или три формата адреса (или что-то еще?) лучше? Я смотрю на эти соображения:
язык objective-это динамический язык, очень похожий на Javascript.
производительность важна, но скорость разработки и переносимость на данный момент более важны.
поэтому реализация будет строго интерпретатор на данный момент; JIT-компилятор может появиться позже, если позволят ресурсы.
переводчик будет написан на C.
5 ответов
взгляните на интерпретатор байт - кода OCaml-это один из самых быстрых в своем роде. Это в значительной степени машина стека, переведенная в потоковый код при загрузке (с использованием расширения GNU computed goto). Вы можете создать подобное-как резьбовые код, а также, должно быть относительно легко сделать.
но если вы имеете в виду будущую компиляцию JIT, убедитесь, что ваша машина стека на самом деле не является полнофункциональной машиной стека, а формой сериализации дерева выражений вместо этого (например, .NET CLI)-таким образом, Вы сможете перевести свой байт-код "стека" в 3-адресную форму, а затем в SSA.
читать эволюция Lua и реализация Lua 5.0 о том, как Lua изменилась с виртуальной машины на основе стека на виртуальную машину на основе регистра и почему она получила производительность.
эксперименты, проведенные Дэвидом Греггом и Роберто Иерусалимским, показали, что байт-код на основе регистра работает лучше, чем байт-код на основе стека, потому что для выполнения тех же задач требуется меньше инструкций байт-кода (и, следовательно, меньше накладных расходов на декодирование). Так что трехадресный формат-явный победитель.
У меня нет большого (не совсем) опыта в этой области, поэтому вы можете проверить некоторые из следующих для себя (или, может быть, кто-то еще может исправить меня, когда это необходимо?).
двумя языками, с которыми я работаю в настоящее время, являются C# и Java, поэтому я, естественно, склонен к их методологиям. Как известно большинству людей, оба скомпилированы в байтовый код, и обе платформы (CLR и JVM) используют JIT (по крайней мере, в основных реализациях). Кроме того, я бы предположил, что испуг для каждой платформы написаны на C/C++, но я действительно не знаю.
All-in-all, эти языки и их соответствующие платформы очень похожи на вашу ситуацию (помимо динамической части, но я не уверен, что это имеет значение). Кроме того, поскольку они являются такими основными языками, я уверен, что их реализации могут служить довольно хорошим руководством для вашего дизайна.
с этим из пути, я точно знаю, что и CLR и JVM являются стековые архитектуры. Некоторые из преимуществ, которые я помню для stack-based vs register-based, являются
- меньше сгенерированный код
- проще переводчиков
- более простые компиляторы
- etc.
кроме того, я считаю, что стек на основе немного более интуитивным и читаемым, но это субъективная вещь, и, как я уже говорил, я еще не видел слишком много байтового кода.
некоторые преимущества регистра архитектура
- меньше инструкций должно быть выполнено
- более быстрые интерпретаторы (следует из #1)
- можно более легко перевести на машинный код, так как большинство распространенных аппаратных средств основаны на Регистре
- etc.
конечно, всегда есть способы компенсировать недостатки для каждого, но я думаю, что они описывают очевидные вещи для рассмотрения.
Если у вас есть JIT в вашем уме, то байт-коды-единственный вариант.
на всякий случай вы можете взглянуть на мой TIScript:http://www.codeproject.com/KB/recipes/TIScript.aspx и источники:http://code.google.com/p/tiscript/