Mash бол өөрөө хөрвүүлдэг програмчлалын хэл юм

Mash бол өөрөө хөрвүүлдэг програмчлалын хэл юм

Бүгдэд нь ирж буй 2020 оны шинэ оны мэнд хүргэе.

Эхнийх нь хэвлэгдсэнээс хойш мацаг барих Маш бараг яг 1 жил өнгөрчээ.

Энэ жилийн хугацаанд хэлийг ихээхэн сайжруулж, олон талаас нь бодож, хөгжлийн векторыг тодорхойлсон.

Энэ бүхнийг олон нийттэй хуваалцаж байгаадаа баяртай байна.

Disclaimer

Энэхүү төслийг зөвхөн урам зоригоор боловсруулж байгаа бөгөөд динамик програмчлалын хэлээр дэлхийд ноёрхлоо харуулахгүй!

Энэ бүтээн байгуулалтыг хичээх ёстой жишиг гэж үзэж болохгүй, төсөл нь тийм ч тохиромжтой биш, гэхдээ хөгжиж байна.

GitHub
вэб сайт
форум

Шинэ хөрвүүлэгч

Төслийн агуулахын /mashc салбараас та Mash (хэлний анхны хувилбар) дээр бичигдсэн хөрвүүлэгчийн шинэ хувилбарыг харж болно.

Хөрвүүлэгч нь asm жагсаалтад код үүсгэгчтэй (стек дээр суурилсан VM-ийн ассемблерт зориулагдсан).
Одоогоор би Java-д зориулсан генераторын хувилбарыг боловсруулж байна (JDK 1.8).

Хөрвүүлэгчийн шинэ хувилбар нь хэлний эхний хувилбарын функцийг бүрэн дэмжиж, түүнийг нөхөж өгдөг.

Шинэ OOP

Хэлний шинэ хувилбарт ангиудтай ажиллах ажлыг хэсэгчлэн шинэчилсэн.
Ангийн аргуудыг ангийн үндсэн болон түүний гадна аль алинд нь зарлаж болно.
Анги нь одоо тодорхой байгуулагчтай болсон: init.

Жишээ код:

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

Хэрэв өв залгамжлал тохиолдвол бидэнд удамшлын дуудлага хийх боломжтой (супер).

Жишээ код:

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

Ангийн тохиолдлууд дээрх аргуудыг динамик дарангуйлах:

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

Багц/нэрийн орон зай

Нэрийн орон зай цэвэр байх ёстой!
Үүний дагуу хэл нь энэ боломжийг хангах ёстой.
Mash-д хэрэв классын арга статик байвал кодын аль ч хэсгээс аюулгүйгээр дуудаж болно.

Жишээ нь:

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

Дашрамд хэлэхэд супер оператор ийм байдлаар дуудагдах үед зөв ажиллах болно.

Үл хамаарал

Хэлний шинэ хувилбарт тэдгээрийг анги гэж үздэг.

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

Шинэ тоо

Одоо тооллын элементүүдэд тогтмол утгыг оноож болно:

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

Суулгасан хэл

Mash нь Lua-тай адил суулгагдсан програмчлалын хэлээр өөрийн байр сууриа олох боломжтой.

Эдгээр зорилгоор Mash-г ашиглаж эхлэхийн тулд та төслийг өөрөө угсрах шаардлагагүй болно.

Mash нь Runtime Environment-тэй - бүрэн API бүхий динамик номын сан болгон эмхэтгэсэн стек дээр суурилсан VM.

Таны хийх ёстой зүйл бол үүнийг төслийн хамааралд нэмж, хэд хэдэн дуудлага хийх явдал юм.

Хэл нь өөрөө суулгагдсан хэлээр ажиллах функцээр хангадаг.
Үүний зэрэгцээ хэлний болон гуравдагч талын номын сантай хамтран ажиллахад нөлөөлөхгүй.
Бид дотор нь бичигдсэн янз бүрийн фреймворкуудын бүрэн хүчийг ашиглах боломжтой суулгагдсан хэлийг олж авдаг.

Mash + JVM

Би JVM-д зориулсан орчуулагчийн хувилбарыг боловсруулж эхэлсэн.
Магадгүй, N хугацааны дараа энэ сэдвээр нийтлэл Хабре дээр гарч ирэх болно.

Үр дүн

Тодорхой үр дүн байхгүй. Энэ бол үр дүнгийн завсрын төлөөлөл юм.
2020 онд бүгдэд нь амжилт хүсье.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх