Sunting: bahasa saya memungkinkan banyak pewarisan, tidak seperti Java.
Saya sudah mulai merancang dan mengembangkan bahasa pemrograman saya sendiri untuk tujuan pendidikan, rekreasi, dan berpotensi bermanfaat.
Pada awalnya, saya telah memutuskan untuk mendasarkannya di Jawa.
Ini menyiratkan bahwa semua kode akan ditulis dalam bentuk kelas, dan kode itu dikompilasi ke dalam kelas, yang dimuat oleh VM.
Namun, saya sudah mengecualikan fitur seperti antarmuka dan kelas abstrak, karena saya merasa tidak perlu untuk itu. Mereka sepertinya menegakkan paradigma, dan saya ingin bahasa saya tidak melakukan itu. Saya ingin menjadikan kelas sebagai unit kompilasi, karena sepertinya nyaman untuk diterapkan, akrab, dan saya hanya menyukai ide itu.
Kemudian saya perhatikan bahwa saya pada dasarnya pergi dengan sistem modul, di mana kelas dapat digunakan baik sebagai "ruang nama", memberikan konstanta dan fungsi menggunakan static
direktif, atau sebagai templat untuk objek yang perlu instantiated ("aktual" tujuan kelas dalam bahasa lain).
Sekarang saya bertanya-tanya: apa kelebihan dan kekurangan dari memiliki kelas sebagai unit kompilasi?
Juga, komentar umum tentang desain saya akan sangat dihargai. Pos informatif tentang bahasa saya dapat ditemukan di sini: http://www.yannbane.com/2012/12/kava.html .
Jawaban:
Ini dapat mengurangi kompleksitas bahasa. Tidak perlu untuk konstruksi yang berbeda, semuanya diperlakukan sama. Dalam desain tertentu (meskipun bukan milik Anda tampaknya), Anda mendapat manfaat dari tidak memiliki statika dan masalah desain mereka cenderung mengalami (masalah urutan inisialisasi, keterbatasan konkurensi, kecanggungan dengan kelas generik / jenis). Ini juga memungkinkan beberapa manfaat dari konsep modul seperti contoh modul terisolasi untuk sandboxing atau paralelisasi; dan pengetikan modul di mana dependensi sesuai dengan beberapa antarmuka dan seluruh nilai implementasi modul dapat dipakai dan dimasukkan
Yang mengatakan, konsepnya cenderung memiliki lebih banyak masalah daripada tidak. Secara realistis, Anda tidak dapat memperlakukan semuanya dengan sama, karena kelas 'tingkat atas' memerlukan aturan khusus seperti memiliki konstruktor default (atau Anda mengalami masalah aneh yang membuatnya berputar). Modularitas unit kompilasi cenderung menjadi sangat aneh juga. Bagaimana kelas bahkan referensi orang lain ketika mereka hanya kelas? Bagaimana ketergantungan tersebut ditangani, dan bagaimana Anda menentukan urutan yang benar untuk memutar kelas? Bagaimana Anda memastikan bahwa referensi kelas rangkap digunakan kembali oleh berbagai bagian aplikasi (atau bagaimana Anda menangani contoh rangkap jika itu semantik yang Anda inginkan)?
Setelah melihat ke dalamnya, saya mengalami banyak masalah dengan dependensi, pelingkupan hal dengan benar, dan masalah inisialisasi. Anda akhirnya mengalami masalah yang membuat 'kelas tingkat atas' istimewa, dan banyak keterbatasan untuk membuatnya berfungsi yang akhirnya membentuknya menjadi ruang nama sederhana.
sumber
Object
. Saya menyadari bahwa saya mungkin memerlukan beberapa perilaku khusus untuk itu, tetapi selama ini adalah kasus yang terisolasi, saya setuju dengan itu. Saya tidak percaya saya akan memiliki masalah ketergantungan. Ada satu set kelas yang dimuat ketika VM dimulai, beberapa dari mereka diimplementasikan secara asli (kelas Sistem), tetapi mereka semua mewarisi dari Object. Setelah semuanya dimuat, KVM memuat kelas yang diperintahkan untuk dimuat, dan menghitung dependensi. Namun, saya tertarik, masalah apa yang diberikan statika?object
saya, maksud saya bukan kelas yang berperilaku seperti modul daripada kelas dalam yang belum tentu publik di luar unit kompilasi mereka. 'Mengerjakan dependensi' berubah menjadi sarang lebah raksasa dalam detailnya jika Anda menginginkan segala jenis perilaku gaya DLL; ymmv. Adapun statis .Math
kelas, yang sebenarnya adalah sebuah modul dengan metode statis dan anggota ganda statis konstan yang disebutPi
.Alih-alih menjawab pertanyaan ini, saya akan naik satu tingkat dan menyarankan mempelajari OpenCourseWare MIT , khususnya 6.035 (Teknik Bahasa Komputer). Ini akan menjelaskan seluruh problematika, sehingga Anda tidak akan tergoda untuk mengajukan pertanyaan seperti ini lagi.
Rekayasa Bahasa Komputer
Satu-satunya prasyarat adalah Java.
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/
Deskripsi Kursus
Kursus ini menganalisis masalah yang terkait dengan implementasi bahasa pemrograman tingkat tinggi. Topik yang dibahas meliputi: konsep dasar, fungsi, dan struktur penyusun, interaksi teori dan praktik, dan menggunakan alat dalam membangun perangkat lunak. Kursus ini mencakup proyek multi-orang tentang desain dan implementasi kompiler.
sumber