نئين پروگرامنگ ٻولي Mash

ڪيترن سالن تائين مون پنهنجي هٿ جي ڪوشش ڪئي منهنجي پنهنجي پروگرامنگ ٻولي کي ترقي ڪرڻ ۾. مان ٺاهڻ چاهيان ٿو، منهنجي خيال ۾، سڀ کان سادي، مڪمل طور تي فعال ۽ آسان ٻولي ممڪن آهي.

هن آرٽيڪل ۾ آئون پنهنجي ڪم جي مکيه مرحلن کي اجاگر ڪرڻ چاهيان ٿو، ۽ شروع ڪرڻ سان، ٻوليء جي تخليق ڪيل تصور ۽ ان جي پهرين عمل کي بيان ڪرڻ چاهيان ٿو، جنهن تي آئون هن وقت ڪم ڪري رهيو آهيان.

مون کي اڳ ۾ چوڻ ڏيو ته مون سڄو پروجيڪٽ فري پاسڪل ۾ لکيو، ڇاڪاڻ ته ... ان تي پروگرام وڏي تعداد ۾ پليٽ فارمن لاءِ گڏ ڪري سگھجن ٿا، ۽ گڏ ڪرڻ وارو پاڻ کي تمام بهتر بائنري پيدا ڪري ٿو (آءٌ پروجيڪٽ جا سڀئي حصا گڏ ڪريان ٿو O2 پرچم سان).

ٻوليءَ جو وقت

سڀ کان پهريان، اها مجازي مشين بابت ڳالهائڻ جي قابل آهي جيڪا مون کي منهنجي ٻوليء ۾ مستقبل جي ايپليڪيشنن کي هلائڻ لاء لکڻو پوندو. مون هڪ اسٽيڪ فن تعمير کي لاڳو ڪرڻ جو فيصلو ڪيو، شايد، ڇاڪاڻ ته اهو آسان طريقو هو. مون کي هڪ به عام مضمون نه مليو ته روسي ۾ اهو ڪيئن ڪجي، تنهنڪري پاڻ کي انگريزي-ٻولي جي مواد سان واقف ڪرڻ کان پوء، آئون پنهنجي سائيڪل کي ڊزائين ڪرڻ ۽ لکڻ لاء ويٺو. اڳتي هلي مان هن معاملي ۾ پنهنجا ”ترقي“ خيال ۽ پيش رفت پيش ڪندس.

اسٽيڪ تي عملدرآمد

ظاهر آهي، VM جي چوٽي تي اسٽيڪ آهي. منهنجي عمل ۾ اهو ڪم ڪري ٿو بلاڪ ۾. لازمي طور تي هي پوائنٽر جي هڪ سادي صف آهي ۽ اسٽيڪ جي مٿين انڊيڪس کي ذخيرو ڪرڻ لاء هڪ متغير آهي.
جڏهن اهو شروع ڪيو ويندو آهي، 256 عناصر جي هڪ صف ٺاهي وئي آهي. جيڪڏهن وڌيڪ اشارن کي اسٽيڪ تي ڌڪيو وڃي ٿو، ان جي سائيز ايندڙ 256 عناصر طرفان وڌائي ٿي. ان جي مطابق، جڏهن اسٽيڪ مان عناصر کي هٽائڻ، ان جي سائيز کي ترتيب ڏني وئي آهي.

VM ڪيترن ئي اسٽيڪ استعمال ڪري ٿو:

  1. مکيه اسٽيڪ.
  2. واپسي پوائنٽن کي محفوظ ڪرڻ لاءِ اسٽيڪ.
  3. ڪچرو گڏ ڪندڙ اسٽيڪ.
  4. ڪوشش ڪريو / پڪڙيو / آخرڪار بلاڪ هينڊلر اسٽيڪ.

مستقل ۽ متغير

