Подтвердить что ты не робот

Чистая, автономная виртуальная машина, реализованная в 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 почти невелики.

4b9b3361

Ответ 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, не уверен, как разрешить этот конфликт, кроме как указать этот конфликт.