Mash е програмски јазик кој сам се компајлира

Mash е програмски јазик кој сам се компајлира

Поздрав до сите во новата 2020 година.

Од објавувањето на првиот постот Помина речиси точно 1 година за Mash.

Во текот на оваа година, јазикот беше значително подобрен, многу од неговите аспекти беа разгледани и беше утврден векторот на развојот.

Среќен сум што го споделувам сето ова со заедницата.

Општи услови

Овој проект се развива исклучиво од ентузијазам и не претендира на светска доминација во областа на динамичните програмски јазици!

Овој развој не треба да се смета како стандард кон кој треба да се стремиме, проектот не е идеален, но сепак се развива.

GitHub
Мапа
форум

Нов компајлер

Во гранката /mashc на проектното складиште, можете да видите нова верзија на компајлерот, која е напишана во Mash (првата верзија на јазикот).

Компајлерот има генератор на код во списокот asm (за асемблер за VM базиран на стек).
Во моментов развивам верзија на генератор за Java (JDK 1.8).

Новата верзија на компајлерот целосно ја поддржува функционалноста на првата верзија на јазикот и ја надополнува.

Нов OOP

Во новата верзија на јазикот, работата со часови е делумно редизајнирана.
Методите на класи може да се декларираат и во телото на класата и надвор од него.
Класата сега има експлицитен конструктор: 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
...

Доколку дојде до наследство, тогаш имаме можност лесно да правиме наследени повици (супер).

Примерок код:

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

Патем, супер операторот ќе работи правилно кога ќе се повика на овој начин.

Исклучоци

Во новата верзија на јазикот тие се третираат како класи:

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

Нов број

Сега на елементите за набројување може да им се доделат константни вредности:

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

Вграден јазик

Потенцијално, Mash може да ја најде својата ниша како вграден програмски јазик, сличен на Lua.

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

Mash има Runtime Environment - VM базиран на стек, компајлиран како динамична библиотека со целосен API.

Сè што треба да направите е да го додадете во зависноста од проектот и да остварите неколку повици.

Самиот јазик обезбедува функционалност за работа како вграден јазик.
Во исто време, перформансите во врска со јазикот и библиотеките од трети страни не се засегнати.
Добиваме вграден јазик кој може да ја користи целосната моќ на различни рамки напишани во него.

Mash + JVM

Почнав да развивам верзија на преведувачот за JVM.
Можеби, по N временски период, на Хабре ќе се појави објава на оваа тема.

Резултатите од

Нема посебни резултати. Ова е средно претставување на резултатите.
Среќно на сите во 2020 година.

Извор: www.habr.com

Додадете коментар