ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



байткод КуМир-а

Сообщений 1 страница 6 из 6

1

Средства, изначально работающие в браузере

Евгений написал(а):

Спецификация байткода Кумир
Кумир имеет два режима выполнения: быстрый - используя машинный код, полученный компилятором gcc из промежуточного C99-кода, и стандартный - используя интерпретатор байт-кода. Данный документ описывает используемый байт-код.
1 Основные положения. Структура программы интерпретатора
Программа интерпретатора состоит из:

    таблицы констант;
    таблиц глобальных переменных;
    таблиц локальных переменных;
    таблицы используемых внешних функций;
    программного кода, являющегося набором инструкций для каждого отдельно Кумир-алгоритма.

В программе данные элементы описываются в произвольном порядке. Каждый элемент определяется заголовком, данными и, при необходимости – размером элемента в программе.
Программа может иметь как бинарное, так и текстовое представление. Эти представления эквивалентны, для их преобразования предназначена утилита kumir2-as, входящая в поставку Кумир, которая преобразует текстовое представление в бинарное и наоборот.
Формальное описание бинарного и текстового представления кода будет приведено в приложениях.
Для чтения и записи байткода как в текстовом, так и в бинарном виде предназначена библиотека Bytecode, входящая в поставку Кумир, которая реализует чтение и запись структуры Bytecode::Data (описана в data.h), используя в качестве источников ввода-вывода потоки QDataStream и QTextStream.
2 Элемент программы
Под элементом программы понимаются:

    константа (строковое представление – „.constant”, бинарное - 0x03 );
    локальная переменная („.local”, 0x01 );
    глобальная переменная („.global”, 0x02 );
    ссылка на внешний алгоритм („.extern”, 0x05 );
    кумир-алгоритм („.function”, 0x04 ) и его три частных случая:
    – главный алгоритм („.main”, 0x07 );
    – программа до первого алгоритма („.init”, 0x06 );
    – тестирующий алгоритм („.testing”, 0x08 ).

