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

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

Շնորհավորում եմ բոլորիդ նոր՝ 2020 թվականի կապակցությամբ։

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

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

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

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

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

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

GitHub
Site
Ֆորում

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

Նախագծի պահոցի /mashc ճյուղում կարող եք տեսնել կոմպիլյատորի նոր տարբերակը, որը գրված է Mash-ով (լեզվի առաջին տարբերակը):

Կոմպիլյատորն ունի կոդի գեներատոր asm ցուցակում (stack 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

Ներդրված PL

Հնարավոր է, որ Mash-ը կարողանա իր տեղը գտնել որպես ներդրված ծրագրավորման լեզու, նման Lua-ին։

Այս նպատակներով Mash-ը օգտագործել սկսելու համար ձեզ նույնիսկ անհրաժեշտ չէ նախագիծը ինքներդ կառուցել։

Mash-ն ունի Runtime Environment՝ stack VM, որը կառուցված է որպես դինամիկ գրադարան՝ լիարժեք API-ով։

Դուք պարզապես պետք է այն ավելացնեք ձեր նախագծի կախվածություններին և մի քանի զանգ կատարեք։

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

Mash + JVM

Սկսվեց JVM-ի համար թարգմանչի տարբերակի մշակումը։
Հնարավոր է՝ N ժամանակահատվածից հետո այս թեմայով գրառում հայտնվի Habr-ում։

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

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

Source: www.habr.com

Գնեք հուսալի հոստինգ DDoS պաշտպանությամբ կայքերի, VPS VDS սերվերների համար 🔥 Գնեք հուսալի կայքերի հոսթինգ՝ DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster