Készítse el saját programozási nyelvét (I)

A programozási nyelvek alakulása

Miután megírta az első cikket hogyan hozhat létre saját operációs rendszertValaki elmondta, hogy tudnék-e cikket készíteni erről hogyan lehet programozási nyelvet létrehozni. Eleinte nem nagyon figyeltem, de most és más módszerekkel sokkal többet tanultam a programozási nyelvek létrehozásáról. Tehát tegyük alapvető programozási nyelv, könnyen beágyazható más programokba, és egy olyan virtuális géppel működik, amelyet mi is megtervezünk. Ma a legalapvetőbb virtuális gépet kell elkészítenünk.

Valószínűleg kíváncsi vagy: Virtuális gép? De ez nem túl nehéz, és a programokat is lelassítja? " Ezzel szemben egy egyszerű virtuális gép nagyon egyszerű és viszonylag gyors. választottam Rozsda mint a virtuális gép nyelvét. De mi az Rozsda?

Rozsda Ez egy olyan programozási nyelv, amely a végrehajtás biztonságára összpontosít, így ennek használatával gyakorlatilag lehetetlen lesz valaki bezárni a virtuális gépet. Ez egy összeállított, fejlesztés alatt álló nyelv Mozilla. Szervo-, a helyettesítője Gekkó, fejlődik benne. Még mindig megváltoztathatja a szintaxisát, de a kódot, amelyet használni fogok, az első stabil kiadásig meg fogjuk őrizni.

Rozsda települ Linux Egyszerű módon. Hivatalos csomag azonban nincs. A Ubuntu felveheti ezt a kettőt PPA: ppa: hansjorg / rozsda  y ppa: cmrx64 / rakomány, felhasználói Bolthajtás lehet használni AUR (cargo-git az a csomag, amely mindent telepít). A többi felhasználhatja:

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

Hogyan működik egy virtuális gép?

Ha tudod, hogyan működik az assembler világ, pontosan ugyanaz, a verem vagy a verem mellett. Ha nem, elmagyarázom neked. Képzeljük el a következő kódot:

2 + 3 nyomtatás

A számítógép nem érti, mit jelent a 2 + 3, és azt sem, hogy milyen sorrendet kövessen. A számítógépek akkumulátorokkal vagy halmokkal működnek, amelyekben az adatok felhalmozódnak és folyamatosan kinyerhetők. A virtuális gépünk kódjának ilyennek kell kinéznie:

PUSH 2 PUSH 3 ADD PRINT

Alapvetően a tetejére tennénk a kettőt, a hármat is. Az ADD kihúzza (vagyis eltávolítja a veremből, és megkapja az értékét) a verem utolsó 2 elemét, és az eredményt a verem tetejéhez adja. A PRINT elveszi a verem utolsó elemét, és azt felhasználja, hogy megjelenítse nekünk. Most tegyük ezt be Rozsda.

Először meg kell határoznunk a bájtkódot, használhatunk egy létezőt, amilyen a Jáva vagy a CLR .NET / Mono, de egy alaposabbat fogunk létrehozni.

https://gist.github.com/a01de8904fd39a442c20

Minden utasításhoz hexadecimális jelölést használunk. A magasra tettük # [levezetés (FromPrimitive)], a sajátossága Rozsda és később segítségünkre lesz, ha közvetlenül összehasonlíthatjuk a felsorolást a bájtokkal.

Most létre kell hoznunk egy olyan függvényt, amely végrehajtja az utasításokat. Ehhez el kell olvasnunk egy bájtot, és össze kell hasonlítanunk a felsorolásban szereplő utasításokkal. Ha talál ilyeneket, akkor végre kell hajtania a műveletet.

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

Tesszük, hogy minden bájtot külön-külön olvassunk és futtassunk:

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

Amint láthatja, megkülönböztetjük, ha korábban kaptuk a PUSH parancsot (az INTEGER parancsunkat), a következő bájt teljesen a verembe kerül. Két olyan funkciót használunk, amelyeket nem tanítottam meg, self.pop () y self.push (), amelyek nyilvánvalóan felelősek a verem kezeléséért.

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

Nem túl összetettek, de a pop funkció hibadetektálási mechanizmusokkal rendelkezik. Valójában a Rozsda, ha eltávolítjuk ezeket a mechanizmusokat, fordítási hibát okozna. Most egyszerűen be kell hívnunk egy programot Perin (virtuális gépünk) és hajtsunk végre egy byte-kódot.

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

Ez a bájtkód leolvasható egy fájlból, de itt az egyszerűség kedvéért egy változóban tároltam. Ha végrehajtjuk, akkor a várt eredményt kapjuk:

Perin v0.1 A Perin virtuális gép FlopFlip byte-kódot hajt végre PerinVM példány indítása

Minden kód elérhető a címen GitHub alatt Apache licenc 2.0: https://github.com/AdrianArroyoCalle/perin. Összeállításához meg kell Szállítmány telepítve és felhelyezve:

töltésépítés && ./target/main

