Creëer je eigen programmeertaal (I)

De evolutie van programmeertalen

Na het schrijven van het eerste artikel over hoe u uw eigen besturingssysteem maaktIemand vertelde me of ik er een artikel over kon schrijven hoe je een programmeertaal maakt. In het begin besteedde ik niet veel aandacht, maar nu en op andere manieren heb ik veel meer geleerd over het maken van programmeertalen. Dus laten we doen een basis programmeertaal, eenvoudig in te bedden in andere programma's en dat werkt met een virtuele machine die we ook gaan ontwerpen. Vandaag moeten we de meest eenvoudige virtuele machine maken.

U vraagt ​​zich waarschijnlijk af: Een virtuele machine? Maar is dat niet erg moeilijk en vertraagt ​​het ook de programma's? " Een eenvoudige virtuele machine is daarentegen heel eenvoudig en relatief snel. ik heb gekozen Roest als taal voor de virtuele machine. Maar wat is het Roest?

Roest Het is een programmeertaal die gericht is op uitvoeringsbeveiliging, dus als u deze gebruikt, is het praktisch onmogelijk voor iemand om de virtuele machine te sluiten. Het is een gecompileerde taal in ontwikkeling gemaakt door mozilla. Servo-, de vervanger voor Gekko, ontwikkelt zich in hem. Je kunt nog steeds je syntaxis wijzigen, maar de code die ik ga gebruiken, wordt bewaard tot de eerste stabiele release.

Roest installeert in Linux Op een simpele manier. Er is echter geen officieel pakket. Gebruikers van Ubuntu u kunt deze twee toevoegen PPA: ppa: hansjorg / rust  y ppa: cmrx64 / vracht, gebruikers van boog kan gebruiken AUR (lading-git is het pakket dat alles installeert). De rest kan gebruiken:

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

Hoe werkt een virtuele machine?

Als je weet hoe de assemblerwereld werkt, is het precies hetzelfde, met de stapel of de stapel. Zo niet, dan leg ik het je uit. Laten we ons de volgende code voorstellen:

print 2 + 3

De computer begrijpt niet wat 2 + 3 betekent, en weet ook niet welke volgorde hij moet volgen. Computers werken met batterijen of stapels waarin gegevens worden verzameld en continu worden geëxtraheerd. Die code in onze virtuele machine zou er ongeveer zo uit moeten zien:

PUSH 2 PUSH 3 ADD PRINT

In principe zouden we de 2 bovenop de stapel plaatsen, de 3 ook. ADD trekt (d.w.z. verwijdert het van de stapel en krijgt zijn waarde) de laatste 2 items op de stapel en voegt het resultaat toe aan de bovenkant van de stapel. PRINT zou het laatste item op de stapel nemen en het gebruiken om het aan ons weer te geven. Laten we dat nu doen Roest.

We moeten eerst een taal definiëren voor de bytecode, kunnen we een bestaande gebruiken zoals die in Java of CLR van .NET / Mono, maar we gaan een meer basale versie maken.

https://gist.github.com/a01de8904fd39a442c20

We gebruiken hexadecimale notatie voor elke instructie. Op hoog hebben we gezet # [afgeleid (FromPrimitive)], is een bijzonderheid van Roest en het zal ons later helpen om de opsomming rechtstreeks met bytes te kunnen vergelijken.

Nu moeten we een functie maken die al deze instructies uitvoert. Hiervoor moeten we een byte lezen en deze vergelijken met de instructies die we in de opsomming hebben. Als u er een vindt, moet u uw actie uitvoeren.

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

We doen dat om elke byte afzonderlijk te lezen en uit te voeren:

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

Zoals je kunt zien, maken we onderscheid als we eerder het PUSH-commando (ons INTEGER-commando) hebben gekregen, de volgende byte wordt volledig naar de stapel genomen. Daar gebruiken we twee functies die ik je niet heb geleerd, zelf. pop () y self.push (), die duidelijk verantwoordelijk zijn voor het afhandelen van de stapel.

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

Ze zijn niet erg complex, maar de pop-functie heeft foutdetectiemechanismen. In feite, in Roest, als we die mechanismen verwijderen, zouden we een compilatiefout krijgen. Nu hoeven we alleen maar een programma in te schakelen Perin (onze virtuele machine) en voer een bytecode uit.

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

Die bytecode kan uit een bestand worden gelezen, maar hier heb ik het voor de eenvoud in een variabele opgeslagen. Als we het uitvoeren, geeft het ons het verwachte resultaat:

Perin v0.1 Perin VM voert FlopFlip bytecode uit PerinVM-instantie starten PerinVM v0.1.0 Integer-waarde 5

Alle code is beschikbaar op GitHub onder de Apache-licentie 2.0: https://github.com/AdrianArroyoCalle/perin. Om te compileren moeten ze Cargo geïnstalleerd en gezet:

charge build && ./target/main

In het volgende hoofdstuk zullen we meer zien over onze programmeertaal.


