Mash cànan prògramachaidh ùr

Airson grunn bhliadhnaichean dh’ fheuch mi ri mo làmh a leasachadh mo chànan prògramaidh fhìn. Bha mi airson, nam bheachd-sa, an cànan as sìmplidh, làn-ghnìomhach agus as freagarraiche a chruthachadh.

San artaigil seo tha mi airson prìomh ìrean na h-obrach agam a chomharrachadh agus, an toiseach, cunntas a thoirt air a’ bhun-bheachd cruthaichte den chànan agus a chiad bhuileachadh, air a bheil mi ag obair an-dràsta.

Leig leam a ràdh ro-làimh gun do sgrìobh mi am pròiseact gu lèir ann an Free Pascal, oir ... faodar prògraman air a chruinneachadh airson àireamh mhòr de àrd-ùrlaran, agus bidh an compiler fhèin a ’toirt a-mach binaries fìor làn-leasaichte (bidh mi a’ cruinneachadh a h-uile pàirt den phròiseact le bratach O2).

Ùine ruith cànain

An toiseach, is fhiach bruidhinn mun inneal brìgheil a bha agam ri sgrìobhadh gus tagraidhean a ruith nam chànan san àm ri teachd. Cho-dhùin mi ailtireachd stac a chuir an gnìomh, is dòcha, oir b’ e sin an dòigh as fhasa. Cha do lorg mi aon artaigil àbhaisteach air mar a nì mi seo ann an Ruisis, agus mar sin às deidh dhomh eòlas fhaighinn air an stuth Beurla, shuidh mi sìos gu bhith a’ dealbhadh agus a’ sgrìobhadh mo bhaidhsagal fhìn. An uairsin nochdaidh mi mo bheachdan agus leasachaidhean “adhartach” sa chùis seo.

Cur an gnìomh stac

Gu follaiseach, aig mullach an VM tha an stac. Anns a 'bhuileachadh agam bidh e ag obair ann am blocaichean. Gu bunaiteach, is e taghadh sìmplidh de chomharran a tha seo agus caochladair airson clàr-amais mullach na stac a stòradh.
Nuair a thèid a thòiseachadh, thèid sreath de 256 eileamaidean a chruthachadh. Ma thèid barrachd chomharran a phutadh air a’ chruach, meudaichidh a meud leis na h-ath 256 eileamaid. Mar sin, nuair a bheir thu air falbh eileamaidean bhon chruach, thèid a mheud atharrachadh.

Bidh an VM a’ cleachdadh grunn stacan:

  1. Prìomh stac.
  2. Stac airson puingean tilleadh a stòradh.
  3. Stòr cruinneachaidh sgudail.
  4. Feuch / glac / mu dheireadh cuir casg air stac làimhseachaidh.

Coinnlean agus caochlaidhean

Tha am fear seo sìmplidh. Bidh co-chomharran air an làimhseachadh ann am pìos beag còd fa leth agus tha iad rim faighinn ann an tagraidhean san àm ri teachd tro sheòlaidhean statach. Tha caochladairean nan sreath de chomharran de mheud sònraichte, tha ruigsinneachd gu na ceallan aige air a dhèanamh le clàr-amais - i.e. seòladh staitigeach. Faodar caochladairean a phutadh gu mullach a’ chruaich no leughadh às an sin. Gu fìrinneach, air sgàth Fhad ‘s a tha na caochladairean againn gu bunaiteach a’ stòradh comharran gu luachan ann an cuimhne VM, tha smachd aig a ’chànan air a bhith ag obair le comharran so-thuigsinn.

Neach-cruinneachaidh sgudail

Anns an VM agam tha e leth-fèin-ghluasadach. An fheadhainn sin. bidh an leasaiche fhèin a’ co-dhùnadh cuin a chuireas iad fios chun neach-cruinneachaidh sgudail. Chan obraich e le bhith a’ cleachdadh cuntair puing cunbhalach, mar ann am Python, Perl, Ruby, Lua, msaa. Tha e air a chur an gnìomh tro shiostam comharrachaidh. An fheadhainn sin. nuair a thathar an dùil luach sealach a thoirt do chaochladair, thèid comharradh don luach seo a chur ri stac an neach-cruinneachaidh sgudail. Anns an àm ri teachd, bidh an neach-cruinneachaidh gu luath a 'ruith tron ​​​​liosta de chomharran a chaidh ullachadh mar-thà.

A’ làimhseachadh feuchainn/glacadh/blocaichean mu dheireadh

Mar ann an cànan ùr-nodha sam bith, tha làimhseachadh eisgeachd na phàirt chudromach. Tha cridhe VM air a phasgadh ann am bloc feuchainn ..catch, a dh’ fhaodas tilleadh gu coileanadh còd às deidh dha eisgeachd a ghlacadh le bhith a’ putadh beagan fiosrachaidh mu dheidhinn air a’ chruach. Ann an còd tagraidh, faodaidh tu feuchainn / glacadh / mu dheireadh blocaichean còd a mhìneachadh, a’ sònrachadh puingean inntrigidh aig àm glacaidh (neach-làimhseachaidh eisgeachd) agus mu dheireadh / deireadh (deireadh a’ bhloc).

Ioma-snàthainn

Tha e a’ faighinn taic aig ìre VM. Tha e sìmplidh agus goireasach a chleachdadh. Bidh e ag obair gun siostam brisidh, agus mar sin bu chòir an còd a chuir gu bàs ann an grunn snàithleanan grunn thursan nas luaithe, fa leth.

Leabharlannan taobh a-muigh airson VMs

Chan eil dòigh air a dhèanamh às aonais seo. Bidh VM a’ toirt taic do in-mhalairt, coltach ri mar a thèid a chuir an gnìomh ann an cànanan eile. Faodaidh tu pàirt den chòd a sgrìobhadh ann am Mash agus pàirt den chòd ann an cànanan dùthchasach, an uairsin gan ceangal ann an aon.

Eadar-theangaiche bho chànan àrd-ìre Mash gu bytecode airson VMs

Cànan eadar-mheadhanach

Gus eadar-theangair a sgrìobhadh gu sgiobalta bho chànan iom-fhillte gu còd VM, leasaich mi cànan eadar-mheadhanach an toiseach. B’ e an toradh sealladh uamhasach coltach ri neach-cruinneachaidh nach eil adhbhar sònraichte ann a bhith a’ beachdachadh an seo. Cha bhith mi ag ràdh ach aig an ìre seo gu bheil an t-eadar-theangair a’ pròiseasadh a’ mhòr-chuid de sheasmhachd is caochladairean, a’ tomhas na seòlaidhean statach aca agus seòlaidhean puingean inntrigidh.

Ailtireachd eadar-theangair

Cha do thagh mi an ailtireachd as fheàrr airson a bhuileachadh. Cha bhith an t-eadar-theangair a’ togail craobh chòd, mar a bhios eadar-theangairean eile a’ dèanamh. Tha ea 'coimhead air toiseach an structair. An fheadhainn sin. ma tha coltas air a’ phìos còd a thathar a’ parsadh “fhad‘ s a tha <condition>:”, tha e follaiseach gur e togail lùb ùine a tha seo agus feumar a phròiseasadh mar thogail lùb greiseag. Rud coltach ri cùis suidse iom-fhillte.

Taing don fhuasgladh ailtireachd seo, cha robh an eadar-theangair gu math luath. Ach, tha cho furasta ‘s a tha an atharrachadh aige air a dhol suas gu mòr. Chuir mi na structaran riatanach ris nas luaithe na dh 'fhaodadh mo chofaidh fuarachadh. Chaidh làn thaic OOP a chuir an gnìomh ann an nas lugha na seachdain.

Còd optimization

An seo, gu dearbh, dh ’fhaodadh e a bhith air a chuir an gnìomh nas fheàrr (agus thèid a chuir an gnìomh, ach nas fhaide air adhart, cho luath‘ s a gheibh duine timcheall air). Gu ruige seo, chan eil fios aig an optimizer ach mar a ghearras e air falbh còd nach deach a chleachdadh, cuibhreannan agus in-mhalairt bhon cho-chruinneachadh. Cuideachd, thèid aon a chuir an àite grunn chumhachan leis an aon luach. Sin e.

Mash cànain

Bun-bheachd cànan

