Lag ditt eget programmeringsspråk (I)

Utviklingen av programmeringsspråk

Etter å ha skrevet den første artikkelen på hvordan du lager ditt eget operativsystemNoen fortalte meg om jeg kunne gjøre en artikkel om hvordan lage et programmeringsspråk. Først fulgte jeg ikke mye oppmerksomhet, men nå og på andre måter har jeg lært mye mer om etableringen av programmeringsspråk. Så la oss gjøre et grunnleggende programmeringsspråk, lett å legge inn i andre programmer, og som fungerer med en virtuell maskin som vi også vil designe. I dag må vi lage den mest grunnleggende virtuelle maskinen.

Du lurer sannsynligvis på: «En virtuell maskin? Men er ikke det veldig vanskelig, og bremser det også programmene? " I kontrast er en enkel virtuell maskin veldig enkel og relativt rask. jeg har valgt Rust som et språk for den virtuelle maskinen. Men hva er det? Rust?

Rust Det er et programmeringsspråk som er fokusert på eksekveringssikkerhet, så bruk av det vil være praktisk umulig for noen å kunne lukke den virtuelle maskinen. Det er et sammensatt språk i utvikling skapt av Mozilla. Servo, erstatningen for Gecko, utvikler seg i ham. Du kan fremdeles endre syntaksen din, men koden jeg skal bruke blir beholdt til den første stabile utgivelsen.

Rust installeres i Linux På en enkel måte. Det er imidlertid ingen offisiell pakke. Brukere av Ubuntu kan legge til disse to PPA: ppa: hansjorg / rust  y ppa: cmrx64 / last, brukere av Arch kan bruke AUR (last-git er pakken som installerer alt). Resten kan bruke:

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

Hvordan fungerer en virtuell maskin?

Hvis du vet hvordan montørverdenen fungerer, er det nøyaktig det samme, med stakken eller stakken. Hvis ikke, forklarer jeg det for deg. La oss forestille oss følgende kode:

skriv ut 2 + 3

Datamaskinen forstår ikke hva 2 + 3 betyr, og vet heller ikke hvilken rekkefølge de skal følge. Datamaskiner fungerer med batterier eller stabler der data akkumuleres og trekkes ut kontinuerlig. Den koden i den virtuelle maskinen vår skal se slik ut:

PUSH 2 PUSH 3 LEGG TIL UTSKRIFT

I utgangspunktet vil vi sette de 2 på bunken på toppen, de 3 også. ADD ville trekke (dvs. fjerne den fra bunken og få verdien) de to siste elementene på bunken og legge resultatet til toppen av bunken. PRINT tar det siste elementet på bunken og bruker det til å vise det for oss. La oss nå gjøre det Rust.

Vi må først definere et språk for Bytekode, kunne vi bruke en eksisterende som den i Java eller CLR av. NET / Mono, men vi skal lage en mer grunnleggende.

https://gist.github.com/a01de8904fd39a442c20

Vi bruker heksadesimal notasjon for hver instruksjon. På høy har vi satt # [avledet (FromPrimitive)], er en særegenhet ved Rust og det vil hjelpe oss senere å kunne sammenligne opptellingen med byte direkte.

Nå må vi lage en funksjon som utfører hver av disse instruksjonene. For dette må vi lese en byte og sammenligne den med instruksjonene vi har i oppregningen. Hvis du finner noen som eksisterer, må du utføre handlingen din.

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

Vi gjør det for å lese hver byte hver for seg og for å utføre dem:

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

Som du kan se, skiller vi ut om vi fikk PUSH-kommandoen (vår INTEGER-kommando) før, neste byte blir helt tatt til stabelen. Der bruker vi to funksjoner som jeg ikke har lært deg, self.pop () y self.push (), som åpenbart har ansvaret for å håndtere stabelen.

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

De er ikke veldig komplekse, men pop-funksjonen har feildeteksjonsmekanismer. Faktisk i Rust, hvis vi fjerner disse mekanismene, vil det gi oss en kompileringsfeil. Nå må vi bare kalle inn et program Perin (vår virtuelle maskin) og utføre en bytekode.

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

Den bytekoden kan leses fra en fil, men her har jeg for enkelhets skyld lagret den i en variabel. Hvis vi utfører det, vil det gi oss det forventede resultatet:

Perin v0.1 Perin VM utfører FlopFlip bytecode Starter PerinVM-forekomst PerinVM v0.1.0 Heltalsverdi 5

All kode er tilgjengelig på GitHub under Apache lisens 2.0: https://github.com/AdrianArroyoCalle/perin. For å kompilere må de ha Cargo installert og satt:

charge build && ./target/main

