Katakanlah, saya ingin membuat bahasa pemrograman saya sendiri. Dengan asumsi bahwa saya telah membuat semua keputusan tentang bagaimana saya ingin terlihat dan bertindak, apakah saya hanya perlu menulis kompiler untuk itu?
Sebagai contoh, apakah kode Java tingkat tinggi tidak lain dari sekedar teks dan teks ini dalam format yang benar untuk kompiler untuk menerimanya dan mengubahnya menjadi sesuatu yang lain?
Pertanyaan saya adalah, apakah pembuatan bahasa pemrograman dilakukan melalui kompiler? Tingkat tinggi baik-baik saja.
System.out.println()
Java karena kompiler Java menerima itu atau ada hal lain yang bekerja di sini.Jawaban:
Jawaban singkatnya adalah tidak .
Anda dapat menganggap bahasa pemrograman sebagai formalisme matematika yang digunakan untuk mengekspresikan komputasi. Compiler / interpreter adalah hanya bagian dari perangkat lunak aktual yang melakukan perhitungan itu, dan tidak boleh berfungsi sebagai spesifikasi bahasa.
Yang sedang berkata, selain spesifikasi leksikal dan sintaksis suatu bahasa, Anda juga harus mendefinisikan spesifikasi semantik, yaitu, apa yang sebenarnya dimaksud oleh program (benar secara sintaksis) yang ditulis dalam bahasa Anda. Semantik yang jelas untuk memulai adalah semantik operasional , di mana makna suatu program diberikan dalam hal bagaimana sebenarnya program itu berjalan. Artinya, secara matematis mendefinisikan dengan tepat bagaimana program dijalankan. Di atas semantik ini Anda harus membangun kompiler / juru bahasa yang sebenarnya dengan optimisasi dan sebagainya.
Menentukan semantik operasional penuh dari bahasa Anda akan memberi Anda dokumentasi bahasa formal dan itu akan membuat Anda memahami bahasa Anda dengan sangat detail. Juga, itu akan memungkinkan Anda untuk secara formal beralasan tentang beberapa aspek bahasa. Menulis semantik operasional benar-benar kebiasaan yang baik.
Ada juga semantik yang bermanfaat, seperti semantik aksiomatik , denotasi , dan game . Namun, mereka lebih maju dan biasanya tidak membuat mereka menjadi kompiler / juru bahasa.
sumber
Tidak Membuat semua keputusan tentang bagaimana Anda ingin bahasa untuk melihat dan bertindak yang menciptakan bahasa pemrograman Anda sendiri. Anda tidak memerlukan kompiler atau juru bahasa untuk membuat bahasa pemrograman. Anda tidak memerlukan kompiler atau juru bahasa untuk menulis program dalam bahasa pemrograman Anda.
Anda hanya memerlukan kompiler atau juru bahasa jika Anda benar-benar ingin menjalankan program yang Anda tulis.
Tidak. Pembuatan bahasa pemrograman dilakukan dengan membuat dua set aturan:
Itu dia.
Ada bahasa pemrograman yang tidak memiliki implementasi. Atau yang tidak memiliki implementasi untuk waktu yang lama.
Misalnya, Konrad Zuse menciptakan Plankalkül pada pertengahan 1940-an, tetapi karena perang ia tidak pernah dapat mengimplementasikannya. Ini pertama kali dilaksanakan sebagai bagian dari disertasi pada tahun 1975. Tapi itu pasti ada pada 1950-an dan 1960-an.
LISP pada awalnya dirancang sebagai alternatif yang lebih dapat ditelusuri ke kalkulus λ untuk mempelajari komputasi. Itu diterapkan oleh Steve Russell, seorang siswa John McCarthy. McCarthy sendiri bahkan meragukan bahwa LISP dapat diimplementasikan sama sekali!
APL pada awalnya dirancang sebagai notasi untuk pengajaran matematika. Kemudian diperluas untuk berfungsi sebagai bahasa spesifikasi untuk IBM System / 360. Implementasi datang kemudian, setelah bahasa sudah digunakan.
PLANNER adalah bahasa yang sangat berpengaruh, yang sebenarnya hanya diterapkan setelah sudah mempengaruhi bahasa lain; itu dirancang pada tahun 1969 dan diimplementasikan pada tahun 1973, pada saat itu ia telah mempengaruhi Smalltalk dan Prolog (keduanya 1972).
Struktur dan Interpretasi Mekanika Klasik adalah buku teks fisika yang menggunakan Skema alih-alih matematika untuk menggambarkan sistem dinamis; fakta bahwa Skema memiliki penerjemah dan penyusun tidak penting untuk buku itu, ia digunakan sebagai bahasa untuk menyampaikan pikiran, bukan menjalankan program.
Seperti yang Anda lihat, bahasa pemrograman dapat bermanfaat bahkan tanpa implementasi. "Program harus ditulis untuk dibaca manusia, dan hanya untuk komputer yang dieksekusi" adalah kutipan terkenal dari Struktur dan Interpretasi Program Komputer. Bahasa pemrograman adalah bahasa formal untuk menggambarkan proses yang rumit secara jelas. Fakta bahwa jika Anda menggambarkan suatu proses yang cukup tepat untuk dipahami manusia, itu juga dapat dieksekusi oleh mesin adalah efek samping. Ini adalah efek samping yang sangat diinginkan, berguna, kuat, tetapi merupakan efek samping.
"Bahasa pemrograman" pertama, kalkulus λ, kalkulus SKI, Mesin Turing, fungsi rekursif μ, tidak diciptakan untuk dieksekusi. Mereka diciptakan untuk memahami pertanyaan mendasar dari logika dan matematika.
sumber
Ada 3 opsi.
Kode sumber Assembler yang ditulis oleh manusia menerjemahkan 1 ke 1 menjadi kode mesin yang dikonsumsi oleh CPU.
Interpreter
Suatu program membaca setiap baris kode, mengikuti instruksi dan menjalankannya secara berurutan.
Compiler
Suatu program mem-parsing pernyataan yang sering menggunakan Pohon Sintaksis Abstrak dan menggunakannya untuk menghasilkan kode objek.
Kompiler menghasilkan beberapa bentuk kode objek yang dapat dikonsumsi oleh mesin nyata atau virtual.
Memburamkan garis
Ada banyak perantara di sini.
Ruby dijalankan dari AST-nya. Java terkenal menjalankan kode byte untuk CPU fiksi.
SQL ditafsirkan, tetapi tidak dieksekusi seperti yang tertulis, itu diterjemahkan ke dalam rencana kueri.
Javascript ada di zona senja yang aneh. Ini diinterpretasikan untuk sebagian besar, tetapi bagian-bagian penting dijalankan melalui kompiler JIT yang menghasilkan kode byte non standar dan juga digunakan sebagai kode objek untuk beberapa kompiler.
Php dulunya adalah bahasa yang ditafsirkan murni, tetapi Facebook menggunakan kompiler php itu sendiri.
Rekomendasi saya
Jika Anda ingin bereksperimen dengan menulis bahasa pemrograman.
Mulai dengan penerjemah.
Jika Anda ingin memahami kompiler, pelajari AST !.
Bahasa seperti Pascal dibuat khusus untuk AST, ia dapat beralih dari kode sumber ke kode mesin dalam satu pass tunggal dan dengan demikian relatif mudah diimplementasikan dalam kompiler.
Jika Anda bersikeras mempelajari kompiler dan bukan penerjemah, saya sarankan Anda mempelajari tulisan-tulisan Wirth tentang subjek tersebut.
sumber
Semua kompiler lakukan adalah untuk memastikan bahwa input yang diberikan menggunakan bahasa yang dipahami oleh kompiler dan bahwa ia membawa struktur semantik yang sama dengan bahasa.
Compiler memalsukan kecerdasan dengan memanfaatkan lexer dan parser untuk menganalisis leksikal input dan mencoba untuk mengurai token ke dalam urutan yang memiliki makna yang dimaksudkan tanpa memperkenalkan ambiguitas.
Untuk menjawab pertanyaan Anda, Anda BISA membuat bahasa pemrograman dengan membuat kompiler, tetapi dengan melakukannya, bahasa pemrograman sebenarnya dibuat sebelum kompiler selesai.
Pikirkan bahasa pemrograman sebagai bahasa lain di luar sana - Bahasa Inggris, Prancis, Jerman, dll. Pekerjaan kompiler adalah, diberi beberapa masukan, pastikan kata-kata yang digunakan dalam input itu cocok dengan kata-kata yang digunakan dalam bahasa yang dibuat untuknya, buat Pastikan bahwa urutan kata-kata tersebut masuk akal dalam bahasa yang dibuat untuknya dan akhirnya menerjemahkan input itu ke dalam bahasa yang dapat dimengerti mesin.
sumber