A következő fejezetben többet fogunk megtudni a programozási nyelvünkről.


Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   útjáró dijo

    Érdekes kíváncsiság, bár a valóságban nem túl hasznos, nem árt tudni.

    Nagyon jó, hogy a Rustot hirdeti, ez egy olyan nyelv, amely sokat ígér, nemcsak hogy biztonságosabb, mint a c ++, hanem (egyelőre) szintaxisában is tisztább.

    Ami a fotót illeti, nem venném figyelembe a java evolution XD-t.

    1.    útjáró dijo

      És a fortran-tól soha nem használtam, de nem sok jót hallottam róla ...

      1.    Félelmetes dijo

        Én igen, és ez különösen hasznos a mérnöki munkában, annak ellenére, hogy a Python egyre nagyobb teret hódít.

      2.    juan dijo

        A Fortran talán a másik nagy nyelv C. mellett. Az igazán kritikus kérdésekben ma is az egyik vagy a másik lesz.

        És vitatható lenne, hogy a Fortran a C „evolúciója”, amikor talán fordítva kellene lennie, mivel a C újabb, modernebb és több lehetőséggel rendelkezik; bár az egyik a legkevésbé sem válik el a másiktól.

        Bár a végső álláspontok valamilyen szempontból vitathatóak.

    2.    Francisco dijo

      +1 a Java-ra

  2.   hordár dijo

    Lássuk, tetszik-e ez nekem, adok valamit a programozásnak, de alapból, hátha értek többet.

  3.   usergnulinux dijo

    Mi a valódi célja egy új programozási nyelv létrehozásának? Személy szerint nekem úgy tűnik, hogy ez egy trükk a forráskód elrejtésére.

  4.   Yeilly dijo

    Barátom, mi történt a "saját operációs rendszered" folytatásával? Ne hagyja ott, kérem, folytassa.

    Valójában mester vagy, és ez a két dal teljesen lekötötte a figyelmemet, de nem szeretném, ha félúton megállnának.

    Tudom, hogy sokan gondoljuk ugyanezt, és várjuk e nagyon érdekes témák folytatásait és következtetéseit.

  5.   Cristian David dijo

    Nagyon érdekes, köszönöm szépen. 🙂

  6.   Franco dijo

    Nem gondolom, hogy a java programozási nyelv, inkább parancsértelmező, mivel nem fordítható

    1.    Mario dijo

      [A programozási nyelv olyan formális nyelv, amelyet olyan gépek kifejlesztésére terveztek, amelyeket olyan gépek, mint például számítógépek, végezhetnek.

      Emiatt a Java programozási nyelv. Még a bash nyelv (linux shell nyelv) is programozási nyelv.

      Kétféle nyelv létezik:
      - Összeállított
      - Értelmezve
      - Vegyes (virtuális gépek, a natív könyvtárak összeállítása és a funkcionális kód értelmezése)

      A tolmácsok nagyon hasznosak, ha multiplatformról van szó, és ehhez nincsenek katasztrofális teljesítményeik. A Java, VB.NET, C ++ .NET, F #, C # mind vegyes nyelvek. A bash nyelv, a denevér, a PHP, a Javascript és még sok más értelmezett nyelv.

      Ha a Java-t nem tekinti nyelvnek, mert az értelmezve van (ami nem az), akkor ne vegye figyelembe sok más programkészítéshez használt nyelvet. Ezenfelül a három szabály szerint nem szabad úgy gondolkodnia, hogy létezik programozási nyelv, kivéve magát a gépnyelvet.

      És miért ne? Még a gépnyelv sem tekinthető nyelvnek, mivel valójában csak a processzor által "értelmezett" parancsok halmaza.

      Mivel gyakorlatilag az ÖSSZES nyelv nem más, mint egy parancssor, amelyet egy processzor értelmez.

      Lehet, hogy egy nyelv többé-kevésbé tetszik neked (ebben az esetben a Java), többé-kevésbé hasznosnak és hatékonynak tűnik, de azt mondhatod, hogy ez nem programozási nyelv, mert nincs lefordítva ... ellentmond minden programozási nyelv meghatározásának.

    2.    Mario dijo

      😐 Remélem, hogy nem tűntem túl durván

      1.    Maria Antoinette, Manuela Cardenas dijo

        nem csend, csak az életünket romboltad le

      2.    Mario dijo

        hahahahaha, perdoooon. nem volt szándékomban xD

    3.    carlos dijo

      a java egy programozási nyelv. Mivel kifejleszthet egy alkalmazást, és amikor fordít, készít egy .jar fájlt, amelyet a JVM értelmez. Ezután a python logikája szerint ezt sem értelmezi, hanem különböző futtatható fájlokra fordítja ...

  7.   Illés Mongelos dijo

    Nagyon jó információ

  8.   Carlos Arturo dijo

    jó információ, de kétlem, hogy új programozási nyelvet lehet létrehozni a semmiből anélkül, hogy más analógiákra vagy szoftverekre kellene támaszkodnunk. Ugyanúgy beszélek, mint más nyelvek, például a java vagy a HTML.
    Nagyra értékelném a segítségét ebben a kérdésben.