Ini adalah bagian dari serangkaian pertanyaan yang berfokus pada proyek yang disebut Proyek Abstraksi, yang bertujuan untuk abstrak konsep-konsep yang digunakan dalam desain bahasa dalam bentuk kerangka kerja.
Halaman lain yang terkait dengan itu terkait dengan pengetikan struktural dapat dilihat di sini . Meta-topik yang terkait dengan penyelidikan tentang kerangka kerja dan tempat yang tepat untuk memposting dapat ditemukan di sini .
Seberapa mudah seharusnya menggunakan Kerangka Pengembangan Bahasa?
Saya telah menulis kerangka kerja pembuatan kode skala besar yang juga mencakup kemampuan untuk mengirim hasilnya ke kompiler khusus bahasa. Topik kemudahan penggunaan muncul dari satu contoh kerangka kerja seperti: CodeDOM, atau Model Obyek Dokumen Kode.
Ini adalah kerangka kerja yang ditulis oleh Microsoft yang menggambarkan struktur kode umum, tetapi umumnya meninggalkan banyak (pemaksaan ekspresi) dan cenderung agak abstrak dalam representasi konstruk tertentu, untuk benar-benar memancarkan kode buruk berdasarkan pada apa yang Anda lakukan: sebelumnya CodeDOM buruk ditangani memancarkan PrivateImplementationType
pada CodeMemberMethod
, ketika jenis yang digunakan adalah antarmuka generik. CodeDOM adalah alasan asli saya untuk menulis generator kode pertama saya.
Satu hal yang saya coba lakukan, untuk menyederhanakan kerangka kerja, adalah mengurangi jumlah pekerjaan yang perlu Anda lakukan sesuatu, dan fokus pada tindakan versus jenis spesifik yang membentuk tindakan itu.
Inilah perbandingan berdampingan tentang cara kerja kerangka yang saya tulis:
//Truncated...
/* *
* From a project that generates a lexer, this is the
* state->state transition character range selection logic.
* */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
* 'start' <= nextChar && nextChar <= 'end'
* */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));
Versus CodeDOM:
//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));
Fokus kerangka kerja ini adalah penggemar bahasa, serta mereka yang tertarik untuk menghasilkan kode atau aplikasi. Mengingat fokusnya pada kompilasi, pembuatan kode, dan pengembangan bahasa, haruskah kerangka kerja fokus pada kemudahan penggunaan atau daya mentah?
Tujuan utama saya adalah untuk meningkatkan ketersediaan alat-alat seperti itu, sehingga mereka yang tertarik pada domain tidak memerlukan banyak pengalaman dalam domain teori bahasa sebelum mereka dapat mulai bekerja pada proyek-proyek yang berfokus pada bahasa mereka sendiri.
Mengingat bahwa saya penulis kerangka kerja, pandangan saya tentang "kegunaan" bias. Jadi, saya harus bertanya kepada yang lain apakah fokus dan tujuan masuk akal bagi orang lain yang tidak terkait dengan proyek.
sumber
Jawaban:
Sulit membangun kerangka pengembangan bahasa. Anda harus memutuskan hal-hal apa yang Anda ingin dukung, maka Anda harus memutuskan mana yang Anda tahu cara melakukannya, dan bagaimana memadukannya menjadi satu kesatuan yang koheren. Akhirnya, Anda telah melakukan investasi yang cukup sehingga bekerja dengan bahasa nyata (mis., Bahasa komputer khas serta DSL), dan benar-benar melakukan sesuatu yang bermanfaat. Topi saya untuk Anda untuk mencoba.
Anda dapat membandingkan usaha Anda dengan yang saya mulai 15 tahun yang lalu, DMS Software Reengineering Toolkit . DMS dimaksudkan untuk memberikan parsing tujuan umum, analisis, dan transformasi kode. Diberikan spesifikasi langauge eksplisit, itu akan mengurai kode, membangun AST, membuat ulang kode dari AST (prettyprint), mengubah kode menggunakan pola yang ditulis dalam bahasa pemrograman yang ditargetkan, membangun tabel simbol, kontrol komputasi dan aliran data, dll. Dengan menambahkan kode khusus, satu membuat DMS membawa berbagai efek. (Lihat alat di situs; semuanya DMS dalam satu atau lain bentuk).
Berikut ini makalah teknis tentang DMS seperti beberapa tahun yang lalu. (Kami terus meningkatkannya)
Walaupun DMS sendiri sulit dibangun, kami menemukan bahwa dibutuhkan sejumlah besar teknik yang sesuai untuk mendefinisikan bahasa nyata ke DMS, termasuk IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (dan banyak lainnya).
Apa yang kami pikirkan (cukup baik): menurunkan biaya alat bangunan sebesar 1-2 kali lipat. Artinya, tugas-tugas yang mungkin memakan waktu 1-10 tahun dapat direnungkan oleh manusia biasa sebagai proyek 1 bulan-1 tahun. Yang masih tidak mudah:
Jadi, ada banyak ruang untuk perbaikan. Biarkan banyak bunga mekar.
sumber
Pertanyaan ini mungkin telah dijawab di The Mythical Man Month, bagian "Integritas Konseptual". Jika tidak, itu setidaknya sangat relevan dengan pertanyaan Anda. Meskipun Brooks mendeskripsikan merancang seluruh sistem komputasi, esai ini berlaku dengan sangat baik untuk kerangka kerja dan bahasa baru.
Saya percaya ada korelasi positif antara tingkat adopsi teknologi apa pun dengan integritas konseptual dan kemudahan penggunaannya. Seharusnya ada studi kasus teknologi terbaru seperti bahasa, kerangka kerja, dan OS, untuk membuktikan korelasi ini, tetapi belum ada yang tahu.
sumber