Mash është një gjuhë programimi që përpilohet vetë

Mash është një gjuhë programimi që përpilohet vetë

Përshëndetje të gjithëve në vitin e ri 2020.

Që nga botimi i të parës postimi Ka kaluar pothuajse saktësisht 1 vit për Mash-in.

Gjatë këtij viti, gjuha u përmirësua shumë, u menduan shumë nga aspektet e saj dhe u përcaktua vektori i zhvillimit.

Jam i lumtur t'i ndaj të gjitha këto me komunitetin.

Mohim përgjegjësie

Ky projekt po zhvillohet vetëm me entuziazëm dhe nuk pretendon dominimin botëror në fushën e gjuhëve dinamike të programimit!

Ky zhvillim nuk duhet të konsiderohet si një standard për të cilin duhet të përpiqemi; projekti nuk është ideal, por megjithatë po zhvillohet.

GitHub
Faqe
Forum

Përpilues i ri

Në degën /mashc të depove të projektit, mund të shihni një version të ri të përpiluesit, i cili është shkruar në Mash (versioni i parë i gjuhës).

Përpiluesi ka një gjenerator kodi në listën asm (për assembler për një VM të bazuar në stek).
Aktualisht jam duke zhvilluar një version të gjeneratorit për Java (JDK 1.8).

Versioni i ri i përpiluesit mbështet plotësisht funksionalitetin e versionit të parë të gjuhës dhe e plotëson atë.

OOP i ri

Në versionin e ri të gjuhës, puna me klasa është ridizajnuar pjesërisht.
Metodat e klasës mund të deklarohen si në trupin e klasës ashtu edhe jashtë saj.
Klasa tani ka një konstruktor eksplicit: init.

Shembull i kodit:

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

Nëse ndodh trashëgimia, atëherë kemi mundësinë që lehtësisht të bëjmë thirrje të trashëguara (super).

Shembull i kodit:

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

Mbështetja dinamike e metodave në instancat e klasës:

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

Paketat/hapësirat e emrave

Hapësira e emrave duhet të mbetet e pastër!
Prandaj, gjuha duhet ta ofrojë këtë mundësi.
Në Mash, nëse një metodë e klasës është statike, ajo mund të thirret në mënyrë të sigurt nga çdo pjesë e kodit.

Shembull:

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

Nga rruga, super operatori do të funksionojë siç duhet kur thirret në këtë mënyrë.

përjashtime

Në versionin e ri të gjuhës ato trajtohen si klasa:

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

Numri i ri

Tani elementëve të numërimit mund t'u caktohen vlera konstante:

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

Gjuha e ngulitur

Potencialisht, Mash mund të gjejë vendin e saj si një gjuhë programimi e integruar, e ngjashme me Lua.

Për të filluar përdorimin e Mash për këto qëllime, nuk keni nevojë as ta montoni vetë projektin.

Mash ka një mjedis Runtime - një VM e bazuar në stek, e përpiluar si një bibliotekë dinamike me një API të plotë.

E tëra çfarë ju duhet të bëni është ta shtoni atë në varësinë e projektit dhe të bëni disa telefonata.

Vetë gjuha ofron funksionalitet për të punuar si gjuhë e integruar.
Në të njëjtën kohë, performanca në lidhje me gjuhën dhe bibliotekat e palëve të treta nuk ndikohet.
Ne marrim një gjuhë të integruar që mund të përdorë fuqinë e plotë të kornizave të ndryshme të shkruara në të.

Mash + JVM

Fillova të zhvilloj një version të përkthyesit për JVM.
Ndoshta, pas N shumë kohe, një postim mbi këtë temë do të shfaqet në Habré.

Rezultatet e

Nuk ka rezultate të veçanta. Ky është një paraqitje e ndërmjetme e rezultateve.
Fat të gjithëve në vitin 2020.

Burimi: www.habr.com

Shto një koment