B’ e am prìomh bheachd an cànan as gnìomhaiche agus as sìmplidh a leasachadh. Tha mi a’ smaoineachadh gu bheil an leasachadh a’ dèiligeadh ris an obair aige le brag.

Blocaichean còd, modhan-obrach agus gnìomhan

Tha a h-uile togail sa chànan air fhosgladh le coloin. : agus tha iad dùinte leis a’ ghnìomhaiche deireadh.

Tha modhan-obrach agus gnìomhan air an ainmeachadh mar proc agus func, fa leth. Tha na h-argamaidean air an liostadh ann am brathan. Tha a h-uile dad mar a’ mhòr-chuid de chànanan eile.

Gnìomhaiche air ais faodaidh tu luach a thilleadh bho ghnìomh, gnìomhaiche fois a’ leigeil leat an dòigh-obrach/gnìomh fhàgail (ma tha e taobh a-muigh nan lùban).

Còd sampaill:

...

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

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

Dealbhaidhean le taic

  • Lùban: airson..deireadh, fhad 's..deireadh, gu..deireadh
  • Cùmhnantan: ma tha...[eile..] a' tighinn gu crìch, atharraich..[cùis..crìoch..][eile..] crìoch
  • Dòighean: proc <ainm>():... deireadh, func <ainm>():... deireadh
  • Label & goto: <name> :, leum <ainm>
  • Àireamhan àireamhach agus arrays seasmhach.

Caochlaidhean

Faodaidh an t-eadar-theangair an dearbhadh gu fèin-ghluasadach, no ma sgrìobhas an leasaiche var mus tèid a mhìneachadh.

Eisimpleirean de chòd:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Thathas a’ toirt taic do chaochladairean cruinneil is ionadail.

OOP

Uill, tha sinn air tighinn chun chuspair as blasta. Bidh Mash a’ toirt taic do gach paradigm prògramadh a tha ag amas air nithean. An fheadhainn sin. clasaichean, dìleab, polymorphism (a ‘gabhail a-steach fiùghantach), meòrachadh fèin-ghluasadach fiùghantach agus introspection (làn).

Às aonais tuilleadh ado, tha e nas fheàrr dìreach eisimpleirean còd a thoirt seachad.

Clas sìmplidh agus ag obair leis:

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

Toradh: 30.

Oidhreachd agus 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

Toradh: 60.

Dè mu dheidhinn polymorphism fiùghantach? Seadh, is e meòrachadh a tha seo!:

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

Toradh: 60.

A-nis leig dhuinn mionaid a ghabhail gus sùil a thoirt air luachan agus clasaichean sìmplidh:

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

Bheir toradh: fìor, fìor.

Mu ghnìomhaichean sònrachaidh agus comharran soilleir

Tha an gnìomhaiche ?= air a chleachdadh gus caochladair comharradh a shònrachadh gu luach mar chuimhneachan.
Bidh an gnìomhaiche = ag atharrachadh luach sa chuimhne a’ cleachdadh puing bho chaochladair.
Agus a-nis beagan mu phuingean soilleir. Chuir mi ris a’ chànan iad gus am biodh iad ann.
@<caochlaideach> - gabh comharradh soilleir gu caochladair.
? <caochlaideach> - faigh caochladair le puing.
@= - sònraich luach do chaochladair le comharradh soilleir air.

Còd sampaill:

uses <bf>
uses <crt>

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

Toradh: cuid aireamh, 10, 11.

Feuch...[glacadh..][mu dheireadh..]crìoch

Còd sampaill:

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

Planaichean airson an ama ri teachd

Bidh mi a’ coimhead agus a’ coimhead air GraalVM & Truffle. Chan eil inneal-cruinneachaidh JIT aig an àrainneachd runtime agam, agus mar sin a thaobh coileanadh chan eil e an-dràsta ach farpaiseach le Python. Tha mi an dòchas gun urrainn dhomh co-chruinneachadh JIT a chuir an gnìomh stèidhichte air GraalVM no LLVM.

tasgaidh

Faodaidh tu cluich leis na leasachaidhean agus lean am pròiseact thu fhèin.

làrach-lìn
Stòr air GitHub

Tapadh leibh airson leughadh chun deireadh ma rinn thu.

Source: www.habr.com

Cuir beachd ann