Buat bahasa pengaturcaraan anda sendiri (I)

Evolusi bahasa pengaturcaraan

Selepas menulis artikel pertama di bagaimana membuat sistem operasi anda sendiriSeseorang memberitahu saya jika saya boleh membuat artikel cara membuat bahasa pengaturcaraan. Pada mulanya saya tidak memberi banyak perhatian, tetapi sekarang dan melalui cara lain saya telah belajar lebih banyak mengenai penciptaan bahasa pengaturcaraan. Oleh itu, mari kita lakukan bahasa pengaturcaraan asas, mudah disematkan dalam program lain dan berfungsi dengan mesin maya yang juga akan kami reka. Hari ini kita harus membuat mesin maya yang paling asas.

Anda mungkin tertanya-tanya: «Mesin maya? Tetapi bukankah itu sangat sulit dan apakah itu juga memperlambat program? " Sebaliknya, mesin maya sederhana sangat mudah dan agak pantas. Saya telah memilih Rust sebagai bahasa untuk mesin maya. Tetapi apa itu Rust?

Rust Ini adalah bahasa pengaturcaraan yang difokuskan pada keselamatan pelaksanaan, jadi menggunakannya tidak mungkin seseorang dapat menutup mesin maya. Ini adalah bahasa yang disusun dalam pembangunan yang dibuat oleh Mozilla. Servo, pengganti untuk Gecko, sedang berkembang dalam dirinya. Anda masih boleh mengubah sintaks anda tetapi kod yang akan saya gunakan akan kekal sehingga pelepasan stabil pertama.

Rust memasang di Linux Dengan cara yang mudah. Walau bagaimanapun, tidak ada bungkusan rasmi. Pengguna dari Ubuntu anda boleh menambah kedua-duanya PPA: ppa: hansjorg / karat  y ppa: cmrx64 / kargo, pengguna Arch boleh digunakan AUR (kargo-git adalah pakej yang memasang semuanya). Selebihnya boleh menggunakan:

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

Bagaimana mesin maya berfungsi?

Sekiranya anda tahu bagaimana dunia assembler berfungsi sama persis dengan stack atau stack. Sekiranya tidak, saya akan menerangkannya kepada anda. Mari bayangkan kod berikut:

cetak 2 + 3

Komputer tidak memahami apa maksud 2 + 3, dan juga tidak tahu pesanan apa yang harus diikuti. Komputer berfungsi dengan bateri atau timbunan di mana data terkumpul dan diekstrak secara berterusan. Kod itu di mesin maya kami akan kelihatan seperti ini:

PUSH 2 PUSH 3 TAMBAH CETAK

Pada asasnya kita meletakkan 2 di timbunan di atas, 3 juga. ADD akan menarik (iaitu mengeluarkannya dari timbunan dan mendapatkan nilainya) 2 item terakhir pada timbunan dan menambahkan hasilnya ke bahagian atas timbunan. PRINT akan mengambil item terakhir di tumpukan dan menggunakannya untuk memaparkannya kepada kami. Sekarang mari kita buat Rust.

Kita mesti terlebih dahulu menentukan bahasa untuk Bykod, kita boleh menggunakan yang sudah ada seperti yang ada Java o el CLR .NET / Mono, tetapi kami akan membuat yang lebih asas.

https://gist.github.com/a01de8904fd39a442c20

Kami menggunakan notasi heksadesimal untuk setiap arahan. Pada tahap tinggi kita telah meletakkan # [menurunkan (FromPrimitive)], adalah keanehan dari Rust dan ini akan menolong kita untuk dapat membandingkan penghitungan dengan bait secara langsung.

Sekarang kita mesti membuat fungsi yang melaksanakan setiap arahan tersebut. Untuk ini, kita mesti membaca bait dan membandingkannya dengan arahan yang kita ada dalam penghitungan. Sekiranya anda menjumpai apa-apa yang ada, anda mesti melaksanakan tindakan anda.

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

Kami melakukannya untuk membaca setiap bait secara individu dan melaksanakannya:

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

Seperti yang anda lihat, kita membezakan jika kita diberi arahan PUSH (perintah INTEGER kita) sebelumnya, bait seterusnya akan dibawa sepenuhnya ke timbunan. Di sana kami menggunakan dua fungsi yang belum saya ajarkan kepada anda, diri.pop () y self.push (), yang jelas bertugas mengendalikan timbunan.

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

Mereka tidak terlalu rumit, tetapi fungsi pop memiliki mekanisme pengesanan ralat. Sebenarnya, di Rust, jika kita membuang mekanisme tersebut, itu akan memberi kita kesalahan penyusunan. Sekarang kita hanya perlu memanggil program perin (mesin maya kami) dan laksanakan kod bytec.

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

Bytecode itu boleh dibaca dari fail, tetapi di sini untuk kesederhanaan saya telah menyimpannya dalam pemboleh ubah. Sekiranya kita melaksanakannya, ia akan memberikan hasil yang diharapkan:

Perin v0.1 Perin VM melaksanakan FlopFlip bytecode Memulakan instance PerinVM PerinVM v0.1.0 Nilai integer 5

Semua kod boleh didapati di GitHub di bawah Lesen Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Untuk menyusunnya mesti ada Cargo dipasang dan letakkan:

caj bina && ./target/main