هي هڪ سادو آهي. مستقل ڪوڊ جي هڪ الڳ ننڍڙي ٽڪري ۾ هٿ ڪيا ويا آهن ۽ جامد پتي ذريعي مستقبل جي ايپليڪيشنن ۾ دستياب آهن. متغير هڪ خاص سائيز جي اشارن جو هڪ صف آهي، ان جي سيلز تائين رسائي انڊيڪس ذريعي ڪئي ويندي آهي - يعني. جامد پتو. متغيرن کي اسٽيڪ جي چوٽي تي ڌڪ ڏيئي سگھجي ٿو يا اتان کان پڙھي سگھجي ٿو. حقيقت ۾، ڇاڪاڻ ته جڏهن ته اسان جا متغير لازمي طور تي VM ميموري ۾ قدرن ڏانهن اشارن کي ذخيرو ڪن ٿا، ٻولي غالب پوائنٽن سان ڪم ڪندي غلبو آهي.

ڪچرو گڏ ڪندڙ

منهنجي VM ۾ اهو نيم خودڪار آهي. اهي. ڊولپر پاڻ فيصلو ڪري ٿو ته ڪچري جي ڪليڪٽر کي ڪڏهن سڏيندو. اهو باقاعده پوائنٽر ڪائونٽر استعمال ڪندي ڪم نٿو ڪري، جيئن پٿون، پرل، روبي، لوا وغيره ۾. اهو مارڪر سسٽم ذريعي لاڳو ٿئي ٿو. اهي. جڏهن هڪ متغير هڪ عارضي قدر مقرر ڪرڻ جو ارادو ڪيو ويو آهي، هن قدر ڏانهن هڪ اشارو شامل ڪيو ويندو آهي ڪچري جي ڪليڪٽر جي اسٽيڪ ۾. مستقبل ۾، ڪليڪٽر جلدي اڳ ۾ ئي تيار ڪيل اشارن جي فهرست ذريعي هلندو آهي.

ھٿ ڪرڻ جي ڪوشش/پڪڙ/آخر ۾ بلاڪ

جيئن ڪنهن به جديد ٻوليءَ ۾، استثنيٰ سنڀالڻ هڪ اهم جزو آهي. VM ڪور هڪ ڪوشش ۾ لپي ويو آهي.. ڪيچ بلاڪ، جيڪو هڪ استثنا کي پڪڙڻ کان پوء ڪوڊ جي عمل کي واپس ڪري سگهي ٿو ان بابت ڪجهه معلومات کي اسٽيڪ تي دٻائڻ سان. ايپليڪيشن ڪوڊ ۾، توھان وضاحت ڪري سگھو ٿا ڪوشش / پڪڙي / آخر ۾ ڪوڊ جا بلاڪ، بيان ڪري سگھو ٿا داخلا پوائنٽون ڪيچ تي (استثنائي ھينڊلر) ۽ آخر ۾ / آخر (بلاڪ جي آخر).

ملٽي ٽريڊنگ

اهو VM سطح تي سپورٽ آهي. اهو سادو ۽ استعمال ڪرڻ آسان آهي. اهو ڪم ڪري ٿو بغير ڪنهن مداخلت جي سسٽم، تنهنڪري ڪوڊ کي ڪيترن ئي موضوعن ۾ ڪيترن ئي ڀيرا تيزيء سان عمل ڪيو وڃي.

VMs لاءِ خارجي لائبريريون

هن کان سواء ڪو به طريقو ناهي. VM درآمدات کي سپورٽ ڪري ٿو، جهڙوڪ اهو ٻين ٻولين ۾ ڪيئن لاڳو ٿئي ٿو. توھان ڪوڊ جو حصو Mash ۾ ۽ ڪوڊ جو حصو مادري ٻولين ۾ لکي سگھو ٿا، پوء انھن کي ھڪڙي ۾ ڳنڍيو.

VMs لاءِ بائيٽ ڪوڊ تائين اعليٰ سطحي ميش ٻولي کان ترجمو ڪندڙ

وچولي ٻولي

هڪ پيچيده ٻولي مان VM ڪوڊ ۾ ترجمي کي جلدي لکڻ لاءِ، مون پهريون ڀيرو وچولي ٻولي ٺاهي. نتيجو اهو نڪتو جو هڪ اهڙو خوفناڪ تماشو هو جنهن تي غور ڪرڻ جو هتي ڪو خاص مقصد ناهي. مان صرف ايترو چوندس ته هن سطح تي مترجم سڀ کان وڌيڪ مستقل ۽ متغيرن کي پروسيس ڪري ٿو، انهن جي جامد پتي ۽ داخلا پوائنٽن جي ايڊريس کي حساب ڪري ٿو.

