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:
- Kuchuluka kwakukulu.
- Mulu wosunga zobwerera.
- Zotolera zinyalala.
- 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.
Zikomo powerenga mpaka kumapeto ngati munatero.
Source: www.habr.com