Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров12K
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-м году.
Теги:
Хабы:
Всего голосов 21: ↑15 и ↓6+14
Комментарии8

Публикации

Истории

Работа

DevOps инженер
43 вакансии
Java разработчик
361 вакансия

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань