Skapa ditt eget programmeringsspråk (I)

Utvecklingen av programmeringsspråk

Efter att ha skrivit den första artikeln på hur du skapar ditt eget operativsystemNågon sa till mig om jag kunde göra en artikel om hur man skapar ett programmeringsspråk. Först var jag inte mycket uppmärksam, men nu och på andra sätt har jag lärt mig mycket mer om skapandet av programmeringsspråk. Så låt oss göra ett grundläggande programmeringsspråk, lätt att bädda in i andra program och som fungerar med en virtuell maskin som vi också kommer att designa. Idag måste vi göra den mest grundläggande virtuella maskinen.

Du undrar nog: En virtuell maskin? Men är det inte så svårt och saktar det också ner programmen? " Däremot är en enkel virtuell maskin mycket enkel och relativt snabb. Jag har valt Rust som ett språk för den virtuella maskinen. Men vad är det Rust?

Rust Det är ett programmeringsspråk som är fokuserat på exekveringssäkerhet, så att använda det blir praktiskt taget omöjligt för någon att kunna stänga den virtuella maskinen. Det är ett sammanställt språk i utveckling skapat av Mozilla. Servo, ersättaren för Gecko, utvecklas i honom. Du kan fortfarande ändra din syntax men koden jag ska använda kommer att behållas tills den första stabila utgåvan.

Rust installeras i Linux På ett enkelt sätt. Det finns dock inget officiellt paket. Användare av ubuntu du kan lägga till dessa två PPA: ppa: hansjorg / rost  y ppa: cmrx64 / last, användare av Arch kan använda AUR (last-git är paketet som installerar allt). Resten kan använda:

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

Hur fungerar en virtuell maskin?

Om du vet hur montörvärlden fungerar är det exakt detsamma, med stacken eller stacken. Om inte, förklarar jag det för dig. Låt oss föreställa oss följande kod:

skriv ut 2 + 3

Datorn förstår inte vad 2 + 3 betyder och vet inte vilken ordning som ska följas. Datorer arbetar med batterier eller stackar där data samlas och extraheras kontinuerligt. Den koden i vår virtuella maskin ska se ut så här:

PUSH 2 PUSH 3 LÄGG TILL UTSKRIFT

I grund och botten skulle vi lägga de 2 på stacken ovanpå, de 3 också. ADD skulle dra (dvs. ta bort den från stacken och få sitt värde) de två sista objekten på stacken och lägga till resultatet överst i stacken. PRINT skulle ta det sista föremålet i stacken och använda det för att visa det för oss. Låt oss nu göra det i Rust.

Vi måste först definiera ett språk för bytekod, vi kan använda en befintlig som den i java eller CLR av .NET / Mono, men vi ska skapa en mer grundläggande.

https://gist.github.com/a01de8904fd39a442c20

Vi använder hexadecimal notation för varje instruktion. På högt har vi lagt # [härledd (FromPrimitive)], är en egenart av Rust och det kommer att hjälpa oss senare att kunna jämföra uppräkningen med byte direkt.

Nu måste vi göra en funktion som utför var och en av dessa instruktioner. För detta måste vi läsa en byte och jämföra den med de instruktioner som vi har i uppräkningen. Om du hittar några som finns måste du utföra din åtgärd.

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

Vi gör det för att läsa varje byte individuellt och för att utföra dem:

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

Som du kan se, skiljer vi om vi fick PUSH-kommandot (vårt INTEGER-kommando) innan, nästa byte tas helt på stacken. Där använder vi två funktioner som jag inte har lärt dig, self.pop () y self.push (), som uppenbarligen ansvarar för hanteringen av stacken.

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

De är inte särskilt komplexa, men popfunktionen har feldetekteringsmekanismer. I själva verket i Rust, om vi tar bort dessa mekanismer skulle det ge oss ett kompileringsfel. Nu måste vi helt enkelt ringa in ett program Mycket (vår virtuella maskin) och kör en bytkod.

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

Denna bytecode kan läsas från en fil, men här för enkelhetens skull har jag lagrat den i en variabel. Om vi ​​utför det kommer det att ge oss det förväntade resultatet:

Perin v0.1 Perin VM kör FlopFlip bytecode Startar PerinVM-instans PerinVM v0.1.0 Heltalsvärde 5

All kod finns på GitHub under Apache-licens 2.0: https://github.com/AdrianArroyoCalle/perin. För att kompilera måste de ha Laddning installerat och satt:

charge build && ./target/main

