--- published: true layout: post --- ## Что это такое? Практикуюсь в изобретении бессмысленных вещей. После проекта [fw](https://github.com/kpmy/fw "fw"), в котором интерпретировался выхлоп уже готового компилятора, написание своего компилятора было неизбежным. Вот он и реализовался. Проект компилятора и интерпретатора. Все довольно упростилось, язык `LEAF` структурно даже проще обычного Оберона. Система типов банальная. Хотя есть комплексные числа. Но это простой тип, он не усложняет систему вообще. Зато списки есть, и множества для любых значений, и ассоциативные массивы. Все довольно примитивное. Основная особенность в том, что все статическое. И передается по значению. Есть пара обобщенных типов: значение вообще и указатель на значение вообще, вот по указателю уже динамическое значение будет, в куче. Работа с ними (с значениями вообще) получилась неудобной, ведь язык строго типизированный. Зато структурно в языке всё очень по Дейкстре. Хотя он бы не одобрил такое обращение со сложными структурами (я про передачу по значению). Процедуры, два вида циклов (и никаких `FOR`), ветвление. Модульность уже по Вирту, почти как в Обероне. А пользовательских типов нет. Да и зачем, основная идея в том, что пользовательский тип это обязательно либо `RECORD` либо `ARRAY OF`, `RECORD` хорошо ложится на ассоциативный массив, а `ARRAY` на простой список. Дальше возникает кагбэ "проблема": тип полей и элементов массива не указать, в `LEAF` значение в списке всегда `ANY`. Ну что тут поделаешь, язык `LEAF` как раз и нужен чтобы проверить, как оно вообще, жизнеспособна ли такая идея или нет. Первая версия компилятора и рантайма написана на `golang` где-то за месяц. Теперь надо остановиться и подумать, как это сделать эффективным и не глючным. P.S. Этак можно и лолу переписать на `golang`, где бы только время взять.