Элемент программы - это структура Bytecode::TableElem, которая состоит из:

    типа элемента;
    для констант, локальных переменных и глобальных переменных – базового типа переменной, размерности массива и параметра аргумента (арг, аргрез, рез или простая переменная);
    для переменных, алгоритмов и ссылок на внешние алгоритмы – номера модуля (исполнителя) – целое число от 0 до 255;
    для локальных переменных и алгоритмов – уникального номера алгоритма – целое число от 0 до 65535;
    для констант, переменных, алгоримов и ссылок на внешние алгоритмы – уникальный номер id – целое число от 0 до 65535;
    для переменных, алгоритмов и ссылок на внешние алгоритмы – имя переменной или алгоритма – Unicode-строка;
    для ссылок на внешние алгоритмы – имя модуля (plugin'а), реализующего данный модуль – ASCII-строка;
    для кумир-алгоритмов (включая его частные случаи) – список инструкций.

3 Инструкции
Инструкции интерпретатора имеют фиксированный размер 32 бита.

    Первый байт определяет тип инструкции.
    Второй байт является контекстно-зависимым и может определять:
        номер модуля;
        таблицу для выбора значений (локальная, глобальная или константа);
        номер регистра (ячейки памяти выполнителя).
    Последние два байта определяют контекстно-зависимый аргумент команды.

Описание инструкций приведено в приложении instructions.xls.

Код:
Тип инструкции  Hex-код  Второй байт       Аргумент       Изменение стека значений  Описание
      NOP        0x00                                                               Ничего не делает
     CALL        0x0A    Номер модуля  Номер алгоритма            "-N-1+R"          Берет из стека число аргументов N, затем N значений в порядке следования аргумент
     INIT        0x0C   Таблица перем. Номер переменной              0              Устанавливает флаг для переменной "не определена"
    SETARR       0x0D   Таблица перем. Номер переменной            "-2*D"           Устанавливает границы D-мерного массива, если он еще не определен, либо изменяет
     STORE       0x0E   Таблица перем. Номер переменной              0              Сохраняет значение из стека в переменной. Если переменная является массивом, то с
   STOREARR      0x0F   Таблица перем. Номер переменной             "-D"            Сохраняет значение из стека в элементе D-мерного массива. Индексы массива берутся
     LOAD        0x10   Таблица перем. Номер переменной             "+1"            Кладет в стек значение переменной. Если переменная является массивом, то сохраняе
    LOADARR      0x11   Таблица перем. Номер переменной            "-D+1"           Кладет в стек значение элемента D-мерного массива. Индексы массива берутся из сте
    SETMON       0x12
   UNSETMON      0x13
     JUMP        0x14                  Номер инструкции              0              Выполняет безусловный переход к соответствующему номеру инструкции в текущем алго
      JNZ        0x15   Номер регистра Номер инструкции              0              Выполняет переход к соответствующему номеру инструкции в текущем алгоритме, если
      JZ         0x16   Номер регистра Номер инструкции              0              Выполняет переход к соответствующему номеру инструкции в текущем алгоритме, если
      POP        0x18   Номер регистра                               -1             Кладет значение из стека в соотвествующий регистр
     PUSH        0x19   Номер регистра                              "+1"            Кладет значение соответствующего регистра в стек значений
      RET        0x1B                                                0              Выполняет возврат из текущей выполняемой функции
     PAUSE       0x1D
     ERROR       0x1E   Таблица перем. Номер переменной              0              Выполняет аварийное завершение программы с текстом ошибки из соотвествующей литер
     LINE        0x1F                    Номер строки                0              Указывает отладчику на номер текущей строки программы
      REF        0x20   Таблица перем. Номер переменной             "+1"            Кладет в стек явную ссылку на указанную переменную. Используется при передаче рез
    REFARR       0x21   Таблица перем. Номер переменной           "-2*D+1"          Кладет в стек явную ссылку на элемент D-мерного массива. Индексы массива берутся
    SHOWREG      0x22   Номер регистра                               0              Выводит на поля значение указанного регистра
   CLEARMARG     0x23                    Номер строки                0              Очищает поля от текущей строки (включительно), до указанной (включительно).
      SUM        0xF1                                               "-1"            Берет из стека два последних элемента и кладет обратно их сумму.
      SUB        0xF2                                               "-1"            Берет из стека два последних элемента и кладет обратно разность предпоследнего эл
      MUL        0xF3                                               "-1"            Берет из стека два последних элемента и кладет обратно их произведение.
      DIV        0xF4                                               "-1"            Берет из стека два последних элемента и кладет обратно частное от деления предпос
      POW        0xF5                                               "-1"            Берет из стека два последних элемента и кладет обратно предпоследний элемент в ст
      NEG        0xF6                                                0              Берет из стека элемент и кладет обратно его противоположное значение.
      AND        0xF7                                               "-1"            Берет из стека два последних элемента и возвращает их логическое произведение.
      OR         0xF8                                               "-1"            Берет из стека два последних элемента и возвращает их логическую сумму.
      EQ         0xF9                                               "-1"            Берет из стека два последних элемента и возвращает "истина", если они равны.
      NEQ        0xFA                                               "-1"            Берет из стека два последних элемента и возвращает "ложь", если они равны.
      LS         0xFB                                               "-1"            Берет из стека два последних элемента и возвращает "истина", если предпоследний э
      GT         0xFC                                               "-1"            Берет из стека два последних элемента и возвращает "истина", если предпоследний э
      LEQ        0xFD                                               "-1"            Берет из стека два последних элемента и возвращает "истина", если предпоследний э
      GEQ        0xFE                                               "-1"            Берет из стека два последних элемента и возвращает "истина", если предпоследний э

Отредактировано Лис (2022-06-13 22:32:26)

0

2

Я не записал точный URL файла instructions.xls и теперь не могу его найти.

Это нужно мне для того, чтобы пересмотреть, какие инструкции там есть
(не пропустил ли я чего в прошлый раз, ошибочно посчитав неважным)

Посмотрел поиском все сообщения со словом КуМир:
2023-03-02, Нужно поискать аналог syscall в байткоде КуМир-а
2023-02-24, Что нужно, чтобы описать виртуальную машину КуМир
2022-07-03, Нужно объединить усилия
2022-06-14, Виртуальной машине нужен лидер
2022-06-14, Виртуальной машине нужен лидер 2
2022-06-14, КуМир не поддерживает параллельность
2022-06-13, Про файл instructions.xls
2022-06-13, Спецификация байткода КуМир
2022-06-13, Дорабатывать ВМ из КуМира, чтобы избежать NIH-синдрома
2022-06-13, В КуМире есть IDE на Qt
2022-05-30, В КуМире есть виртуальная машина
2022-04-23, Кумир один из немногих доступных инструментов
2022-01-31, Для образования нужен продукт
2022-01-28, Нужен процессор
2022-01-10, Байткод из КуМир имеет самостоятельную значимость/значение
2021-07-13, Язык программирования должен быть с морфологией
2021-06-26, Формирование ELF-файла при помощи КуМира
2021-04-13, Рефал лучше КуМира
2021-04-13, Как Лис закопал Санду и КуМир
2020-11-01, Список книжек про КуМир
2020-10-15, Солуни проигрывает КуМир-у
2021-04-13, В КуМире есть подпрограммы, в Солуни - нет
2020-10-12, Язык из состава ЯОС как альтернатива КуМир
2020-10-07, Документация важнее исходников
2020-07-23, Идея про создание виртуальной машины (сказочной колесницы), как модуля QEMU по аналогии с виртовской MIX
2020-01-18, Продолжение и замена КуМир в ВУЗах
2019-07-10, Идея: реализовать алгоритм Апресяна
2019-04-07, GitLab с исходниками КуМир
2019-03-14, Иго длилось 300 лет
2018-11-13, Нет перехода от КуМир-а к ВУЗовской программе
2018-09-06, 1Скрипт как альтернатива
2017-10-24, Примеры записи правил
2017-10-24, Идея: записывать грамматику кодом на языке КуМир
2017-10-11, Идея: из произвольного синтаксиса в КуМир
2017-10-11, Идея: транслятор с КуМир-а в PHP
2017-10-11, Идея: компилятор КуМир-а на КуМир-е
2017-03-28, Подключение исполнителя
2017-10-10, Блокируются ли файлы, и ждёт ли интерпретатор разблокировки?
2017-10-10, КуМир не подключает .dll-ки (хм, а исполнители тогда как подключаются?)
2017-10-10, Нужно научиться реализовывать исполнителей не на КуМир
2017-10-10, C++-ная обёртка для запуска КуМир через FastCGI
2017-10-10, Эмуляция динамической памяти массивом фиксированного размера
2017-10-09, Запись в файл, кодировка 1251
2017-09-12, Запрос на калькулятор
2017-09-12, Кумира достаточно
2017-09-10, Школьники справятся
2021-04-12, Массивы переменной длины
2017-09-10, Массивы переменного размера в стеке
2017-09-06, Работа с консолью в КуМир
2017-09-06, Как запустить КуМир в браузере через JavaScript
2017-08-11, Запустить КуМир
2017-04-15, Как описать структуру на КуМире
2017-03-28, Нужно EBNF-описание синтаксиса КуМир
2017-03-26, В кумире есть две функции для работы с юникодом
2017-03-26, Синтаксис языка программирования Кумир

0

3

Сайт
kpolyakov.spb.ru
Host
Error

http://web.archive.org/web/202210062359 … /kumir.htm
(пока не нашел)

Теперь нашел:
https://github.com/a-a-maly/kumir2/blob … s?raw=true

В общем, некоторые алгоритмы некоторых исполнителей
выполняются самой виртуальной машиной:
https://github.com/a-a-maly/kumir2/blob … m.cpp#L875
if (mod == 0xFF) {
    do_specialcall(alg);
}
и это плохо, потому что внешние дополнительные исполнители не реализуешь как плагины, надо пересобирать всю виртуальную машину.

Отредактировано Лис (2023-03-05 18:50:00)

0

4

Четыре недостатка виртуальной машины КуМир-а:
1) использует синтаксис C++ (писалась с другими целями под другие требования), а не более простой синтаксис Си;
2) она эмулирует синусы не в явном виде (функция магически реализуется виртуальной машиной, а не является одной из её команд);
3) затруднено добавление новых функций для связи с операционной системой;
4) она не многопоточная (не соответствует современным реалиям).

