Skep u eie programmeertaal (I)

Die ontwikkeling van programmeertale

Na die skryf van die eerste artikel oor hoe om u eie bedryfstelsel te skep, iemand het my gesê dat as ek 'n artikel kan doen oor hoe om 'n programmeertaal te skep. Aanvanklik het ek nie veel aandag gegee nie, maar nou en op ander maniere het ek baie meer geleer oor die skepping van programmeertale. Laat ons dit doen 'n basiese programmeertaal, maklik in ander programme ingebed en werk met 'n virtuele masjien wat ons ook sal ontwerp. Vandag moet ons die mees basiese virtuele masjien maak.

U wonder waarskynlik: 'N Virtuele masjien? Maar is dit nie baie moeilik nie en vertraag dit ook die programme? ' Daarteenoor is 'n eenvoudige virtuele masjien baie eenvoudig en relatief vinnig. ek het gekies Rust as 'n taal vir die virtuele masjien. Maar wat is dit? Rust?

Rust Dit is 'n programmeertaal wat gefokus is op sekuriteitsuitvoering, en dit sal dus prakties onmoontlik wees vir iemand om die virtuele masjien te sluit. Dit is 'n saamgestelde taal wat ontwikkel is deur Mozilla. Serwo, die plaasvervanger vir Gecko, ontwikkel in hom. U kan steeds u sintaksis verander, maar die kode wat ek gaan gebruik, sal tot die eerste stabiele weergawe gehou word.

Rust installeer in Linux Op 'n eenvoudige manier. Daar is egter geen amptelike pakket nie. Gebruikers van Ubuntu kan hierdie twee byvoeg PPA: ppa: hansjorg / roes  y ppa: cmrx64 / vrag, gebruikers van Boog kan gebruik Aur (vrag-git is die pakket wat alles installeer). Die res kan gebruik:

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

Hoe werk 'n virtuele masjien?

As u weet hoe die samelewêreld werk, is dit presies dieselfde, met die stapel of die stapel. Indien nie, sal ek dit aan u verduidelik. Laat ons die volgende kode voorstel:

druk 2 + 3 uit

Die rekenaar verstaan ​​nie wat 2 + 3 beteken nie en weet ook nie watter volgorde dit moet volg nie. Rekenaars werk met batterye of stapels waarin data versamel en voortdurend onttrek word. Die kode op ons virtuele masjien moet so lyk:

DRUK 2 DRUK 3 VOEG PRINT BY

Basies sou ons die 2 bo-op die stapel plaas, die 3 ook. ADD trek (dws verwyder dit uit die stapel en kry die waarde daarvan) van die laaste 2 items op die stapel en voeg die resultaat bo-aan die stapel. PRINT neem die laaste item op die stapel en gebruik dit om dit aan ons te vertoon. Laat ons dit nou doen Rust.

Ons moet eers 'n taal vir die bytecode, kan ons 'n bestaande een soos die een in gebruik Java o el CLR van .NET / Mono, maar ons gaan 'n meer basiese een skep.

https://gist.github.com/a01de8904fd39a442c20

Ons gebruik heksadesimale notasie vir elke instruksie. Op die hoogte het ons geplaas # [afgelei (FromPrimitive)], is 'n eienaardigheid van Rust en dit sal ons later help om die enumerasie met grepe direk te kan vergelyk.

Nou moet ons 'n funksie maak wat elkeen van die instruksies uitvoer. Hiervoor moet ons 'n greep lees en dit vergelyk met die instruksies wat ons in die opsomming het. As u een vind wat bestaan, moet u u aksie uitvoer.

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

Ons doen dit om elke greep afsonderlik te lees en uit te voer:

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

Soos u kan sien, onderskei ons as ons die PUSH-opdrag (ons INTEGER-opdrag) voorheen gekry het, dan word die volgende byte heeltemal na die stapel geneem. Daar gebruik ons ​​twee funksies wat ek u nie geleer het nie, self.pop () y self.push (), wat natuurlik verantwoordelik is vir die hantering van die stapel.

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

Hulle is nie baie kompleks nie, maar die pop-funksie het foutopsporingstelsels. In werklikheid, in Rust, as ons die meganismes verwyder, sal dit ons 'n kompileringsfout gee. Nou moet ons eenvoudig 'n program inroep perin (ons virtuele masjien) en voer 'n bytecode uit.

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

Die bytecode kan uit 'n lêer gelees word, maar hier het ek dit vir 'n eenvoudigheid in 'n veranderlike gestoor. As ons dit uitvoer, sal dit ons die verwagte resultaat gee:

Perin v0.1 Perin VM voer FlopFlip bytecode uit PerinVM-instansie PerinVM v0.1.0 heelgetalwaarde 5

Alle kode is beskikbaar by GitHub onder die Apache-lisensie 2.0: https://github.com/AdrianArroyoCalle/perin. Hulle moet hê om saam te stel Cargo geïnstalleer en geplaas:

charge build && ./target/main

In die volgende hoofstuk sal ons meer oor ons programmeertaal sien.


Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

