Mash - мова програмування, компілює саму себе

Mash - мова програмування, компілює саму себе

Вітаю всіх у новому 2020 році.

З моменту публікації першого поста для Mash пройшов майже рівно 1 рік.

За цей рік мова була сильно доопрацьована, було продумано багато її аспектів та визначено вектор розвитку.

Цим усім я радий поділитися із спільнотою.

відмова

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

Не варто розглядати цю розробку як зразок, якого потрібно прагнути, проект — не ідеальний, проте розвивається.

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
...

Якщо відбувається успадкування, то у нас з'являється можливість легко робити ув'язнені виклики (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-му році.

Джерело: habr.com

Додати коментар або відгук