Kreirajte svoj vlastiti programski jezik (I)

Evolucija programskih jezika

Nakon pisanja prvog članka o kako stvoriti vlastiti operativni sistemNeko mi je rekao mogu li napisati članak o tome kako stvoriti programski jezik. U početku nisam obraćao puno pažnje, ali sada i na druge načine naučio sam mnogo više o stvaranju programskih jezika. Pa hajdemo osnovni programski jezik, lako se može ugraditi u druge programe i koji radi s virtualnom mašinom koju ćemo također dizajnirati. Danas moramo napraviti najosnovniju virtualnu mašinu.

Vjerovatno se pitate: «Virtualna mašina? Ali nije li to vrlo teško i usporava li programe? " Suprotno tome, jednostavna virtualna mašina je vrlo jednostavna i relativno brza. Odabrao sam rđa kao jezik za virtuelnu mašinu. Ali šta je to? rđa?

rđa To je programski jezik koji je usredotočen na sigurnost izvršenja, pa će pomoću njega biti praktično nemoguće da neko zatvori virtualnu mašinu. To je kompajlirani jezik u razvoju koji je kreirao Mozilla. Servo, zamjena za Gecko, razvija se u njemu. Još uvijek možete promijeniti sintaksu, ali kôd koji ću koristiti zadržat će se do prvog stabilnog izdanja.

rđa instalira u Linux Na jednostavan način. Međutim, ne postoji službena parcela. Korisnici Ubuntu mogu dodati ovo dvoje PPA: ppa: hansjorg / hrđa  y ppa: cmrx64 / teret, korisnici svod mogu koristiti AUR (cargo-git je paket koji sve instalira). Ostali mogu koristiti:

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

Kako funkcionira virtualna mašina?

Ako znate kako svijet asemblera funkcionira, potpuno je isto, sa hrpom ili hrpom. Ako ne, objasnit ću vam. Zamislimo sljedeći kod:

ispis 2 + 3

Računar ne razumije šta znači 2 + 3, niti zna kojim redoslijedom se treba pridržavati. Računari rade s baterijama ili hrpama u kojima se podaci akumuliraju i kontinuirano izvlače. Taj kôd u našoj virtualnoj mašini trebao bi izgledati otprilike ovako:

PUSH 2 PUSH 3 DODAJ ŠTAMPU

U osnovi bismo stavili 2 na hrpu, 3 također. ADD bi povukao (tj. Uklonio ga iz steka i dobio njegovu vrijednost) posljednje 2 stavke u stogu i dodao rezultat na vrh stoga. PRINT bi uzeo posljednju stavku na hrpi i njome je prikazao nama. Uradimo to sada rđa.

Prvo moramo definirati jezik za bajt kod, mogli bismo koristiti postojeću poput one u Java ili CLR .NET / Mono, ali mi ćemo stvoriti jedan osnovniji.

https://gist.github.com/a01de8904fd39a442c20

Za svaku nastavu koristimo heksadecimalni zapis. Na vrh smo stavili # [izvodi (izPrimitivnog)], je posebnost rđa i to će nam pomoći kasnije da budemo mogli direktno usporediti nabrajanje s bajtovima.

Sada moramo napraviti funkciju koja izvršava svaku od tih uputa. Za to moramo pročitati bajt i uporediti ga s uputama koje imamo u nabrajanju. Ako pronađete nešto što postoji, morate izvršiti svoju akciju.

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

To činimo kako bismo pročitali svaki bajt pojedinačno i kako bismo ih izvršili:

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

Kao što vidite, razlikujemo se ako smo prije dobili naredbu PUSH (naša naredba INTEGER), sljedeći bajt će u potpunosti biti prebačen u stog. Tamo koristimo dvije funkcije koje vas nisam naučio, self.pop () y self.push (), koji su očito zaduženi za rukovanje hrpom.

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

Nisu vrlo složeni, ali pop funkcija ima mehanizme za otkrivanje grešaka. Zapravo, u rđa, ako uklonimo te mehanizme, to bi nam stvorilo grešku u kompilaciji. Sada jednostavno moramo pozvati program Perin (naša virtualna mašina) i izvršite bytecode.

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

Taj se bytecode može pročitati iz datoteke, ali ovdje sam ga radi jednostavnosti pohranio u varijablu. Ako ga izvršimo, dat će nam očekivani rezultat:

Perin v0.1 Perin VM izvršava FlopFlip bytecode Pokretanje PerinVM instance PerinVM v0.1.0 Integer vrijednost 5

Sav kod je dostupan na GitHub ispod Apache licenca 2.0: https://github.com/AdrianArroyoCalle/perin. Da bi ih kompajlirali, moraju ih imati teret instalirano i stavljeno:

napuni izgradnju && ./cilj/main

U sljedećem poglavlju vidjet ćemo više o našem programskom jeziku.


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   roader rekao je

    Zanimljiva znatiželja, iako nije previše korisna u stvarnosti, ne škodi saznanju.

    Sjajno je što oglašavate Rust, to je jezik koji puno obećava, ne samo što je sigurniji od c ++, već je (za sada) jasniji u svojoj sintaksi.

    Što se tiče fotografije, ne bih razmatrao Java Evolution XD.

    1.    roader rekao je

      A od fortrana ga nikad nisam koristio, ali nisam čuo puno dobrog o njemu ...

      1.    Sramotno rekao je

        Da, i to je posebno korisno u inženjerstvu iako Python dobiva na terenu.

      2.    Juan rekao je

        Fortran je možda drugi sjajni jezik uz C. Čak će i danas u zaista kritičnim pitanjima biti jedno ili drugo.

        I bilo bi diskutabilno da je Fortran kao 'evolucija' C-a, kad bi možda trebalo biti obrnuto, jer je C noviji, moderniji i sa više mogućnosti; iako se jedno ni najmanje ne odvaja od drugog.

        Iako su konačne pozicije s neke točke gledišta diskutabilne.

    2.    Francisco rekao je

      +1 za Javu

  2.   porter rekao je

    Da vidimo da li mi se ovo sviđa, dat ću nešto programiranju, ali osnovno da vidim da li razumijem više.

  3.   usergnulinux rekao je

    Koja je stvarna svrha stvaranja novog programskog jezika? Lično mi se čini da je trik sakriti izvorni kod.

  4.   Yeilly rekao je

    Prijatelju, šta se dogodilo s nastavkom "vašeg vlastitog operativnog sistema"? Ne ostavljajte ga tamo, molim vas, nastavite.

    Zapravo ste majstor i ove dvije pjesme potpuno su mi privukle pažnju, ali ne bih želio da ostanu na pola puta.

    Znam da mnogi od nas misle isto i čekamo nastavke i zaključke ovih vrlo zanimljivih tema.

  5.   Cristian David rekao je

    Vrlo zanimljivo, puno vam hvala. 🙂

  6.   Franco rekao je

    Javu ne smatram programskim jezikom, već interpretatorom naredbi, jer se ne može kompajlirati

    1.    Mario rekao je

      [Programski jezik je formalni jezik dizajniran da izrazi procese koje mogu izvoditi mašine kao što su računari.]

      Iz tog razloga, Java je programski jezik. Čak je i Bash jezik (linux shell jezik) sam po sebi programski jezik.

      Postoje dvije vrste jezika:
      - Kompajlirano
      - Protumačeno
      - Mješovito (virtualne mašine, matične biblioteke se kompajliraju i interpretira funkcionalni kod)

      Tumači su vrlo korisni kada je u pitanju multiplatform i za to nemaju katastrofalne performanse. Java, VB.NET, C ++ .NET, F #, C # su svi mješoviti jezici. Bash jezik, bat, PHP, Javascript i mnogi drugi su interpretirani jezici.

      Ako Java ne smatrate jezikom jer se tumači (što nije), ne biste trebali uzeti u obzir mnoge druge jezike koji se koriste za izradu programa. Štoviše, prema pravilu od tri, ne biste trebali uzeti u obzir da postoji bilo koji programski jezik, osim samog strojnog jezika.

      A zašto ne? Čak se ni mašinski jezik ne može smatrati jezikom, jer je to zapravo samo skup naredbi koje „interpretira“ procesor.

      Jer u stvari, SVI jezici nisu ništa drugo do skup naredbi koje interpretira procesor.

      Možda vam se jezik sviđa više ili manje (Java, u ovom slučaju), čini se više ili manje korisnim i moćnim, ali ako kažem da to nije programski jezik jer nije kompajliran ... to se protivi svim definicijama programskog jezika.

    2.    Mario rekao je

      😐 Nadam se da nisam djelovao previše bezobrazno

      1.    Marija Antoaneta od Manuele Cardenas rekao je

        bez tišine samo si nam uništio život

      2.    Mario rekao je

        hahahahaha, perdoooon. to mi nije bila namjera xD

    3.    Carlos rekao je

      java je programski jezik. Jer možete razviti aplikaciju i kada kompajlirate napravite .jar koji interpretira JVM. Tada se prema vašoj python logici ne tumači, već se kompajlira u različite izvršne datoteke ...

  7.   Elijah Mongelos rekao je

    Vrlo dobre informacije

  8.   Carlos Arturo rekao je

    dobre informacije, ali sumnjam da će biti moguće stvoriti novi programski jezik ispočetka, bez potrebe da se oslanjam na druge analogije ili softver. Govorim na isti način kao i drugi jezici poput jave ili HTML-a.
    Izuzetno bih vam zahvalio na ovom pitanju.