Shekaru da yawa na gwada hannuna don haɓaka yaren shirye-shirye na. Ina so in ƙirƙira, a ganina, yare mafi sauƙi, cikakken aiki da dacewa.
A cikin wannan labarin ina so in haskaka manyan matakai na aikina kuma, don farawa, bayyana ma'anar da aka kirkiro na harshe da farkon aiwatarwa, wanda nake aiki a yanzu.
Bari in ce a gaba cewa na rubuta dukan aikin a cikin Free Pascal, saboda ... Ana iya haɗa shirye-shiryen akan shi don ɗimbin dandamali, kuma mai tarawa da kansa yana samar da ingantattun binaries (Na tattara duk abubuwan aikin tare da tutar O2).
Lokacin gudu na harshe
Da farko, yana da daraja magana game da injin kama-da-wane da na rubuta don gudanar da aikace-aikacen gaba a cikin yarena. Na yanke shawarar aiwatar da tsarin gine-gine, watakila, saboda ita ce hanya mafi sauƙi. Ban sami labarin ko ɗaya na al'ada ba game da yadda ake yin wannan a cikin harshen Rashanci, don haka bayan na san kaina da kayan Ingilishi, na zauna don yin zane da rubuta keke na. Na gaba zan gabatar da ra'ayoyi na "ci gaba" da ci gaba a cikin wannan al'amari.
aiwatar da tari
Babu shakka, a saman VM shine tari. A cikin aiwatarwa yana aiki a cikin tubalan. Mahimmanci wannan tsari ne mai sauƙi na masu nuni da kuma mai canzawa don adana fihirisar saman tari.
Lokacin da aka fara shi, an ƙirƙiri tsararrun abubuwa 256. Idan an tura ƙarin masu nuni a kan tarin, girmansa yana ƙaruwa da abubuwa 256 na gaba. Saboda haka, lokacin cire abubuwa daga tari, ana daidaita girmansa.
VM yana amfani da tari da yawa:
- Babban tari.
- Tari don adana wuraren dawowa.
- Tari mai tarin shara.
- Gwada/kama/karshe toshe tarin mai sarrafa.
Constants da masu canzawa
Wannan mai sauki ne. Ana sarrafa madanni a cikin ƙaramin ƙaramin lamba kuma ana samun su a aikace-aikace na gaba ta hanyar adiresoshin tsaye. Maɓalli ɗimbin masifu ne na ƙayyadaddun girman, samun damar shiga sel ɗinsa ana aiwatar da shi ta index - watau. a tsaye adireshin. Ana iya tura masu canji zuwa saman tarin ko karanta daga can. A gaskiya, saboda Duk da yake masu canjin mu da gaske suna adana masu nuni zuwa ƙima a cikin ƙwaƙwalwar VM, harshe ya mamaye ta ta hanyar aiki tare da maƙasudai.
Mai tara shara
A cikin VM na yana da Semi-atomatik. Wadancan. mai haɓakawa da kansa ya yanke shawarar lokacin da zai kira mai tattara shara. Ba ya aiki ta amfani da ma'aunin nuni na yau da kullun, kamar a cikin Python, Perl, Ruby, Lua, da sauransu. Ana aiwatar da shi ta hanyar tsarin alama. Wadancan. lokacin da aka yi niyya don sanya maɓalli mai ƙima na wucin gadi, ana ƙara mai nuni ga wannan ƙimar a cikin tarin masu tara shara. A nan gaba, mai tarawa da sauri ya shiga cikin jerin abubuwan da aka riga aka shirya.
Gwada gwada/kama/karshe ya toshe
Kamar yadda a cikin kowane harshe na zamani, keɓantawar sarrafa abu ne mai mahimmanci. An nannade VM core a cikin gwadawa..catch block, wanda zai iya komawa zuwa aiwatar da lambar bayan kama wani keɓantacce ta tura wasu bayanai game da shi a kan tarin. A cikin lambar aikace-aikacen, zaku iya ayyana gwadawa/kama/karshe tubalan lamba, tantance wuraren shigarwa a kama (banda mai kulawa) da ƙarshe/ƙarshen (ƙarshen toshe).
Multithreading
Ana tallafawa a matakin VM. Yana da sauƙi kuma dace don amfani. Yana aiki ba tare da tsarin katsewa ba, don haka yakamata a aiwatar da lambar a cikin zaren da yawa sau da yawa cikin sauri, bi da bi.
Laburaren waje don VMs
Babu yadda za a yi ba tare da wannan ba. VM tana goyan bayan shigo da kaya, kama da yadda ake aiwatar da shi a wasu harsuna. Kuna iya rubuta ɓangaren lambar a cikin Mash da ɓangaren lambar a cikin yarukan asali, sannan ku haɗa su zuwa ɗaya.
Mai Fassara daga Harshen Mash na babban matakin zuwa bytecode don VMs
Yaren tsaka-tsaki
Don rubuta mai fassara da sauri daga hadaddun harshe zuwa lambar VM, na fara haɓaka yaren tsaka-tsaki. Sakamakon ya kasance mugun kallo mai kama da mai haɗawa wanda babu takamaiman ma'ana a cikin la'akari a nan. Zan ce kawai a wannan matakin mai fassara yana aiwatar da mafi yawan ma'auni da masu canji, yana ƙididdige adiresoshin su na tsaye da adiresoshin wuraren shigarwa.
Fassara gine-gine
Ban zabi mafi kyawun gine-gine don aiwatarwa ba. Mai fassara baya gina bishiyar lambar, kamar yadda sauran masu fassara ke yi. Ya dubi farkon tsarin. Wadancan. idan yanki na lambar da ake tantancewa yayi kama da "yayin da <condition>:", to a bayyane yake cewa wannan ɗan lokaci ne ana gina madauki kuma yana buƙatar sarrafa shi azaman madauki na ɗan lokaci. Wani abu kamar hadadden akwati.
Godiya ga wannan bayani na gine-gine, mai fassarar ya juya baya da sauri sosai. Duk da haka, sauƙi na gyara shi ya karu sosai. Na ƙara tsarin da ake buƙata da sauri fiye da kofi na zai iya yin sanyi. An aiwatar da cikakken tallafin OOP a cikin ƙasa da mako guda.
Haɓaka lambar
A nan, ba shakka, za a iya aiwatar da shi da kyau (kuma za a aiwatar da shi, amma daga baya, da zaran mutum ya zo kusa da shi). Ya zuwa yanzu, mai ingantawa kawai ya san yadda za a yanke lambar da ba a yi amfani da ita ba, madaidaicin da shigo da kaya daga taron. Har ila yau, ana maye gurbin ma'auni da yawa masu daraja ɗaya da ɗaya. Shi ke nan.
Harshe Mash
Asalin ra'ayi na harshe
Babban ra'ayin shi ne haɓaka harshe mafi aiki da sauƙi mai yiwuwa. Ina tsammanin cewa ci gaban yana jure wa aikinsa tare da bang.
Tubalan lamba, matakai da ayyuka
Dukkan gine-gine a cikin harshen ana buɗe su da hanji. : kuma mai aiki yana rufewa karshen.
An bayyana matakai da ayyuka azaman proc da func, bi da bi. An jera muhawara a cikin baƙaƙe. Komai yana kama da yawancin harsuna.
Mai aiki samu zaka iya dawo da ƙima daga aiki, mai aiki hutu yana ba ku damar fita hanya / aiki (idan yana waje da madaukai).
Misali code:
...
func summ(a, b):
return a + b
end
proc main():
println(summ(inputln(), inputln()))
end
Tsare-tsaren Tallafi
- Madaukai: don..ƙarshe, yayin da..ƙarshe, har zuwa..ƙarshe
- Sharuɗɗa: idan.. [wani ...] ƙare, canzawa.. [harka..ƙarshe
- Hanyoyin: proc <name>():... ƙare, func <name>():... ƙare
- Label & goto: <name>:, tsalle <suna>
- Ƙididdigar ƙididdiga da tsararraki masu tsayi.
Bambanci
Mai fassara zai iya tantance su ta atomatik, ko kuma idan mai haɓakawa ya rubuta var kafin ayyana su.
Misalai na lamba:
a ?= 10
b ?= a + 20
var a = 10, b = a + 20
Ana tallafawa masu canji na duniya da na gida.
OOP
To, mun zo kan batun mafi dadi. Mash yana goyan bayan duk misalan shirye-shiryen da ke kan abu. Wadancan. azuzuwan, gado, polymorphism (ciki har da tsauri), tunani mai ƙarfi na atomatik da introspection (cikakken).
Ba tare da ƙarin jin daɗi ba, yana da kyau a ba da misalai na lamba kawai.
Aji mai sauƙi da aiki tare da shi:
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
Za a fitar da: 30.
Gado da 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
Za a fitar da: 60.
Me game da polymorphism mai tsauri? Ee, wannan shine tunani!:
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
Za a fitar da: 60.
Yanzu bari mu ɗauki ɗan lokaci don bincika ƙima da azuzuwan masu sauƙi:
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
Za a fitar: gaskiya, gaskiya.
Game da masu gudanar da ayyuka da filaye masu nuni
Ana amfani da afaretan ?= don sanya madaidaicin mai nuni zuwa ƙima a ƙwaƙwalwar ajiya.
A = afareta yana canza ƙima a ƙwaƙwalwar ajiya ta amfani da mai nuni daga madaidaici.
Kuma yanzu kaɗan game da maƙasudai bayyananne. Na kara su cikin harshen domin su wanzu.
@<m> - Ɗauki maƙasudi bayyananne zuwa maɓalli.
?<m> - sami m ta mai nuni.
@= - Sanya ƙima ga maɓalli ta hanyar maƙasudin bayyananne gare shi.
Misali code:
uses <bf>
uses <crt>
proc main():
var a = 10, b
b ?= @a
PrintLn(b)
b ?= ?b
PrintLn(b)
b++
PrintLn(a)
InputLn()
end
Za a fitar: wasu lamba, 10, 11.
Gwada...[kama...] [ƙarshe..] ƙare
Misali 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
Shirye-shirye na nan gaba
Ina ci gaba da kallo da kallon GraalVM & Truffle. Yanayin runtime dina ba shi da na'urar tattara bayanai na JIT, don haka ta fuskar yin aiki a halin yanzu yana gasa da Python kawai. Ina fatan zan iya aiwatar da harhada JIT bisa GraalVM ko LLVM.
wurin ajiya
Kuna iya yin wasa tare da abubuwan ci gaba kuma ku bi aikin da kanku.
Na gode don karantawa har zuwa ƙarshe idan kun yi.
source: www.habr.com