Chilankhulo chatsopano cha pulogalamu Mash

Kwa zaka zingapo ndinayesa dzanja langa kupanga chinenero changa cha mapulogalamu. Ndinkafuna kulenga, mwa lingaliro langa, chinenero chosavuta kwambiri, chogwira ntchito komanso chosavuta zotheka.

M'nkhaniyi ndikufuna kuwonetsa magawo akuluakulu a ntchito yanga ndipo, poyambira, ndifotokoze lingaliro lopangidwa la chinenero ndi kukhazikitsa kwake koyamba, zomwe ndikugwira ntchito panopa.

Ndiloleni ndinene pasadakhale kuti ndinalemba ntchito yonseyi ku Free Pascal, chifukwa... mapulogalamu omwe ali pamenepo amatha kusonkhanitsidwa pamapulatifomu ambiri, ndipo wopanga yekhayo amapanga ma binaries okometsedwa kwambiri (ndikusonkhanitsa zigawo zonse za polojekitiyo ndi mbendera ya O2).

Nthawi yogwiritsira ntchito chinenero

Choyamba, ndikofunikira kulankhula za makina enieni omwe ndimayenera kulemba kuti ndigwiritse ntchito mtsogolo m'chinenero changa. Ndinaganiza zogwiritsa ntchito zomangamanga, mwina, chifukwa inali njira yosavuta. Sindinapeze nkhani yodziwika bwino ya momwe ndingachitire izi m'Chirasha, motero nditadziwa bwino nkhani zachingerezi, ndidakhala pansi ndikupanga ndi kulemba njinga yangayanga. Kenako ndipereka malingaliro anga "zapamwamba" ndi zomwe ndikuchita pankhaniyi.

Kukhazikitsa kwa stack

Mwachiwonekere, pamwamba pa VM pali stack. Pakukhazikitsa kwanga zimagwira ntchito mu block. M'malo mwake, izi ndi zolozera zosavuta komanso zosinthika kuti musunge zolozera pamwamba pa stack.
Ikayambitsidwa, gulu la zinthu 256 limapangidwa. Ngati zolozera zambiri zikankhidwira pamtengo, kukula kwake kumawonjezeka ndi zinthu 256 zotsatirazi. Chifukwa chake, pochotsa zinthu pamtengo, kukula kwake kumasinthidwa.

VM imagwiritsa ntchito milu ingapo:

  1. Kuchuluka kwakukulu.
  2. Mulu wosunga zobwerera.
  3. Zotolera zinyalala.
  4. Yesani/gwirani/pomaliza letsani stack.

Zosintha ndi Zosintha

Ichi ndi chophweka. Ma Constants amayendetsedwa mu kachidutswa kakang'ono kakang'ono ndipo amapezeka m'mapulogalamu amtsogolo kudzera pama adilesi osasintha. Zosintha ndi mndandanda wazolozera za kukula kwake, mwayi wofikira ma cell ake umachitika ndi index - i.e. static adilesi. Zosintha zimatha kukankhidwira pamwamba pa mulu kapena kuwerenga kuchokera pamenepo. Kwenikweni, chifukwa Ngakhale zosintha zathu zimasunga zolozera pazokumbukira za VM, chilankhulocho chimayendetsedwa ndikugwira ntchito ndi zolozera.

Wotolera zinyalala

Mu VM yanga ndi semi-automatic. Iwo. wokonza mwiniyo amasankha nthawi yoti aitane wosonkhanitsa zinyalala. Sichigwira ntchito pogwiritsa ntchito chowerengera chokhazikika, monga ku Python, Perl, Ruby, Lua, ndi zina. Imagwiritsidwa ntchito pogwiritsa ntchito chikhomo. Iwo. pamene kusintha kumayenera kuperekedwa kwa mtengo wanthawi yochepa, cholozera pamtengowu chimawonjezedwa ku stack ya otolera zinyalala. M'tsogolomu, wosonkhanitsa mwamsanga amadutsa mndandanda wazomwe zakonzedwa kale.

Kugwira kuyesa/kugwira/kutsekereza

Monga m'chinenero chilichonse chamakono, kugwiritsira ntchito mwapadera ndi gawo lofunikira. VM core imakulungidwa mu try..catch block, yomwe imatha kubwerera ku code execution pambuyo pogwira zina mwa kukankhira zambiri za izo pa stack. Mu code yogwiritsira ntchito, mutha kutanthauzira kuyesa / kugwira / pomaliza midadada ya code, kufotokoza malo olowera pakugwira (kupatula chothandizira) ndipo potsiriza / kumapeto (kutha kwa chipika).

Multithreading

Imathandizidwa pamlingo wa VM. Ndi yosavuta komanso yosavuta kugwiritsa ntchito. Zimagwira ntchito popanda kusokoneza dongosolo, kotero code iyenera kuchitidwa mu ulusi wambiri kangapo mofulumira, motsatira.

Malaibulale akunja a ma VM

Palibe njira yochitira popanda izi. VM imathandizira kuitanitsa kunja, mofanana ndi momwe imagwiritsidwira ntchito m'zinenero zina. Mutha kulemba gawo la kachidindo mu Mash ndi gawo la codeyo muzilankhulo zakomweko, kenako kuzilumikiza kukhala chimodzi.

Womasulira kuchokera pachilankhulo cha Mash chapamwamba kupita ku ma bytecode a VM

Chilankhulo chapakatikati