17 kommentaar, los joune

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

  1.   padryer dijo

    Interessante nuuskierigheid, hoewel dit in werklikheid nie baie nuttig is nie, maak dit nie skade om te weet nie.

    Dit is wonderlik dat u Rust adverteer, dit is 'n taal wat baie beloof, dit is nie net veiliger as c ++ nie, maar (voorlopig) duideliker in die sintaksis.

    Wat die foto betref, sou ek nie Java Evolution XD oorweeg nie.

    1.    padryer dijo

      En van fortran af het ek dit nooit gebruik nie, maar ek het nog nie veel goed daarvan gehoor nie ...

      1.    Verskriklik dijo

        Ek doen dit, en dit is veral nuttig in ingenieurswese, alhoewel Python veld wen.

      2.    John dijo

        Fortran is miskien die ander wonderlike taal saam met C. Selfs vandag sal regtig kritieke vrae die een of die ander wees.

        En dit sou betwyfel kan word dat Fortran 'n 'evolusie' van C is, en miskien andersom, aangesien C nuwer, moderner en met meer moontlikhede is; alhoewel die een nie in die minste daarvan losgemaak is nie.

        Alhoewel die uiteindelike posisies uit een of ander oogpunt almal bespreek kan word.

    2.    Francisco dijo

      +1 na Java

  2.   portier dijo

    Kom ons kyk of ek hiervan hou, ek gee iets aan programmering, maar basies om te sien of ek meer verstaan.

  3.   gebruikersnulinux dijo

    Wat is die eintlike doel van die skep van 'n nuwe programmeertaal? Persoonlik lyk dit vir my asof dit 'n foefie is om die bronkode weg te steek.

  4.   Yeilly dijo

    Vriend, wat het gebeur met die voortsetting van 'u eie bedryfstelsel'? Moet dit asseblief nie daar laat nie, gaan voort.

    Eintlik is jy 'n meester en net hierdie twee liedjies het my aandag heeltemal geboei, maar ek wil nie hê hulle moet halfpad bly nie.

    Ek weet dat baie van ons dieselfde dink en ons wag op die voortsetting en gevolgtrekking van hierdie baie interessante onderwerpe.

  5.   Cristian David dijo

    Baie interessant, baie dankie. 🙂

  6.   Franco dijo

    Ek beskou Java nie as 'n programmeertaal nie, maar eerder as 'n tolk vir opdragte, aangesien dit nie kompileerbaar is nie

    1.    Mario dijo

      ['N Programmeringstaal is 'n formele taal wat ontwerp is om prosesse uit te druk wat deur masjiene soos rekenaars uitgevoer kan word.]

      Om hierdie rede is Java 'n programmeertaal. Selfs die Bash-taal (linux-skeltaal) is 'n programmeertaal op sigself.

      Daar is twee soorte tale:
      - Saamgestel
      - Uitgelê
      - Gemengd (virtuele masjiene, die inheemse biblioteke word saamgestel en die funksionele kode word geïnterpreteer)

      Die tolke is baie handig as dit by multiplatform kom en het geen rampspoedige prestasie daarvoor nie. Java, VB.NET, C ++ .NET, F #, C # is gemengde tale. Die bash-taal, bat, PHP, Javascript en nog vele meer is geïnterpreteerde tale.

      As u Java nie as 'n taal beskou nie omdat dit geïnterpreteer word (wat dit nie is nie), moet u nie baie ander tale wat gebruik word om programme te maak, oorweeg nie. Boonop moet u volgens hierdie reël van drie nie oorweeg dat daar enige programmeertaal is nie, behalwe die masjientaal self.

      En waarom nie? Nie eens masjientaal kan as 'n taal beskou word nie, want dit is eintlik net 'n stel opdragte wat deur die verwerker geïnterpreteer word.

      Want effektief is dat ALLE tale niks anders is as 'n stel opdragte wat deur 'n verwerker geïnterpreteer word nie.

      U hou dalk van 'n taal min of meer (Java, in hierdie geval), lyk min of meer nuttig en kragtig, maar om te sê dat dit nie 'n programmeertaal is nie omdat dit nie saamgestel is nie ... dit is in stryd met alle definisies van die programmeertaal.

    2.    Mario dijo

      Ek hoop nie ek het te onbeskof gelyk nie

      1.    Maria Antoinette van Manuela Cardenas dijo

        nee stil jy het net ons lewens vernietig

      2.    Mario dijo

        hahahahaha, perdoooon. dit was nie my bedoeling nie xD

    3.    carlos dijo

      java is 'n programmeertaal. Omdat u 'n toepassing kan ontwikkel en wanneer u saamstel, maak u 'n .jar wat deur die JVM geïnterpreteer word. Volgens u python-logika word dit ook nie geïnterpreteer nie, maar dit kom saam met verskillende uitvoerbare ...

  7.   Elia Mongelos dijo

    Baie goeie inligting

  8.   Carlos Arturo dijo

    goeie inligting, maar ek twyfel, dit is moontlik om 'n nuwe programmeertaal van nuuts af te skep sonder om op ander analogieë of sagteware te vertrou. Ek praat op dieselfde manier as ander tale soos Java of HTML.
    Ek sal u hulp met hierdie vraag baie waardeer.