Ustvarite svoj programski jezik (I)

Razvoj programskih jezikov

Po pisanju prvega članka o kako ustvariti svoj operacijski sistem, mi je nekdo rekel, da če bi lahko napisal članek o kako ustvariti programski jezik. Sprva nisem posvečal veliko pozornosti, zdaj pa sem na druge načine izvedel veliko več o ustvarjanju programskih jezikov. Torej, narediva osnovni programski jezik, ki ga je mogoče enostavno vgraditi v druge programe in deluje z navideznim računalnikom, ki ga bomo tudi oblikovali. Danes moramo narediti najosnovnejši virtualni stroj.

Verjetno se sprašujete: Navidezni stroj? A ni to zelo težko in ali to upočasni programe? " Nasprotno pa je preprost navidezni stroj zelo preprost in razmeroma hiter. izbral sem Rust kot jezik za navidezni stroj. Toda kaj je to Rust?

Rust To je programski jezik, ki je osredotočen na varnost izvajanja, zato bo z njegovo uporabo praktično nemogoče, da nekdo zapre navidezni stroj. Je prevedeni jezik v razvoju, ki ga je ustvaril Mozilla. Servo, nadomestek za Gecko, se v njem razvija. Sintakso lahko še vedno spremenite, vendar se bo koda, ki jo bom uporabil, ohranila do prve stabilne izdaje.

Rust namesti v Linux Na preprost način. Vendar pa ni uradne pakete. Uporabniki Ubuntu lahko dodate ta dva PPA: ppa: hansjorg / rja  y ppa: cmrx64 / tovor, uporabniki Arch lahko uporabi AUR (cargo-git je paket, ki namesti vse). Ostali lahko uporabljajo:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Kako deluje navidezni stroj?

Če veste, kako deluje svet zbiralcev, je popolnoma enako, tako glede sklada ali sklada. Če ne, vam bom razložil. Predstavljajmo si naslednjo kodo:

natisni 2 + 3

Računalnik ne razume, kaj pomeni 2 + 3, niti ne ve, kateremu vrstnemu redu mora slediti. Računalniki delujejo z baterijami ali skladi, v katerih se podatki zbirajo in neprestano pridobivajo. Ta koda v našem virtualnem računalniku bi morala izgledati nekako takole:

PUSH 2 PUSH 3 ADD PRINT

V bistvu bi na vrh postavili 2, 3 pa tudi. ADD bi potegnil (tj. Odstranil ga iz sklada in dobil njegovo vrednost) zadnja 2 elementa v kupu in rezultat dodal na vrh sklada. PRINT bi vzel zadnji element na kupu in ga uporabil za prikaz. Zdaj pa narediva to v Rust.

Najprej moramo določiti jezik za bajtno kodo, lahko uporabimo obstoječo, kot je tista v Java o el CLR .NET / Mono, vendar bomo ustvarili bolj osnovnega.

https://gist.github.com/a01de8904fd39a442c20

Za vsako navodilo uporabljamo šestnajstiški zapis. Na visoko smo postavili # [izhaja (izPrimitive)], je posebnost Rust in nam bo kasneje pomagalo, da bomo lahko neposredno primerjali naštevanje z bajti.

Zdaj moramo narediti funkcijo, ki izvrši vsako od teh navodil. Za to moramo prebrati bajt in ga primerjati z navodili, ki jih imamo v naštevanju. Če najdete kakršno koli, ki obstaja, morate izvesti svoje dejanje.

https://gist.github.com/8950ce212a2de2f397f9

To naredimo, da preberemo vsak bajt posebej in jih izvedemo:

https://gist.github.com/12e24a1f0dd65e4cd65d

Kot lahko vidite, razlikujemo, če smo prej dobili ukaz PUSH (naš ukaz INTEGER), naslednji bajt bo v celoti prenesen v sklad. Tam uporabljamo dve funkciji, ki vas ju nisem naučil, self.pop () y self.push (), ki so očitno zadolženi za ravnanje s skladom.

https://gist.github.com/54147f853a8a2b8c01d9

Niso zelo zapleteni, ima pa pop funkcija mehanizme za odkrivanje napak. Pravzaprav v Rust, če odstranimo te mehanizme, bi to povzročilo napako pri sestavljanju. Zdaj moramo preprosto poklicati program Perin (naš virtualni stroj) in izvedite bajtno kodo.

https://gist.github.com/99b1ab461318b3a644d0

To bajtno kodo je mogoče prebrati iz datoteke, vendar sem jo zaradi enostavnosti shranil v spremenljivko. Če jo izvedemo, nam bo dal pričakovani rezultat:

Perin v0.1 Perin VM izvede bajtno kodo FlopFlip Zagon primerka PerinVM PerinVM v0.1.0 Celotna vrednost 5

Vsa koda je na voljo na GitHub pod Licenca Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Za sestavljanje jih morajo imeti Cargo nameščen in postavljen:

polnjenje gradi && ./cilj/glavno

