Toi (язык программирования) - Toi (programming language) - Wikipedia
Toi - это императивный, чувствительный к типу язык, который обеспечивает базовую функциональность язык программирования. Язык был разработан и разработан Полом Лонгтином.[1] Написанный на C, Toi был создан с целью стать образовательным опытом и служить инструментом обучения (или игрушкой, отсюда и название) для тех, кто хочет познакомиться с внутренней работой языка программирования.[2][мертвая ссылка ]
Технические характеристики[3][4]
Типы
0 VOID - Null, без данных 1 ADDR - Тип адреса (байт-код) 2 TYPE - Тип типа 3 PLIST - Список параметров 4 FUNC - Функция 5 OBJBLDR - Конструктор объектов 6 OBJECT - Объект / класс 7 G_PTR - Общий указатель 8 G_INT - Общее целое число 9 G_FLOAT - Общее двойное10 G_CHAR - Общий символ 11 G_STR - Общая строка 12 S_ARRAY - Статический массив 13 D_ARRAY - Динамический массив 14 H_TABLE - Hashtable15 G_FIFO - Стек
Время выполнения
Определение контекста времени выполнения
Контекст времени выполнения отслеживает метаданные отдельных потоков, например:
- Операционная куча
- Операционный стек, в который помещаются текущие рабочие инструкции.
- см. ОПРЕДЕЛЕНИЕ СТЕКА
- Экземпляр пространства имен
- Структура данных, которая содержит ссылки на контейнеры переменных, а также обеспечивает интерфейс для уровней пространства имен.
- см. ОПРЕДЕЛЕНИЕ ИМЕННОГО ПРОСТРАНСТВА
- Стек аргументов
- Аргументы для вызовов функций помещаются в этот стек и сбрасываются при вызове.
- см. ОПРЕДЕЛЕНИЕ СТЕКА, ОПРЕДЕЛЕНИЕ ФУНКЦИИ
- Счетчик команд
- Интерфейс вокруг байт-кода для отслеживания перемещения пронумерованных инструкций.
- см. ОПРЕДЕЛЕНИЕ СЧЕТЧИКА ПРОГРАММЫ
Этот контекст дает определение «среде», в которой выполняется код.
Пространство имен определение
Ключевой частью любого операционного компьютерного языка является понятие «Пространства имен». Это понятие «Пространства имен» относится к возможности объявить имя вместе с необходимыми метаданными и вызвать то же имя для получения значений, связанных с этим именем. .
В этом определении пространство имен предоставит следующие ключевые механизмы:
- Объявление имени
- Присвоение имени значению
- Получение значения имени
- Обработка области действия имени
- Неявно входить / выходить из области действия
Аргумент области видимости - это однобайтный формат, который имеет следующий формат:
Пространство имен | Scope0000000 | 0
Области видимости обрабатываются путем ссылки либо на глобальную область действия, либо на локальную область действия. Локальная область действия обозначается "0" в аргументе области при обращении к именам, и эта область инициализируется при оценке любого нового блока кода. Когда вызывается другой блок кода, новая область добавляется как новый уровень пространства имен. Уровни пространства имен действуют как переключатели контекста в контексте функций. Например, локальное пространство имен должно быть «возвращено», если этот локальный контекст пространства имен необходимо сохранить при возврате. Нажатие уровней пространства имен гарантирует, что для каждого п вызовы функций, вы можете пройти п экземпляры предыдущих пространств имен. Например, возьмите этот рисунок уровня пространства имен, где каждый уровень является экземпляром пространства имен:
Уровень 0: глобальное пространство имен, LSB == '1'. Уровень 1: уровень пространства имен, где локальный уровень равен 1, LSB == '0'.
Когда функция вызывается, создается другой уровень пространства имен и увеличивается локальный уровень, например:
Уровень 0: Глобальное пространство имен, LSB == '1'. Уровень 1: Уровень пространства имен. Уровень 2: Уровень пространства имен, где локальный уровень равен 2, LSB == '0'.
Имена глобальных областей видимости (LSB == 1 в аргументе области видимости) сохраняются во время выполнения, поскольку они обрабатывают все определения функций, объекты и имена, объявленные в глобальной области. «Локальный уровень» - это то место, где ссылки, имеющие аргумент области действия «0», относятся к именам.
Аргумент пространства имен указывает, в каком пространстве имен существует переменная. Когда аргумент пространства имен равен 0, выполняется ссылка на текущее пространство имен. Глобальное пространство имен по умолчанию равно 1, а любые другие пространства имен должны быть объявлены с использованием
Переменная определение
Переменные в этом определении обеспечивают следующие механизмы:
- Обеспечьте различимую область типизированных данных
- Обеспечьте общий контейнер для типизированных данных, чтобы можно было маркировать
- Объявите набор основных типов данных и методы для:
- Выделите надлежащее пространство памяти для данного типа данных,
- Освободите место в памяти, которое могут занимать данные переменных, и
- Установить понятие собственности
Для данной переменной V V определяет следующие атрибуты
V -> Владение V -> Тип V -> Указатель на типизированное пространство в памяти
Затем каждую переменную можно обрабатывать как общий контейнер.
В предыдущем разделе было введено понятие уровней пространства имен. Как и в случае с именами, контейнеры универсальных переменных должны сообщать о своей области действия с точки зрения местоположения в пределах заданного набора областей. Это то, что называется «собственность». В данной среде выполнения контейнеры переменных могут существовать в следующих структурах: экземпляр стека, аргументы байт-кода и пространства имен.
Концепция собственности различает переменные, существующие в одной или нескольких структурах. Это установлено для предотвращения случайного освобождения контейнеров переменных, которые не копируются, а вместо этого передаются как ссылки на эти структуры.
Функция определение
Функции в этой виртуальной машине - это указатель на набор инструкций в программе с метаданными об определенных параметрах.
Объект определение
В этой парадигме объекты - это единицы, которые инкапсулируют отдельное пространство имен и набор методов.
Байт-код спецификация
Байт-код расположен в следующем порядке:
<opcode>, <arg 0>, <arg 1>, <arg 2>
Где
Интерпретация инструкций байт-кода
Инструкция байт-кода - это однобайтовый код операции, за которым следует максимум 3 аргумента, которые могут быть в следующих формах:
- Статический (однобайтный)
- Имя (одно слово)
- Адрес (в зависимости от состояния выполнения, обычно слово)
- Динамический (размер заканчивается NULL, за которым следует (размер) * байтов данных)
- то есть FF FF 00 <0xFFFF байтов данных>,
- 01 00 <0x1 байт данных>,
- 06 00 <0x6 байт данных> и т. Д.
Ниже приводится спецификация всех инструкций с кратким описанием каждой инструкции и категорией инструкции:
Код операции
Ключевые слова:
TOS - «Вершина стека» Верхний элемент TBI - «Будет реализован» S <[переменная]> - Статический аргумент.N <[переменная]> - Имя.A <[переменная]> - Аргумент адреса.D <[переменная]> - Аргумент динамического байт-кода.
Hex | Мемноник | аргументы - описание
Управление стеком
Эти подпрограммы работают с текущим рабочим стеком (1).
10 POP S- выталкивает стек n раз. 11 ROT - вращает вершину стека. 12 DUP - дублирует вершину стека. 13 ROT_THREE - вращает верхние три элемента стека.
Управление переменными
20 DEC SS N - объявить переменную типа 21 LOV S N - загрузить ссылочную переменную в стек 22 STV S N - сохранить TOS для ссылочной переменной23 CTV S ND - загружает константу в переменную 24 CTS D <данные> - загружает константу в стек
Управление типами
Типы сейчас витают в воздухе. Я подробно расскажу, какие бывают типы, когда придет время
30 ТИП - помещает тип TOS в стек TBI31 CAST S- Пытается преобразовать TOS в TBI
Бинарные операции
OPS берет два верхних элемента стека, выполняет операцию и помещает результат в стек.
40 ADD - добавляет41 SUB - вычитает 42 MULT - умножает 43 DIV - делит 44 POW - мощность, TOS ^ TOS1 TBI45 BRT - основной корень, TOS корень TOS1 TBI46 SIN - синус TBI47 COS - косинус TBI48 TAN - тангенс TBI 49 ISIN - инверсный синус TBI4A ICOS - обратный консин TBI4B ITAN - обратный тангенс TBI4C MOD - модуль TBI4D OR - или TBI4E XOR - xor TBI4F NAND - и TBI
Условные выражения
Вещи для сравнения, <> =! и т. д. и т. д. ведет себя как арифметические инструкции, кроме инструкции НЕ. Отправляет логическое значение TOS
50 GTHAN - Больше 51 LTHAN - Меньше 52 GTHAN_EQ - Больше или равно 53 LTHAN_EQ - Меньше или равно 54 EQ - Равно 55 NEQ - Не равно 56 NOT - Инвертирует TOS, если TOS логическое 57 OR - логическое OR58 AND - логическое AND
Петли
60 STARTL - Начало цикла 61 CLOOP - Условный цикл. Если TOS истинно, продолжить цикл, иначе break 6E BREAK - выход из цикла 6F ENDL - конец цикла
Кодовый поток
Эти инструкции определяют поток кода.
70 ИДТИ К A- переходит на адрес 71 JUMPF A - переходит вперед строк 72 IFDO - Если TOS имеет значение TRUE, делать до тех пор, пока не будет выполнено, если нет, переходить к done73 ELSE - связан с оператором IFDO, если IFDO не работает, выполнить Блок ELSE, пока не будет достигнуто DONE. 74 JTR - переход к возврату. TBI75 JTE - скачок к ошибке. Объект ошибки в TOS TBI7D ERR - Запуск блока ошибки, использует TOS для оценки ошибки TBI7E DONE - Конец блока 7F CALL N - Вызывает функцию, отправляет возвращаемое значение в STACK.
Универсальный объектный интерфейс. Ожидает объект на TOS
80 GETN N <имя> - возвращает переменную, связанную с именем в объекте 81 SETN N <имя> - устанавливает переменную, связанную с именем в объекте Объект в TOS, переменную в TOS 182 CALLM N <имя> - вызывает метод в объекте 83 INDEXO - индексирует объект , использует аргумент stack84 MODO S- Изменить объект на основе op. [+, -, *, /,%, ^ .. и т. д.]
F - Функции / классы
FF DEFUN NSD - Все развлекает. нет, нет - он определяет функцию. D - его имя, S - возвращаемое значение, D - аргументы.
FE DECLASS ND- определяет класс FD DENS S - объявляет пространство имен F2 ENDCLASS - конец блока класса F1 NEW S <область> N - создает экземпляр класса F0 RETURN - возвращается из функции
Специальные байты
00 НОЛЬ - No-op01 LC N <имя> - вызывает библиотеку функций ОС, т.е. ввод / вывод, открытие файлов и т. Д. TBI02 PRINT - печатает все, что находится в TOS.03 DEBUG - включает режим отладки 0E ARGB - создает стек аргументов 0F PC S - примитив call вызывает подпрограмму A. Список примитивных подпрограмм TBI, предоставляющих методы для настройки объектов, которых этот набор байт-кода не может коснуться. Использует argstack.
Компилятор / Переводчик / Ассемблер
Лексический анализ
Этот раздел посвящен переходу от кода к байт-коду. Сначала абстрактная нотация кода будет разбита на двоичное дерево следующим образом:
<node> /\ / \ / \ <arg> <next>
node> может быть аргументом своего родительского узла или следующей инструкцией. Узлы инструкций - это узлы, которые будут производить инструкцию, или несколько узлов в зависимости от интерпретации байт-кода этой инструкции. Например, эта строка кода:
int x = 3
переведет на:
def / / / / / int set / / / / null 'x' 'x' null / / null 3
Функции выражаются как индивидуальные бинарные деревья. Корень любого файла обрабатывается как отдельное двоичное дерево, так как это тоже функция.
Различные узлы инструкций следующие:
- def <тип> <имя>
- Определите именованное пространство в памяти с указанным типом
- См. Раздел "ТИПЫ" в разделе "ОБЗОР"
- Определите именованное пространство в памяти с указанным типом
- установить <имя> <значение>
- Установить именованное пространство в памяти с указанным значением
Переход от двоичных деревьев к байт-коду
Различные узлы инструкций в дереве будут вызывать определенные функции, которые будут принимать указанные аргументы и смотреть вперед и назад для формулирования эквивалента правильного байт-кода.
Сайт разработчика
Разработчик языка Пол Лонгтин ведет общедоступный веб-сайт и блог под названием banna.tech, названный в честь его онлайн-псевдонима «банна».