Поздрав до сите во новата 2020 година.
Од објавувањето на првиот
Во текот на оваа година, јазикот беше значително подобрен, многу од неговите аспекти беа разгледани и беше утврден векторот на развојот.
Среќен сум што го споделувам сето ова со заедницата.
Општи услови
Овој проект се развива исклучиво од ентузијазам и не претендира на светска доминација во областа на динамичните програмски јазици!
Овој развој не треба да се смета како стандард кон кој треба да се стремиме, проектот не е идеален, но сепак се развива.
Нов компајлер
Во гранката /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