I neste kapittel vil vi se mer om programmeringsspråket vårt.


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   roader sa

    Interessant nysgjerrighet, selv om det ikke er veldig nyttig i virkeligheten, skader det ikke å vite.

    Det er flott at du annonserer Rust, det er et språk som lover mye, ikke bare er det sikrere enn c ++, men (for nå) klarere i syntaksen.

    Når det gjelder foto, vil jeg ikke vurdere java evolusjon XD.

    1.    roader sa

      Og fra fortran brukte jeg den aldri, men jeg har ikke hørt mye bra om det ...

      1.    Forferdelig sa

        Jeg gjør det, og det er spesielt nyttig innen engineering, selv om Python vinner terreng.

      2.    John sa

        Fortran er kanskje det andre store språket sammen med C. Selv i dag vil virkelig kritiske spørsmål være det ene eller det andre.

        Og det ville være diskutabelt at Fortran er som en 'evolusjon' av C, når det kanskje burde være omvendt, ettersom C er nyere, mer moderne og med flere muligheter; selv om den ene ikke skiller seg fra den andre i det minste.

        Selv om de endelige posisjonene alle kan diskuteres fra et eller annet synspunkt.

    2.    Francisco sa

      +1 til Java

  2.   bærer sa

    La oss se om jeg liker dette, jeg vil gi noe til programmering, men grunnleggende for å se om jeg forstår mer.

  3.   brukernulinux sa

    Hva er det virkelige formålet med å lage et nytt programmeringsspråk? Personlig ser det ut til at det er et knep å skjule kildekoden.

  4.   Yeilly sa

    Venn, hva skjedde med fortsettelsen av "ditt eget operativsystem"? Ikke la den være der, fortsett.

    Egentlig er du en mester, og bare disse to sangene har fengslet oppmerksomheten min, men jeg vil ikke at de skal være halvveis.

    Jeg vet at mange av oss tenker det samme, og vi venter på fortsettelsen og konklusjonen av disse veldig interessante emnene.

  5.   Cristian David sa

    Veldig interessant, tusen takk. 🙂

  6.   Frank sa

    Jeg anser ikke java som et programmeringsspråk, snarere som en kommandotolk, siden det ikke kan kompileres

    1.    Mario sa

      [Et programmeringsspråk er et formelt språk designet for å uttrykke prosesser som kan utføres av maskiner som datamaskiner.]

      Av denne grunn er Java et programmeringsspråk. Selv Bash-språket (linux-skallspråk) er et programmeringsspråk i seg selv.

      Det er to typer språk:
      - Kompilert
      - Tolket
      - Blandet (virtuelle maskiner, de opprinnelige bibliotekene blir samlet og funksjonskoden tolkes)

      Tolkerne er veldig nyttige når det gjelder multiplatform og ikke har en katastrofal ytelse for det. Java, VB.NET, C ++ .NET, F #, C # er alle blandede språk. Bash-språket, bat, PHP, Javascript og mange flere er tolket språk.

      Hvis du ikke anser Java som et språk fordi det tolkes (som det ikke er), bør du ikke vurdere mange andre språk som brukes til å lage programmer. Videre, etter denne regelen på tre, bør du ikke vurdere at det ikke er noe programmeringsspråk bortsett fra selve maskinspråket.

      Og hvorfor ikke? Selv maskinspråk kan ikke betraktes som et språk, siden det egentlig bare er et sett med kommandoer "tolket" av prosessoren.

      For effektivt, ALLE språk er ikke annet enn et sett med kommandoer som tolkes av en prosessor.

      Du liker kanskje et språk mer eller mindre (Java, i dette tilfellet), virker mer eller mindre nyttig og kraftig, men å si at det ikke er et programmeringsspråk fordi det ikke er kompilert ... det strider mot alle definisjoner av programmeringsspråk.

    2.    Mario sa

      Hope Jeg håper jeg ikke virket for frekk

      1.    Maria Antoinette av Manuela Cardenas sa

        ikke stille, du ødela bare livene våre

      2.    Mario sa

        hahahahaha, perdoooon. det var ikke min intensjon xD

    3.    carlos sa

      java er et programmeringsspråk. fordi du kan utvikle et program og når du kompilerer, lager du en .jar som tolkes av JVM. I følge din pythonlogikk tolkes den heller ikke, men den kompileres til forskjellige kjørbare filer ...

  7.   Elijah Mongelos sa

    Veldig god informasjon

  8.   Carlos Arturo sa

    god informasjon, men jeg er i tvil om at det vil være mulig å lage et nytt programmeringsspråk fra bunnen av uten å måtte stole på andre analogier eller programvare. Jeg snakker på samme måte som andre språk ble laget som java eller HTML.
    Jeg vil sette stor pris på din hjelp til dette spørsmålet.