Lumikha ng iyong sariling wika ng programa (I)

Ang ebolusyon ng mga wika ng programa

Matapos isulat ang unang artikulo sa kung paano lumikha ng iyong sariling operating systemMay nagsabi sa akin kung makakagawa ako ng isang artikulo sa kung paano lumikha ng isang wika ng programa. Sa una hindi ako nagbigay ng pansin, ngunit ngayon at sa pamamagitan ng iba pang mga paraan natutunan ko ang higit pa tungkol sa paglikha ng mga wika ng programa. Kaya gawin natin isang pangunahing wika ng programa, madaling mai-embed sa iba pang mga programa at gumagana iyon sa isang virtual machine na magdidisenyo din kami. Ngayon kailangan nating gawin ang pinaka pangunahing virtual machine.

Marahil ay nagtataka ka: Isang virtual machine? Ngunit hindi ba mahirap iyon at pinapabagal din nito ang mga programa? " Sa kaibahan, ang isang simpleng virtual machine ay napaka-simple at medyo mabilis. Ako ang pumili Kalawang bilang isang wika para sa virtual machine. Ngunit ano ito Kalawang?

Kalawang Ito ay isang wika ng programa na nakatuon sa seguridad ng pagpapatupad, kaya't ang paggamit nito ay halos imposible para sa isang tao na ma-sarado ang virtual machine. Ito ay isang pinagsamang wika sa kaunlaran na nilikha ni Mozilla. Magpaandar buhat sa malayo, ang kapalit ng Tuko, ay bumubuo sa kanya. Maaari mo pa ring baguhin ang iyong syntax ngunit ang code na gagamitin ko ay mananatili hanggang sa unang matatag na paglabas.

Kalawang nai-install sa Linux Sa isang simpleng paraan. Gayunpaman, walang opisyal na parsela. Ang mga gumagamit ng Ubuntu maaari mong idagdag ang dalawang ito PPA: ppa: hansjorg / kalawang  y ppa: cmrx64 / kargamento, mga gumagamit ng Arko maaaring magamit AUR (cargo-git ay ang pakete na nag-i-install ng lahat). Ang natitira ay maaaring gumamit ng:

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

Paano gumagana ang isang virtual machine?

Kung alam mo kung paano gumagana ang assembler world ito ay eksaktong kapareho, sa stack o stack. Kung hindi, ipapaliwanag ko sa iyo. Isipin natin ang sumusunod na code:

i-print ang 2 + 3

Hindi maintindihan ng computer kung ano ang ibig sabihin ng 2 + 3, at hindi rin nito alam kung anong sundin ang order. Gumagana ang mga computer sa mga baterya o stack kung saan ang data ay naipon at patuloy na nakuha. Ang code na iyon sa aming virtual machine ay dapat magmukhang ganito:

PUSH 2 PUSH 3 ADD PRINT

Karaniwan ilalagay namin ang 2 sa stack sa tuktok, ang 3 pati na rin. Ang ADD ay kukuha (ibig sabihin, alisin ito mula sa stack at makuha ang halaga nito) ang huling 2 item sa stack at idagdag ang resulta sa tuktok ng stack. Kukunin ng PRINT ang huling item sa stack at gagamitin ito upang ipakita ito sa amin. Ngayon gawin natin iyon sa Kalawang.

Dapat muna nating tukuyin ang isang wika para sa byte code, maaari naming gamitin ang isang mayroon nang tulad ng isa sa Java o el CLR ng .NET / Mono, ngunit lilikha kami ng isang mas pangunahing kaalaman.

https://gist.github.com/a01de8904fd39a442c20

Gumagamit kami ng hexadecimal notation para sa bawat tagubilin. Sa mataas na inilagay namin # [deriving (FromPrimitive)], ay isang kakaibang uri ng Kalawang at makakatulong ito sa amin sa paglaon upang maihambing ang enumerasyon sa mga byte nang direkta.

