Mash yra programavimo kalba, kuri kompiliuoja pati

Mash yra programavimo kalba, kuri kompiliuoja pati

Sveikinu visus su naujais 2020 metais.

Nuo pat pirmojo paskelbimo paštu Apie Mash praėjo beveik lygiai 1 metai.

Per šiuos metus kalba buvo labai patobulinta, apgalvota daugelis jos aspektų, nustatytas raidos vektorius.

Džiaugiuosi galėdamas visu tuo pasidalinti su bendruomene.

Atsakomybės neigimas

Šis projektas kuriamas tik entuziastingai ir nepretenduoja į pasaulinį dominavimą dinaminių programavimo kalbų srityje!

Ši plėtra neturėtų būti laikoma standartu, kurio reikia siekti, projektas nėra idealus, bet vis dėlto vystosi.

GitHub
Vieta
forumas

Naujas kompiliatorius

Projekto saugyklos šakoje /mashc galite pamatyti naują kompiliatoriaus versiją, kuri parašyta Mash (pirmoji kalbos versija).

Kompiliatorius turi kodų generatorių asm sąraše (skirtas rinkiniui pagrįsto VM surinkėjui).
Šiuo metu kuriu generatoriaus versiją, skirtą Java (JDK 1.8).

Naujoji kompiliatoriaus versija visiškai palaiko pirmosios kalbos versijos funkcionalumą ir ją papildo.

Naujas OOP

Naujoje kalbos versijoje darbas su klasėmis buvo iš dalies pakeistas.
Klasės metodai gali būti deklaruojami tiek klasės korpuse, tiek už jo ribų.
Dabar klasėje yra aiškus konstruktorius: init.

Kodo pavyzdys:

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

Jei įvyksta paveldėjimas, tuomet turime galimybę nesunkiai atlikti paveldėtus skambučius (super).

Kodo pavyzdys:

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

Dinaminis metodų nepaisymas klasės egzemplioriuose:

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

Paketai / vardų erdvės

Vardų erdvė turi likti švari!
Atitinkamai, kalba turi suteikti tokią galimybę.
Mash, jei klasės metodas yra statinis, jį galima saugiai iškviesti iš bet kurios kodo dalies.

Pavyzdys:

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

Beje, super operatorius taip iškviestas veiks teisingai.

Išimtys

Naujoje kalbos versijoje jie traktuojami kaip klasės:

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

Naujas enum

Dabar surašymo elementams galima priskirti pastovias reikšmes:

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

Įterpta kalba

Potencialiai Mash gali rasti savo nišą kaip įterptoji programavimo kalba, panaši į Lua.

Norėdami pradėti naudoti Mash šiems tikslams, jums net nereikia patiems surinkti projekto.

„Mash“ turi vykdymo aplinką – kamino pagrindu sukurtą VM, sukompiliuotą kaip dinaminę biblioteką su visa API.

Viskas, ką jums reikia padaryti, tai pridėti jį prie projekto priklausomybės ir paskambinti porą kartų.

Pati kalba suteikia funkcionalumą veikti kaip įterptoji kalba.
Tuo pačiu metu našumas kartu su kalbos ir trečiųjų šalių bibliotekomis neturi įtakos.
Gauname įterptąją kalbą, kuri gali išnaudoti visą įvairių joje parašytų karkasų galią.

Mash + JVM

Pradėjau kurti JVM vertėjo versiją.
Galbūt po N laiko Habré pasirodys įrašas šia tema.

rezultatai

Konkrečių rezultatų nėra. Tai yra tarpinis rezultatų vaizdas.
Sėkmės visiems 2020 metais.

Šaltinis: www.habr.com

Добавить комментарий