Ang Mash ay isang programming language na kino-compile ang sarili nito

Ang Mash ay isang programming language na kino-compile ang sarili nito

Pagbati sa lahat sa bagong taon 2020.

Mula nang mailathala ang una pag-aayuno Halos eksaktong 1 taon na ang lumipas tungkol kay Mash.

Sa taong ito, ang wika ay lubos na napabuti, marami sa mga aspeto nito ang pinag-isipang mabuti at ang vector ng pag-unlad ay natukoy.

Ikinagagalak kong ibahagi ang lahat ng ito sa komunidad.

Pagtanggi sa pananagutan

Ang proyektong ito ay binuo lamang sa sigasig at hindi nagpapanggap na dominasyon sa mundo sa larangan ng mga dynamic na programming language!

Ang pag-unlad na ito ay hindi dapat ituring bilang isang pamantayan na dapat pagsikapan; ang proyekto ay hindi perpekto, ngunit ito ay umuunlad gayunpaman.

GitHub
Π‘Π°ΠΉΡ‚
Pagtitipon

Bagong compiler

Sa sangay ng /mashc ng repositoryo ng proyekto, makakakita ka ng bagong bersyon ng compiler, na nakasulat sa Mash (ang unang bersyon ng wika).

Ang compiler ay may code generator sa asm listing (para sa assembler para sa stack-based VM).
Sa kasalukuyan ay gumagawa ako ng bersyon ng generator para sa Java (JDK 1.8).

Ang bagong bersyon ng compiler ay ganap na sumusuporta sa functionality ng unang bersyon ng wika at pinupunan ito.

Bagong OOP

Sa bagong bersyon ng wika, ang gawain sa mga klase ay bahagyang muling idinisenyo.
Ang mga pamamaraan ng klase ay maaaring ideklara kapwa sa katawan ng klase at sa labas nito.
Ang klase ay mayroon na ngayong tahasang constructor: init.

Halimbawang code:

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

Kung nangyari ang mana, magkakaroon tayo ng pagkakataon na madaling gumawa ng mga minanang tawag (super).

Halimbawang code:

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

Dynamic na pag-override ng mga pamamaraan sa mga instance ng klase:

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

Mga package/namespace

Dapat manatiling malinis ang namespace!
Alinsunod dito, ang wika ay dapat magbigay ng pagkakataong ito.
Sa Mash, kung ang isang paraan ng klase ay static, maaari itong ligtas na tawagan mula sa anumang bahagi ng code.

Halimbawa:

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

Sa pamamagitan ng paraan, ang super operator ay gagana nang tama kapag tinawag sa ganitong paraan.

Mga pagbubukod

Sa bagong bersyon ng wika, itinuturing silang mga klase:

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

Bagong enum

Ngayon ang mga elemento ng enumeration ay maaaring italaga ng mga pare-parehong halaga:

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

Naka-embed na wika

Posible, mahahanap ng Mash ang angkop na lugar nito bilang isang naka-embed na programming language, katulad ng Lua.

Upang simulan ang paggamit ng Mash para sa mga layuning ito, hindi mo na kailangang i-assemble ang proyekto nang mag-isa.

Ang Mash ay may Runtime Environment - isang stack-based na VM na pinagsama-sama bilang isang dynamic na library na may buong API.

Ang kailangan mo lang gawin ay idagdag ito sa dependency ng proyekto at gumawa ng ilang tawag.

Ang wika mismo ay nagbibigay ng functionality upang gumana bilang isang naka-embed na wika.
Kasabay nito, ang pagganap kasabay ng wika at mga aklatan ng third-party ay hindi apektado.
Nakakakuha kami ng naka-embed na wika na maaaring gumamit ng buong kapangyarihan ng iba't ibang mga framework na nakasulat dito.

Mash + JVM

Nagsimula akong bumuo ng isang bersyon ng tagasalin para sa JVM.
Marahil, pagkatapos ng N tagal ng oras, isang post sa paksang ito ay lalabas sa HabrΓ©.

Mga resulta ng

Walang partikular na resulta. Ito ay isang intermediate na representasyon ng mga resulta.
Good luck sa lahat sa 2020.

Pinagmulan: www.habr.com

Magdagdag ng komento