Fiteny fandaharana vaovao Mash

Nandritra ny taona maro dia nanandrana ny tanako aho tamin'ny famolavolana ny fitenin-drafiko manokana. Te-hamorona, araka ny hevitro, ny fiteny tsotra indrindra, azo ampiasaina tanteraka ary azo atao.

Amin'ity lahatsoratra ity dia tiako ny hanasongadina ireo dingana lehibe amin'ny asako ary, manomboka amin'ny, mamaritra ny foto-kevitra noforonina momba ny fiteny sy ny fampiharana azy voalohany, izay iasako amin'izao fotoana izao.

Avelao aho hilaza mialoha fa nanoratra ny tetikasa manontolo tamin'ny Free Pascal aho, satria... Ny programa eo aminy dia azo amboarina ho an'ny sehatra marobe, ary ny mpanangom-bokatra dia mamokatra binary tena tsara (manangona ny singa rehetra amin'ny tetikasa miaraka amin'ny saina O2 aho).

Fotoan'ny fiteny

Voalohany indrindra, mendrika ny hiresaka momba ny milina virtoaly izay tsy maintsy soratako mba hampandehanana ny fampiharana ho avy amin'ny fiteniko. Nanapa-kevitra ny hametraka rafitra stack aho, angamba, satria io no fomba mora indrindra. Tsy nahita lahatsoratra mahazatra iray momba ny fomba hanaovana izany amin'ny teny Rosiana aho, ka rehefa avy nahafantatra ny tenako tamin'ny teny anglisy aho dia nipetraka nanamboatra sy nanoratra ny bisikiletako manokana. Manaraka izany dia hanolotra ny hevitro sy ny fivoarana "advance" momba ity raharaha ity aho.

Fampiharana stack

Mazava ho azy fa eo an-tampon'ny VM ny stack. Amin'ny fampiharana ahy dia miasa amin'ny sakana. Amin'ny ankapobeny dia tondrozotra tsotra sy fari-pahalalana hitehirizana ny index of the top of the stack ity.
Rehefa atomboka izany dia misy singa 256 noforonina. Raha tondro maro kokoa no atosiky ny stack, dia mitombo ny habeny amin'ny singa 256 manaraka. Araka izany, rehefa manaisotra singa avy amin'ny stack, ny habeny dia ahitsy.

Mampiasa stacks maromaro ny VM:

  1. Main stack.
  2. Stack ho fitehirizana teboka miverina.
  3. Fitambarana mpanangona fako.
  4. Andramo/sambory/sakanana farany ny stack handler.

Constants sy Variables

Tsotra ity iray ity. Ny Constant dia karakaraina amin'ny kaody kely misaraka ary azo ampiasaina amin'ny fampiharana ho avy amin'ny alΓ lan'ny adiresy static. Variables dia andiana tondro amin'ny habe iray, ny fidirana amin'ny sela dia tanterahana amin'ny alΓ lan'ny index - i.e. adiresy static. Azo atosihana eny an-tampon'ny stack na vakiana avy eo ny variables. Raha ny marina, satria Raha mitahiry tondro amin'ny soatoavina ao amin'ny fitadidiana VM ny fari-piadidianay, ny fiteny dia anjakan'ny fiasana amin'ny tondro tsy mazava.

Mpamory fako

Amin'ny VM-ko dia semi-automatique. Ireo. ny developer mihitsy no manapa-kevitra hoe rahoviana no hiantso ny mpanangona fako. Tsy mandeha amin'ny fampiasana kaontera fanondro mahazatra, toy ny amin'ny Python, Perl, Ruby, Lua, sns. Izy io dia ampiharina amin'ny alΓ lan'ny rafitra marika. Ireo. rehefa misy fari-piainana natao homena sanda vonjimaika, dia ampiana tondro ho an'io sanda io amin'ny fitobian'ny mpanangona fako. Amin'ny ho avy, ny mpanangona dia mihazakazaka haingana amin'ny lisitry ny tondro efa voaomana.

Fikarakarana try/catch/final blocks

Toy ny amin'ny fiteny maoderina rehetra, singa manan-danja ny fitantanana exception. Ny fototry ny VM dia nofonosina amin'ny try..catch block, izay afaka miverina amin'ny famonoana kaody aorian'ny fisamborana fanavahana amin'ny alΓ lan'ny fanosehana fampahalalana sasantsasany momba izany eo amin'ny stack. Ao amin'ny fehezan-dalΓ na fampiharana, azonao atao ny mamaritra ny try/catch/finally blocks of code, manondro ny fidirana amin'ny catch (exception handler) ary farany/end (faran'ny sakana).

Multithreading

Izy io dia tohanana amin'ny ambaratonga VM. Tsotra sy mora ampiasaina. Izy io dia miasa tsy misy rafitra fanelingelenana, ka ny code dia tokony hotanterahina amin'ny kofehy maromaro imbetsaka haingana kokoa.

Tranomboky ivelany ho an'ny VM

Tsy misy fomba azo atao raha tsy misy izany. Ny VM dia manohana ny fanafarana, mitovy amin'ny fomba fampiharana azy amin'ny fiteny hafa. Azonao atao ny manoratra ampahany amin'ny kaody amin'ny Mash sy ampahany amin'ny kaody amin'ny fiteny teratany, avy eo mampifandray azy ireo ho iray.

Mpandika avy amin'ny fiteny Mash avo lenta ho bytecode ho an'ny VM

Fiteny manelanelana

