Mash on programmeerimiskeel, mis kompileerib ise

Mash on programmeerimiskeel, mis kompileerib ise

Tervitused kõigile uuel aastal 2020.

Alates esimese avaldamisest postitusest Mashist on möödas peaaegu täpselt 1 aasta.

Selle aasta jooksul sai keelt kõvasti täiustatud, paljud selle aspektid läbi mõeldud ja arenguvektor määratud.

Mul on hea meel seda kõike kogukonnaga jagada.

Kaebused

Seda projekti arendatakse ainult entusiastlikult ja see ei pretendeeri maailma domineerimisele dünaamiliste programmeerimiskeelte valdkonnas!

Seda arengut ei tohiks pidada standardiks, mille poole püüelda, projekt pole ideaalne, kuid areneb sellegipoolest.

GitHub
veebisait
Foorum

Uus kompilaator

Projekti hoidla harus /mashc näete kompilaatori uut versiooni, mis on kirjutatud Mashis (keele esimene versioon).

Kompilaatoril on asm-loendis koodigeneraator (pinupõhise VM-i monteerija jaoks).
Praegu töötan välja Java generaatori versiooni (JDK 1.8).

Kompilaatori uus versioon toetab täielikult keele esimese versiooni funktsionaalsust ja täiendab seda.

Uus OOP

Keele uues versioonis on töö klassidega osaliselt ümber kujundatud.
Klassimeetodeid saab deklareerida nii klassi kehas kui ka väljaspool seda.
Klassil on nüüd selge konstruktor: init.

Näidiskood:

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

Pärimise korral on meil võimalus pärandatud kõnesid lihtsalt teha (super).

Näidiskood:

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

Meetodite dünaamiline alistamine klassi eksemplaridel:

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

Paketid/nimeruumid

Nimeruum peab jääma puhtaks!
Sellest lähtuvalt peab keel selle võimaluse pakkuma.
Kui Mashis on klassimeetod staatiline, saab seda turvaliselt välja kutsuda mis tahes koodiosast.

Näide:

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

Muide, superoperaator töötab sel viisil kutsudes õigesti.

Erandid

Keele uues versioonis käsitletakse neid klassidena:

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

Uus enum

Nüüd saab loenduselementidele määrata konstantsed väärtused:

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

Manustatud keel

Võimalik, et Mash võib sarnaselt Luaga leida oma niši manustatud programmeerimiskeelena.

Mashi nendel eesmärkidel kasutamise alustamiseks ei pea te isegi projekti ise kokku panema.

Mashil on Runtime Environment – ​​pinupõhine VM, mis on kompileeritud täieliku API-ga dünaamilise raamatukoguna.

Kõik, mida pead tegema, on lisada see projekti sõltuvusse ja teha paar kõnet.

Keel ise pakub manustatud keelena töötamiseks funktsioone.
Samal ajal ei mõjuta see keele ja kolmandate osapoolte raamatukogude toimivust.
Saame sisseehitatud keele, mis suudab kasutada kõigi sellesse kirjutatud raamistike võimsust.

Mash + JVM

Hakkasin JVM-i jaoks tõlkija versiooni välja töötama.
Võib-olla ilmub N aja pärast Habres selleteemaline postitus.

Tulemused

Erilisi tulemusi pole. See on tulemuste vahepealne esitus.
Edu kõigile 2020. aastal.

Allikas: www.habr.com

Lisa kommentaar