Mash este un limbaj de programare care se compilează singur

Mash este un limbaj de programare care se compilează singur

Salutări tuturor în noul an 2020.

De la publicarea primei Oficiul poștal A trecut aproape exact 1 an despre Mash.

Pe parcursul acestui an limbajul a fost mult îmbunătățit, multe dintre aspectele sale au fost gândite și s-a determinat vectorul dezvoltării.

Mă bucur să împărtășesc toate acestea cu comunitatea.

Declinare a responsabilităţii

Acest proiect este dezvoltat exclusiv din entuziasm și nu pretinde dominație mondială în domeniul limbajelor de programare dinamică!

Această dezvoltare nu ar trebui să fie considerată un standard pentru care trebuie depus eforturi; proiectul nu este ideal, dar se dezvoltă totuși.

GitHub
Loc
for

Compilator nou

În ramura /mashc a depozitului de proiect, puteți vedea o nouă versiune a compilatorului, care este scrisă în Mash (prima versiune a limbajului).

Compilatorul are un generator de cod în listarea asm (pentru asamblare pentru o VM bazată pe stivă).
În prezent, dezvolt o versiune a generatorului pentru Java (JDK 1.8).

Noua versiune a compilatorului acceptă pe deplin funcționalitatea primei versiuni a limbajului și o completează.

OOP nou

În noua versiune a limbii, lucrul cu clasele a fost reproiectat parțial.
Metodele de clasă pot fi declarate atât în ​​corpul clasei, cât și în afara acestuia.
Clasa are acum un constructor explicit: init.

Cod simplu:

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

Dacă apare moștenirea, atunci avem posibilitatea de a face cu ușurință apeluri moștenite (super).

Cod simplu:

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

Suprascrierea dinamică a metodelor pe instanțe de clasă:

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

Pachete/spații de nume

Spațiul de nume trebuie să rămână curat!
În consecință, limba trebuie să ofere această oportunitate.
În Mash, dacă o metodă de clasă este statică, poate fi apelată în siguranță din orice parte a codului.

Exemplu:

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

Apropo, super operatorul va funcționa corect atunci când este chemat în acest fel.

excepții

În noua versiune a limbii, acestea sunt tratate ca niște clase:

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

Enum nou

Acum elementelor de enumerare li se pot atribui valori constante:

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

Limbajul încorporat

Potențial, Mash își poate găsi nișa ca limbaj de programare încorporat, similar cu Lua.

Pentru a începe să utilizați Mash în aceste scopuri, nici măcar nu trebuie să asamblați singur proiectul.

Mash are un mediu de rulare - un VM bazat pe stivă, compilat ca o bibliotecă dinamică cu un API complet.

Tot ce trebuie să faceți este să îl adăugați la dependența de proiect și să efectuați câteva apeluri.

Limbajul în sine oferă funcționalitate pentru a funcționa ca un limbaj încorporat.
În același timp, performanța împreună cu bibliotecile de limbă și de la terți nu este afectată.
Obținem un limbaj încorporat care poate folosi întreaga putere a diferitelor cadre scrise în el.

Mash + JVM

Am început să dezvolt o versiune a traductorului pentru JVM.
Poate că, după N timp, o postare pe acest subiect va apărea pe Habré.

Rezultatele

Nu există rezultate deosebite. Aceasta este o reprezentare intermediară a rezultatelor.
Mult succes tuturor in 2020.

Sursa: www.habr.com

Adauga un comentariu