Buat bahasa pemrograman Anda sendiri (I)

Evolusi bahasa pemrograman

Setelah menulis artikel pertama di cara membuat sistem operasi Anda sendiriSeseorang memberi tahu saya jika saya bisa membuat artikel tentang cara membuat bahasa pemrograman. Awalnya saya tidak terlalu memperhatikan, tetapi sekarang dan melalui cara lain saya telah belajar lebih banyak tentang pembuatan bahasa pemrograman. Jadi, ayo lakukan bahasa pemrograman dasar, dapat dengan mudah disematkan di program lain dan berfungsi dengan mesin virtual yang juga akan kami desain. Hari ini kita harus membuat mesin virtual paling dasar.

Anda mungkin bertanya-tanya: «Mesin virtual? Tapi bukankah itu sangat sulit dan apakah itu juga memperlambat program? " Sebaliknya, mesin virtual sederhana sangat sederhana dan relatif cepat. aku telah memilih Karat sebagai bahasa untuk mesin virtual. Tapi apa itu Karat?

Karat Ini adalah bahasa pemrograman yang berfokus pada keamanan eksekusi, jadi menggunakannya secara praktis tidak mungkin bagi seseorang untuk menutup mesin virtual. Ini adalah bahasa yang dikompilasi dalam pengembangan yang dibuat oleh Mozilla. Servo, pengganti Tokek, berkembang dalam dirinya. Anda masih dapat mengubah sintaks Anda tetapi kode yang akan saya gunakan akan disimpan hingga rilis stabil pertama.

Karat dipasang di Linux Dengan cara yang sederhana. Namun, tidak ada paket resmi. Pengguna Ubuntu dapat menambahkan keduanya PPA: ppa: hansjorg / karat  y ppa: cmrx64 / cargo, pengguna Lengkungan bisa menggunakan AUR (kargo-git adalah paket yang menginstal segalanya). Sisanya bisa menggunakan:

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

Bagaimana cara kerja mesin virtual?

Jika Anda tahu cara kerja dunia assembler, itu persis sama, dengan stack atau stack. Jika tidak, saya akan menjelaskannya kepada Anda. Bayangkan kode berikut:

cetak 2 + 3

Komputer tidak mengerti apa arti 2 + 3, juga tidak tahu urutan apa yang harus diikuti. Komputer bekerja dengan baterai atau tumpukan di mana data dikumpulkan dan diekstraksi terus menerus. Kode itu di mesin virtual kita akan terlihat seperti ini:

Tekan 2 Tekan 3 TAMBAHKAN CETAK

Pada dasarnya kami akan meletakkan 2 di tumpukan di atas, 3 juga. ADD akan menarik (yaitu menghapusnya dari tumpukan dan mendapatkan nilainya) 2 item terakhir di tumpukan dan menambahkan hasilnya ke bagian atas tumpukan. PRINT akan mengambil item terakhir di tumpukan dan menggunakannya untuk ditampilkan kepada kami. Sekarang mari kita lakukan itu Karat.

Pertama-tama kita harus mendefinisikan bahasa untuk Kode Bytecode, kita bisa menggunakan yang sudah ada seperti yang ada di Jawa o el CLR dari .NET / Mono, tetapi kita akan membuat yang lebih mendasar.

https://gist.github.com/a01de8904fd39a442c20

Kami menggunakan notasi heksadesimal untuk setiap instruksi. Di tempat tinggi kami telah menempatkan # [memperoleh (FromPrimitive)], adalah kekhasan Karat dan itu akan membantu kita nanti untuk dapat membandingkan pencacahan dengan byte secara langsung.

Sekarang kita harus membuat fungsi yang menjalankan setiap instruksi tersebut. Untuk ini kita harus membaca satu byte dan membandingkannya dengan instruksi yang kita miliki dalam pencacahan. Jika Anda menemukan yang ada, Anda harus menjalankan tindakan Anda.

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

Kami melakukannya untuk membaca setiap byte secara individual dan menjalankannya:

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

Seperti yang Anda lihat, kami membedakan jika kami diberi perintah PUSH (perintah INTEGER kami) sebelumnya, byte berikutnya akan sepenuhnya dibawa ke tumpukan. Di sana kami menggunakan dua fungsi yang belum saya ajarkan kepada Anda, self.pop () y self.push (), yang jelas bertugas menangani tumpukan.

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

Mereka tidak terlalu rumit, tetapi fungsi pop memiliki mekanisme deteksi kesalahan. Faktanya, di Karat, jika kita menghapus mekanisme tersebut, itu akan memberi kita kesalahan kompilasi. Sekarang kita hanya perlu memanggil sebuah program perin (mesin virtual kami) dan jalankan bytecode.

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

Bytecode itu dapat dibaca dari file, tetapi di sini untuk kesederhanaan saya telah menyimpannya dalam sebuah variabel. Jika kita menjalankannya, itu akan memberi kita hasil yang diharapkan:

Perin v0.1 Perin VM mengeksekusi bytecode FlopFlip Memulai instance PerinVM PerinVM v0.1.0 Nilai integer 5

Semua kode tersedia di GitHub di bawah Lisensi Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Untuk mengkompilasi mereka harus punya Muatan dipasang dan diletakkan:

charge build && ./target/main