Kuti ndilembe mwachangu womasulira kuchokera kuchilankhulo chovuta kupita ku code ya VM, ndidayamba kupanga chilankhulo chapakatikati. Zotsatira zake zinali zowoneka ngati zophatikizira zomwe palibe chifukwa choganizira apa. Ndingonena kuti pamlingo uwu womasulira amakonza zosintha zambiri ndi zosinthika, amawerengera maadiresi awo osasunthika ndi ma adilesi a malo olowera.

Zomangamanga za omasulira

Sindinasankhe zomanga zabwino kwambiri kuti ndikwaniritse. Womasulira samapanga mtengo wa code, monga momwe omasulira ena amachitira. Amayang'ana chiyambi cha mapangidwe. Iwo. ngati chidutswa cha kachidindo chikupendedwa chikuwoneka ngati "pamene :", ndiye zikuwonekeratu kuti iyi ndi nthawi yomanga loop ndipo iyenera kukonzedwa ngati nthawi yopangira loop. Chinachake ngati chosinthira chovuta.

Chifukwa cha njira yomangayi, womasulirayo adakhala wosafulumira kwambiri. Komabe, kumasuka kwa kusinthidwa kwake kwawonjezeka kwambiri. Ndinawonjezera zomangira zofunika mofulumira kuposa khofi wanga akhoza kuziziritsa. Thandizo lathunthu la OOP linakhazikitsidwa pasanathe sabata.

Kukhathamiritsa kwa ma code

Apa, ndithudi, zikanakhazikitsidwa bwino (ndipo zidzakhazikitsidwa, koma pambuyo pake, munthu akangofika). Pakadali pano, optimizer amangodziwa kudula kachidindo kosagwiritsidwa ntchito, zosinthika ndi zotuluka kuchokera ku msonkhano. Komanso, zokhazikika zingapo zokhala ndi mtengo womwewo zimasinthidwa ndi chimodzi. Ndizomwezo.

Language Mash

Lingaliro loyambira la chilankhulo

Lingaliro lalikulu linali kupanga chilankhulo chogwira ntchito kwambiri komanso chosavuta. Ndikuganiza kuti chitukukochi chimagwira ntchito yake ndi bang.

Code midadada, ndondomeko ndi ntchito

Zomanga zonse m'chinenerochi zimatsegulidwa ndi colon. : ndipo amatsekedwa ndi woyendetsa TSIRIZA.

Njira ndi ntchito zimalengezedwa ngati proc ndi func, motsatana. Zotsutsazo zandandalikidwa m’makolo. Chilichonse chili ngati zilankhulo zina zambiri.

Woyendetsa obwereza mutha kubweza mtengo kuchokera ku ntchito, woyendetsa yopuma amakulolani kutuluka ndondomeko / ntchito (ngati ili kunja kwa malupu).

Chitsanzo kodi:

...

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

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

Mapangidwe Othandizira

  • Lupu: kwa..kumapeto, pamene..kutha, mpaka..kutha
  • Zinthu: ngati..[mwina..]mapeto, sinthani..[case..end..][kana..]mapeto..
  • Njira: proc ():... mapeto, func ():... mapeto
  • Label & goto: :, kulumpha
  • Enum enumerations ndi masanjidwe mosalekeza.

Zosintha

Womasulira atha kuzizindikira zokha, kapena ngati wopanga alemba var asanawafotokozere.

Zitsanzo zamakodi:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Zosintha zapadziko lonse lapansi komanso zam'deralo zimathandizidwa.

UWO

Chabwino, tabwera kumutu wokoma kwambiri. Mash imathandizira ma paradigms onse opangidwa ndi zinthu. Iwo. makalasi, cholowa, polymorphism (kuphatikiza zamphamvu), zowoneka bwino zodziwikiratu ndi introspection (zodzaza).

Popanda ado, ndi bwino kungopereka zitsanzo zamakhodi.

Kalasi yosavuta ndikugwira nayo ntchito:

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

Zotsatira: 30.

Cholowa ndi polymorphism:

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

Zotsatira: 60.

Nanga bwanji dynamic polymorphism? Inde, uku ndi kusinkhasinkha!:

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

Zotsatira: 60.

Tsopano tiyeni titenge kamphindi kuti tidziwe za mfundo zosavuta ndi makalasi:

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

Will output: zoona, zoona.

Zokhudza ogwira ntchito ndi zolozera zomveka bwino

Wogwiritsa ?= amagwiritsidwa ntchito kugawira cholozera chosintha pamtengo wokumbukira.
The = woyendetsa amasintha mtengo mu kukumbukira pogwiritsa ntchito pointer kuchokera ku variable.
Ndipo tsopano pang'ono za zolozera zomveka. Ndinaziwonjezera ku chinenerocho kuti zikhalepo.
@ - tengani cholozera chodziwika bwino pakusintha.
? - pezani chosinthika ndi cholozera.
@= - perekani mtengo ku chosinthika ndi cholozera chowonekera kwa icho.

Chitsanzo kodi:

uses <bf>
uses <crt>

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

Zotulutsa: nambala ina, 10, 11.

Yesani..[gwirani..][potsiriza..]mapeto

Chitsanzo kodi:

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

Zimakonzekera zam'tsogolo

Ndimayang'anabe ndikuyang'ana GraalVM & Truffle. Malo anga othamanga alibe JIT compiler, kotero ponena za momwe amagwirira ntchito panopa akupikisana ndi Python. Ndikukhulupirira kuti nditha kugwiritsa ntchito kuphatikiza kwa JIT kutengera GraalVM kapena LLVM.

posungira

Mutha kusewera ndi zomwe zikuchitika ndikutsata polojekitiyo nokha.

webusaiti
Chosungira pa GitHub

Zikomo powerenga mpaka kumapeto ngati munatero.

Source: www.habr.com

Kuwonjezera ndemanga