Mba hanoratana haingana mpandika teny avy amin'ny fiteny sarotra ho kaody VM, dia namorona fiteny mpanelanelana voalohany aho. Ny vokatr'izany dia fampisehoana mahatsiravina toy ny assembler izay tsy misy dikany manokana hodinihina eto. Holazaiko fotsiny fa amin'ity ambaratonga ity ny mpandika teny dia manodina ny ankamaroan'ny tsy miovaova sy ny miovaova, kajy ny adiresiny static sy ny adiresin'ny teboka fidirana.

Architecture mpandika teny

Tsy nisafidy ny maritrano tsara indrindra amin'ny fampiharana aho. Ny mpandika teny dia tsy manamboatra hazo kaody, toy ny ataon'ny mpandika teny hafa. Mijery ny fiandohan'ny rafitra izy. Ireo. raha toa ka toy ny hoe "raha :" ny sombin-kaody izay nozaraina:, dia mazava ho azy fa ity dia fananganana loop kely ary mila amboarina ho toy ny fananganana loop. Zavatra sahala amin'ny saron-tava sarotra.

Noho io vahaolana ara-javakanto io, ny mpandika teny dia hita fa tsy dia haingana. Na izany aza, nitombo be ny fanamorana ny fanovana azy. Nanampy ireo rafitra ilaina haingana kokoa noho ny mety ho mangatsiaka ny kafeko. Ny fanohanana OOP feno dia nampiharina tao anatin'ny herinandro latsaka.

Optimization kaody

Eto, mazava ho azy, mety ho nampiharina tsara kokoa (ary hampiharina, fa any aoriana, raha vantany vao tonga amin'izany). Hatreto, ny optimizer dia tsy mahalala afa-tsy ny manapaka ny kaody tsy ampiasaina, ny tsy miovaova ary ny fanafarana avy amin'ny fivoriambe. Ankoatra izany, dia soloina iray ny constants maromaro mitovy lanja. Izay ihany.

Language Mash

Hevitra fototra momba ny fiteny

Ny hevi-dehibe dia ny hampivelatra ny fiteny azo ampiasaina sy tsotra indrindra. Heveriko fa ny fampandrosoana dia miatrika ny asany amin'ny banga.

Code blocks, fomba fiasa ary fiasa

Ny fanorenana rehetra amin'ny fiteny dia misokatra amin'ny colon. : ary nakaton'ny mpandraharaha tapitra.

Ny fomba fiasa sy ny fiasa dia ambara ho proc sy func. Voatanisa ao anaty fononteny ireo hevitra. Ny zava-drehetra dia toy ny ankamaroan'ny fiteny hafa.

mpandraharaha hiverina afaka mamerina sanda avy amin'ny asa iray ianao, operator break mamela anao hivoaka ny fomba fiasa/asa (raha ivelan'ny tadivavarana).

Kaody santionany:

...

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

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

Designed Supported

  • Loops: fa..farany, raha..farany, hatramin'ny..farany
  • Fepetra: raha..[hafa..]farany, mifamadika..[raha..farany..][hafa..]farany
  • Fomba: proc ():... end, func ():... end
  • Label & goto: :, hitsambikina
  • Fanisana enum sy array tsy tapaka.

hiovaova

Ny mpandika teny dia afaka mamaritra azy ireo ho azy, na raha manoratra var ny mpamorona alohan'ny hamaritana azy ireo.

Ohatra kaody:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Tohanana ny fari-piainana maneran-tany sy eo an-toerana.

OOP

Eny, tonga amin'ny lohahevitra matsiro indrindra isika. Mash dia manohana ny paradigma fandaharana rehetra miompana amin'ny zavatra. Ireo. kilasy, lova, polymorphisme (anisan'izany ny dynamique), ny fandinihan-tena mandeha ho azy sy ny introspection (feno).

Raha tsy misy ado intsony, tsara kokoa ny manome ohatra kaody fotsiny.

Kilasy tsotra sy miasa miaraka aminy:

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

Ny vokatra azo: 30.

Fandovana sy polymorphisme:

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

Ny vokatra azo: 60.

Ahoana ny amin'ny polymorphisme dynamic? Eny, fisaintsainana izany!:

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

Ny vokatra azo: 60.

Andeha isika haka fotoana kely hijerena ireo soatoavina sy kilasy tsotra:

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

Hivoaka: marina, marina.

Momba ireo mpandraharaha fanendrena sy tondro mazava

Ny opΓ©rateur ?= dia ampiasaina hanendry tondro ho an'ny sanda iray ao anaty fitadidiana.
Ny = operator dia manova sanda amin'ny fitadidiana amin'ny fampiasana tondro avy amin'ny fari-piainana.
Ary izao kely momba ny fanondro mazava. Nampiako tamin'ilay fiteny izy ireo mba misy.
@ β€” maka fanondro mazava amin'ny fari-piainana iray.
? β€” mahazo miovaova amin'ny fanondro.
@= β€” manendry sanda ho an'ny variable amin'ny alalan'ny tondro mazava ho azy.

Kaody santionany:

uses <bf>
uses <crt>

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

Hivoaka: laharana sasany, 10, 11.

Andramo..[sambory..][farany..]farany

Kaody santionany:

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

Drafitra ho an'ny ho avy

Mbola mijery sy mijery an'i GraalVM & Truffle aho. Tsy manana compiler JIT ny tontolon'ny runtime ahy, ka amin'ny lafiny fampisehoana dia mifaninana amin'ny Python ihany izy amin'izao fotoana izao. Manantena aho fa ho afaka hampihatra ny JIT compilation mifototra amin'ny GraalVM na LLVM.

repository

Afaka milalao amin'ny fivoarana ianao ary manaraka ny tetikasa.

tranonkala
Repository amin'ny GitHub

Misaotra namaky hatramin'ny farany raha nanao izany ianao.

Source: www.habr.com

Add a comment