Kreu vian propran programlingvon (I)

La evoluo de programlingvoj

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 Ĝi estas programlingvo enfokusigita al ekzekuta sekureco, do uzi ĝin estos preskaŭ maleble por iu povi fermi la virtualan maŝinon. Ĝi estas kompilita lingvo en disvolviĝo kreita de Mozilla. Servo, la anstataŭanto de Gecko, disvolviĝas en li. Vi ankoraŭ povas ŝanĝi vian sintakson, sed la kodo, kiun mi uzos, restos ĝis la unua stabila eldono.

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.


La enhavo de la artikolo aliĝas al niaj principoj de redakcia etiko. Por raporti eraron alklaku Ĉi tie.

17 komentoj, lasu la viajn

Lasu vian komenton

Via retpoŝta adreso ne estos eldonita. Postulita kampojn estas markita per *

*

*

  1. Respondeculo pri la datumoj: Miguel Ángel Gatón
  2. Celo de la datumoj: Kontrola SPAM, administrado de komentoj.
  3. Legitimado: Via konsento
  4. Komunikado de la datumoj: La datumoj ne estos komunikitaj al triaj krom per laŭleĝa devo.
  5. Stokado de datumoj: Datumbazo gastigita de Occentus Networks (EU)
  6. Rajtoj: Iam ajn vi povas limigi, retrovi kaj forigi viajn informojn.

  1.   vojisto diris

    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.

    1.    vojisto diris

      Kaj de fortran, mi neniam uzis ĝin, sed mi ne aŭdis multajn bonajn aferojn pri ĝi ...

      1.    Fora diris

        Mi faras, kaj ĝi estas speciale utila en inĝenierado kvankam Python malfermiĝas.

      2.    John diris

        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.

    2.    francisco diris

      +1 al Ĝavo

  2.   portisto diris

    Ni vidu ĉu mi ŝatas ĉi tion, mi donas ion al programado sed baza por vidi ĉu mi komprenas pli.

  3.   usergnulinux diris

    Kio estas la vera celo krei novan programlingvon? Persone ŝajnas al mi, ke temas pri kaŝi la fontkodon.

  4.   Jes diris

    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.

  5.   Cristian David diris

    Tre interesa, dankegon. 🙂

  6.   Sincera diris

    Mi ne konsideras Java programlingvo, prefere komandinterpretilon, ĉar ĝi ne estas kompilebla

    1.    mario diris

      [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.

    2.    mario diris

      😐 Mi esperas, ke mi ne ŝajnis tro malĝentila

      1.    Maria Antonieta de Manuela Cardenas diris

        sen kvieto vi nur detruis niajn vivojn

      2.    mario diris

        hahahahaha, perdoooon. ĝi ne estis mia intenco xD

    3.    carlos diris

      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 ...

  7.   Elija Mongelos diris

    Tre bona informo

  8.   Carlos Arturo diris

    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.