Mash өзү компиляциялоочу программалоо тили

Mash өзү компиляциялоочу программалоо тили

Баарыңыздарды жаңы 2020-жылыңыздар менен куттуктайм.

Биринчи жарыялангандан бери орозо Машга туура 1 жылдай болуп калды.

Ушул жылдын ичинде тил абдан өркүндөтүлүп, анын көп жактары ойлонулуп, өнүгүү вектору аныкталды.

Мунун баарын коомчулук менен бөлүшүп жатканыма кубанычтамын.

баш тартуу

Бул долбоор бир гана энтузиазм менен иштелип жатат жана динамикалык программалоо тилдеринде дүйнөлүк үстөмдүк кылбайт!

Бул өнүгүүгө умтула турган стандарт катары каралбашы керек; долбоор идеалдуу эмес, бирок ошентсе да өнүгүп жатат.

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

Пакеттер/ат мейкиндиктери

Ат мейкиндиги таза бойдон калышы керек!
Ошого жараша тил бул мүмкүнчүлүктү бериши керек.
Машта класстын ыкмасы статикалык болсо, аны коддун каалаган бөлүгүнөн коопсуз чакырса болот.

мисалы:

...
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 Луага окшош камтылган программалоо тили катары өз ордун таба алат.

Бул максаттар үчүн Mash колдоно баштоо үчүн, ал тургай, долбоорду өз алдынча чогултуунун кереги жок.

Mashто Runtime Environment бар - толук API менен динамикалык китепкана катары түзүлгөн стекке негизделген VM.

Болгону, аны долбоордун көз карандылыгына кошуп, бир нече чалууларды жасоо керек.

Тилдин өзү камтылган тил катары иштөө үчүн функцияларды берет.
Ошол эле учурда, тил жана үчүнчү тараптын китепканалары менен бирге аткаруу таасир этпейт.
Биз анда жазылган ар кандай алкактардын толук күчүн колдоно ала турган орнотулган тилди алабыз.

Mash + JVM

Мен JVM үчүн котормочунун версиясын иштеп баштадым.
Балким, N убакыт өткөндөн кийин, бул тема боюнча билдирүү Habré пайда болот.

натыйжалары

Атайын жыйынтыктар жок. Бул жыйынтыктардын ортодогу өкүлчүлүгү.
2020-жылы баарына ийгилик.

Source: www.habr.com

Комментарий кошуу