Pada bab selanjutnya kita akan melihat lebih banyak tentang bahasa pemrograman kita.


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   pengendara jalan dijo

    Rasa ingin tahu yang menarik, meski sebenarnya tidak terlalu berguna, tidak ada salahnya mengetahuinya.

    Bagus sekali Anda mengiklankan Rust, ini adalah bahasa yang menjanjikan banyak hal, tidak hanya lebih aman daripada c ++, tetapi (untuk saat ini) lebih jelas dalam sintaksnya.

    Untuk foto, saya tidak akan mempertimbangkan java evolusi XD.

    1.    pengendara jalan dijo

      Dan dari fortran, saya tidak pernah menggunakannya, tetapi saya belum mendengar banyak hal baik tentangnya ...

      1.    berpori dijo

        Ya, dan ini sangat berguna dalam teknik meskipun Python mulai berkembang.

      2.    juan dijo

        Fortran mungkin adalah bahasa hebat lainnya bersama dengan C. Masih hari ini pertanyaan yang sangat kritis akan menjadi satu atau yang lain.

        Dan akan diperdebatkan bahwa Fortran adalah sebagai 'evolusi' dari C, padahal mungkin seharusnya sebaliknya, karena C lebih baru, lebih modern dan dengan lebih banyak kemungkinan; meskipun yang satu tidak terlepas dari yang lain sedikit pun.

        Meskipun posisi akhir semuanya bisa diperdebatkan dari beberapa sudut pandang.

    2.    Francisco dijo

      +1 ke Java

  2.   porter dijo

    Mari kita lihat apakah saya suka ini, saya akan memberikan sesuatu untuk pemrograman tetapi dasar untuk melihat apakah saya lebih mengerti.

  3.   usergnulinux.dll dijo

    Apa tujuan sebenarnya dari membuat bahasa pemrograman baru? Menurut saya pribadi, ini adalah cara untuk menyembunyikan kode sumber.

  4.   Ya ampun dijo

    Sobat, apa yang terjadi dengan kelanjutan dari "sistem operasi Anda sendiri"? Jangan biarkan di sana, lanjutkan.

    Sebenarnya, Anda adalah seorang master dan kedua lagu ini telah benar-benar menarik perhatian saya, tetapi saya tidak ingin mereka berhenti di tengah jalan.

    Saya tahu banyak dari kita yang berpikiran sama dan menunggu kelanjutan dan kesimpulan dari topik yang sangat menarik ini.

  5.   Christian David dijo

    Sangat menarik, terima kasih banyak. 🙂

  6.   Jujur dijo

    Saya tidak menganggap java sebagai bahasa pemrograman, melainkan penerjemah perintah, karena tidak dapat dikompilasi

    1.    Mario dijo

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

      Untuk alasan ini, Java adalah bahasa pemrograman. Bahkan bahasa Bash (bahasa shell linux) adalah bahasa pemrograman itu sendiri.

      Ada dua jenis bahasa:
      - Disusun
      - Diterjemahkan
      - Campuran (Mesin virtual, pustaka asli dikompilasi dan kode fungsional diinterpretasikan)

      Penerjemah sangat berguna dalam hal multiplatform dan tidak memiliki performa yang buruk untuk itu. Java, VB.NET, C ++ .NET, F #, C # semuanya adalah bahasa campuran. Bahasa bash, bat, PHP, Javascript dan banyak lagi bahasa yang diinterpretasikan.

      Jika Anda tidak menganggap Java sebagai bahasa karena ditafsirkan (padahal bukan) Anda sebaiknya tidak mempertimbangkan banyak bahasa lain yang digunakan untuk membuat program. Selain itu, dengan aturan tiga itu, Anda tidak boleh mempertimbangkan bahwa ada bahasa pemrograman apa pun kecuali bahasa mesin itu sendiri.

      Dan mengapa tidak? Bahkan bahasa mesin tidak dapat dianggap sebagai bahasa karena sebenarnya hanya sekumpulan perintah yang "ditafsirkan" oleh prosesor.

      Karena secara efektif, SEMUA bahasa tidak lebih dari sekumpulan perintah yang diinterpretasikan oleh prosesor.

      Anda mungkin menyukai bahasa yang lebih atau kurang (Java, dalam hal ini), tampak lebih atau kurang berguna dan kuat tetapi untuk mengatakan bahwa itu bukan bahasa pemrograman karena tidak dikompilasi… itu bertentangan dengan semua definisi bahasa pemrograman.

    2.    Mario dijo

      😐 Saya harap saya tidak tampak terlalu kasar

      1.    Maria Antoinette dari Manuela Cardenas dijo

        tidak tenang Anda hanya menghancurkan hidup kami

      2.    Mario dijo

        hahahahaha, perdoooon. itu bukan niat saya xD

    3.    carlos dijo

      java adalah bahasa pemrograman. karena Anda dapat mengembangkan aplikasi dan ketika Anda mengkompilasi Anda membuat .jar yang diinterpretasikan oleh JVM. Kemudian menurut logika python Anda juga tidak diinterpretasikan tetapi dikompilasi ke executable yang berbeda ...

  7.   Elia Mongelos dijo

    Informasi yang sangat baik

  8.   Carlos Arturo dijo

    informasi yang bagus tetapi saya ragu, akan mungkin untuk membuat bahasa pemrograman baru dari awal tanpa harus bergantung pada analogi atau perangkat lunak lain. Saya berbicara dengan cara yang sama seperti bahasa lain dibuat seperti java atau HTML.
    Saya akan sangat menghargai bantuan Anda atas pertanyaan ini.