Чистая, автономная виртуальная машина, реализованная в C и размером скомпилированного кода менее 100-200K? - PullRequest
21 голосов
/ 12 марта 2011

Я ищу виртуальную машину со следующими функциями:

  • Небольшая площадь скомпилированного кода ( ниже 200K ).
  • Нет внешних зависимостей.
  • Поддержка Unicode (или необработанной) строки.
  • Чистый код / хорошо организован.
  • C (99) код , НЕC ++.
  • C / Java-подобный синтаксис .
  • Операторы / побитовые: И / ИЛИ и т. Д.
  • Потоки поддержка.
  • Общий / переносимый байт-код .Байт-код должен работать на разных машинах, даже если он был скомпилирован на другой архитектуре с разным порядком байтов и т. Д.
  • Barebones , ничего сложного не требуется.Только базовая языковая поддержка.
  • Lexer / парсер и компилятор отдельно от VM .Я буду встраивать виртуальную машину в программу, а затем самостоятельно компилировать байт-код.

До сих пор я рассмотрел Lua , Белка , Neko, Пешка , Io , AngelScript ... и единственный, который несколько приближается к спецификации, это Lua, но синтаксис ужасен, он не имеет побитовой поддержкии стиль кода вообще отстой.Белка и IO огромны, в основном.Пешка проблематична, она небольшая, но байт-код не является кроссплатформенным, и у реализации есть некоторые серьезные проблемы (бывший байт-код вообще не проверяется, даже заголовки AFAIK).

Я хотел бы найти подходящийвариант там.

Спасибо!

Обновление: Интерпретаторы Javascript - это ... интерпретаторы.Это вопрос виртуальной машины для виртуальной машины на основе байт-кода, следовательно, требование разделения vm компилятора / байт-кода.JS интерпретируется и очень редко компилируется JIT.Я не хочу JIT обязательно.Кроме того, все текущие парсеры ECMAScript все, кроме малого.

Ответы [ 7 ]

6 голосов
/ 12 марта 2011

Вы говорите, что просмотрели NekoVM , но не упоминаете, почему он вам не подходит.

Он написан на C, а не на C ++, виртуальная машина находится под 10kLOC с размером компиляции примерно 100kB, а компилятор является отдельным исполняемым файлом, создающим переносимый байт-код. Сам язык имеет C-подобный синтаксис, побитовые операторы и не является враждебным по отношению к потокам.

3 голосов
/ 12 апреля 2017

JerryScript :

  • требуется менее 64 КБ ОЗУ
  • ~ 160 КБ двоичный размер
  • , написанный на C99
  • На основе VM
  • имеет прекомпиляцию байт-кода

IoT JavaScript склеивает JerryScript с libuv (стиль nodejs) - это может быть прощеиграть.

Потоки, вероятно, не там, где вы хотите.В последнее время в ECMAScript добавлены фоновые рабочие в отдельных потоках и общих многопоточных буферах - не уверен, что с ним в истории в JerryScript - вероятно, еще нет, но кто знает - у них есть план длякак это сделать, может не далеко.

2 голосов
/ 28 апреля 2011

Наконец, после всего этого времени ни один из ответов на самом деле не сделал этого. Я закончил тем, что разветвлял LUA. На сегодняшний день не существует автономной виртуальной машины с вышеуказанными требованиями ... Жаль; (

Тем не менее, Pawn довольно хорош, если только код не был проблематичным.

1 голос
/ 14 апреля 2014

Для чего-то очень "скелета":

http://en.wikibooks.org/wiki/Creating_a_Virtual_Machine/Register_VM_in_C

Более краткое введение в тему, чем что-либо еще, предоставлено.

Тем не менее, он, вероятно, соответствует по крайней мере нескольким из желаемых критериев:

  • Небольшой объем скомпилированного кода (до 200 КБ) ... проверьте, очевидно;
  • Нет внешних зависимостей ... check;
  • Чистый код / ​​хорошо организовано ... проверка;
  • код C (99), НЕ C ++ ... check;
  • C / Java-подобный синтаксис ... check.
1 голос
/ 10 апреля 2012

Попробуйте 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();
    }
}

Потоковая поддержка отсутствует. Но в ВМ нет глобального состояния, поэтому легко запускать несколько копий в одном процессе.

API прост. Доступ к ОЗУ ВМ осуществляется через обратные вызовы. Ваш основной цикл вызывает embedvm_exec(vmdata) несколько раз, он выполняет одну операцию и возвращает.

Виртуальная машина имеет небольшой размер и используется на 8-разрядных микроконтроллерах.

0 голосов
/ 04 марта 2017

По выбору стоит использовать что-то минимальное и расширить его. mini-vm содержит менее 200 строк кода, включая комментарии, имеет либеральную лицензию (MIT), написан на C. Из коробки он поддерживает 0 операций, но его очень легко расширить.Приведенный пример компилятора представляет собой простой калькулятор.Но можно легко представить добавление сравнений, ветвлений, доступа к памяти и обращений супервизора, чтобы вы могли перейти туда, куда хотите.Виртуальная виртуальная машина, которую легко расширить, особенно полезна для разработки языков, специфичных для предметной области, и иметь несколько языков, нацеленных на ваш вид мини-vm, было бы просто, если бы не пришлось реализовывать несколько компиляторов (или портировать их. Компилятор QuakeC просто lcc,и очень легко перенастраивать).

Поддержка потоков должна была бы быть расширением, и базовая виртуальная машина не будет хорошо работать в многопроцессорном сценарии pthread (тяжелая многопоточность).Странно, но mini-vm может иметь ПК (программный счетчик) для каждого тяжеловесного потока, но разделяет регистры между всеми потоками, использующими один и тот же контекст.Выполнение отдельных контекстов было бы поточно-ориентированным.

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

0 голосов
/ 12 марта 2011

Попробуйте встроить интерпретатор JavaScript в ваш код.

http://www.mozilla.org/js/spidermonkey/

...