Пункт про синтаксис требует проработки. После написания версии на Си будет возможность сравнить две реализации (КуМир и новую "Сказочную колесницу"),
и тогда можно будет сказать, плох ли Си для этой задачи и в каких местах пришлось от этого страдать.

Пункт про эмуляцию функций можно было бы довести до двух крайностей:
- либо все инструкции реализовать тем же неявным способом, подняв их в синтаксис языка (получился бы интерпретатор ассемблера);
- либо реализовать аппаратно совершенно всё прям до максимально возможного языкового уровня.
Промежуточный вариант, не бросающийяс в крайности - использовать уровень имеющейся в наличии аппаратуры.
Это раньше сопроцессор 8087 был не на всякой машине, но теперь-то с этим в процессорах смартфонов всё нормально?
(Смартфоны - самая массовая аппаратная платформа на текущий момент (слава Джобсу). Маск ещё не доделал вирт-очки и нейроимпланты).
А раз есть аппаратные синусы, можно их ввести в виртуальную машину на уровне спецификации
Я предлагал ранее делать несколько фич - с регистрами, с синусами, с многопоточностью.
В идеале, такие фичи могли бы собираться как в конструкторе (указываем какие фичи нужны и получаем запрошенную виртуальную машину (вот что Гента с мозгами делает...))

