Mash on ohjelmointikieli, joka kääntää itsensä

Mash on ohjelmointikieli, joka kääntää itsensä

Tervehdys kaikille uutta vuotta 2020.

Ensimmäisen julkaisun jälkeen lähettää Mashista on kulunut melkein tasan vuosi.

Tämän vuoden aikana kieltä paranneltiin suuresti, sen monia puolia mietittiin ja kehitysvektoria määriteltiin.

Olen iloinen voidessani jakaa tämän kaiken yhteisön kanssa.

Vastuun kieltäminen

Tämä projekti on kehitetty yksinomaan innostuksesta, eikä se väitä olevansa maailmanvalloitus dynaamisten ohjelmointikielten alalla!

Tätä kehitystä ei pidä pitää standardina, johon on pyrittävä, hanke ei ole ihanteellinen, mutta kehittyy kuitenkin.

GitHub
Paikka
foorumi

Uusi kääntäjä

Projektivaraston /mashc-haarassa näet kääntäjän uuden version, joka on kirjoitettu Mashilla (kielen ensimmäinen versio).

Kääntäjässä on koodigeneraattori asm-listauksessa (pinopohjaisen virtuaalikoneen kokoonpanijaa varten).
Tällä hetkellä kehitän versiota generaattorista Javalle (JDK 1.8).

Kääntäjän uusi versio tukee täysin kielen ensimmäisen version toimintoja ja täydentää sitä.

Uusi OOP

Uudessa kielen versiossa työskentely luokkien kanssa on suunniteltu osittain uudelleen.
Luokkametodit voidaan ilmoittaa sekä luokan rungossa että sen ulkopuolella.
Luokassa on nyt eksplisiittinen konstruktori: init.

Koodiesimerkki:

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

Jos perinnöllistä tapahtuu, meillä on mahdollisuus tehdä helposti perittyjä puheluita (super).

Koodiesimerkki:

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

Luokkainstanssien menetelmien dynaaminen ohittaminen:

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

Paketit/nimitilat

Nimiavaruuden tulee pysyä puhtaana!
Näin ollen kielen on tarjottava tämä mahdollisuus.
Jos luokkametodi on Mashissa staattinen, sitä voidaan kutsua turvallisesti mistä tahansa koodin osasta.

Esimerkiksi:

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

Muuten, superoperaattori toimii oikein, kun sitä kutsutaan tällä tavalla.

poikkeukset

Kielen uudessa versiossa niitä käsitellään kuin luokkia:

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

Uusi enum

Nyt luetteloelementeille voidaan määrittää vakioarvot:

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

Upotettu kieli

Mahdollisesti Mash voi löytää markkinarakonsa sulautetuksi ohjelmointikieleksi, joka on samanlainen kuin Lua.

Jotta voit alkaa käyttää Mashia näihin tarkoituksiin, sinun ei tarvitse edes koota projektia itse.

Mashilla on Runtime Environment - pinopohjainen VM, joka on käännetty dynaamiseksi kirjastoksi, jossa on täydellinen API.

Sinun tarvitsee vain lisätä se projektiriippuvuuteen ja soittaa pari puhelua.

Kieli itsessään tarjoaa toiminnallisuuden toimiakseen upotettuna kielenä.
Samalla se ei vaikuta suorituskykyyn kielten ja kolmannen osapuolen kirjastojen kanssa.
Saamme sulautetun kielen, joka voi hyödyntää siihen kirjoitettujen erilaisten puitteiden täyttä tehoa.

Mash + JVM

Aloin kehittää versiota kääntäjästä JVM:lle.
Ehkä N ajan kuluttua tästä aiheesta ilmestyy viesti Habreen.

Tulokset

Mitään erityisiä tuloksia ei ole. Tämä on väliesitys tuloksista.
Onnea kaikille vuodelle 2020.

Lähde: will.com

Lisää kommentti