Ngayon ay dapat kaming gumawa ng isang pagpapaandar na nagpapatupad ng bawat isa sa mga tagubiling iyon. Para sa mga ito kailangan nating basahin ang isang byte at ihambing ito sa mga tagubilin na mayroon kami sa pagpapalista. Kung may makita kang mayroon, dapat mong isagawa ang iyong aksyon.

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

Ginagawa namin iyon upang basahin ang bawat byte nang paisa-isa at maisagawa ang mga ito:

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

Tulad ng nakikita mo, naiiba namin kung binigyan kami ng utos na PUSH (aming utos na INTEGER) dati, ang susunod na byte ay ganap na dadalhin sa stack. Gumagamit kami ng dalawang pag-andar na hindi ko itinuro sa iyo, sarili.pop () y self.push (), na malinaw naman na namamahala sa paghawak ng stack.

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

Ang mga ito ay hindi masyadong kumplikado, ngunit ang pag-andar ng pop ay may mga mekanismo ng pagtuklas ng error. Sa katunayan, sa Kalawang, kung aalisin namin ang mga mekanismong magbibigay sa amin ng isang error sa pagtitipon. Ngayon kailangan lang naming tumawag sa isang programa perin (aming virtual machine) at magpatupad ng isang bytecode.

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

Ang bytecode na iyon ay maaaring mabasa mula sa isang file, ngunit dito para sa pagiging simple naiimbak ko ito sa isang variable. Kung isagawa namin ito, bibigyan kami ng inaasahang resulta:

Perin v0.1 Ang Perin VM ay nagpapatupad ng FlopFlip bytecode Simula sa PerinVM na halimbawa PerinVM v0.1.0 na halaga ng Integer 5

Ang lahat ng code ay magagamit sa GitHub sa ilalim ng Apache Lisensya 2.0: https://github.com/AdrianArroyoCalle/perin. Upang makatipon dapat mayroon sila Karga naka-install at inilagay:

singilin ang build && ./target/main

