Mash is een programmeertaal die zichzelf compileert

Mash is een programmeertaal die zichzelf compileert

Groeten aan iedereen in het nieuwe jaar 2020.

Sinds de publicatie van de eerste vasten Er is bijna precies 1 jaar verstreken rond Mash.

Gedurende dit jaar werd de taal enorm verbeterd, over veel aspecten ervan nagedacht en de ontwikkelingsvector bepaald.

Ik ben blij om dit allemaal met de gemeenschap te delen.

Disclaimer

Dit project wordt uitsluitend op enthousiasme ontwikkeld en pretendeert geen wereldheerschappij op het gebied van dynamische programmeertalen!

Deze ontwikkeling moet niet worden beschouwd als een norm waarnaar moet worden gestreefd; het project is niet ideaal, maar ontwikkelt zich toch.

GitHub
Plaats
forum

Nieuwe compiler

In de /mashc-tak van de projectrepository kun je een nieuwe versie van de compiler zien, die is geschreven in Mash (de eerste versie van de taal).

De compiler heeft een codegenerator in ASM-lijst (voor assembler voor een op stapel gebaseerde VM).
Momenteel ontwikkel ik een versie van de generator voor Java (JDK 1.8).

De nieuwe versie van de compiler ondersteunt de functionaliteit van de eerste versie van de taal volledig en vormt een aanvulling hierop.

Nieuwe OOP

In de nieuwe versie van de taal is het werken met klassen gedeeltelijk opnieuw ontworpen.
Klassemethoden kunnen zowel in de klassenbody als daarbuiten worden gedeclareerd.
De klasse heeft nu een expliciete constructor: init.

Voorbeeldcode:

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

Als er sprake is van overerving, hebben we de mogelijkheid om gemakkelijk overgeΓ«rfde oproepen te doen (super).

Voorbeeldcode:

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

Dynamisch overschrijven van methoden op klasse-instanties:

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

Pakketten/naamruimten

De naamruimte moet schoon blijven!
Daarom moet de taal deze mogelijkheid bieden.
Als een klassenmethode in Mash statisch is, kan deze veilig vanuit elk deel van de code worden aangeroepen.

Voorbeeld:

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

Overigens zal de superoperator correct werken als hij op deze manier wordt opgeroepen.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

In de nieuwe versie van de taal worden ze behandeld als klassen:

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

Nieuw enum

Nu kunnen aan opsommingselementen constante waarden worden toegewezen:

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

Ingebedde taal

Mogelijk kan Mash zijn niche vinden als een ingebedde programmeertaal, vergelijkbaar met Lua.

Om Mash voor deze doeleinden te gaan gebruiken, hoeft u het project niet eens zelf in elkaar te zetten.

Mash heeft een Runtime Environment: een stackgebaseerde VM die is samengesteld als een dynamische bibliotheek met een volledige API.

Het enige dat u hoeft te doen, is het aan de projectafhankelijkheid toevoegen en een paar keer bellen.

De taal zelf biedt functionaliteit om als ingebedde taal te werken.
Tegelijkertijd worden de prestaties in combinatie met taal- en externe bibliotheken niet beΓ―nvloed.
We krijgen een ingebedde taal die de volledige kracht van de verschillende raamwerken die erin zijn geschreven, kan gebruiken.

Mash + JVM

Ik begon met het ontwikkelen van een versie van de vertaler voor de JVM.
Misschien verschijnt er na N tijd een bericht over dit onderwerp op HabrΓ©.

Resultaten van

Er zijn geen bijzondere resultaten. Dit is een tussenweergave van de resultaten.
Veel succes voor iedereen in 2020.

Bron: www.habr.com

Voeg een reactie