Luuqadda cusub ee barnaamijka Mash

Dhowr sano ayaan gacantayda isku dayay inaan horumariyo luuqadeyda barnaamijka. Waxaan rabay in aan abuuro, fikradayda, luqadda ugu fudud, si buuxda u shaqaynaysa uguna habboon ee suurtogalka ah.

Maqaalkan waxaan rabaa inaan iftiimiyo marxaladaha ugu muhiimsan ee shaqadayda, oo aan ku bilaabo, sharaxo fikradda la abuuray ee luqadda iyo hirgelinteeda ugu horreysa, taas oo aan hadda ka shaqeynayo.

Aan horay u sheego in aan mashruuca oo dhan ku qoray Free Pascal, sababtoo ah... Barnaamijyada ku yaal waxaa lagu soo ururin karaa tiro aad u badan oo goobo ah, iyo isku-duwaha laftiisa ayaa soo saara binaries aad loo hagaajiyay (waxaan ururiyaa dhammaan qaybaha mashruuca oo leh calanka O2).

Waqtiga orodka luqadda

Ugu horreyntii, waxaa habboon in aan ka hadlo mashiinka farsamada ee aan ku qasbanahay inaan qoro si aan u socodsiiyo codsiyada mustaqbalka ee luqaddayda. Waxaan go'aansaday in aan hirgeliyo qaab-dhismeedka isugeynta, laga yaabee, sababtoo ah waxay ahayd habka ugu fudud. Ma aanan helin hal maqaal oo caadi ah oo ku saabsan sida tan loogu sameeyo Ruushka, markaa ka dib markaan naftayda bartay walxaha Ingiriisiga ah, waxaan u fadhiistay naqshadaynta iyo qorista baaskiilka. Marka xigta waxaan soo bandhigi doonaa fikradahayga "horumarsan" iyo horumarka arrintan ku saabsan.

Hirgelinta raasamaal

Sida iska cad, meesha ugu sareysa ee VM-gu waa xirmada. Hirgelintayda waxay ka shaqeysaa blocks. Asal ahaan tani waa tilmaame fudud oo kala duwan iyo doorsoome lagu kaydiyo tusmada sare ee xidhmada.
Marka la bilaabo, 256 curiye ayaa la abuuraa. Haddii tilmaameyaal badan lagu riixo xidhmada, cabbirkeedu waxa uu kordhiyaa 256 curiye ee soo socda. Sidaas awgeed, marka laga saarayo canaasiirta xidhmada, cabbirkeeda ayaa la hagaajiyaa.

VM waxay isticmaashaa dhowr xidhmo:

  1. Xidhmada ugu weyn
  2. Xirmo loogu talagalay kaydinta dhibcaha soo noqoshada.
  3. Xirmada qashinka.
  4. Isku day/qabso/ugu dambayntii xidh xidhidhka gacantahaye.

Joogtada iyo Kala-duwanaanta

Midkani waa mid fudud. Joogtada waxaa lagu maamulaa kood yar oo gooni ah waxaana laga heli karaa codsiyada mustaqbalka iyada oo loo marayo ciwaanno taagan. Kala duwanaanshuhu waa tilmaameyaal kala duwan oo cabbir gaar ah leh, gelitaanka unugyadeeda waxaa lagu fuliyaa index - i.e. ciwaanka taagan Kala duwanaanshiyaha waxaa lagu riixi karaa meesha ugu sareysa ee xirmada ama waxaa laga akhrisan karaa halkaas. Dhab ahaantii, sababtoo ah Iyadoo doorsoomayaalkeennu ay asal ahaan ku kaydiyaan tilmaamayaasha qiyamka xusuusta VM, luqadda waxaa u badan in lagu shaqeeyo tilmaameyaal qarsoon.

Qashin ururiyaha

VM-gayga waa semi-otomaatig ah. Kuwaas. horumariyaha laftiisa ayaa go'aaminaya goorta uu wacayo qashin ururiyaha. Ma shaqaynayso iyadoo la isticmaalayo miiska tilmaame ee caadiga ah, sida Python, Perl, Ruby, Lua, iwm. Waxaa lagu hirgeliyaa habka calaamadaynta. Kuwaas. marka doorsoome la doonayo in loo qoondeeyo qiime ku meel gaadh ah, tilmaame qiimahan ayaa lagu darayaa xidhmada qashinka. Mustaqbalka, ururiyuhu si dhakhso ah ayuu u dhex maraa liiskii hore loo diyaariyey ee tilmaamayaasha.

