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ă 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.
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.
Și de la fortran, nu l-am folosit niciodată, dar nu am auzit multe lucruri bune despre asta ...
Da, și este deosebit de util în inginerie, chiar dacă Python câștigă teren.
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.
+1 către Java
Să vedem dacă îmi place asta, dau ceva programării dar de bază să văd dacă înțeleg mai mult.
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ă.
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.
Foarte interesant, vă mulțumesc foarte mult. 🙂
Nu consider java un limbaj de programare, mai degrabă un interpret de comandă, deoarece nu este compilabil
[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.
😐 Sper că nu mi s-a părut prea nepoliticos
fără liniște ne-ai distrus doar viețile
hahahahaha, perdoooon. nu a fost intenția mea xD
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 ...
Informații foarte bune
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.