Приветствую всех в новом 2020-м году.
С момента публикации первого поста про Mash прошел практически ровно 1 год.
За этот год язык был сильно доработан, были продуманы многие его аспекты и определен вектор развития.
Этим всем я рад поделиться с сообществом.
Disclaimer
Данный проект разрабатывается исключительно на энтузиазме и не претендует на мировое господство в сфере динамических языков программирования!
Не стоит рассматривать данную разработку в качестве эталона, к которому нужно стремиться, проект — не идеален, но тем не менее развивается.
Новый компилятор
В ветке /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/
Добавить комментарий