Wax ka qabashada isku dayga/qabsashada/ugu dambayntii way xannibaysaa

Sida luqad kasta oo casriga ah, wax ka qabashada ka reeban waa qayb muhiim ah. Xudunta VM waxa ay ku duudduubtay isku day..qabso block, kaas oo ku soo noqon kara fulinta code ka dib marka laga reebo isagoo riixaya xoogaa macluumaad ah oo ku saabsan dushiisa. Codsiga koodka, waxaad ku qeexi kartaa isku day/qabasho/ugu dambayntii baloogyada koodka, adoo tilmaamaya meelaha laga soo galo qabashada (hagaha ka reeban) iyo ugu dambayn/dhammaadka (dhamaadka block).

Multithreading

Waxaa lagu taageeraa heerka VM. Waa sahlan tahay oo ku habboon in la isticmaalo. Waxay u shaqeysaa iyada oo aan la joojin nidaamka, markaa koodka waa in lagu fuliyaa dhowr xadhig dhowr jeer si dhakhso ah, siday u kala horreeyaan.

Maktabadaha dibadda ee VM-yada

Ma jirto si loo sameeyo tan la'aanteed. VM waxay taageertaa soo dejinta, si la mid ah sida loogu fuliyo luqadaha kale. Waxaad ku qori kartaa qayb ka mid ah koodka Mash iyo qayb ka mid ah koodka oo ku qoran luqadaha hooyo, ka dibna ku xidh mid ka mid ah.

Turjumaan ka yimid luqadda Mash ee heerka sare ah una beddelo bytecode ee VM-yada

Luuqad dhexe

Si aan dhaqso ugu qoro turjumaan luqad adag oo VM code ah, waxaan markii hore sameeyay luqad dhexe. Natiijadu waxay ahayd soo ururiye-u eg muuqaal naxdin leh oo aanay jirin meel gaar ah oo halkan lagu tixgeliyo. Waxaan dhihi doonaa oo kaliya in heerkan turjubaanka uu ku shaqeeyo inta badan joogtada iyo doorsoomayaasha, wuxuu xisaabiyaa cinwaanadooda taagan iyo ciwaanada meelaha laga soo galo.

Dhismaha turjubaanka

Maan dooran dhismaha ugu fiican ee hirgelinta. Turjubaanka ma dhiso geed kood ah, sida turjumaanada kale sameeyaan. Waxa uu eegayaa bilawga dhismaha. Kuwaas. Haddii gabal koodka la sifeeyay uu u ekaado "xilli <xaalad>:", markaas way iska caddahay in tani ay tahay in muddo ah la dhisayo oo loo baahan yahay in la habeeyo iyadoo la dhisayo in muddo ah. Wax la mid ah kiis beddelka kakan.

Waad ku mahadsan tahay xalkan qaab dhismeedka, turjumaanku wuxuu noqday mid aan aad u degdegin. Si kastaba ha ahaatee, fududaynta wax ka beddelkeeda ayaa si weyn u kordhay. Waxaan ku daray qaababka lagama maarmaanka ah si ka dhakhso badan inta kafeegaygu qaboojin karo. Taageerada OOP oo buuxda ayaa lagu hirgeliyay in ka yar hal toddobaad.

Hagaajinta koodka

Halkan, dabcan, si fiican ayaa loo hirgelin karay (waana la hirgelin doonaa, laakiin hadhow, isla marka qofku u soo dhawaado). Ilaa hadda, wanaajinta kaliya ayaa og sida loo gooyo koodka aan la isticmaalin, joogtada ah iyo soo dejinta ka imanaya golaha. Sidoo kale, dhowr joogto ah oo leh qiime isku mid ah ayaa lagu beddelay hal. Waa intaas.

Luqadda Mash

Fikradda aasaasiga ah ee luqadda

