Mash is in programmeartaal dy't himsels kompilearret.

Mash is in programmeartaal dy't himsels kompilearret.

Groetnis oan allegearre yn it nije jier 2020.

Sûnt de publikaasje fan 'e earste peal oer Mash is hast krekt 1 jier foarby.

Yn dit jier is de taal flink ferbettere, in protte aspekten derfan úttocht en is in ûntwikkelingsvektor bepaald.

Dit alles bin ik bliid om te dielen mei de mienskip.

Disclaimer

Dit projekt wurdt allinnich ûntwikkele op entûsjasme en docht net foar as wrâldoerhearsking op it mêd fan dynamyske programmeartalen!

Jo moatte dizze ûntwikkeling net beskôgje as in standert wêrop jo moatte stribje, it projekt is net ideaal, mar it ûntwikkelt lykwols.

GitHub
webside
Forum

Nije gearstaller

Yn 'e /mashc-tûke fan it projektrepository kinne jo de nije ferzje fan' e kompilator sjen, dy't skreaun is yn Mash (de earste ferzje fan 'e taal).

De gearstaller hat in koadegenerator yn 'e asm-listing (foar assembler ûnder de stapel VM).
Op it stuit bin ik it ûntwikkeljen fan in ferzje fan de generator foar Java (JDK 1.8).

De nije ferzje fan 'e gearstaller stipet de funksjonaliteit fan' e earste ferzje fan 'e taal folslein en komplementearret it.

Nije OOP

Yn de nije ferzje fan de taal is it wurk mei klassen wat op 'e nij ynrjochte.
Klassemetoaden kinne wurde ferklearre sawol yn it klasselichem as bûten it.
De klasse hat no in eksplisite konstruktor: init.

Foarbyld fan koade:

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

As erfenis foarkomt, dan hawwe wy de mooglikheid om maklik erflike oproppen te meitsjen (super).

Foarbyld fan koade:

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

Dynamyske oerskriuwen fan metoaden foar klasse-eksimplaren:

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

Pakketten / nammeromten

De nammeromte moat skjin bliuwe!
Dêrom moat de taal dizze kâns biede.
Yn Mash, as in klassemetoade statysk is, kin it feilich neamd wurde fan elk diel fan 'e koade.

Foarbyld:

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

Troch de wei, de super operator sil wurkje goed mei sa'n oprop.

Utsûnderingen

Yn 'e nije ferzje fan' e taal wurde se behannele as klassen:

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

Nije enum

No kinne de eleminten fan 'e enumeraasje konstante wearden wurde tawiisd:

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

Ynsletten PL

Potinsjeel - Mash kin syn niche fine as in ynbêde programmeartaal, lykas Lua.

Om Mash foar dizze doelen te brûken, hoege jo it projekt net iens sels te bouwen.

Mash hat in Runtime Environment - in stack VM boud as in dynamyske bibleteek mei in folsleine API.

Jo moatte it gewoan tafoegje oan 'e projektôfhinklikens en in pear oproppen meitsje.

De taal sels jout funksjonaliteit om te wurkjen as in ynbêde taal.
Tagelyk wurdt prestaasjes yn gearhing mei taal- en bibleteken fan tredden net skeind.
Wy krije in ynbêde taal dy't de folsleine krêft brûke kin fan ferskate kaders dy't dêryn skreaun binne.

Mash + JVM

Begûn mei it ûntwikkeljen fan in ferzje fan 'e oersetter foar de JVM.
Miskien sil nei de N-de tiid in post oer dit ûnderwerp ferskine op Habré.

Resultaten

D'r binne gjin spesifike resultaten. Dit is in tuskenlizzende foarstelling fan de resultaten.
Sterkte foar elkenien yn 2020.

Boarne: www.habr.com

Add a comment