مترجم فن تعمير

مون عمل درآمد لاءِ بهترين فن تعمير نه چونڊيو. مترجم ڪوڊ ٽري نٿو ٺاهي، جيئن ٻيا مترجم ڪندا آهن. هن کي ساخت جي شروعات ڏسڻ ۾ اچي ٿي. اهي. جيڪڏهن ڪوڊ جو ٽڪرو پارس ڪيو پيو وڃي ته "جڏهن <condition>:" وانگر نظر اچي ٿو، ته پوء اهو واضح آهي ته اهو هڪ ڊگهو لوپ تعمير آهي ۽ ان تي عمل ڪرڻ جي ضرورت آهي جڏهن ته لوپ تعمير جي طور تي. ھڪڙي پيچيده سوئچ ڪيس وانگر.

هن تعميراتي حل جي مهرباني، مترجم تمام تيز نه ٿي سگهيو. تنهن هوندي به، ان جي ترميم جي آسانيء ۾ تمام گهڻو وڌي چڪو آهي. مون ضروري ڍانچو شامل ڪيو ان کان وڌيڪ تيزيءَ سان منهنجي ڪافي ٿڌي ٿي سگهي. مڪمل OOP سپورٽ هڪ هفتي کان گهٽ ۾ لاڳو ڪيو ويو.

ڪوڊ جي اصلاح

هتي، يقينا، اهو بهتر طور تي لاڳو ٿي سگهي ٿو (۽ لاڳو ڪيو ويندو، پر بعد ۾، جيترو جلدي هڪ ان جي ڀرسان ٿي ويندو). ايترو پري، اصلاح ڪندڙ صرف ڄاڻي ٿو ته ڪيئن غير استعمال ٿيل ڪوڊ، مستقل ۽ اسيمبلي مان درآمد کي ڪٽيو. انهي سان گڏ، ساڳئي قدر سان ڪيترائي مستقل هڪ سان تبديل ڪيا ويا آهن. اهو ئي سڀ ڪجهه آهي.

ٻولي ماش

ٻوليءَ جو بنيادي تصور

بنيادي خيال اهو هو ته سڀ کان وڌيڪ فنڪشنل ۽ سادي ٻولي کي ترقي ڪرڻ لاء. مان سمجهان ٿو ته ترقي پنهنجي ڪم کي ڌڪ سان گڏ ڪري ٿو.

ڪوڊ بلاڪ، طريقا ۽ افعال

ٻوليءَ ۾ سڀ اڏاوتون ڪولن سان کوليون وينديون آهن. : ۽ آپريٽر طرفان بند ٿيل آهن آخر.

طريقيڪار ۽ افعال کي ترتيب سان proc ۽ func قرار ڏنو ويو آهي. دليل قوس ۾ درج ٿيل آهن. سڀ ڪجهه ٻين ٻولين وانگر آهي.

آپريٽر موٽڻ توھان ھڪڙي قدر واپس ڪري سگھو ٿا ھڪڙي فنڪشن مان، آپريٽر ٽوڙڻ توھان کي اجازت ڏئي ٿو نڪرڻ جي طريقيڪار / فنڪشن (جيڪڏھن اھو لوپس کان ٻاھر آھي).

نموني ڪوڊ:

...

func summ(a, b):
  return a + b
end

proc main():
  println(summ(inputln(), inputln()))
end