Fikradda ugu weyn waxay ahayd in la horumariyo luqadda ugu shaqaynaysa uguna fudud ee suurtogalka ah. Waxaan u maleynayaa in horumarku uu shaqadiisa ku qabsanayo bang.

Xeerarka blocks, hababka iyo hawlaha

Dhammaan dhismayaasha afka waxaa lagu furay xiidan. : waxaana xidhay hawlwadeenku dhamaadka.

Nidaamyada iyo shaqooyinka waxaa lagu dhawaaqaa inay yihiin proc iyo func, siday u kala horreeyaan. Dooduhu waxay ku taxan yihiin khaanadaha. Wax walba waa sida luqadaha kale intooda badan.

Hawl-wadeen soo laabtay waxaad ka soo celin kartaa qiimaha shaqo, hawlwadeen nasashada wuxuu kuu ogolaanayaa inaad ka baxdo nidaamka / shaqada (haddii ay ka baxsan tahay wareegyada).

Koodhka Tusaalaha:

...

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

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

Naqshado la taageeray

  • Loops: for..dhammaadka, halka..dhamaadka, ilaa..dhamaadka
  • Shuruudaha: haddii..[kale..]dhammaadka, beddelo
  • Hababka: proc <name>():... dhamaadka, func <name>():...dhamaadka
  • Sumad & goto: <name>:, boodi <name>
  • Tiro-koobyada iyo habab joogto ah.

Kala duwanaansho

Turjubaanka ayaa si toos ah u go'aamin kara, ama haddii horumariyuhu qoro var ka hor inta uusan qeexin iyaga.

Tusaalooyinka koodka:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Doorsoomayaasha caalamiga ah iyo kuwa maxalliga ah waa la taageeray.

OOP

Hagaag, waxaanu nimid mawduuca ugu macaan. Mash waxa ay taageertaa dhammaan jaangooyooyinka barnaamijka ku jihaysan shayga. Kuwaas. fasallada, dhaxalka, polymorphism (oo ay ku jiraan firfircoon), milicsi toos ah oo firfircoon iyo indho-indheyn (buuxa).

Iyadoo aan jirin wax dheeraad ah, waxa fiican inaad bixiso tusaalooyin kood ah.

Fasal fudud oo la shaqayntiisa:

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

Soo saari doona: 30.

Dhaxalka iyo 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

Soo saari doona: 60.

Ka warran polymorphism firfircoon? Haa, tani waa milicsiga!:

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

Soo saari doona: 60.

Hadda aan qaadanno daqiiqad si aan u eegno qiyamka fudud iyo fasallada:

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

Soo saari doonaa: run, run.

Ku saabsan hawl-wadeenada shaqada iyo tilmaamayaasha cad

Hawlwadeenka ?= waxa loo isticmaalaa in lagu meeleeyo doorsoome tilmaame qiimaha xusuusta.
Hawlwadeenku = waxa uu beddelaa qiimaha xusuusta isagoo isticmaalaya tilmaame doorsoome.
Oo hadda wax yar oo ku saabsan tilmaamayaasha cad. Waxaan ku daray afka si ay u jiraan.
@<variable> - u qaado tilmaame cad doorsoomayaal.
?<kala duwanaan karo> - doorsoome ku hel tilmaame.
@= - u qoondee qiime doorsoomayaasha iyadoo tilmaame cad u saarayo.

Koodhka Tusaalaha:

uses <bf>
uses <crt>

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

Soo saari doona: tiro ka mid ah, 10, 11.

Isku day

Koodhka Tusaalaha:

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

Qorshayaasha mustaqbalka

Waan sii eegayaa oo eegayaa GraalVM & Truffle. Deegaanka runtimeygu ma laha isku-ururiyaha JIT, marka marka la eego waxqabadka hadda waxa uu la tartamayaa Python oo kaliya. Waxaan rajeynayaa inaan awood u yeelan doono inaan hirgeliyo isku-dubarid JIT oo ku saleysan GraalVM ama LLVM.

kayd

Waxaad la ciyaari kartaa horumarka oo aad laftigaaga la socon kartaa mashruuca.

website
Kaydka GitHub

Waad ku mahadsan tahay akhrinta ilaa dhamaadka haddii aad samaysay.

Source: www.habr.com

Add a comment