Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие языки > [???] виртуальная машина


Автор: GoldFinch 21.5.2010, 15:15
Хочу создать язык, компилируемый в байткод, и виртуальную машину (ВМ), выполняющую этот байткод.

Основное требование - минимальный размер скомпилированного байткода, и минимальный размер файлов исполняемых модулей.
При этом размер ВМ, ее потребление ресурсов при выполнении байткода, производительность, имеют существенно меньшее значение.

ВМ должна быть написана на нативном языке (асм, Си или С++) под Windows.
Язык должен быть способен выполнять любые задачи, какие может выполнять асм или Си.

=================

Способы реализации: 
Наиболее простой - сжимать байткод zip'ом, а перед выполнением распаковывать. Такое можно использовать как последний способ уменьшить размер байткода.
Очевидно, что уменьшения объема байткода можно добиться встраивая в ВМ мощные средства, типа solve_me_this_task.
На низком уровне, можно использовать упаковку бит инструкций ВМ.

Интуитивно понятно, что если взять программу на высокоуровневом языке типа перла, и перевести текст исходника в бинарный вид, то это и будет минимальный размер программы. Причем чем более язык высокоуровневый, тем меньше объем кода программы. 
Тогда как если ВМ будет RISC, то размер программ будет большим.

Автор: Lipetsk 21.5.2010, 15:23
может быть вас Lua устроит? и не надо ничего создавать? ;)

Автор: GoldFinch 21.5.2010, 15:51
Lipetsk, прочитайте 3й абзац.
Переписывать Lua под нужные мне требования - это слишком затратно.

У программы должен быть полный доступ к регистрам процессора и памяти (в том числе TEB, [fs:18]).
Поддержка импорта и вызова функций из длл, и прочие низкоуровневые вещи которых нет в Lua.

Автор: kemiisto 21.5.2010, 16:39
Я в замешательстве. smile 

Цитата
virtual machine was originally defined by Popek and Goldberg as "an efficient, isolated duplicate of a real machine".

Цитата
An essential characteristic of a virtual machine is that the software running inside is limited to the resources and abstractions provided by the virtual machine—it cannot break out of its virtual world.


А ты пишешь, что
Цитата(GoldFinch @  21.5.2010,  16:15 Найти цитируемый пост)
Язык должен быть способен выполнять любые задачи, какие может выполнять асм или Си.


Хочется уточнить, ты хочешь написать низкоуровневый ЯП для своей ВМ? Я правильно понял? Что-то вроде LLVM?

Цитата(GoldFinch @  21.5.2010,  16:15 Найти цитируемый пост)
Наиболее простой - сжимать байткод zip'ом, а перед выполнением распаковывать. Такое можно использовать как последний способ уменьшить размер байткода.

Так происходить на JVM. http://en.wikipedia.org/wiki/JAR_%28file_format%29.

Автор: GoldFinch 21.5.2010, 18:18
kemiisto, возможности ВМ определяются ее назначением. В настоящее время есть большой класс ВМ которые не "efficient" и не "isolated" в силу своего назначения. Но если вас смущает термин ВМ, можно использовать термин "платформа /для выполнения байткода/".

Цитата(kemiisto @  21.5.2010,  17:39 Найти цитируемый пост)
Хочется уточнить, ты хочешь написать низкоуровневый ЯП для своей ВМ? Я правильно понял? Что-то вроде LLVM?

Наоборот, я считаю что у ВМ должен быть максимально высокоуровневый ЯП, тогда код для нее будет минимален.

Доступ к памяти реальной машины можно реализовать например введя встроенный массив Memory[] в который будет отображена реальная память. Для регистров процессора - встроенную переменную-структуру Registers (соответствующую регистрам на входе в функцию, для коллбеков с соглашением вызова использующим регистры).

Как я уже писал, сжатие кода zip-ом, это способ который стоит применять когда все другие уже исчерпаны. Тем более что я ожидаю что размер программ для ВМ будет небольшим, порядка единиц килобайт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)