Jump to content

Той (язык программирования)

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».

  1. ^ «банана/язык» . Гитхаб . 17 февраля 2021 г.
  2. ^ «банна – бесполезные вещи» . Архивировано из оригинала 24 октября 2016 г. Проверено 23 октября 2016 г.
  3. ^ «банана/язык» . Гитхаб . 17 февраля 2021 г.
  4. ^ «СПЕЦИФИКАЦИЯ – язык – некоторые дураки пытаются создать интерпретируемый язык» .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b6749486c6601695093cb39bafafb2f0__1687315620
URL1:https://arc.ask3.ru/arc/aa/b6/f0/b6749486c6601695093cb39bafafb2f0.html
Заголовок, (Title) документа по адресу, URL1:
Toi (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)