воскресенье, 17 января 2021 г.

Добавил константы

 Начал добавлять переменные, но решил добавить константы, и добавил.

Теперь предстоит написать конверторы значений для разных типов, чтобы можно было в качестве параметра указать другой тип данных.

Константа создаётся строкой вида

Тип_константы constant Имя_константы Значение_константы

Поэтому, если например тип указан Long, а значение маленькое, то оно кладётся на стек с типом Short например, и его нужно в Long сконвертировать. А такие конверторы у меня сейчас сделаны только для типа Integer.

Пример констант PI и ten

Если бы я писал интерпретатор на ассемблере, то этой проблемы не было бы. Но я пишу программу на C++, а у него строгая типизация, и для работы с данными приходится писать функции, которые конвертируют один сишный тип в другой.

Можно было бы конечно прибегнуть к чисто сишным приёмам, копируя значение с помощью memcpy(), но этот фокус сработал бы только при конвертировании интегральных типов, а например конвертацию float в int уже пришлось бы делать так же, как у меня сделано сейчас. Так что я решил не заниматься усложением себе задачи.

Дело в том, что на практике такое копирование почти работает - до тех пор, пока мы не добавляем возможность для пользователя например создавать константы с типом класса, созданного пользователем. И тут начинается разделение типов на встроенные и пользовательские, а это ещё больше всё усложняет.

Я не знал, нужен ли мне класс типа Class. Пока что не понадобился. Но уже оказалось удобным ввести классы WholeNumber - как признак, что это целочисленное значение, и класс Referenceable - как признак того, что этот класс может быть типом константы или переменной.

Меня уже спросили, зачем писать подобную программу в XXI веке. Это же как бы из эпохи мамонтов реликт.

Да, мне тут уже рассказали, что по технологиям это 1965-й год. Очень, очень давние времена.

Но я уже писал, что это не первый мой интерпретатор. В процессе работы меня постоянно преследует дежавю - это я уже делал в таком-то году, это я уже делал в году таком-то.

В целом, моя идея в том, чтобы написать нечто среднее между Forth, Python и Visual Basic. Если посмотреть на каждый из этих языков, то при всех своих очевидных достоинствах, у них есть и недостатки.

Форт заставляет пользователя класть параметры функций на стек. Это немного странно в наше время, поскольку интерпретатор может сам читать параметры команды. А пользователю привычнее синтаксис вида

Переменная = Функция Параметры

То есть что-то вроде Бейсика. Только без номеров строк.

Visual Basic - это язык Microsoft Office, и его не назовёшь открытым решением. Python гораздо привлекательнее в этом смысле.

Ну, а Python практически лишён недостатков, кроме того, что ты не можешь начать писать программу на C++, встроив в неё Python как язык скриптов. Я же как раз пытаюсь сделать именно такое решение - вот код, вот стек, вот консоль.

Проблема лишь в том, что такая программа сама по себе получается довольно большой по трудоёмкости её создания. 

Люди пишут, что интерпретатор Форт можно написать за вечер. У меня правда не получилось написать интерпретатор Форт за вечер. Но я и не пытался поставить в этом деле рекорд.

В общем, добавил константы.

Комментариев нет: