Mash — язык программирования, компилирует сам себя

от автора

image

Приветствую всех в новом 2020-м году.

С момента публикации первого поста про Mash прошел практически ровно 1 год.

За этот год язык был сильно доработан, были продуманы многие его аспекты и определен вектор развития.

Этим всем я рад поделиться с сообществом.

Disclaimer

Данный проект разрабатывается исключительно на энтузиазме и не претендует на мировое господство в сфере динамических языков программирования!

Не стоит рассматривать данную разработку в качестве эталона, к которому нужно стремиться, проект — не идеален, но тем не менее развивается.

GitHub
Сайт
Форум

Новый компилятор

В ветке /mashc репозитория проекта, вы можете увидеть новую версию компилятора, которая написана на Mash’е (на первой версии языка).

Компилятор имеет генератор кода в asm листинг (для ассемблера под стековую ВМ).
В данный момент веду разработку версии генератора под Java (JDK 1.8).

Новая версия компилятора полностью поддерживает функционал первой версии языка и дополняет его.

Новое ООП

В новой версии языка отчасти переработана работа с классами.
Методы класса могут быть объявлены, как в теле класса, так и за его пределами.
У класса теперь есть явно выражаемый конструктор: init.

Пример кода:

... class MyClass:   private:     var a, b    public:     init(a, b):       $a ?= a       $b ?= b     end      func Foo():       return $a + $b        end end  func MyClass::Bar(c):   return $a + $b + c end ... 

Если происходит наследование, то у нас появляется возможность легко делать inherited вызовы (super).

Пример кода:

... class MySecondClass(MyClass):   public:     var c      init(a, b, c):       super(a, b)       $c ?= c     end      func Bar():       super($c)       end end ...  x ?= new MySecondClass(10, 20, 30) println( x -> Bar() )     // 60 

Динамическое переопределение методов у экземпляров классов:

... func Polymorph::NewFoo(c):   return $a + $b + c   end ... x -> Foo ?= Polymorph -> NewFoo x -> Foo(30)    // 60 

Пакеты / пространства имен

Пространство имен должно оставаться чистым!
Соответственно язык должен предоставлять эту возможность.
В Mash’е, если метод класса статичен — он может быть безопасно вызван из любого участка кода.

Пример:

... class MyPackage:   func MyFunc(a, b):     return a + b     end end ... println( MyPackage -> MyFunc(10, 20) )    // 30 

К слову, оператор super при таком вызове будет работать корректно.

Исключения

В новой версии языка они обрабатываются, как классы:

... try:   raise new Exception(     "My raised exception!"   ) catch E:   if E is Exception:     println(E)   else:     println("Unknown exception class!")   end end ... 

Новый enum

Теперь элементам перечисления могут быть присвоены константные значения:

enum MyEnum [   meFirst = "First",   meSecond = 2,   meThird ] ... k ?= meSecond ... if k in MyEnum:   ... end 

Встраиваемый ЯП

Потенциально — Mash может занять свою нишу в качестве встраиваемого языка программирования, по типу Lua.

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

У Mash есть Runtime Environment — стековая ВМ, собранная в качестве динамической библиотеки с полноценным API.

Требуется лишь добавить её в зависимости проекта и совершить пару вызовов.

В самом языке предусмотрен функционал, для работы в качестве встраиваемого языка.
При этом, работоспособность в связке с языковыми и сторонними библиотеками не нарушается.
Получаем встраиваемый язык, который может использовать всю мощь различных фреймворков, написанных на нем.

Mash + JVM

Начал вести разработку версии транслятора для JVM.
Возможно, спустя N-ное количество времени, на хабре появится пост на эту тему.

Итоги

Итогов особо нет. Это промежуточное представление результатов.
Всем удачи в 2020-м году.


ссылка на оригинал статьи https://habr.com/ru/post/482842/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *