Вітаю ўсіх у новым 2020 годзе.
З моманту публікацыі першага
За гэты год мова была моцна дапрацавана, былі прадуманы многія яе аспекты і вызначаны вектар развіцця.
Гэтым усім я рады падзяліцца з суполкай.
адмова
Дадзены праект распрацоўваецца выключна на энтузіязме і не прэтэндуе на сусветнае панаванне ў сферы дынамічных моў праграмавання!
Не варта разглядаць дадзеную распрацоўку ў якасці эталона, да якога трэба імкнуцца, праект - не ідэальны, але тым не менш развіваецца.
Новы кампілятар
У галінцы /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