V naslednjem poglavju bomo videli več o našem programskem jeziku.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   cestnik je dejal

    Zanimiva radovednost, čeprav v resnici ni zelo koristna, vendar ne škodi vedeti.

    Super je, da oglašujete Rust, je jezik, ki obljublja veliko, ne samo, da je bolj varen kot c ++, ampak je (za zdaj) bolj jasen v svoji sintaksi.

    Kar zadeva fotografijo, ne bi upošteval Java evolution XD.

    1.    cestnik je dejal

      In od fortrana ga nisem nikoli uporabljal, vendar o njem nisem slišal veliko dobrega ...

      1.    Strašno je dejal

        Jaz sem in je še posebej koristen v inženirstvu, čeprav se Python vse bolj uveljavlja.

      2.    John je dejal

        Fortran je morda drugi odlični jezik skupaj s C. Tudi danes bo v resnično kritičnih vprašanjih eno ali drugo.

        In sporno bi bilo, da je Fortran kot "evolucija" C-ja, čeprav bi bilo morda obratno, saj je C novejši, modernejši in z več možnostmi; čeprav se eno niti najmanj ne loči od drugega.

        Čeprav so o končnih stališčih z nekega vidika sporna.

    2.    Francisco je dejal

      +1 za Javo

  2.   vratar je dejal

    Poglejmo, ali mi je to všeč, nekaj dam programiranju, ampak osnovno, da vidim, če razumem več.

  3.   usergnulinux je dejal

    Kaj je resnični namen ustvarjanja novega programskega jezika? Osebno se mi zdi, da je potegavščina skriti izvorno kodo.

  4.   Yeilly je dejal

    Prijatelj, kaj se je zgodilo z nadaljevanjem "lastnega operacijskega sistema"? Ne puščajte ga tam, prosim, nadaljujte.

    Pravzaprav ste mojster in ravno ti dve pesmi sta popolnoma pritegnili mojo pozornost, vendar ne bi rad, da ostaneta na pol poti.

    Vem, da mnogi med nami razmišljamo enako in čakamo na nadaljevanje in zaključke teh zelo zanimivih tem.

  5.   Cristian David je dejal

    Zelo zanimivo, najlepša hvala. 🙂

  6.   Franco je dejal

    Jave ne štejem za programski jezik, temveč za tolmač ukazov, saj ni kompatibilen

    1.    Mario je dejal

      [Programski jezik je formalni jezik, namenjen izražanju procesov, ki jih lahko izvajajo stroji, kot so računalniki.]

      Iz tega razloga je Java programski jezik. Tudi jezik Bash (jezik lupine linux) je sam po sebi programski jezik.

      Obstajata dve vrsti jezikov:
      - Sestavljeno
      - Tolmačeno
      - mešano (navidezni stroji, izvorne knjižnice so sestavljene in interpretirana funkcionalna koda)

      Tolmači so zelo koristni pri multiplatformih in za to nimajo katastrofalne zmogljivosti. Java, VB.NET, C ++ .NET, F #, C # so vsi mešani jeziki. Bash jezik, bat, PHP, Javascript in mnogi drugi so tolmačeni jeziki.

      Če Java ne štejete za jezik, ker se razlaga (kar pa ne), ne bi smeli upoštevati številnih drugih jezikov, ki se uporabljajo za izdelavo programov. Poleg tega po tem pravilu treh ne bi smeli upoštevati, da obstaja kateri koli programski jezik, razen samega strojnega jezika.

      In zakaj ne? Niti strojnega jezika ne bi mogli šteti za jezik, saj gre v resnici le za ukaz, ki ga »razlaga« procesor.

      Ker dejansko VSE jeziki niso nič drugega kot nabor ukazov, ki jih interpretira procesor.

      Morda vam je jezik bolj ali manj všeč (v tem primeru Java), zdi se bolj ali manj uporaben in zmogljiv, vendar če rečemo, da ni programski jezik, ker ni preveden ..., je v nasprotju z vsemi definicijami programskega jezika.

    2.    Mario je dejal

      😐 Upam, da se mi ni zdel preveč nesramen

      1.    Maria Antoinette iz Manuele Cardenas je dejal

        brez tišine si nam uničil samo življenje

      2.    Mario je dejal

        hahahahaha, perdoooon. to ni bil moj namen xD

    3.    Carlos je dejal

      java je programski jezik. Ker lahko razvijete aplikacijo in pri prevajanju naredite .jar, ki ga razlaga JVM. Nato se po vaši python logiki tudi ne razlaga, ampak se prevede v različne izvedljive datoteke ...

  7.   Elija Mongelos je dejal

    Zelo dobre informacije

  8.   Carlos Arturo je dejal

    dobre informacije, dvomim pa, da bo mogoče nov programski jezik ustvariti iz nič, ne da bi se bilo treba zanašati na druge analogije ali programsko opremo. Govorim na enak način kot drugi jeziki, kot sta Java ali HTML.
    Hvaležen bi bil za vašo pomoč pri tem vprašanju.