Creați propriul limbaj de programare (I)

Evoluția limbajelor de programare

După ce am scris primul articol pe cum să vă creați propriul sistem de operareCineva mi-a spus dacă pot face un articol despre cum se creează un limbaj de programare. La început nu am acordat prea multă atenție, dar acum și în alte moduri am învățat mult mai multe despre crearea limbajelor de programare. Deci, să facem un limbaj de programare de bază, ușor de încorporat în alte programe și care funcționează cu o mașină virtuală pe care o vom proiecta și noi. Astăzi trebuie să facem cea mai simplă mașină virtuală.

Probabil vă întrebați: O mașină virtuală? Dar nu este foarte dificil și încetinește și programele? " În schimb, o mașină virtuală simplă este foarte simplă și relativ rapidă. am ales Rugină ca limbaj pentru mașina virtuală. Dar ce este Rugină?

Rugină Este un limbaj de programare care se concentrează pe securitatea execuției, astfel încât utilizarea acestuia va fi practic imposibilă pentru cineva să poată închide mașina virtuală. Este un limbaj compilat în dezvoltare creat de Mozilla. Servo, înlocuitorul Gecko, se dezvoltă în el. Vă puteți schimba în continuare sintaxa, dar codul pe care îl voi folosi va fi păstrat până la prima versiune stabilă.

Rugină se instalează în Linux Într-un mod simplu. Cu toate acestea, nu există colet oficial. Utilizatorii de Ubuntu le puteți adăuga pe aceste două PPA: ppa: hansjorg / rugină  y ppa: cmrx64 / cargo, utilizatorii de Arc poate utiliza AUR (cargo-git este pachetul care instalează totul). Restul pot folosi:

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

Cum funcționează o mașină virtuală?

Dacă știți cum funcționează lumea ansamblorului, este exact același lucru, cu stiva sau stiva. Dacă nu, vă voi explica. Să ne imaginăm următorul cod:

tipăriți 2 + 3

Computerul nu înțelege ce înseamnă 2 + 3 și nici nu știe ce ordine să urmeze. Calculatoarele funcționează cu baterii sau stive în care datele sunt acumulate și extrase continuu. Codul din mașina noastră virtuală ar trebui să arate cam așa:

PUSH 2 PUSH 3 ADAUGĂ IMPRIMĂ

Practic am pune 2 pe stiva deasupra, și 3. ADD ar extrage (adică l-ar scoate din stivă și a obține valoarea ei) ultimele 2 articole din stivă și ar adăuga rezultatul în partea de sus a stivei. PRINT ar lua ultimul element din stivă și l-ar folosi pentru a ni-l afișa. Acum să facem asta în Rugină.

Mai întâi trebuie să definim un limbaj pentru Cod octet, am putea folosi unul existent ca cel din Java ieșire CRJ din .NET / Mono, dar vom crea unul mai de bază.

https://gist.github.com/a01de8904fd39a442c20

Folosim notația hexazecimală pentru fiecare instrucțiune. Pe mare am pus # [derivare (DinPrimitiv)], este o particularitate a Rugină și ne va ajuta mai târziu să putem compara enumerarea cu octeți direct.

Acum trebuie să realizăm o funcție care execută fiecare dintre aceste instrucțiuni. Pentru aceasta trebuie să citim un octet și să-l comparăm cu instrucțiunile pe care le avem în enumerare. Dacă găsiți ceva care există, trebuie să vă executați acțiunea.

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

Facem asta pentru a citi fiecare octet individual și pentru a le executa:

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

După cum puteți vedea, diferențiem dacă ni s-a dat comanda PUSH (comanda noastră INTEGER) înainte, următorul octet va fi dus complet la stivă. Acolo folosim două funcții pe care nu v-am învățat-o, self.pop () y self.push (), care sunt în mod evident însărcinate cu manipularea stivei.

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

Nu sunt foarte complexe, dar funcția pop are mecanisme de detectare a erorilor. De fapt, în Rugină, dacă eliminăm aceste mecanisme, ne-ar da o eroare de compilare. Acum trebuie pur și simplu să apelăm la un program perin (mașina noastră virtuală) și executați un bytecode.

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

Acest cod de octet poate fi citit dintr-un fișier, dar aici, pentru simplitate, l-am stocat într-o variabilă. Dacă îl executăm, acesta ne va da rezultatul așteptat:

Perin v0.1 Perin VM execută codul de bytec FlopFlip Pornind instanța PerinVM PerinVM v0.1.0 Valoarea întregului 5

Toate codurile sunt disponibile la adresa GitHub sub Licență Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Pentru a compila trebuie să aibă încărcătură instalat și pus:

charge build && ./target/main

În capitolul următor vom vedea mai multe despre limbajul nostru de programare.


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   rutier el a spus

    Curiozitate interesantă, deși nu este foarte utilă în realitate, nu strică să știi.

    Este minunat să faceți publicitate Rust, este un limbaj care promite multe, nu numai că este mai sigur decât c ++, dar (deocamdată) mai clar în sintaxa sa.

    În ceea ce privește fotografia, nu aș lua în considerare java evolution XD.

    1.    rutier el a spus

      Și de la fortran, nu l-am folosit niciodată, dar nu am auzit multe lucruri bune despre asta ...

      1.    Forios el a spus

        Da, și este deosebit de util în inginerie, chiar dacă Python câștigă teren.

      2.    Ioan el a spus

        Fortran este poate celălalt mare limbaj alături de C. Chiar și astăzi în întrebări cu adevărat critice va fi una sau alta.

        Și ar fi discutabil faptul că Fortran este o „evoluție” a lui C, atunci când poate ar trebui să fie invers, deoarece C este mai nou, mai modern și cu mai multe posibilități; deși una nu este desprinsă de cealaltă în cel mai mic.

        Deși pozițiile finale sunt toate discutabile dintr-un anumit punct de vedere.

    2.    Francisco el a spus

      +1 către Java

  2.   porter el a spus

    Să vedem dacă îmi place asta, dau ceva programării dar de bază să văd dacă înțeleg mai mult.

  3.   usergnulinux el a spus

    Care este scopul real al creării unui nou limbaj de programare? Mi se pare personal că este o manevră de a ascunde codul sursă.

  4.   Yeilly el a spus

    Prietene, ce s-a întâmplat cu continuarea „propriului tău sistem de operare”? Nu-l lăsați acolo, vă rugăm să continuați.

    De fapt, ești un maestru și doar aceste două melodii mi-au captivat complet atenția, dar nu aș vrea să rămână la jumătatea drumului.

    Știu că mulți dintre noi gândim la fel și așteptăm continuările și concluziile acestor subiecte interesante.

  5.   Cristian David el a spus

    Foarte interesant, vă mulțumesc foarte mult. 🙂

  6.   franc el a spus

    Nu consider java un limbaj de programare, mai degrabă un interpret de comandă, deoarece nu este compilabil

    1.    Mario el a spus

      [Un limbaj de programare este un limbaj formal conceput pentru a exprima procesele care pot fi efectuate de mașini precum computerele.]

      Din acest motiv, Java este un limbaj de programare. Chiar și limbajul Bash (limbajul shell Linux) este un limbaj de programare în sine.

      Există două tipuri de limbi:
      - Compilat
      - Interpretat
      - Mixt (Mașini virtuale, bibliotecile native sunt compilate și codul funcțional este interpretat)

      Interpretii sunt foarte utili atunci când vine vorba de multiplatformă și nu au o performanță dezastruoasă pentru asta. Java, VB.NET, C ++ .NET, F #, C # sunt toate limbaje mixte. Limbajul bash, bat, PHP, Javascript și multe altele sunt limbi interpretate.

      Dacă nu considerați Java ca un limbaj deoarece este interpretat (ceea ce nu este), nu ar trebui să luați în considerare multe alte limbi care sunt utilizate pentru a crea programe. Mai mult, prin respectiva regulă de trei, nu ar trebui să considerați că există vreun limbaj de programare, cu excepția limbajului mașinii în sine.

      Nici măcar limbajul mașinii nu ar putea fi considerat un limbaj, deoarece este într-adevăr doar un set de comenzi „interpretate” de procesor.

      Deoarece efectiv, TOATE limbile nu sunt altceva decât un set de comenzi care sunt interpretate de un procesor.

      S-ar putea să vă placă un limbaj mai mult sau mai puțin (Java, în acest caz), pare mai mult sau mai puțin util și puternic, dar să spuneți că nu este un limbaj de programare deoarece nu este compilat ... este împotriva tuturor definițiilor limbajului de programare.

    2.    Mario el a spus

      😐 Sper că nu mi s-a părut prea nepoliticos

      1.    Maria Antonieta a Manuelei Cardenas el a spus

        fără liniște ne-ai distrus doar viețile

      2.    Mario el a spus

        hahahahaha, perdoooon. nu a fost intenția mea xD

    3.    Carlos el a spus

      java este un limbaj de programare. pentru că poți dezvolta o aplicație și când compilezi creezi un .jar care este interpretat de JVM. Apoi, conform logicii tale Python, acesta nu este interpretat, dar se compilează la diferite executabile ...

  7.   Ilie Mongelos el a spus

    Informații foarte bune

  8.   Carlos Arturo el a spus

    informații bune, dar am o îndoială, va fi posibil să creezi un nou limbaj de programare de la zero, fără a fi nevoie să te bazezi pe alte analogii sau software. Vorbesc în același mod în care alte limbi au fost făcute precum java sau HTML.
    Aș aprecia foarte mult ajutorul dvs. cu privire la această întrebare.