
Շնորհավորում եմ բոլորիդ նոր՝ 2020 թվականի կապակցությամբ։
Առաջինի հրապարակումից ի վեր Մաշի դեպքից անցել է գրեթե ուղիղ 1 տարի։
Այս տարվա ընթացքում լեզուն մեծապես բարելավվել է, նրա բազմաթիվ ասպեկտներ մտածվել են, և որոշվել է զարգացման վեկտորը։
Ես ուրախ եմ այս ամենը կիսել համայնքի հետ։
Հրաժարում պատասխանատվությունից
Այս նախագիծը մշակվում է բացառապես ոգևորության հիման վրա և չի հավակնում համաշխարհային գերիշխանության դինամիկ ծրագրավորման լեզուների ոլորտում։
Այս զարգացումը չպետք է դիտարկել որպես չափանիշ, որին պետք է ձգտել. նախագիծը իդեալական չէ, բայց այնուամենայնիվ այն զարգանում է։
Նոր կոմպիլյատոր
Նախագծի պահոցի /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
