Mutauro mutsva wechirongwa Mash

Kwemakore akawanda ndakaedza ruoko rwangu pakugadzira mutauro wangu wepurogiramu. Ini ndaida kugadzira, mumaonero angu, iyo yakanyanya kupfava, inoshanda zvizere uye yakanakira mutauro inogoneka.

Muchikamu chino ndinoda kuratidza matanho makuru ebasa rangu uye, kutanga, tsanangura pfungwa yakasikwa yemutauro uye kushandiswa kwayo kwekutanga, iyo yandiri kushanda iye zvino.

Rega nditaure pachine nguva kuti ndakanyora chirongwa chose muFree Pascal, nekuti... zvirongwa pairi zvinogona kuunganidzwa kwenhamba huru yemapuratifomu, uye iyo compiler pachayo inogadzira yakagadziridzwa mabhinari (ini ndinounganidza zvese zvikamu zvepurojekiti nemureza weO2).

Mutauro nguva yekumhanya

Chekutanga pane zvese, zvakafanira kutaura nezve muchina chaiwo wandaifanira kunyora kuti ndishandise ramangwana mumutauro wangu. Ndakafunga kuita stack architecture, pamwe, nekuti yaive nzira iri nyore. Handina kuwana chinyorwa chimwe chete chakajairika pamusoro pekuita izvi muchiRussia, saka mushure mekujairana nemashoko emutauro weChirungu, ndakagara pasi kuti ndigadzire uye kunyora bhasikoro rangu. Tevere ini ndicharatidza yangu "yepamusoro" mazano uye budiriro munyaya iyi.

Stack kushandiswa

Zviripachena, pamusoro peVM pane stack. Mukuita kwangu kunoshanda mumabhuroko. Chaizvoizvo iyi iri nyore rondedzero yeanongedza uye shanduko yekuchengetedza indekisi yekumusoro kwestack.
Painotangwa, mutsara we 256 element unogadzirwa. Kana mamwe mapoinzi akasundirwa pachitunha, saizi yaro inowedzera neanotevera 256 zvinhu. Saizvozvo, kana uchibvisa zvinhu kubva mudura, saizi yayo inogadziriswa.

Iyo VM inoshandisa akati wandei akaturikidzana:

  1. Main stack.
  2. Murwi wekuchengetedza mapoinzi ekudzoka.
  3. Garbage collector stack.
  4. Edza/kubata/pedzisire vhara mutakuri wemutambi.

Constants uye Variables

Iyi iri nyore. Constants inobatwa mune yakaparadzana chidimbu chidiki chekodhi uye inowanikwa mune ramangwana maapplication kuburikidza neakamira kero. Variables imhando yeanongedzo yehumwe saizi, kupinda kumaseru ayo kunoitwa ne index - i.e. static address. Zvinosiyana zvinogona kusundidzirwa kumusoro kwechitubu kana kuverenga kubva ipapo. Chaizvoizvo, nokuti Nepo machinjiro edu achichengeta mapoinzi kune zvakakosha mundangariro yeVM, mutauro unotongwa nekushanda nemanongedzo.

Muunganidzi wemarara

MuVM yangu ndeye semi-otomatiki. Avo. mugadziri pachake anosarudza nguva yekudaidza muunganidzi wemarara. Izvo hazvishande uchishandisa yakajairwa pointer counter, semuPython, Perl, Ruby, Lua, nezvimwe. Inoitwa kuburikidza nemaki system. Avo. kana shanduko yakaitirwa kupihwa kukosha kwechinguvana, chinongedzo kune iyi kukosha chinowedzerwa kune muunganidzwa wemarara. Mune ramangwana, muunganidzi anokurumidza kumhanya kuburikidza neakatogadzirirwa rondedzero yeanongedza.

Kubata edza/kubata/pekupedzisira kunovhara

Sezvakaita mumutauro wemazuva ano, kubata kwakasiyana chinhu chakakosha. VM musimboti wakaputirwa netry..catch block, inogona kudzoka ku code execution mushure mekubata kusarudzika nekusundidzira rumwe ruzivo nezvayo pamurwi. Mune kodhi yekushandisa, unogona kutsanangura edza / kubata / pakupedzisira mabhuroki ekodhi, uchitsanangura mapoinzi ekupinda pakubata (kunze kwemubati) uye pakupedzisira / kupera (kupera kwebhuroka).

Multithreading

Inotsigirwa padanho reVM. Zviri nyore uye zviri nyore kushandisa. Inoshanda isina inovhiringidza sisitimu, saka iyo kodhi inofanirwa kuitwa mune akati wandei shinda kakawanda nekukurumidza, zvichiteerana.

Maraibhurari ekunze eVMs

Hapana nzira yekuita pasina izvi. VM inotsigira zvinotengeswa kunze kwenyika, zvakafanana nemashandisirwo azvinoitwa mune mimwe mitauro. Iwe unogona kunyora chikamu chekodhi muMash uye chikamu chekodhi mumitauro yeko, wozobatanidza mune imwe.

Muturikiri kubva pamutauro weMash wepamusoro-soro kuenda kubhaitikodhi yeVM

Mutauro wepakati

