Keuntungan dan kerugian dari penataan semua kode melalui kelas dan kompilasi ke kelas (seperti Java)

13

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 staticdirektif, 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 .

jcora
sumber
1
Jika kelas juga menyertakan ruang nama yang mendamaikan semua pengidentifikasi di kelas, maka Anda memiliki unit kompilasi yang lengkap. Kelas itu dapat dikompilasi dengan sukses, asalkan semua dependensi ke kelas lain dapat dipenuhi baik dengan kompilasi atau dengan referensi ke kelas yang dikompilasi dalam sebuah majelis. Atomitas seperti itu seharusnya memiliki keunggulan yang jelas.
Robert Harvey
Catatan: Jika Anda menghapus kelas dan antarmuka abstrak, Anda memaksa orang untuk menggunakan warisan untuk subtyping dan polimorfisme. Itu pasti menghasilkan kode yang mengerikan. Selain itu, kecuali jika Anda menambahkan beberapa pewarisan (dan menangani masalah terkait), itu sangat dibatasi.
1
@delnan: Sebenarnya, Anda masih dapat menggunakan komposisi untuk membangun fungsionalitas.
Robert Harvey
2
@ RobertTarvey Saya berasumsi Anda sedang berbicara tentang pembatasan oleh kurangnya pewarisan berganda. Ya, orang dapat menirunya dengan komposisi yang cukup, tetapi saya tidak menganggapnya dapat diterima. Sebagai contoh, sebuah objek yang biasanya mengimplementasikan dua antarmuka harus diimplementasikan dua kali, dalam subkelas dari kelas dasar yang berbeda (dan sementara kedua implementasi dapat mendelegasikan ke kelas umum, itu masih merupakan shitload kode tambahan dan Anda tidak dapat dengan mudah mengubah sebuah instance dari satu ke instance dari yang lain).
@delnan: Apa yang salah dengan menggunakan warisan untuk subtyping dan polimorfisme? Itulah warisan untuk ...
Mason Wheeler

Jawaban:

6

apa manfaat memiliki kelas sebagai unit kompilasi?

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.

Telastyn
sumber
Saya berencana hanya memiliki satu kelas tingkat atas tunggal, the 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?
jcora
@yannbane - Maksud objectsaya, 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 .
Telastyn
Perilaku seperti modul itu akan dicapai melalui penggunaan metode / variabel statis, kan? Apakah buruk untuk, bukannya membuat kelas yang dapat dipakai, buat kelas yang hanya memiliki anggota dan metode statis? Saya melihat artikel itu, namun, saya pikir itu tidak berlaku untuk anggota statis konstan , atau metode statis. Sebagai contoh, saya tidak melihat ada yang salah dalam membuat Mathkelas, yang sebenarnya adalah sebuah modul dengan metode statis dan anggota ganda statis konstan yang disebut Pi.
jcora
@yannbane - Tidak, tidak juga. Modul adalah modul karena mereka instantiatable. Kalau tidak, Anda hanya memiliki ruang nama gaya C ++. Setelah Anda membatasi kelas tingkat atas Anda menjadi ruang nama gaya C ++, mereka tidak benar-benar kelas lagi.
Telastyn
Hm, saya masih OK dan tidak benar-benar melihat masalah dengan membuat modul dengan kelas. Dan ya, modul bertindak sebagai ruang nama, terutama modul Python.
jcora
4

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.

agas
sumber