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