Mash to język programowania, który sam się kompiluje

Mash to język programowania, który sam się kompiluje

Witam wszystkich w nowym roku 2020.

Od czasu publikacji pierwszego post Minął prawie dokładnie rok od Mash.

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.

GitHub
Strona
forum

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

Dodaj komentarz