Чистая, автономная виртуальная машина, реализованная в C и под 100-200K скомпилированного кода?
Я ищу виртуальную машину со следующими функциями:
- Небольшая скомпилированная область кода (ниже 200K).
- Нет внешних зависимостей.
- Поддержка Unicode (или raw).
- Очистить код/хорошо организованный.
- C (99) код, не С++.
- Синтаксис типа C/Java.
- Операторы/побитовые: AND/OR и т.д.
- Поддержка Threading.
- Общий/портативный байт-код. Bytecode должен работать на разных машинах, даже если он был скомпилирован в другой архитектуре с различной степенью точности и т.д.
- Barebones, ничего не нужно. Только базовая поддержка языка.
- Lexer/парсер и компилятор отдельно от VM. Я буду внедрять VM в программу, а затем скомпилировать байт-код независимо.
До сих пор я рассмотрел Lua, Squirrel, Neko, Pawn, Io, AngelScript... и единственный, который близок к спецификации, - Lua, но синтаксис ужасно, он не имеет побитовой поддержки, а стиль кода обычно отстой. Белка и ИО огромны, в основном. Пешка проблематична, она небольшая, но байт-код не является кросс-платформой, и реализация имеет некоторые серьезные проблемы (например, байт-код не проверен вообще, даже заголовки AFAIK).
Я хотел бы найти подходящий вариант там.
Спасибо!
Обновление: Устные переводчики Javascript - это... интерпретаторы. Это вопрос VM для виртуальной машины на основе байт-кода, следовательно, требование разделения компилятора/байт-кода vm. JS интерпретируется и очень редко компилируется JIT. Я не хочу, чтобы JIT обязательно. Кроме того, все текущие анализаторы ECMAScript почти невелики.
Ответы
Ответ 1
Наконец, после всего этого времени ни один из ответов на самом деле не сделал этого. Я закончил тем, что бросил LUA. На сегодняшний день не существует автономной виртуальной машины с указанными выше требованиями... жаль; (
Тем не менее, Pawn довольно хорош, если только код не был проблематичным.
Ответ 2
Вы говорите, что просмотрели NekoVM, но не упоминайте, почему он вам не подходит.
Он написан на C, а не на С++, VM находится под 10kLOC с скомпилированным размером примерно 100 КБ, а компилятор - это отдельный исполняемый файл, создающий портативный байт-код. Сам язык имеет C-подобный синтаксис, побитовые операторы, и он не является нить-враждебным.
Ответ 3
JerryScript:
- требуется менее 64 КБ оперативной памяти.
- ~ 160 KB двоичный размер
- написан на C99
- Основанная на VM
- имеет предварительную компиляцию байт-кода
JavaScript JavaScript glues JerryScript с libuv (стиль nodejs) - с ним может быть проще играть.
Threading, вероятно, не существует в состоянии, которое вы хотите. Недавние добавления в ECMAScript вокруг фоновых работников по отдельным потокам и совместным потоковым буферам - не уверен, что история с ним в JerryScript - возможно, еще нет, но кто знает - у них есть план того, как это сделать, может быть далеко.
Ответ 4
Попробуйте EmbedVM.
http://www.clifford.at/embedvm/
http://svn.clifford.at/embedvm/trunk/
Вот пример некоторого кода, игра для угадывания. Компилятор построен в C с помощью lex + yacc:
global points;
function main()
{
local num, guess;
points = 0;
while (1)
{
// report points
$uf4();
// get next random number
num = $uf0();
do {
// read next guess
guess = $uf1();
if (guess < num) {
// hint to user: try larger numbers
$uf2(+1);
points = points - 1;
}
if (guess > num) {
// hint to user: try smaller numbers
$uf2(-1);
points = points - 1;
}
} while (guess != num);
// level up!
points = points + 10;
$uf3();
}
}
Нет поддержки потоков. Но в VM нет глобального состояния, поэтому легко запускать несколько копий в одном и том же процессе.
API прост. Доступ к виртуальной памяти осуществляется через обратные вызовы. Ваш основной цикл вызывает embedvm_exec(vmdata)
несколько раз, он выполняет одну операцию и возвращает.
VM имеет небольшой размер и используется на 8-разрядных микроконтроллерах.
Ответ 5
Для чего-то очень "barebones":
http://en.wikibooks.org/wiki/Creating_a_Virtual_Machine/Register_VM_in_C
Более краткое введение в тему, чем что-либо еще, предоставлено.
Тем не менее, он, вероятно, удовлетворяет по крайней мере этим нескольким из желаемых критериев:
- Небольшой скомпилированный код (ниже 200K)... проверьте, очевидно,
- Нет внешних зависимостей... check;
- Чистый код/хорошо организованный... check;
- C (99) код, NOT С++... check;
- Синтаксис типа C/Java... проверьте.
Ответ 6
В опции - использовать что-то минимальное и расширять его. mini-vm находится под 200 строками кода, включая комментарии, у него есть либеральная лицензия (MIT), она написана на C. Из box поддерживает 0 операций, но его очень легко расширить. Включенный примерный компилятор - это простой калькулятор. Но можно легко представить, как добавить сравнения, ветки, доступ к памяти и вызовы супервизора, чтобы взять их туда, куда вы хотите пойти. Виртуальная виртуальная машина, которая легко расширяется, особенно полезна для разработки доменных языков, и наличие нескольких языков, нацеленных на ваш вкус mini-vm, было бы прямолинейным, кроме как реализовать несколько компиляторов (или их переносить). Компилятор QuakeC - это всего лишь lcc, и очень легко перенацеливаться).
Поддержка потоковой передачи должна быть расширением, а основная виртуальная машина не будет хорошо играть в многопроцессорном сценарии pthread (суперпоточный поток). Вряд ли mini-vm может иметь ПК (счетчик программ) на один тяжелый поток, но будет делиться регистрами между всеми потоками, используя один и тот же контекст. Запуск отдельных контекстов был бы потокобезопасным, хотя.
Я пропускаю ответы на требования к языку, потому что вопрос начинается с просьбы о виртуальной машине с баребонами. Но в то же время требует синтаксиса C/Java, не уверен, как разрешить этот конфликт, кроме как указать этот конфликт.
Ответ 7
Попробуйте внедрить интерпретатор JavaScript в свой код.
http://www.mozilla.org/js/spidermonkey/