[html]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="GENERATOR" content="LyX 2.3.6.1" />
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>Спецификация байткода Кумир</title>
<style type='text/css'>
/* Layout-provided Styles */
dfn.lyxnoun {
font-variant: small-caps;
}
h1.title {
font-family: sans-serif;
font-weight: bold;
font-size: x-large;
margin-bottom: 1ex;
text-align: center;
}
div.abstract {
font-size: small;
margin-top: 0.7ex;
margin-bottom: 0.7ex;
margin-left: 3ex;
margin-right: 3ex;
text-align: left;
}
div.abstract {
margin: 4ex;
}
div.abstract_item {
font-size: small;
padding-top: 1ex;
}
div.abstract_label {
font-weight: bold;
}
h2.section {
font-family: sans-serif;
font-weight: bold;
font-size: x-large;
margin-top: 1.3ex;
margin-bottom: 0.7ex;
text-align: left;
}
div.standard {
text-indent: 2em;
margin-bottom: 2ex;
}
ul.itemize {
margin-top: 0.7ex;
margin-bottom: 0.7ex;
margin-left: 3ex;
text-align: left;
}
</style>
</head>
<body dir="auto">
<h1 class="title" id='magicparlabel-1'>Спецификация байткода Кумир</h1>
<div class="abstract" id='magicparlabel-2'><div class="abstract_item">Кумир имеет два режима выполнения: <em>быстрый</em> - используя машинный код, полученный компилятором gcc из промежуточного C99-кода, и <em>стандартный</em> - используя интерпретатор байт-кода. Данный документ описывает используемый байт-код.</div>
</div>
<h2 class="section" id='magicparlabel-3'><span class="section_label">1</span> Основные положения. Структура программы интерпретатора</h2>
<div class="standard" id='magicparlabel-4'>Программа интерпретатора состоит из:</div>
<ul class="itemize" id='magicparlabel-5'><li class="itemize_item">таблицы констант;</li>
<li class="itemize_item">таблиц глобальных переменных;</li>
<li class="itemize_item">таблиц локальных переменных;</li>
<li class="itemize_item">таблицы используемых внешних функций;</li>
<li class="itemize_item">программного кода, являющегося набором <em>инструкций</em> для каждого отдельно Кумир-алгоритма.</li>
</ul>
<div class="standard" id='magicparlabel-10'>В программе данные элементы описываются в произвольном порядке. Каждый элемент определяется <em>заголовком</em>, данными и, при необходимости – размером элемента в программе.</div>
<div class="standard" id='magicparlabel-11'>Программа может иметь как бинарное, так и текстовое представление. Эти представления эквивалентны, для их преобразования предназначена утилита <dfn class='lyxnoun'>kumir2-as</dfn>, входящая в поставку Кумир, которая преобразует текстовое представление в бинарное и наоборот.</div>
<div class="standard" id='magicparlabel-12'>Формальное описание бинарного и текстового представления кода будет приведено в приложениях.</div>
<div class="standard" id='magicparlabel-13'>Для чтения и записи байткода как в текстовом, так и в бинарном виде предназначена библиотека <dfn class='lyxnoun'>Bytecode</dfn>, входящая в поставку Кумир, которая реализует чтение и запись структуры <dfn class='lyxnoun'>Bytecode::Data</dfn> (описана в <span style='font-family:monospace;'>data.h</span>), используя в качестве источников ввода-вывода потоки <dfn class='lyxnoun'>QDataStream</dfn> и <dfn class='lyxnoun'>QTextStream</dfn>.</div>
<h2 class="section" id='magicparlabel-14'><span class="section_label">2</span> Элемент программы</h2>
<div class="standard" id='magicparlabel-15'>Под элементом программы понимаются:</div>
<ul class="itemize" id='magicparlabel-16'><li class="itemize_item">константа (строковое представление – „.constant”, бинарное - <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>03</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">локальная переменная („.local”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>01</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">глобальная переменная („.global”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>02</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">ссылка на внешний алгоритм („.extern”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>05</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">кумир-алгоритм („.function”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>04</mn>
</mrow>
</mrow></math>) и его три частных случая:</li>
<li class="itemize_item">– главный алгоритм („.main”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>07</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">– программа до первого алгоритма („.init”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>06</mn>
</mrow>
</mrow></math>);</li>
<li class="itemize_item">– тестирующий алгоритм („.testing”, <math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mrow><mn>0</mn><mi>x</mi><mn>08</mn>
</mrow>
</mrow></math>).</li>
</ul>
<div class="standard" id='magicparlabel-24'>Элемент программы - это структура <dfn class='lyxnoun'>Bytecode::TableElem</dfn>, которая состоит из:</div>
<ul class="itemize" id='magicparlabel-25'><li class="itemize_item">типа элемента;</li>
<li class="itemize_item">для констант, локальных переменных и глобальных переменных – базового типа переменной, размерности массива и параметра аргумента (арг, аргрез, рез или простая переменная);</li>
<li class="itemize_item">для переменных, алгоритмов и ссылок на внешние алгоритмы – номера модуля (исполнителя) – целое число от 0 до 255;</li>
<li class="itemize_item">для локальных переменных и алгоритмов – уникального номера алгоритма – целое число от 0 до 65535;</li>
<li class="itemize_item">для констант, переменных, алгоримов и ссылок на внешние алгоритмы – уникальный номер id – целое число от 0 до 65535;</li>
<li class="itemize_item">для переменных, алгоритмов и ссылок на внешние алгоритмы – имя переменной или алгоритма – Unicode-строка;</li>
<li class="itemize_item">для ссылок на внешние алгоритмы – имя модуля (plugin'а), реализующего данный модуль – ASCII-строка;</li>
<li class="itemize_item">для кумир-алгоритмов (включая его частные случаи) – список <em>инструкций</em>.</li>
</ul>
<h2 class="section" id='magicparlabel-33'><span class="section_label">3</span> Инструкции</h2>
<div class="standard" id='magicparlabel-34'>Инструкции интерпретатора имеют фиксированный размер 32 бита.</div>
<ul class="itemize" id='magicparlabel-35'><li class="itemize_item">Первый байт определяет тип инструкции.</li>
<li class="itemize_item">Второй байт является контекстно-зависимым и может определять:
<br />
<ul class="itemize" id='magicparlabel-37'><li class="itemize_item">номер модуля;</li>
<li class="itemize_item">таблицу для выбора значений (локальная, глобальная или константа);</li>
<li class="itemize_item">номер регистра (ячейки памяти выполнителя).</li>
</ul>
</li><li class="itemize_item">Последние два байта определяют контекстно-зависимый аргумент команды.</li>
</ul>
<div class="standard" id='magicparlabel-41'>Описание инструкций приведено в приложении <span style='font-family:monospace;'>instructions.xls</span>.</div>
</body>
</html>
[/html]