Той (язык программирования)
Toi — это императивный, чувствительный к типам язык, обеспечивающий базовую функциональность языка программирования . Язык был спроектирован и разработан с нуля Полом Лонгтайном. [1] Написанный на C, Toi был создан с целью обучения и служит инструментом обучения (или игрушкой, отсюда и название) для тех, кто хочет ознакомиться с внутренней работой языка программирования. [2]
Спецификация [3] [4]
[ редактировать ]Типы
[ редактировать ]0 VOID - Null, no data 1 ADDR - Address type (bytecode) 2 TYPE - A `type` type 3 PLIST - Parameter list 4 FUNC - Function 5 OBJBLDR - Object builder 6 OBJECT - Object/Class 7 G_PTR - Generic pointer 8 G_INT - Generic integer 9 G_FLOAT - Generic double 10 G_CHAR - Generic character 11 G_STR - Generic string 12 S_ARRAY - Static array 13 D_ARRAY - Dynamic array 14 H_TABLE - Hashtable 15 G_FIFO - Stack
Определение контекста времени выполнения
[ редактировать ]Контекст времени выполнения отслеживает метаданные отдельных потоков, такие как:
- Операционный стек
- Операционный стек, куда помещаются/извлекаются текущие выполняемые инструкции.
- см. ОПРЕДЕЛЕНИЕ СТЕКА
- Экземпляр пространства имен
- Структура данных, содержащая ссылки на контейнеры переменных, а также являющаяся интерфейсом для уровней пространства имен.
- обратитесь к ОПРЕДЕЛЕНИЮ ПРОСТРАНСТВА ИМЕН
- Стек аргументов
- Аргументы вызовов функций помещаются в этот стек и сбрасываются при вызове.
- см. ОПРЕДЕЛЕНИЕ СТЕКА, ОПРЕДЕЛЕНИЕ ФУНКЦИИ.
- Счетчик программ
- Интерфейс вокруг байт-кода для отслеживания прохождения инструкций с нумерацией строк.
- см. ОПРЕДЕЛЕНИЕ СЧЕТЧИКА ПРОГРАММ
Этот контекст дает определение «среде», в которой выполняется код.
пространства имен Определение
[ редактировать ]Ключевой частью любого рабочего компьютерного языка является понятие «пространства имен». Это понятие «пространства имен» относится к возможности объявлять имя вместе с необходимые метаданные и вызывать одно и то же имя для получения связанных значений с этим именем.
В этом определении пространство имен будет предоставлять следующие ключевые механизмы:
- Объявление имени
- Присвоение имени значению
- Получение значения имени
- Обработка области имени
- Неявное перемещение в/из области действия
Аргумент области действия представляет собой один байт и имеет следующий формат:
Namespace|Scope 0000000 |0
Области обрабатываются путем ссылки на глобальную или локальную область. Локальная область обозначается цифрой «0» в аргументе области при обращении к именам. и эта область инициализируется при оценке любого нового блока кода. При вызове другого блока кода в качестве нового уровня пространства имен добавляется новая область. Уровни пространства имен действуют как переключатели контекста внутри контекстов функций. Например, локальное пространство имен должно быть «возвращено», если контекст локального пространства имен необходимо сохранить при возврате. Нажатие «Уровней пространства имен» гарантирует, что для каждого n вызовов функции вы сможете пройти n экземпляров предыдущих пространств имен. Например, возьмем этот рисунок уровня пространства имен, где каждый уровень представляет собой экземпляр пространства имен:
Level 0: Global namespace, LSB == '1'. Level 1: Namespace level, where Local Level is at 1, LSB == '0'.
При вызове функции создается другой уровень пространства имен и локальный уровень увеличивается, вот так:
Level 0: Global namespace, LSB == '1'. Level 1: Namespace level. Level 2: Namespace level, where Local Level is at 2, LSB == '0'.
Имена глобальных областей (LSB == 1 в аргументе области) сохраняются во время выполнения, поскольку они обрабатывают все определения функций, объекты и имена, объявленные в глобальной области видимости. «Локальный уровень» — это место, где ссылки которые имеют аргумент области действия «0», на которые ссылаются при доступе к именам.
Аргумент Namespace указывает, в каком пространстве имен находится переменная. Когда аргумент пространства имен равен 0, используется ссылка на текущее пространство имен. По умолчанию глобальное пространство имен равно 1, любые другие пространства имен должны быть объявлены. с помощью
переменной Определение
[ редактировать ]Переменные в этом определении обеспечивают следующие механизмы:
- Обеспечьте различимую область типизированных данных.
- Предоставьте общий контейнер для типизированных данных, чтобы можно было маркировать их.
- Объявите набор фундаментальных типов данных и методов для:
- Выделите подходящее пространство памяти для данного типа данных,
- Освободите пространство памяти, которое могут занимать данные переменных, и
- Установить понятие собственности
Для данной переменной V V определяет следующие атрибуты
V -> Ownership V -> Type V -> Pointer to typed space in memory
Затем каждую переменную можно обрабатывать как общий контейнер.
В предыдущем разделе было введено понятие уровней пространства имен. Много как и в случае с именами, контейнеры универсальных переменных должны сообщать свои область действия с точки зрения местоположения в пределах заданного набора областей. Это то, что называется «Собственность». В данной среде выполнения контейнеры переменных могут существовать в следующих структуры: экземпляр стека, аргументы байт-кода и пространства имен.
Концепция собственности дифференцирует переменные, существующие на одном или нескольких объектах. структуры. Это установлено для предотвращения случайного освобождения переменной. контейнеры, которые не копируются, а передаются как ссылки на эти структуры.
функции Определение
[ редактировать ]Функции в этой виртуальной машине представляют собой указатель на набор инструкций в программа с метаданными об определенных параметрах.
объекта Определение
[ редактировать ]В этой парадигме объекты — это единицы, инкапсулирующие отдельное пространство имен и сборник методов.
байт-кода Спецификация
[ редактировать ]Байт-код располагается в следующем порядке:
<opcode>, <arg 0>, <arg 1>, <arg 2>
Где <opcode> — это один байт, обозначающий, какую подпрограмму вызывать с помощью следующие аргументы при выполнении. Разные коды операций имеют разные аргументы длины, некоторые имеют 0 аргументов, а другие - 3 аргумента.
Интерпретация инструкций байт-кода
[ редактировать ]Инструкция с байт-кодом представляет собой однобайтовый код операции, за которым следуют максимум 3 аргументы, которые могут быть в следующих формах:
- Статический (однобайтовый)
- Имя (одно слово)
- Адрес (в зависимости от состояния выполнения, обычно слово)
- Динамический (размер заканчивается NULL, за которым следует (размер)*байт данных)
- т.е. FF FF 00 <0xFFFF байт данных>,
- 01 00 <0x1 байт данных>,
- 06 00 <0x6 байт данных> и т. д.
Ниже представлена спецификация всех инструкций с кратким описанием каждая инструкция и категория инструкций:
Ключевые слова:
TOS - 'Top Of Stack' The top element TBI - 'To be Implemented' S<[variable]> - Static Argument. N<[variable]> - Name. A<[variable]> - Address Argument. D<[variable]> - Dynamic bytecode argument.
Hex | Mnemonic | arguments - description
Манипулирование стеком
[ редактировать ]These subroutines operate on the current-working stack(1).
10 POP S<n> - pops the stack n times. 11 ROT - rotates top of stack 12 DUP - duplicates the top of the stack 13 ROT_THREE - rotates top three elements of stack
Управление переменными
[ редактировать ]20 DEC S<scope> S<type> N - declare variable of type 21 LOV S<scope> N - loads reference variable on to stack 22 STV S<scope> N - stores TOS to reference variable 23 CTV S<scope> N D<data> - loads constant into variable 24 CTS D<data> - loads constant into stack
Управление типами
[ редактировать ]Типы витают в воздухе в данный момент. Я подробно расскажу, какие типы бывают, когда пришло время
30 TYPEOF - pushes type of TOS on to the stack TBI 31 CAST S<type> - Tries to cast TOS to <type> TBI
Бинарные операции
[ редактировать ]OPS берет два верхних элемента стека, выполняет операцию и помещает результат в стеке.
40 ADD - adds 41 SUB - subtracts 42 MULT - multiplies 43 DIV - divides 44 POW - power, TOS^TOS1 TBI 45 BRT - base root, TOS root TOS1 TBI 46 SIN - sine TBI 47 COS - cosine TBI 48 TAN - tangent TBI 49 ISIN - inverse sine TBI 4A ICOS - inverse consine TBI 4B ITAN - inverse tangent TBI 4C MOD - modulus TBI 4D OR - or's TBI 4E XOR - xor's TBI 4F NAND - and's TBI
Вещи для сравнения, < > = ! и так далее и тому подобное. Ведет себя как арифметические инструкции, за исключением инструкции NOT. Нажимает логическое значение в ТОС
50 GTHAN - Greater than 51 LTHAN - Less than 52 GTHAN_EQ - Greater than or equal to 53 LTHAN_EQ - Less than or equal to 54 EQ - Equal to 55 NEQ - Not equal to 56 NOT - Inverts TOS if TOS is boolean 57 OR - Boolean OR 58 AND - Boolean AND
Петли
[ редактировать ]60 STARTL - Start of loop 61 CLOOP - Conditional loop. If TOS is true, continue looping, else break 6E BREAK - Breaks out of loop 6F ENDL - End of loop
Поток кода
[ редактировать ]Эти инструкции определяют порядок выполнения кода.
70 GOTO A<addr> - Goes to address 71 JUMPF A<n> - Goes forward <n> lines 72 IFDO - If TOS is TRUE, do until done, if not, jump to done 73 ELSE - Chained with an IFDO statement, if IFDO fails, execute ELSE block until DONE is reached. 74 JTR - jump-to-return. TBI 75 JTE - jump-to-error. Error object on TOS TBI 7D ERR - Start error block, uses TOS to evaluate error TBI 7E DONE - End of block 7F CALL N - Calls function, pushes return value on to STACK.
Общий объектный интерфейс. Ожидает объект на TOS
[ редактировать ]80 GETN N<name> - Returns variable associated with name in object 81 SETN N<name> - Sets the variable associated with name in object Object on TOS, Variable on TOS1 82 CALLM N<name> - Calls method in object 83 INDEXO - Index an object, uses argument stack 84 MODO S<OP> - Modify an object based on op. [+, -, *, /, %, ^ .. etc.]
F — Функции/классы
[ редактировать ]FF DEFUN NS<type> D<args> - Un-funs everything. no, no- it defines a function. D is its name, S<type> is the return value, D<args> is the args.
FE DECLASS ND<args> - Defines a class. FD DENS S - Declares namespace F2 ENDCLASS - End of class block F1 NEW S<scope> N - Instantiates class F0 RETURN - Returns from function
Специальные байты
[ редактировать ]00 NULL - No-op 01 LC N<name> - Calls OS function library, i.e. I/O, opening files, etc. TBI 02 PRINT - Prints whatever is on the TOS. 03 DEBUG - Toggle debug mode 0E ARGB - Builds argument stack 0F PC S - Primitive call, calls a subroutine A. A list of TBI primitive subroutines providing methods to tweak objects this bytecode set cannot touch. Uses argstack.
Этот раздел посвящен переходу от кода к байт-коду. Прежде всего абстрактная запись кода будет разбита на двоичное дерево следующим образом:
<node> /\ / \ / \ <arg> <next>
node> может быть аргументом родительского узла или следующей инструкции. Узлы инструкций — это узлы, которые будут создавать инструкции или множественные инструкции. на интерпретации байт-кода его инструкции. Например, эта строка код:
int x = 3
перевел бы на:
def /\ / \ / \ / \ / \ int set /\ /\ / \ / \ null 'x' 'x' null /\ / \ null 3
Функции выражаются в виде отдельных двоичных деревьев . Корень любого файла рассматривается как отдельное двоичное дерево, поскольку это тоже функция.
Различные узлы инструкций следующие:
- def <тип> <имя>
- Определите именованное пространство в памяти с указанным типом
- См. раздел «ТИПЫ» в разделе «ОБЗОР».
- Определите именованное пространство в памяти с указанным типом
- установить <имя> <значение>
- Установить именованное пространство в памяти с указанным значением
Переход от двоичных деревьев к байт-коду
[ редактировать ]Различные узлы инструкций в дереве будут вызывать определенные функции. который будет принимать указанные аргументы, а также просматривать вперед и назад, чтобы сформулировать правильный эквивалент байт-кода.
Сайт разработчика
[ редактировать ]Разработчик языка Пол Лонгтайн управляет общедоступным веб-сайтом и блогом под названием Banna.tech , названным в честь его онлайн-псевдонима «banna».
Ссылки
[ редактировать ]- ^ «банана/язык» . Гитхаб . 17 февраля 2021 г.
- ^ «банна – бесполезные вещи» . Архивировано из оригинала 24 октября 2016 г. Проверено 23 октября 2016 г.
- ^ «банана/язык» . Гитхаб . 17 февраля 2021 г.
- ^ «СПЕЦИФИКАЦИЯ – язык – некоторые дураки пытаются создать интерпретируемый язык» .