Mash - bu o'zini kompilyatsiya qiladigan dasturlash tili

Mash - bu o'zini kompilyatsiya qiladigan dasturlash tili

Hammani kirib kelayotgan yangi 2020-yil bilan tabriklayman.

Birinchisi nashr etilganidan beri post Mash haqida deyarli roppa-rosa 1 yil o'tdi.

Bu yil davomida til ancha takomillashtirildi, uning ko‘p jihatlari o‘ylab topildi va rivojlanish vektori aniqlandi.

Bularning barchasini jamiyat bilan baham ko'rishdan xursandman.

Masʼuliyatdan voz kechish

Ushbu loyiha faqat ishtiyoq bilan ishlab chiqilmoqda va dinamik dasturlash tillari sohasida dunyo hukmronligiga da'vo qilmaydi!

Ushbu rivojlanishni intilish kerak bo'lgan standart deb hisoblamaslik kerak; loyiha ideal emas, lekin shunga qaramay rivojlanmoqda.

GitHub
veb-sayt
forum

Yangi kompilyator

Loyiha omborining /mashc bo'limida siz kompilyatorning Mash tilida yozilgan yangi versiyasini ko'rishingiz mumkin (tilning birinchi versiyasi).

Kompilyatorda asm listingda kod generatori mavjud (stekga asoslangan VM uchun assembler uchun).
Hozir men Java (JDK 1.8) uchun generator versiyasini ishlab chiqyapman.

Kompilyatorning yangi versiyasi tilning birinchi versiyasining funksionalligini to'liq qo'llab-quvvatlaydi va uni to'ldiradi.

Yangi OOP

Tilning yangi versiyasida sinflar bilan ishlash qisman qayta ishlandi.
Sinf usullari sinf tanasida ham, undan tashqarida ham e'lon qilinishi mumkin.
Endi sinfda aniq konstruktor mavjud: init.

Kod namunasi:

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

Agar meros sodir bo'lsa, unda biz osongina meros qo'ng'iroqlarini amalga oshirish imkoniyatiga egamiz (super).

Kod namunasi:

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

Sinf misollarida usullarni dinamik ravishda bekor qilish:

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

Paketlar/nom bo'shliqlari

Nomlar maydoni toza bo'lishi kerak!
Shunga ko'ra, til bu imkoniyatni ta'minlashi kerak.
Mash-da, agar sinf usuli statik bo'lsa, uni kodning istalgan qismidan xavfsiz chaqirish mumkin.

Misol:

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

Aytgancha, super operator shu tarzda chaqirilganda to'g'ri ishlaydi.

Istisnolar

Tilning yangi versiyasida ular sinflar kabi ko'rib chiqiladi:

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

Yangi raqam

Endi ro'yxatga olish elementlariga doimiy qiymatlar berilishi mumkin:

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

O'rnatilgan til

Ehtimol, Mash Lua tiliga o'xshash o'rnatilgan dasturlash tili sifatida o'z joyini topishi mumkin.

Ushbu maqsadlar uchun Mash-dan foydalanishni boshlash uchun siz hatto loyihani o'zingiz yig'ishingiz shart emas.

Mashda Runtime Environment mavjud - to'liq API bilan dinamik kutubxona sifatida tuzilgan stekga asoslangan VM.

Sizga kerak bo'lgan yagona narsa uni loyihaga bog'liqlikka qo'shish va bir nechta qo'ng'iroq qilishdir.

Tilning o'zi o'rnatilgan til sifatida ishlash uchun funksionallikni ta'minlaydi.
Shu bilan birga, til va uchinchi tomon kutubxonalari bilan birgalikda ishlashga ta'sir qilmaydi.
Biz unda yozilgan turli ramkalarning to'liq quvvatidan foydalana oladigan o'rnatilgan tilni olamiz.

Mash + JVM

Men JVM uchun tarjimon versiyasini ishlab chiqishni boshladim.
Ehtimol, N vaqt o'tgach, Habré-da ushbu mavzu bo'yicha post paydo bo'ladi.

natijalar

Hech qanday maxsus natijalar yo'q. Bu natijalarning oraliq ifodasidir.
2020-yilda hammaga omad.

Manba: www.habr.com

a Izoh qo'shish