Mash ir programmēšanas valoda, kas kompilējas pati

Mash ir programmēšanas valoda, kas kompilējas pati

Sveiciens visiem jaunajā 2020. gadā.

Kopš pirmās publicēšanas badošanās Gandrīz tieši 1 gads ir pagājis par Mash.

Šī gada laikā valoda tika krietni pilnveidota, pārdomāti daudzi tās aspekti un noteikts attīstības vektors.

Es priecājos dalīties tajā visā ar sabiedrību.

Atbildības noraidīšana

Šis projekts tiek izstrādāts tikai aiz entuziasma un nepretendē uz pasaules kundzību dinamisko programmēšanas valodu jomā!

Šo attīstību nevajadzētu uzskatīt par standartu, uz kuru jātiecas, projekts nav ideāls, taču tas attīstās.

GitHub
Vietā
Forums

Jauns kompilators

Projekta repozitorija filiālē /mashc var redzēt jaunu kompilatora versiju, kas ir rakstīta Mash (pirmā valodas versija).

Kompilatoram ir koda ģenerators asm sarakstā (uz steku balstītas virtuālās mašīnas montētājam).
Pašlaik es izstrādāju ģeneratora versiju Java (JDK 1.8).

Jaunā kompilatora versija pilnībā atbalsta pirmās valodas versijas funkcionalitāti un papildina to.

Jauns OOP

Jaunajā valodas versijā darbs ar klasēm ir daļēji pārveidots.
Klases metodes var deklarēt gan klases pamattekstā, gan ārpus tā.
Klasei tagad ir skaidrs konstruktors: init.

Koda piemērs:

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

Ja notiek mantojums, tad mums ir iespēja ērti veikt mantotos zvanus (super).

Koda piemērs:

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

Dinamiskā metožu ignorēšana klases gadījumos:

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

Paketes/nosaukumvietas

Nosaukumvietai jāpaliek tīrai!
Attiecīgi valodai ir jānodrošina šī iespēja.
Mash, ja klases metode ir statiska, to var droši izsaukt no jebkuras koda daļas.

Piemērs:

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

Starp citu, superoperators strādās pareizi, kad šādi izsauc.

Izņēmumi

Jaunajā valodas versijā tās tiek uzskatītas par klasēm:

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

Jauns enum

Tagad uzskaites elementiem var piešķirt nemainīgas vērtības:

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

Iegultā valoda

Potenciāli Mash var atrast savu nišu kā iegultā programmēšanas valoda, līdzīga Lua.

Lai sāktu izmantot Mash šiem mērķiem, jums pat nav nepieciešams pats salikt projektu.

Mash ir izpildlaika vide — uz steku balstīta VM, kas apkopota kā dinamiska bibliotēka ar pilnu API.

Viss, kas jums jādara, ir pievienot to projekta atkarībai un veikt pāris zvanu.

Pati valoda nodrošina funkcionalitāti darbam kā iegultai valodai.
Tajā pašā laikā netiek ietekmēta veiktspēja saistībā ar valodu un trešo pušu bibliotēkām.
Mēs iegūstam iegultu valodu, kas var izmantot visu tajā ierakstīto dažādu ietvaru jaudu.

Mash + JVM

Es sāku izstrādāt tulka versiju JVM.
Iespējams, pēc N laika Habré parādīsies ziņa par šo tēmu.

Rezultāti

Nav īpašu rezultātu. Šis ir rezultātu starpposms.
Veiksmi visiem 2020. gadā.

Avots: www.habr.com

Pievieno komentāru