
Hari baik untuk mereka yang memutuskan untuk membaca artikel saya berikutnya.
Pertama-tama, saya memposting tautan ke bagian sebelumnya:
Bagian 1: menulis bahasa VMBagian 2: presentasi program antaraBagian 3: Arsitektur penerjemah. Analisis struktur bahasa dan ekspresi matematikaJuga patut memposting tautan ke
repositori dan ke
artikel ulasan kecil di mana saya menjelaskan secara singkat pekerjaan yang dilakukan secara keseluruhan.
Jadi, dalam artikel terakhir saya menggambarkan pembuatan penerjemah dari bahasa pemrograman tingkat tinggi ke representasi menengah dan perakitan aplikasi lebih lanjut.
Sekarang kita dihadapkan dengan tugas menambahkan struktur dan kelas ke bahasa sehingga memiliki fungsi analog modern. Artikel ini tidak akan memberikan kode yang dijelaskan
fungsionalitas sejak itu banyak, sangat membosankan dan tidak semua orang akan tertarik untuk menggali. Hanya teori. Dan beberapa foto.
Mari mulai membuat ...
Tampilan kelas
Layak dimulai dengan fakta bahwa setiap struktur dapat direpresentasikan sebagai sebuah array. Indeks elemen array dapat dikaitkan dengan variabel kelas tertentu atau metodenya.
Pertimbangkan contoh kode sederhana (secara alami di Mash):

Berikut adalah contoh sederhana dari kelas yang menyimpan salinan nilai-nilai a dan b, yang diteruskan ke dalam konstruktor. Ini juga memiliki destruktor dan fungsi sum yang akan mengembalikan jumlah a dan b.
Tetapi dalam representasi perantara tidak ada OOP, dan bahkan lebih pada level VM.
Jika kita melihat sedikit lebih dalam untuk melihat apa sebenarnya MyClass, maka kita akan melihat tentang gambar berikut:

Bagus Penerjemah, melalui manipulasi dan mantra sederhana, mengubah struktur kami menjadi array yang sederhana.
Pengetikan dinamis untuk kelas
Perlu juga dipertimbangkan tentang pengaturan tipe dinamis cepat untuk kelas dan pekerjaan yang sesuai dengannya, karena dalam bahasa dengan pengetikan dinamis ini adalah poin yang sangat penting.
Solusi paling sederhana dan paling efektif adalah tabel virtual komponen kelas. Yaitu di penerjemah, Anda dapat mengimplementasikan pemrosesan semua definisi kelas dan membuat daftar nama variabel dan metode kelas. Karena itu, sejak kelas kami direpresentasikan dalam bentuk array - setiap nama dari daftar dapat dibandingkan dengan indeks. Saat Anda mengisi daftar nama - Anda dapat menentukan ukuran array untuk setiap kelas, untuk alokasi memori yang lebih ekonomis.
Pengalokasi kelas dasar
Agar dapat menggunakan kelas dengan tabel metode virtual, selain hanya mengalokasikan memori, Anda perlu mengisi tabel ini dengan pointer ke titik masuk ke metode kelas.
Cara sederhana dan bekerja adalah menghasilkan pengalokasi untuk setiap kelas. Ini adalah metode sederhana yang mengalokasikan memori untuk array dari struktur kelas, mengisinya sebagian, dan mengembalikan pointer ke kelas.
Alokator dipanggil ketika instance kelas dibuat, yaitu pada contoh di atas, panggilan akan dilakukan pada saluran ke-24 - “MyClass baru (10, 20)”. Setelah pengalokasi, Anda dapat memanggil konstruktor kelas. Di Mash, konstruktor dipanggil jika konstruk baru berisi tanda kurung (...) setelah nama kelas.
Introspeksi diri
Ada kemungkinan bahwa tidak semua orang memahami definisi ini, tetapi banyak yang menemukan.
Introspeksi - definisi jenis objek dengan pekerjaan yang dilakukan selama eksekusi kode. Contohnya adalah typeof () dalam JavaScript yang sama.
Mash memiliki introspeksi penuh, mis. untuk tipe data sederhana dan untuk kelas.
Tanpa basa-basi lagi, berikut adalah beberapa contoh kode:

Dan untuk kelas:

Introspeksi untuk kelas diimplementasikan dengan menambahkan jenis ke bidang masing-masing kelas - pointer ke jenisnya.
Penyelesaian
Saya mencoba menjelaskan dalam bahasa sederhana bagaimana pekerjaan dengan kelas diatur dalam penerjemah Mash saya. Teknologi serupa juga melekat dalam banyak bahasa lain dengan pengetikan dinamis.
Saya harap Anda menemukan artikel ini menarik. Terima kasih telah membacanya sampai akhir jika Anda melakukannya. Saat ini, ini mungkin artikel terakhir saya tentang pembuatan bahasa Mash (selama saya tidak menguasai kompilasi JIT). Artikel saya berikutnya akan mempertimbangkan aspek lain dari proyek, atau akan berhubungan dengan topik lain sama sekali.