سپورٽ ٿيل ڊيزائن

  • لوپس: لاء.. آخر تائين، جڏهن ته.. آخر تائين.. آخر تائين
  • حالتون: جيڪڏهن.. [ٻيو..] آخر، مٽايو. [ڪيس..آخر... [ٻيو...] آخر
  • طريقا: proc <name>():... end, func <name>():... end
  • ليبل ۽ وڃو: <name>:، jump <name>
  • اينم ڳڻپ ۽ مسلسل صفون.

مختلف

مترجم انهن کي خودڪار طريقي سان طئي ڪري سگهي ٿو، يا جيڪڏهن ڊولپر انهن جي وضاحت ڪرڻ کان پهريان var لکي ٿو.

ڪوڊ جا مثال:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

گلوبل ۽ مقامي متغير جي حمايت ڪئي وئي آهي.

او او پي

خير، اسان سڀ کان وڌيڪ مزيدار موضوع تي آيا آهيون. ميش سڀني اعتراض تي مبني پروگرامنگ پيراڊمز کي سپورٽ ڪري ٿو. اهي. طبقن، وراثت، پوليمورفيزم (متحرڪ سميت)، متحرڪ خودڪار موٽڻ ۽ خودڪشي (مڪمل).

وڌيڪ اشتهارن جي بغير، اهو بهتر آهي ته صرف ڪوڊ مثال ڏيو.

هڪ سادي ڪلاس ۽ ان سان ڪم ڪرڻ:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

proc main():
  x ?= new MyClass(10, 20)
  println(x->Summ())
  x->Free()
end

ٻاھر نڪرندو: 30.

وراثت ۽ پوليمورفيزم:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyNewClass(10, 20)
  println(x->Summ())
  x->Free()
end

ٻاھر نڪرندو: 60.

متحرڪ پوليمورفيزم بابت ڇا؟ ها، اهو عڪس آهي!:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyClass(10, 20)
  x->Summ ?= MyNewClass::Summ
  println(x->Summ())
  x->Free()
end

ٻاھر نڪرندو: 60.

هاڻي اچو ته هڪ لمحو وٺون سادو قدرن ۽ طبقن لاءِ خودڪشي ڪرڻ لاءِ:

uses <bf>
uses <crt>

class MyClass:
  var a, b
end

proc main():
  x ?= new MyClass
  println(BoolToStr(x->type == MyClass))
  x->rem()
  println(BoolToStr(typeof(3.14) == typeReal))
end

ٻاھر نڪرندو: سچو، سچو.

تفويض آپريٽرز ۽ واضح اشارو بابت

The ?= آپريٽر استعمال ڪيو ويندو آهي متغير کي تفويض ڪرڻ لاءِ پوائنٽر کي ميموري ۾ هڪ قدر.
The = آپريٽر هڪ متغير مان پوائنٽر استعمال ڪندي ميموري ۾ قدر تبديل ڪري ٿو.
۽ هاڻي ٿورو واضح اشارو بابت. مون انهن کي زبان ۾ شامل ڪيو ته جيئن اهي موجود آهن.
@<variable> - ھڪڙي واضح پوائنٽر ڏانھن متغير ڏانھن وٺو.
?<variable> - پوائنٽر ذريعي متغير حاصل ڪريو.
@= - ھڪ قدر مقرر ڪريو ھڪڙي متغير کي ھڪڙي واضح پوائنٽر جي ذريعي.

نموني ڪوڊ:

uses <bf>
uses <crt>

proc main():
  var a = 10, b
  b ?= @a
  PrintLn(b)
  b ?= ?b
  PrintLn(b)
  b++
  PrintLn(a)
  InputLn()
end

ٻاھر نڪرندو: ڪجھ نمبر، 10، 11.

ڪوشش ڪريو... [پڪڙ..] [آخر ۾..] آخر

نموني ڪوڊ:

uses <bf>
uses <crt>

proc main():
  println("Start")
  try:
    println("Trying to do something...")
    a ?= 10 / 0
  catch:
    println(getError())
  finally:
    println("Finally")
  end
  println("End")
  inputln()
end

مستقبل لاء منصوبا

مان GraalVM ۽ Truffle کي ڏسندو رهان ٿو. منهنجي رن ٽائم ماحول ۾ JIT مرتب ڪندڙ نه آهي، تنهنڪري ڪارڪردگي جي لحاظ کان اهو في الحال صرف پٿون سان مقابلو آهي. مون کي اميد آهي ته مان GraalVM يا LLVM جي بنياد تي JIT تاليف کي لاڳو ڪرڻ جي قابل ٿي ويندس.

مخزن

توهان ترقي سان راند ڪري سگهو ٿا ۽ پنهنجي منصوبي جي پيروي ڪري سگهو ٿا.

ويب سائيٽ
GitHub تي مخزن

آخر تائين پڙهڻ لاءِ مهرباني جيڪڏهن توهان ڪيو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو