Mash-ը ծրագրավորման լեզու է, որն ինքն իրեն հավաքում է

Mash-ը ծրագրավորման լեզու է, որն ինքն իրեն հավաքում է

Շնորհավորում եմ բոլորին Նոր 2020 թվականին։

Առաջինի հրապարակումից ի վեր ծոմապահություն Մաշի մասին գրեթե ուղիղ 1 տարի է անցել։

Այս տարվա ընթացքում լեզուն մեծապես կատարելագործվեց, մտածվեցին դրա շատ կողմեր ​​և որոշվեց զարգացման վեկտորը։

Ուրախ եմ այս ամենով կիսվել համայնքի հետ։

Հրաժարում պատասխանատվությունից

Այս նախագիծը մշակվում է բացառապես խանդավառության հիման վրա և չի հավակնում համաշխարհային գերիշխանությանը դինամիկ ծրագրավորման լեզուների ոլորտում:

Այս զարգացումը չպետք է դիտարկել որպես չափորոշիչ, որին պետք է ձգտել, նախագիծը իդեալական չէ, բայց, այնուամենայնիվ, այն զարգանում է։

GitHub
Site
Ֆորում

Նոր կոմպիլյատոր

Ծրագրի պահեստի /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-ում, եթե դասի մեթոդը ստատիկ է, այն կարող է ապահով կանչվել կոդի ցանկացած մասից:

Example:

...
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՝ stack-ի վրա հիմնված VM, որը կազմվել է որպես դինամիկ գրադարան՝ ամբողջական API-ով:

Ձեզ անհրաժեշտ է միայն այն ավելացնել նախագծի կախվածության մեջ և կատարել մի քանի զանգ:

Լեզուն ինքնին հնարավորություն է տալիս աշխատել որպես ներկառուցված լեզու:
Միևնույն ժամանակ, լեզվի և երրորդ կողմի գրադարանների հետ համատեղ աշխատանքը չի ազդում:
Մենք ստանում ենք ներկառուցված լեզու, որը կարող է օգտագործել իր մեջ գրված տարբեր շրջանակների ողջ հզորությունը:

Mash + JVM

Ես սկսեցի մշակել JVM-ի թարգմանչի տարբերակը:
Հավանաբար, N ժամանակից հետո այս թեմայով գրառում կհայտնվի Habré-ում:

Արդյունքները

Առանձնահատուկ արդյունքներ չկան։ Սա արդյունքների միջանկյալ ներկայացումն է:
Հաջողություն բոլորին 2020 թվականին։

Source: www.habr.com

Добавить комментарий