Mash estas programlingvo kiu kompilas sin

Mash estas programlingvo kiu kompilas sin

Saluton al ĉiuj en la nova jaro 2020.

Ekde la publikigo de la unua fastado Preskaŭ ekzakte 1 jaro pasis pri Mash.

Dum ĉi tiu jaro, la lingvo estis multe plibonigita, multaj el ĝiaj aspektoj estis pripensitaj kaj la vektoro de evoluo estis determinita.

Mi feliĉas dividi ĉion ĉi kun la komunumo.

malgarantio

Ĉi tiu projekto estas disvolvita nur sur entuziasmo kaj ne pretendas mondregadon en la kampo de dinamikaj programlingvoj!

Ĉi tiu evoluo ne devus esti konsiderata kiel normo por strebo; la projekto ne estas ideala, sed ĝi tamen evoluas.

GitHub
retpaĝaro
forumo

Nova kompililo

En la branĉo /mashc de la projekta deponejo, vi povas vidi novan version de la kompililo, kiu estas skribita en Mash (la unua versio de la lingvo).

La kompililo havas kodgeneratoron en asm-listo (por asemblero por stak-bazita VM).
Nuntempe mi disvolvas version de la generatoro por Java (JDK 1.8).

La nova versio de la kompililo plene subtenas la funkciecon de la unua versio de la lingvo kaj kompletigas ĝin.

Nova OOP

En la nova versio de la lingvo, la laboro kun klasoj estis parte restrukturita.
Klasmetodoj povas esti deklaritaj kaj en la klaskorpo kaj ekster ĝi.
La klaso nun havas eksplicitan konstruilon: init.

Ekzempla kodo:

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

Se heredo okazas, tiam ni havas la ŝancon facile fari heredatajn vokojn (super).

Ekzempla kodo:

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

Dinamika superregado de metodoj sur klaskazoj:

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

Pakoj/nomspacoj

La nomspaco devas resti pura!
Sekve, la lingvo devas doni ĉi tiun ŝancon.
En Mash, se klasmetodo estas senmova, ĝi povas esti sekure vokita de iu ajn parto de la kodo.

Ekzemplo:

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

Cetere, la superfunkciigisto funkcios ĝuste kiam vokita tiamaniere.

Esceptoj

En la nova versio de la lingvo ili estas traktataj kiel klasoj:

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

Nova enum

Nun nombraj elementoj povas esti asignitaj konstantaj valoroj:

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

Enigita lingvo

Eble, Mash povas trovi sian niĉon kiel enigita programlingvo, simila al Lua.

Por komenci uzi Mash por ĉi tiuj celoj, vi eĉ ne bezonas kunmeti la projekton mem.

Mash havas Runtime Environment - stak-bazita VM kompilita kiel dinamika biblioteko kun plena API.

Vi nur devas aldoni ĝin al la projekta dependeco kaj fari kelkajn vokojn.

La lingvo mem disponigas funkciecon por funkcii kiel enigita lingvo.
Samtempe, rendimento kune kun lingvaj kaj triaj bibliotekoj ne estas tuŝita.
Ni ricevas enigitan lingvon, kiu povas uzi la plenan potencon de diversaj kadroj skribitaj en ĝi.

Mash + JVM

Mi komencis evoluigi version de la tradukilo por la JVM.
Eble, post N da tempo, afiŝo pri ĉi tiu temo aperos ĉe Habré.

Rezultoj

Ne estas apartaj rezultoj. Ĉi tio estas meza reprezentado de la rezultoj.
Bonŝancon al ĉiuj en 2020.

fonto: www.habr.com

Aldoni komenton