Sabon harshen shirye-shirye Mash

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:

  1. Babban tari.
  2. Tari don adana wuraren dawowa.
  3. Tari mai tarin shara.
  4. 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.

website
Wurin ajiya akan GitHub

Na gode don karantawa har zuwa ƙarshe idan kun yi.

source: www.habr.com

Add a comment