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

Калі адбываецца атрыманне ў спадчыну, то ў нас з'яўляецца магчымасць лёгка рабіць 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-м годзе.

Крыніца: habr.com

Дадаць каментар