Pada bab seterusnya kita akan melihat lebih banyak mengenai bahasa pengaturcaraan kita.


Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   pengembara kata

    Rasa ingin tahu yang menarik, walaupun pada hakikatnya tidak begitu berguna, tidak ada salahnya untuk mengetahui.

    Hebatnya anda mengiklankan Rust, ini adalah bahasa yang menjanjikan banyak, bukan hanya lebih selamat daripada c ++, tetapi (buat masa ini) lebih jelas dalam sintaksisnya.

    Untuk foto, saya tidak akan mempertimbangkan java evolusi XD.

    1.    pengembara kata

      Dan dari fortran, saya tidak pernah menggunakannya, tetapi saya belum pernah mendengar banyak perkara baik mengenainya ...

      1.    Garang kata

        Saya begitu, dan ia sangat berguna dalam bidang kejuruteraan walaupun Python mendapat tempat.

      2.    John kata

        Fortran mungkin merupakan bahasa hebat lain bersama dengan C. Bahkan hari ini dalam soalan yang sangat kritikal akan menjadi satu atau yang lain.

        Dan boleh diperdebatkan bahawa Fortran adalah sebagai 'evolusi' C, ketika mungkin seharusnya sebaliknya, kerana C lebih baru, lebih moden dan dengan lebih banyak kemungkinan; walaupun satu tidak terlepas dari yang lain sedikit pun.

        Walaupun kedudukan akhir semuanya boleh diperdebatkan dari beberapa sudut pandangan.

    2.    Francisco kata

      +1 ke Java

  2.   porter kata

    Mari lihat jika saya suka ini, saya memberikan sesuatu kepada pengaturcaraan tetapi asas untuk melihat apakah saya lebih faham.

  3.   usergnulinux kata

    Apakah tujuan sebenarnya untuk membuat bahasa pengaturcaraan yang baru? Nampaknya saya secara peribadi bahawa ia adalah tipu daya untuk menyembunyikan kod sumber.

  4.   Baiklah kata

    Kawan apa yang berlaku dengan penerusan "sistem operasi anda sendiri"? Jangan tinggalkan di sana, teruskan.

    Sebenarnya, anda adalah master dan kedua lagu ini telah menarik perhatian saya, tetapi saya tidak mahu lagu itu berhenti di tengah jalan.

    Saya tahu bahawa banyak dari kita berfikir sama dan kita sedang menunggu kesinambungan dan kesimpulan dari topik-topik yang sangat menarik ini.

  5.   Cristian David kata

    Sangat menarik, terima kasih banyak. 🙂

  6.   Prepaid kata

    Saya tidak menganggap java sebagai bahasa pengaturcaraan, sebaliknya jurubahasa perintah, kerana ia tidak dapat disusun

    1.    Mario kata

      [Bahasa pengaturcaraan adalah bahasa formal yang dirancang untuk mengekspresikan proses yang dapat dilakukan oleh mesin seperti komputer.]

      Atas sebab ini, Java adalah bahasa pengaturcaraan. Malah bahasa Bash (bahasa shell linux) adalah bahasa pengaturcaraan dengan sendirinya.

      Terdapat dua jenis bahasa:
      - Disusun
      - Mentafsir
      - Campuran (Mesin maya, perpustakaan asli disusun dan kod fungsinya ditafsirkan)

      Penafsir sangat berguna ketika menggunakan pelbagai platform dan tidak mempunyai prestasi yang buruk untuk itu. Java, VB.NET, C ++ .NET, F #, C # adalah semua bahasa campuran. Bahasa bash, bat, PHP, Javascript, dan banyak lagi bahasa yang ditafsirkan.

      Sekiranya anda tidak menganggap Java sebagai bahasa kerana ia ditafsirkan (yang bukan), anda tidak boleh mempertimbangkan banyak bahasa lain yang digunakan untuk membuat program. Lebih-lebih lagi, dengan ketentuan tiga ini, anda tidak boleh menganggap bahawa ada bahasa pengaturcaraan kecuali bahasa mesin itu sendiri.

      Dan mengapa tidak? Bahkan bahasa mesin tidak boleh dianggap sebagai bahasa kerana ia sebenarnya hanya sekumpulan perintah yang "ditafsirkan" oleh pemproses.

      Kerana berkesan, SEMUA bahasa tidak lebih dari sekumpulan perintah yang ditafsirkan oleh pemproses.

      Anda mungkin menyukai bahasa lebih kurang (Java, dalam hal ini), nampaknya lebih kurang berguna dan hebat tetapi untuk mengatakan bahawa itu bukan bahasa pengaturcaraan kerana tidak disusun ... ia bertentangan dengan semua definisi bahasa pengaturcaraan.

    2.    Mario kata

      Hope Saya harap saya tidak kelihatan terlalu kasar

      1.    Maria Antoinette dari Manuela Cardenas kata

        tidak tenang anda hanya menghancurkan hidup kita

      2.    Mario kata

        hahahahaha, perdoooon. itu bukan niat saya xD

    3.    carlos kata

      java adalah bahasa pengaturcaraan. kerana anda dapat mengembangkan aplikasi dan ketika anda menyusun anda membuat .jar yang ditafsirkan oleh JVM. Kemudian menurut logik python anda tidak ditafsirkan tetapi ia disusun untuk pelbagai yang boleh dilaksanakan ...

  7.   Elijah Mongelos kata

    Maklumat yang sangat baik

  8.   Carlos Arturo kata

    maklumat yang baik tetapi saya mempunyai keraguan, adalah mungkin untuk membuat bahasa pengaturcaraan baru dari awal tanpa perlu bergantung pada analogi atau perisian lain. Saya bercakap dengan cara yang sama seperti bahasa lain yang dibuat seperti Java atau HTML.
    Saya sangat menghargai pertolongan anda mengenai soalan ini.