17 reacties, laat de jouwe achter

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   roader zei

    Interessante nieuwsgierigheid, hoewel het in werkelijkheid niet erg nuttig is, kan het geen kwaad om het te weten.

    Het is geweldig dat je reclame maakt voor Rust, het is een taal die veel belooft, het is niet alleen veiliger dan c ++, maar (voorlopig) duidelijker in zijn syntaxis.

    Wat betreft foto, ik zou Java evolution XD niet overwegen.

    1.    roader zei

      En van fortran heb ik het nooit gebruikt, maar ik heb er niet veel goeds over gehoord ...

      1.    verschrikkelijk zei

        Ik wel, en het is vooral handig bij engineering, ook al wint Python terrein.

      2.    John zei

        Fortran is misschien de andere grote taal, samen met C. Toch zullen vandaag de dag in echt kritische vragen het een of het ander zijn.

        En het zou betwistbaar zijn dat Fortran een 'evolutie' is van C, terwijl het misschien andersom zou moeten zijn, aangezien C nieuwer, moderner en met meer mogelijkheden is; hoewel de een helemaal niet van de ander is losgekoppeld.

        Hoewel de uiteindelijke standpunten allemaal discutabel zijn vanuit een bepaald standpunt.

    2.    Francisco zei

      +1 naar Java

  2.   portier zei

    Eens kijken of ik dit leuk vind, ik geef iets aan programmeren, maar fundamenteel om te zien of ik meer begrijp.

  3.   usernulinux zei

    Wat is het echte doel van het maken van een nieuwe programmeertaal? Het lijkt mij persoonlijk dat het een truc is om de broncode te verbergen.

  4.   Yeilly zei

    Vriend, wat is er gebeurd met de voortzetting van "uw eigen besturingssysteem"? Laat het daar alsjeblieft niet achter, ga ermee door.

    Eigenlijk ben je een meester en alleen deze twee nummers hebben mijn aandacht volledig geboeid, maar ik zou niet willen dat ze halverwege blijven.

    Ik weet dat velen van ons hetzelfde denken en we wachten op de voortzettingen en conclusies van deze zeer interessante onderwerpen.

  5.   Christian David zei

    Heel interessant, heel erg bedankt. 🙂

  6.   Openhartig zei

    Ik beschouw java niet als een programmeertaal, maar als een commando-interpreter, omdat het niet compileerbaar is

    1.    Mario zei

      [Een programmeertaal is een formele taal die is ontworpen om processen uit te drukken die kunnen worden uitgevoerd door machines zoals computers.]

      Om deze reden is Java een programmeertaal. Zelfs de Bash-taal (linux shell-taal) is een programmeertaal op zich.

      Er zijn twee soorten talen:
      - Gecompileerd
      - Uitgelegd
      - Gemengd (virtuele machines, de native bibliotheken worden gecompileerd en de functionele code wordt geïnterpreteerd)

      De tolken zijn erg handig als het om multiplatform gaat en hebben daar geen desastreuze prestatie voor. Java, VB.NET, C ++ .NET, F #, C # zijn allemaal gemengde talen. De bash-taal, bat, PHP, Javascript en nog veel meer zijn geïnterpreteerde talen.

      Als u Java niet als een taal beschouwt omdat het wordt geïnterpreteerd (wat het niet is), moet u niet veel andere talen overwegen die worden gebruikt om programma's te maken. Bovendien zou je volgens die regel van drie niet moeten bedenken dat er een programmeertaal is behalve de machinetaal zelf.

      En waarom niet? Zelfs machinetaal kan niet als een taal worden beschouwd, aangezien het in feite slechts een reeks opdrachten is die door de processor worden "geïnterpreteerd".

      Omdat in feite ALLE talen niets meer zijn dan een reeks opdrachten die worden geïnterpreteerd door een processor.

      Je houdt misschien meer of minder van een taal (Java, in dit geval), lijkt meer of minder nuttig en krachtig, maar om te zeggen dat het geen programmeertaal is omdat het niet is gecompileerd ... het druist in tegen alle definities van programmeertalen.

    2.    Mario zei

      😐 Ik hoop dat ik niet al te grof overkwam

      1.    Maria Antoinette van Manuela Cardenas zei

        geen stilte, je hebt alleen onze levens vernietigd

      2.    Mario zei

        hahahahaha, perdoooon. het was niet mijn bedoeling xD

    3.    carlos zei

      java is een programmeertaal. Omdat je een applicatie kunt ontwikkelen en bij het compileren maak je een .jar die wordt geïnterpreteerd door de JVM.Daarna wordt het volgens je python-logica ook niet geïnterpreteerd, maar gecompileerd naar verschillende executables ...

  7.   Elia Mongelos zei

    Zeer goede informatie

  8.   Carlos Arturo zei

    goede informatie, maar ik twijfel of het mogelijk zal zijn om vanaf nul een nieuwe programmeertaal te maken zonder afhankelijk te zijn van andere analogieën of software. Ik spreek op dezelfde manier dat andere talen zijn gemaakt, zoals java of HTML.
    Ik zou uw hulp bij deze vraag zeer op prijs stellen.