Kukurumidza kunyora muturikiri kubva mumutauro wakaoma kupinda muVM kodhi, ndakatanga kugadzira mutauro wepakati. Mhedzisiro yacho yaive yekuunganidza-senge inotyisa yekuona iyo isina imwe pfungwa yekufunga apa. Ini ndinongotaura kuti padanho rino mushanduri anogadzirisa akawanda anochinja uye akasiyana, anoverengera avo static kero uye kero dzenzvimbo dzekupinda.

Zvivakwa zvevashanduri

Ini handina kusarudza yakanakisa dhizaini yekushandisa. Mushanduri haagadziri muti wekodhi, sezvinoita vamwe vashanduri. Anotarisa pakutanga kwechimiro. Avo. kana chidimbu chekodhi chiri kuchekwa chichiita senge "nepo :", zvino zviri pachena kuti iyi inguva yekuvaka loop uye inoda kugadziriswa sechinguva chidiki chekuvaka. Chimwe chinhu chakaoma chinja-kesi.

Nekuda kwemhinduro yekuvaka iyi, muturikiri akazoita kunge asiri kukurumidza. Zvisinei, kusununguka kwekushandurwa kwayo kwakawedzera zvakanyanya. Ndakawedzera zvivako zvinodiwa nokukurumidza kupfuura kofi yangu inogona kutonhora pasi. Rutsigiro rwakazara rweOOP rwakaitwa mukati meisingasviki svondo.

Code optimization

Pano, hongu, inogona kunge yakaitwa zvirinani (uye ichaitwa, asi gare gare, kana munhu angosvika kwairi). Kusvika pari zvino, iyo optimizer inongoziva nzira yekucheka isina kushandiswa kodhi, maconstants uye kunze kwenyika kubva kugungano. Zvakare, dzinoverengeka dzisingaperi dzine kukosha kwakafanana dzinotsiviwa neimwe. Ndizvo zvose.

Mash mutauro

Pfungwa huru yemutauro

Pfungwa huru yakanga iri yekugadzira mutauro unoshanda zvikuru uye wakapfava unobvira. Ini ndinofunga kuti budiriro inosangana nebasa rayo ne bang.

Code blocks, maitiro uye mabasa

Zvose zvivakwa mumutauro zvinovhurwa nekoloni. : uye anovharwa nemushandisi magumo.

Maitiro uye mabasa anoziviswa se proc uye func, zvichiteerana. Nharo dzacho dzakarongwa mumaparenthesi. Zvose zvakafanana nemimwe mitauro yakawanda.

Operator dzokera unogona kudzorera kukosha kubva kune basa, opareta zororo inokubvumira kubuda maitiro / basa (kana riri kunze kwezvishwe).

Sample code:

...

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

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

Anotsigirwa Magadzirirwo

  • Loops: ye..kuguma, apo..kuguma, kusvika..kuguma
  • Conditions: kana..[zvimwe..]guma, chinja..[case..end..][zvimwe..]guma.
  • Nzira: proc ():... kupera, func ():... kupera
  • Label & goto: :, svetuka
  • Enum enumerations uye arrays anogara aripo.

Misiyano

Mushanduri anogona kuzvisarudzira otomatiki, kana mugadziri akanyora var asati azvitsanangura.

Mienzaniso yekodhi:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Zvisikwa zvepasi rese uye zvemuno zvinotsigirwa.

OOP

Zvakanaka, tauya kune yakanyanya kunaka nyaya. Mash inotsigira ese anotungamirwa nechinhu-anomisikidza zvirongwa paradigms. Avo. makirasi, nhaka, polymorphism (kusanganisira simba), dynamic otomatiki kufungisisa uye introspection (yakazara).

Pasina imwezve ado, zviri nani kungopa kodhi mienzaniso.

Kirasi iri nyore uye kushanda nayo:

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

Kubuda: 30.

Nhaka uye 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

Kubuda: 60.

Zvakadini nezve dynamic polymorphism? Hongu, uku ndiko kufungidzira!:

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

Kubuda: 60.

Iye zvino ngatitorei chinguva kuti titarise kune akareruka maitiro uye makirasi:

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: chokwadi, chokwadi.

Nezve assignment operators uye anonongedzera akajeka

Iyo ?= mushandisi inoshandiswa kugovera chinongedzo chekunongedza kune kukosha mundangariro.
Iyo = opareta inoshandura kukosha mundangariro uchishandisa chinongedzo kubva pane chinoshanduka.
Uye zvino zvishoma nezve zvinongedzo zvakajeka. Ndakadziwedzera pamutauro kuti dzivepo.
@ - tora chinongedzo chakajeka kune chinosiyana.
? β€” tora shanduko neinongedzo.
@= - govera kukosha kune shanduko neinongedza yakajeka kwairi.

Sample code:

uses <bf>
uses <crt>

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

Kuchabuda: imwe nhamba, 10, 11.

Edzai..[bata..][pekupedzisira..]pedzisiro

Sample code:

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

Zvirongwa zvemangwana

Ndinoramba ndakatarisa uye ndakatarisa GraalVM & Truffle. Yangu yekumhanya nharaunda haina JIT compiler, saka maererano nekuita iko zvino inongokwikwidza nePython. Ndinovimba kuti ndichakwanisa kuita JIT kuunganidzwa kwakavakirwa paGraalVM kana LLVM.

repository

Iwe unogona kutamba nebudiriro uye wotevera chirongwa iwe pachako.

Website
Repository paGitHub

Ndinokutendai nekuverenga kusvika kumagumo kana makadaro.

Source: www.habr.com

Voeg