Тезаурусы, пространства имён, заголовочные файлы и файлы с реализациями.
По неизвестной мне причине в КуМир-е не рассматриваются как исполнители ни процессор, ни операционная система.
Если бы они рассматривались, то они бы как раз содержали русские названия команд,
а так же русские названия системных вызовов.
Операционка это большая система, имён в ней много, и не все эти имена нужны сразу.
Например компилятору много не нужно, только то, что нужно для работы с консолью.
Если бы в КуМир-е были несколько разных исполнителей для связи с операционкой, про файлы, про сокеты, про графику,
его возможности сразу бы радикально увеличились. При этом можно было бы каких-то из этих исполнителей подгружать по-умолчанию,
как сейчас это прошито в коде (только в код не прошивать, а добавить через файл конфигурации).
Это стал бы вполне себе рантайм университетского уровня.

Пункт про многопоточность - нужно добавить в набор команд либо специальные инструкции для синхронизации,
либо сделать что-то ещё (префикс блокировки, например, к уже имеющимся инструкциям).

0

5

Лис написал(а):

В идеале, такие фичи могли бы собираться как в конструкторе (указываем какие фичи нужны и получаем запрошенную виртуальную машину (вот что Гента с мозгами делает...))

В принципе да, такую штуку можно сделать. Причем практически без большого усложнения. Я делал похожее, в лексере-шаблоне, когда можно было отключить поиск определенного токена и удалить кусок кода из компиляции, закоментировав лишь одну строку.

Отредактировано Евгений (2023-03-06 14:11:23)

0

6

Евгений написал(а):

Пункт про многопоточность - нужно добавить в набор команд либо специальные инструкции для синхронизации,
либо сделать что-то ещё (префикс блокировки, например, к уже имеющимся инструкциям).

В первом приближении мне видится так: нужно две команды и один регистр блокировок.
1 Команда - "запустить параллельный процесс с такого-то адреса.
2 Команда - "проверить бит в регистре блокировок, если блокирующий процесс завершен, то продолжить выполнение, если нет - ждать завершения"
Для самого регистра блокировок понадобится разрулить возможности доступа для чтения и записи для разных потоков.

Отредактировано Евгений (2023-03-07 10:55:35)

0