Mash je programski jezik koji se sam kompajlira

Mash je programski jezik koji se sam kompajlira

Čestitke svima u novoj 2020.

Od objave prve post Skoro točno 1 godina je prošla o Mashu.

Tijekom ove godine jezik je uvelike poboljšan, promišljeni su mnogi njegovi aspekti i određen je vektor razvoja.

Sretan sam što sve to mogu podijeliti sa zajednicom.

Izjava o odricanju od odgovornosti

Ovaj projekt se razvija isključivo na entuzijazmu i ne pretendira na svjetsku dominaciju u području dinamičkih programskih jezika!

Ovaj razvoj ne treba smatrati standardom kojem treba težiti, projekt nije idealan, ali se svejedno razvija.

GitHub
web stranica
forum

Novi prevodilac

U ogranku /mashc repozitorija projekta možete vidjeti novu verziju prevoditelja, koja je napisana u Mash-u (prva verzija jezika).

Kompajler ima generator koda u popisu asm (za asembler za VM koji se temelji na stogu).
Trenutno razvijam verziju generatora za Javu (JDK 1.8).

Nova verzija prevoditelja u potpunosti podržava funkcionalnost prve verzije jezika i nadopunjuje je.

Novi OOP

U novoj verziji jezika djelomično je redizajniran rad s razredima.
Metode klase mogu se deklarirati iu tijelu klase i izvan njega.
Klasa sada ima eksplicitni konstruktor: init.

Primjer koda:

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

Ako dođe do nasljeđivanja, onda imamo priliku lako obavljati naslijeđene pozive (super).

Primjer koda:

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

Dinamičko nadjačavanje metoda na instancama klase:

...
func Polymorph::NewFoo(c):
  return $a + $b + c  
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30)    // 60

Paketi/imenski prostori

Imenski prostor mora ostati čist!
Sukladno tome, jezik mora pružiti tu mogućnost.
U Mashu, ako je metoda klase statična, može se sigurno pozvati iz bilo kojeg dijela koda.

Primjer:

...
class MyPackage:
  func MyFunc(a, b):
    return a + b  
  end
end
...
println( MyPackage -> MyFunc(10, 20) )    // 30

Usput, super operater će raditi ispravno kada se pozove na ovaj način.

iznimke

U novoj verziji jezika oni se tretiraju kao klase:

...
try:
  raise new Exception(
    "My raised exception!"
  )
catch E:
  if E is Exception:
    println(E)
  else:
    println("Unknown exception class!")
  end
end
...

Novi popis

Sada se elementima nabrajanja mogu dodijeliti konstantne vrijednosti:

enum MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

Ugrađeni jezik

Potencijalno, Mash može pronaći svoju nišu kao ugrađeni programski jezik, sličan Lua.

Da biste počeli koristiti Mash u ove svrhe, ne morate čak ni sami sastaviti projekt.

Mash ima Runtime Environment - VM temeljen na hrpi kompajliran kao dinamička biblioteka s punim API-jem.

Sve što trebate učiniti je dodati ga u ovisnost o projektu i obaviti nekoliko poziva.

Sam jezik pruža funkcionalnost za rad kao ugrađeni jezik.
U isto vrijeme, izvedba u kombinaciji s jezikom i bibliotekama trećih strana nije pogođena.
Dobivamo ugrađeni jezik koji može koristiti punu snagu raznih okvira koji su u njemu napisani.

Mash + JVM

Počeo sam razvijati verziju prevoditelja za JVM.
Možda će se nakon N vremena na Habréu pojaviti post na ovu temu.

Rezultati

Nema posebnih rezultata. Ovo je srednji prikaz rezultata.
Sretno svima u 2020.

Izvor: www.habr.com

Dodajte komentar