I nästa kapitel kommer vi att se mer om vårt programmeringsspråk.


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   roader sade

    Intressant nyfikenhet, även om det inte är särskilt användbart i verkligheten, gör det inte ont att veta.

    Det är fantastiskt att du annonserar för Rust, det är ett språk som lovar mycket, inte bara är det säkrare än c ++, men (för närvarande) tydligare i sin syntax.

    När det gäller foto skulle jag inte överväga java evolution XD.

    1.    roader sade

      Och från fortran använde jag det aldrig, men jag har inte hört många bra saker om det ...

      1.    hemskt sade

        Jag gör det, och det är särskilt användbart inom teknik även om Python vinner mark.

      2.    John sade

        Fortran är kanske det andra stora språket tillsammans med C. Än idag i riktigt kritiska frågor kommer att vara den ena eller den andra.

        Och det skulle vara diskutabelt att Fortran är som en "utveckling" av C, när det kanske borde vara tvärtom, eftersom C är nyare, modernare och med fler möjligheter; även om den ena inte är åtminstone avskild från den andra.

        Även om de slutliga positionerna alla kan diskuteras ur någon synvinkel.

    2.    Francisco sade

      +1 till Java

  2.   porter sade

    Låt oss se om jag gillar det här, jag kommer att ge något åt ​​programmering men grundläggande för att se om jag förstår mer.

  3.   usergnulinux sade

    Vad är det verkliga syftet med att skapa ett nytt programmeringsspråk? Det verkar för mig personligen att det är ett knep att dölja källkoden.

  4.   Yeilly sade

    Vän, vad hände med fortsättningen av "ditt eget operativsystem"? Lämna det inte där snälla fortsätt det.

    Egentligen är du en mästare och dessa två låtar har fängslat min uppmärksamhet, men jag skulle inte vilja att de skulle sluta halvvägs.

    Jag vet att många av oss tycker samma sak och vi väntar på fortsättningen och slutsatserna av dessa mycket intressanta ämnen.

  5.   Cristian David sade

    Mycket intressant, tack så mycket. 🙂

  6.   Frank sade

    Jag anser inte att java är ett programmeringsspråk, utan en kommandotolk, eftersom det inte är sammanställbart

    1.    Mario sade

      [Ett programmeringsspråk är ett formellt språk som är utformat för att uttrycka processer som kan utföras av maskiner som datorer.]

      Av denna anledning är Java ett programmeringsspråk. Även bash-språket (Linux-skalspråk) är ett programmeringsspråk i sig.

      Det finns två typer av språk:
      - Sammanställt
      - Tolkad
      - Blandad (virtuella maskiner, de inbyggda biblioteken sammanställs och funktionskoden tolkas)

      Tolkar är mycket användbara när det gäller multiplatform och har inte en katastrofal prestanda för det. Java, VB.NET, C ++ .NET, F #, C # är alla blandade språk. Bash-språket, bat, PHP, Javascript och många fler är tolkade språk.

      Om du inte ser Java som ett språk eftersom det tolkas (vilket det inte är), bör du inte överväga många andra språk som används för att skapa program. Dessutom bör du enligt den här regeln om tre inte överväga att det finns något programmeringsspråk förutom själva maskinspråket.

      Och varför inte? Inte ens maskinspråk kan betraktas som ett språk eftersom det egentligen bara är en uppsättning kommandon som "tolkas" av processorn.

      Eftersom effektivt, ALLA språk är inget annat än en uppsättning kommandon som tolkas av en processor.

      Du kanske gillar ett språk mer eller mindre (Java, i det här fallet), verkar mer eller mindre användbart och kraftfullt men att säga att det inte är ett programmeringsspråk eftersom det inte är kompilerat ... det strider mot alla definitioner av programmeringsspråk.

    2.    Mario sade

      😐 Jag hoppas att jag inte verkade för oförskämd

      1.    Maria Antoinette av Manuela Cardenas sade

        ingen tyst du förstörde bara våra liv

      2.    Mario sade

        hahahahaha, perdoooon. det var inte min avsikt xD

    3.    carlos sade

      java är ett programmeringsspråk. Eftersom du kan utveckla en applikation och när du kompilerar skapar du en .jar som tolkas av JVM. Enligt din pythonlogik tolkas den inte heller, men den kompileras till olika körbara filer ...

  7.   Elijah Mongelos sade

    Mycket bra information

  8.   Carlos Arturo sade

    bra information men jag tvivlar på att det kommer att vara möjligt att skapa ett nytt programmeringsspråk från grunden utan att behöva förlita sig på andra analogier eller programvara. Jag talar på samma sätt som andra språk gjordes som java eller HTML.
    Jag skulle mycket uppskatta din hjälp med denna fråga.