Post verkado de la unua artikolo pri kiel krei vian propran operaciumonIu diris al mi, ĉu mi povus fari artikolon pri kiel krei programlingvon. Unue mi ne multe atentis, sed nun kaj per aliaj manieroj mi lernis multe pli pri la kreado de programlingvoj. Do ni faru baza programlingvo, facile enkorpigebla en aliaj programoj kaj kiu funkcias kun virtuala maŝino, kiun ni ankaŭ projektos. Hodiaŭ ni devas produkti la plej bazan virtualan maŝinon.
Vi probable scivolas: «Ĉu virtuala maŝino? Sed ĉu tio ne estas tre malfacila kaj ĉu ĝi ankaŭ bremsas la programojn? " Kontraŭe, simpla virtuala maŝino estas tre simpla kaj relative rapida. Mi elektis rustiĝi kiel lingvo por la virtuala maŝino. Sed kio ĝi estas rustiĝi?
rustiĝi instalas en linux En simpla maniero. Tamen ne ekzistas oficiala pakaĵo. Uzantoj de ubuntu povas aldoni ĉi tiujn du PPA: ppa: hansjorg / rust y ppa: cmrx64 / kargo, uzantoj de Arko povas uzi AUR (kargo-git estas la pako, kiu instalas ĉion). La resto povas uzi:
curl -s https://static.rust-lang.org/rustup.sh | sudo sh
Kiel funkcias virtuala maŝino?
Se vi scias, kiel funkcias la muntila mondo, estas same, kun la stako aŭ la stako. Se ne, mi klarigos ĝin al vi. Ni imagu la jenan kodon:
presi 2 + 3
La komputilo ne komprenas, kion signifas 2 + 3, nek scias, kian ordon sekvi. Komputiloj funkcias per baterioj aŭ stakoj, en kiuj datumoj amasiĝas kaj kontinue ĉerpas. Tiu kodo en nia virtuala maŝino devas aspekti tiel:
PUSH 2 PUSH 3 ADD PRINT
Esence ni metus la 2 sur la stakon supre, la 3 ankaŭ. ALDONI tirus (t.e. forigus ĝin de la stako kaj ricevus ĝian valoron) la lastajn 2 erojn sur la stako kaj aldonus la rezulton al la supro de la stako. PRINT prenus la lastan eron sur la stako kaj uzus ĝin por montri ĝin al ni. Nun ni faru tion en rustiĝi.
Ni devas unue difini lingvon por la bajta kodo, ni povus uzi ekzistantan kiel tiu en java aŭ la CLR de .NET / Mono, sed ni kreos pli bazan.
https://gist.github.com/a01de8904fd39a442c20
Ni uzas deksesuman notacion por ĉiu instrukcio. Altan ni metis # [deriva (DePrimitiva)], estas apartaĵo de rustiĝi kaj ĝi helpos nin poste povi kompari la nombradon kun bajtoj rekte.
Nun ni devas plenumi funkcion, kiu plenumas ĉiun el tiuj instrukcioj. Por tio ni devas legi bajton kaj kompari ĝin kun la instrukcioj, kiujn ni havas en la nombrado. Se vi trovas iujn, kiuj ekzistas, vi devas plenumi vian agon.
https://gist.github.com/8950ce212a2de2f397f9
Ni faras tion por legi ĉiun bajton individue kaj ekzekuti ilin:
https://gist.github.com/12e24a1f0dd65e4cd65d
Kiel vi povas vidi, ni diferencas, se ni ricevis la komandon PUSH (nia INTEGER-komando) antaŭe, la sekva bajto estos prenita tute sur la stako. Tie ni uzas du funkciojn, kiujn mi ne instruis al vi, mem.pop () y mem.puŝi (), kiuj evidente respondecas pri manipulado de la stako.
https://gist.github.com/54147f853a8a2b8c01d9
Ili ne estas tre kompleksaj, sed la pop-funkcio havas erarajn detektajn mekanismojn. Fakte, en rustiĝi, se ni forigos tiujn mekanismojn, ĝi donus al ni kompila eraro. Nun ni simple devas alvoki programon perin (nia virtuala maŝino) kaj ekzekutu bajtokodon.
https://gist.github.com/99b1ab461318b3a644d0
Tiu bitokodo legeblas el dosiero, sed ĉi tie por simpleco mi konservis ĝin en variablo. Se ni plenumos ĝin, ĝi donos al ni la atendatan rezulton:
Perin v0.1 Perin VM ekzekutas FlopFlip-bitokodon Komencante ekzemplon de PerinVM PerinVM v0.1.0 Entjera valoro 5
Ĉiu kodo haveblas ĉe GitHub sub la Permeso Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Por kompili ili devas havi kargo instalita kaj metita:
ŝarĝi konstruon && ./target/main
En la sekva ĉapitro ni vidos pli pri nia programlingvo.
17 komentoj, lasu la viajn
Interesa scivolemo, kvankam ĝi ne tre utilas en la realo, ne doloras scii.
Bonege, ke vi reklamas Ruston, ĝi estas lingvo, kiu promesas multon, ne nur ĝi estas pli sekura ol c ++, sed (nuntempe) pli klara en sia sintakso.
Pri foto, mi ne konsiderus java evolution XD.
Kaj de fortran, mi neniam uzis ĝin, sed mi ne aŭdis multajn bonajn aferojn pri ĝi ...
Mi faras, kaj ĝi estas speciale utila en inĝenierado kvankam Python malfermiĝas.
Fortran estas eble la alia bonega lingvo kune kun C. Eĉ hodiaŭ en vere kritikaj demandoj estos unu aŭ la alia.
Kaj estus diskuteble, ke Fortran estas kiel "evoluo" de C, kiam eble ĝi devus esti inverse, ĉar C estas pli nova, pli moderna kaj kun pli da ebloj; kvankam unu ne malligiĝas unu de la alia.
Kvankam la finaj pozicioj estas ĉiuj diskuteblaj laŭ iu vidpunkto.
+1 al Ĝavo
Ni vidu ĉu mi ŝatas ĉi tion, mi donas ion al programado sed baza por vidi ĉu mi komprenas pli.
Kio estas la vera celo krei novan programlingvon? Persone ŝajnas al mi, ke temas pri kaŝi la fontkodon.
Amiko, kio okazis kun la daŭrigo de "via propra operaciumo"? Ne lasu ĝin tie bonvolu, daŭrigu ĝin.
Fakte vi estas majstro kaj ĉi tiuj du kantoj tute allogis mian atenton, sed mi ne ŝatus, ke ili ĉesu duonvoje.
Mi scias, ke multaj el ni opinias same kaj ni atendas la daŭrigojn kaj konkludojn de ĉi tiuj tre interesaj temoj.
Tre interesa, dankegon. 🙂
Mi ne konsideras Java programlingvo, prefere komandinterpretilon, ĉar ĝi ne estas kompilebla
[Programlingvo estas formala lingvo dizajnita por esprimi procezojn efektivigeblajn de maŝinoj kiel komputiloj.]
Tial Ĝavo estas programlingvo. Eĉ la Bash-lingvo (linux-ŝela lingvo) estas programlingvo en si mem.
Estas du specoj de lingvoj:
- Kompilita
- Interpretita
- Miksita (Virtualaj maŝinoj, la denaskaj bibliotekoj estas kompilitaj kaj la funkcia kodo estas interpretita)
La interpretistoj estas tre utilaj kiam temas pri plurplatformo kaj ne havas katastrofan prezenton por tio. Java, VB.NET, C ++ .NET, F #, C # estas ĉiuj miksitaj lingvoj. La bash-lingvo, bat, PHP, Javascript kaj multaj pli estas interpretitaj lingvoj.
Se vi ne konsideras Ĝavon kiel lingvon ĉar ĝi estas interpretata (kio ne estas), vi ne konsideru multajn aliajn lingvojn uzatajn por krei programojn. Cetere per tiu tri regulo vi ne konsideru, ke ekzistas iu ajn programlingvo krom la maŝina lingvo mem.
Kaj kial ne? Eĉ maŝinlingvo ne povus esti konsiderata lingvo, ĉar ĝi vere estas nur aro da komandoj "interpretitaj" de la procesoro.
Ĉar efektive ĈIUJ lingvoj estas nenio pli ol aro da komandoj interpretataj de procesoro.
Vi eble ŝatas lingvon pli-malpli (Java, ĉi-kaze), ŝajnas pli-malpli utila kaj potenca sed diri, ke ĝi ne estas programlingvo ĉar ĝi ne estas kompilita ... ĝi kontraŭas ĉiujn programlingvajn difinojn.
😐 Mi esperas, ke mi ne ŝajnis tro malĝentila
sen kvieto vi nur detruis niajn vivojn
hahahahaha, perdoooon. ĝi ne estis mia intenco xD
java estas programlingvo. ĉar vi povas disvolvi aplikaĵon kaj kiam vi kompilas, vi faras .jar interpretitan de la JVM. Tiam laŭ via python-logiko ĝi ankaŭ ne estas interpretata sed ĝi kompilas al diversaj plenumeblaj ...
Tre bona informo
bonaj informoj sed mi dubas, eblos krei novan programlingvon de nulo sen neceso fidi aliajn analogiojn aŭ programojn. Mi parolas same kiel aliaj lingvoj estis kreitaj kiel java aŭ HTML.
Mi tre dankus vian helpon pri ĉi tiu demando.