Sa susunod na kabanata makikita natin ang higit pa tungkol sa aming wika ng programa.


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ɓngel GatĆ³n
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   roader dijo

    Kagiliw-giliw na pag-usisa, bagaman hindi ito masyadong kapaki-pakinabang sa katotohanan, hindi nasasaktan malaman.

    Mahusay na na-advertise mo ang Rust, ito ay isang wika na maraming pangako, hindi lamang ito mas ligtas kaysa sa c ++, ngunit (sa ngayon) mas malinaw sa syntax nito.

    Tulad ng para sa larawan, hindi ko isasaalang-alang ang java evolution XD.

    1.    roader dijo

      At mula sa fortran, hindi ko ito ginamit, ngunit hindi ko pa naririnig na mabuti ang tungkol dito ...

      1.    Mapangmata dijo

        Ginagawa ko, at lalo itong kapaki-pakinabang sa engineering kahit na ang Python ay nakakakuha ng lupa.

      2.    John dijo

        Ang Fortran ay marahil ang iba pang mahusay na wika kasama ang C. Kahit ngayon sa talagang kritikal na mga katanungan ay magiging isa o iba pa.

        At ito ay magiging debate na ang Fortran ay bilang isang 'evolution' ng C, kung marahil ito ay dapat na iba pang paraan, dahil ang C ay mas bago, moderno at may maraming posibilidad; bagaman ang isa ay hindi hiwalay mula sa iba pa.

        Kahit na ang pangwakas na mga posisyon ay lahat ay mapagtatalunan mula sa ilang pananaw.

    2.    Francisco dijo

      +1 sa Java

  2.   tagabitbit dijo

    Tingnan natin kung gusto ko ito, bibigyan ko ang isang bagay sa pagprograma ngunit pangunahing upang makita kung mas nakakaintindi ako.

  3.   usergnulinux dijo

    Ano ang tunay na layunin ng paglikha ng isang bagong wika sa programa? Tila sa akin mismo na ito ay isang pakana upang maitago ang source code.

  4.   Yeilly dijo

    Kaibigan, ano ang nangyari sa pagpapatuloy ng "iyong sariling operating system"? Huwag iwanan ito doon mangyaring ipagpatuloy ito.

    Sa totoo lang, ikaw ay isang master at ang dalawang kanta na ito ay ganap na naakit ang aking pansin, ngunit hindi ko nais na huminto sila sa kalahati.

    Alam ko na marami sa atin ang nag-iisip ng pareho at hinihintay namin ang mga pagpapatuloy at konklusyon ng mga napaka-kagiliw-giliw na paksang ito.

  5.   Cristian David dijo

    Napakainteres, maraming salamat. šŸ™‚

  6.   Franco dijo

    Hindi ko isinasaalang-alang ang java isang wika sa pagprograma, sa halip isang interpreter ng utos, dahil hindi ito naiipon

    1.    Mario dijo

      [Ang isang programa ng wika ay isang pormal na wika na idinisenyo upang maipahayag ang mga proseso na maaaring isagawa ng mga machine tulad ng computer.]

      Para sa kadahilanang ito, ang Java ay isang wika ng programa. Kahit na ang wikang Bash (linux shell language) ay isang wikang nagprograma mismo.

      Mayroong dalawang uri ng mga wika:
      - Pinagsama
      - Nabigyang-kahulugan
      - Mixed (Virtual machine, ang mga katutubong aklatan ay naipon at ang functional code ay binibigyang kahulugan)

      Ang mga tagasalin ay napaka kapaki-pakinabang pagdating sa multiplatform at walang mapaminsalang pagganap para diyan. Ang Java, VB.NET, C ++ .NET, F #, C # ay pawang halo-halong mga wika. Ang bash na wika, bat, PHP, Javascript, at marami pang iba ay mga naisalin na wika.

      Kung hindi mo isinasaalang-alang ang Java bilang isang wika sapagkat ito ay binibigyang kahulugan (na hindi ito) hindi mo dapat isaalang-alang ang maraming iba pang mga wika na ginagamit upang gumawa ng mga programa. Bukod dito, sa panuntunang iyon ng tatlo hindi mo dapat isaalang-alang na mayroong anumang wika sa pagprograma maliban sa mismong wika ng makina.

      At bakit hindi? Kahit na ang wika ng makina ay maaaring isaalang-alang na isang wika dahil talagang isang hanay lamang ng mga utos na "binibigyang kahulugan" ng processor.

      Dahil epektibo, LAHAT ng mga wika ay hindi hihigit sa isang hanay ng mga utos na binibigyang kahulugan ng isang processor.

      Maaari mong magustuhan ang isang wika nang higit pa o mas kaunti (Java, sa kasong ito), tila higit pa o mas mababa kapaki-pakinabang at malakas ngunit upang sabihin na ito ay hindi isang wika ng programa dahil hindi ito naipon ... sumasalungat ito sa lahat ng mga kahulugan ng wika ng programa.

    2.    Mario dijo

      šŸ˜ Sana parang hindi ako masyadong bastos

      1.    Maria Antoinette ng Manuela Cardenas dijo

        walang tahimik sinira mo lang ang buhay namin

      2.    Mario dijo

        hahahahaha, perdoooon. hindi ito ang aking hangarin xD

    3.    Carlos dijo

      Ang java ay isang wika ng programa. sapagkat maaari kang bumuo ng isang application at kapag nag-ipon ka gumawa ka ng isang .jar na binibigyang kahulugan ng JVM. Pagkatapos ay ayon sa iyong lohika na sawa ay hindi rin ito binibigyan ng kahulugan ngunit pinagsama ito sa iba't ibang mga maipapatupad ...

  7.   Elijah Mongelos dijo

    Napakagandang impormasyon

  8.   Carlos Arturo dijo

    magandang impormasyon ngunit may pag-aalinlangan ako, posible na lumikha ng isang bagong wika ng programa mula sa simula nang hindi na umaasa sa iba pang mga pagkakatulad o software. Nagsasalita ako sa parehong paraan na ang ibang mga wika ay ginawa tulad ng Java o HTML.
    Lubos kong pinahahalagahan ang iyong tulong sa katanungang ito.