Witam wszystkich w nowym roku 2020.
Od czasu publikacji pierwszego
W tym roku język został znacznie udoskonalony, przemyślano wiele jego aspektów i ustalono wektor rozwoju.
Cieszę się, że mogę dzielić się tym wszystkim ze społecznością.
Odpowiedzialność
Projekt ten rozwija się wyłącznie z entuzjazmem i nie pretenduje do światowej dominacji w dziedzinie dynamicznych języków programowania!
Rozwoju tego nie należy uważać za standard, do którego należy dążyć, projekt nie jest idealny, ale mimo to się rozwija.
Nowy kompilator
W gałęzi /mashc repozytorium projektu można zobaczyć nową wersję kompilatora napisaną w języku Mash (pierwsza wersja tego języka).
Kompilator ma generator kodu na liście asm (dla asemblera dla maszyny wirtualnej opartej na stosie).
Obecnie opracowuję wersję generatora dla Java (JDK 1.8).
Nowa wersja kompilatora w pełni wspiera funkcjonalność pierwszej wersji języka i ją uzupełnia.
Nowy OOP
W nowej wersji języka częściowo przeprojektowano pracę z klasami.
Metody klas można deklarować zarówno w treści klasy, jak i poza nią.
Klasa ma teraz jawnego konstruktora: init.
Przykładowy kod:
...
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
...
Jeśli nastąpi dziedziczenie, wówczas mamy możliwość łatwego wykonywania dziedziczonych wywołań (super).
Przykładowy kod:
...
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
Dynamiczne nadpisywanie metod w instancjach klas:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pakiety/przestrzenie nazw
Przestrzeń nazw musi pozostać czysta!
W związku z tym język musi zapewniać taką możliwość.
W Mash, jeśli metoda klasy jest statyczna, można ją bezpiecznie wywołać z dowolnej części kodu.
Przykład:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Nawiasem mówiąc, superoperator będzie działał poprawnie, gdy zostanie wywołany w ten sposób.
Wyjątki
W nowej wersji języka są one traktowane jak klasy:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Nowe wyliczenie
Teraz elementom wyliczeniowym można przypisać wartości stałe:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Wbudowany język
Potencjalnie Mash może znaleźć swoją niszę jako wbudowany język programowania, podobny do Lua.
Aby zacząć używać Masha do tych celów, nie musisz nawet samodzielnie montować projektu.
Mash ma środowisko uruchomieniowe - maszynę wirtualną opartą na stosie, skompilowaną jako bibliotekę dynamiczną z pełnym interfejsem API.
Wszystko, co musisz zrobić, to dodać go do zależności projektu i wykonać kilka wywołań.
Sam język zapewnia funkcjonalność umożliwiającą pracę jako język osadzony.
Jednocześnie nie ma to wpływu na wydajność w połączeniu z bibliotekami językowymi i zewnętrznymi.
Otrzymujemy wbudowany język, który potrafi wykorzystać pełną moc różnych napisanych w nim frameworków.
Zacier + JVM
Zacząłem opracowywać wersję tłumacza dla JVM.
Być może po N czasie na Habré pojawi się post na ten temat.
Wyniki
Nie ma żadnych konkretnych wyników. Jest to pośrednia reprezentacja wyników.
Życzę wszystkim powodzenia w 2020 roku.
Źródło: www.habr.com