Mash ialah bahasa pengaturcaraan yang menyusun dirinya sendiri

Mash ialah bahasa pengaturcaraan yang menyusun dirinya sendiri

Salam tahun baru 2020 kepada semua.

Sejak penerbitan yang pertama Lent Hampir genap 1 tahun telah berlalu tentang Mash.

Pada tahun ini, bahasa telah bertambah baik, banyak aspeknya telah difikirkan dengan teliti dan vektor pembangunan ditentukan.

Saya gembira untuk berkongsi semua ini dengan masyarakat.

Penafian

Projek ini sedang dibangunkan semata-mata atas semangat dan tidak berpura-pura menguasai dunia dalam bidang bahasa pengaturcaraan dinamik!

Pembangunan ini tidak boleh dianggap sebagai satu piawaian yang perlu diperjuangkan; projek ini tidak ideal, tetapi ia sedang berkembang.

GitHub
Website
forum

Penyusun baharu

Dalam /mashc cawangan repositori projek, anda boleh melihat versi baharu pengkompil, yang ditulis dalam Mash (versi pertama bahasa).

Pengkompil mempunyai penjana kod dalam penyenaraian asm (untuk pemasang untuk VM berasaskan tindanan).
Pada masa ini saya sedang membangunkan versi penjana untuk Java (JDK 1.8).

Versi baharu pengkompil menyokong sepenuhnya kefungsian versi pertama bahasa dan melengkapkannya.

OOP baharu

Dalam versi baharu bahasa, kerja dengan kelas telah direka bentuk semula sebahagiannya.
Kaedah kelas boleh diisytiharkan dalam badan kelas dan di luarnya.
Kelas kini mempunyai pembina eksplisit: init.

Contoh kod:

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

Sekiranya pewarisan berlaku, maka kita mempunyai peluang untuk membuat panggilan warisan (super) dengan mudah.

Contoh kod:

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

Penggantian dinamik kaedah pada contoh kelas:

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

Pakej/ruang nama

Ruang nama mesti kekal bersih!
Sehubungan itu, bahasa mesti menyediakan peluang ini.
Dalam Mash, jika kaedah kelas adalah statik, ia boleh dipanggil dengan selamat dari mana-mana bahagian kod.

Contoh:

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

Dengan cara ini, pengendali super akan berfungsi dengan betul apabila dipanggil dengan cara ini.

Pengecualian

Dalam versi baharu bahasa mereka dilayan seperti kelas:

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

enum baru

Kini elemen penghitungan boleh diberikan nilai tetap:

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

Bahasa terbenam

Berkemungkinan, Mash boleh mencari nichenya sebagai bahasa pengaturcaraan terbenam, serupa dengan Lua.

Untuk mula menggunakan Mash untuk tujuan ini, anda tidak perlu memasang sendiri projek itu.

Mash mempunyai Persekitaran Runtime - VM berasaskan tindanan yang disusun sebagai perpustakaan dinamik dengan API penuh.

Apa yang anda perlu lakukan ialah menambahnya pada kebergantungan projek dan membuat beberapa panggilan.

Bahasa itu sendiri menyediakan kefungsian untuk berfungsi sebagai bahasa terbenam.
Pada masa yang sama, prestasi bersama-sama dengan bahasa dan perpustakaan pihak ketiga tidak terjejas.
Kami mendapat bahasa terbenam yang boleh menggunakan kuasa penuh pelbagai rangka kerja yang ditulis di dalamnya.

Mash + JVM

Saya mula membangunkan versi penterjemah untuk JVM.
Mungkin, selepas N tempoh masa, siaran mengenai topik ini akan muncul di HabrΓ©.

Keputusan

Tiada keputusan tertentu. Ini adalah perwakilan pertengahan keputusan.
Semoga berjaya untuk semua pada tahun 2020.

Sumber: www.habr.com

Tambah komen