Apakah kita membuat bahasa pemrograman dengan menulis kompiler?

8

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.

Haych
sumber
Apakah pertanyaan Anda tentang membuat definisi bahasa pemrograman tepat ?
Anton Trunov
Tidak juga. Itu lebih, bisakah saya secara teoritis membuat satu-satunya bahasa saya hanya dengan membuat kompiler yang mem-parsing beberapa teks? Di mana teks ini adalah bahasa buatan saya di sintaksis saya. Sebagai contoh, adalah System.out.println()Java karena kompiler Java menerima itu atau ada hal lain yang bekerja di sini.
Haych
3
Apa yang Anda maksud dengan "penciptaan bahasa pemrograman"? Apa yang Anda maksud dengan "dilakukan melalui"? Sulit bagi saya untuk mengatakan dengan tepat apa yang Anda minta. Anda mengatakan Anda telah membuat semua keputusan tentang bagaimana Anda ingin bahasa itu terlihat dan bertindak; apa lagi yang ada untuk penciptaan bahasa pemrograman, dari sudut pandang Anda? Jika Anda mencoba menguraikan apa yang ingin Anda capai, Anda mungkin dapat memberikan jawaban yang lebih bermanfaat tentang bagaimana hal itu dapat dicapai. Saat ini sepertinya kami harus menebak apa yang mungkin Anda tanyakan.
DW

Jawaban:

10

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.

bellpeace
sumber
3
Ini salah. Bahasa pemrograman tanpa spesifikasi formal masih merupakan bahasa pemrograman.
reinierpost
3
@reinierpost Jadi, jawaban Anda untuk pertanyaan "apakah pembuatan bahasa pemrograman dilakukan melalui kompiler" adalah ya? Jika demikian, maka saya yakin Anda harus menuliskannya sebagai jawaban.
bellpeace
4
@reinierpost: Rumah yang tidak dirancang oleh arsitek masih berupa rumah. Tapi rumah seperti apa yang Anda inginkan untuk tinggal?
Andrej Bauer
1
Pertanyaan yang dinyatakan ambigu. Bisakah bahasa pemrograman dibuat dengan membuat kompiler untuk itu? Pastinya. Apakah ini cara untuk membuat bahasa pemrograman? Tidak, itu hanya satu cara yang mungkin.
reinierpost
2
@ johan Bahasa pemrograman adalah kepentingan praktis dan teoretis yang terlalu besar untuk ditinggalkan sebagai konsep yang tidak didefinisikan secara tepat. Misalnya, bagaimana Anda menjelaskan dengan tepat kepada seseorang apa itu C atau bagaimana cara kerjanya? Dengan memberinya kompiler C? Tetapi ada begitu banyak dari mereka dan mereka berbeda! Selain itu, dalam banyak kasus kita bahkan tidak tahu apa yang akan dilakukan oleh kompiler C (petunjuk: concurrency, model memori). Sebenarnya, kompiler / intepreter `` menginduksi "bahasa pemrograman, tetapi menganggap bahasa pemrograman sebagai implementasi semata menimbulkan lebih banyak masalah daripada yang dipecahkannya.
bellpeace
5

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?

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.

Pertanyaan saya adalah, apakah pembuatan bahasa pemrograman dilakukan melalui kompiler? Tingkat tinggi baik-baik saja.

Tidak. Pembuatan bahasa pemrograman dilakukan dengan membuat dua set aturan:

  1. seperti apa program hukum (sintaksis)
  2. apa yang program hukum lakukan (semantik)

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.

Jörg W Mittag
sumber
0

Apakah pembuatan bahasa pemrograman dilakukan melalui kompiler?

Ada 3 opsi.

  • Assembler
  • Seorang penerjemah
  • Kompiler


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.

Johan
sumber
Ada lebih dari tiga opsi. Sebagai contoh, satu opsi adalah: tidak melakukan apa pun. Anda dapat membuat bahasa pemrograman hanya dengan menyatakan aturannya. Anda tidak perlu menerapkannya sama sekali. Plankalkül tidak diimplementasikan hingga 60 tahun (?) Setelah dibuat. LISP dan APL awalnya tidak dimaksudkan untuk diimplementasikan sama sekali, LISP dirancang sebagai versi yang lebih mudah ditelusur dari kalkulus λ untuk mempelajari komputasi, APL dirancang sebagai notasi untuk pengajaran matematika. Buku Struktur dan Interpretasi Mekanika Klasik menggunakan Skema sebagai notasi untuk menggambarkan sistem yang dinamis, bukan sebagai ...
Jörg W Mittag
bahasa untuk menulis program yang benar-benar dijalankan.
Jörg W Mittag
0

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.

smac89
sumber
Ini belum tentu benar. Ada banyak contoh bahasa yang dibuat bersamaan dengan program yang ditulis untuk memprosesnya. FORTRAN adalah nama kompiler, bukan bahasa.
reinierpost
@reinierpost Maksud saya adalah sebelum seorang kompiler dapat mengenali satu set token di dalam bahasa yang diberikannya, token tersebut harus ada terlebih dahulu ... oleh karena itu bahasa telah ada sebelum penyelesaian kompiler. Bahasa tidak akan ada tanpa komponen paling dasar yang merupakan kata / frasa dalam bahasa itu. Semantik bisa datang nanti. Dengan cara yang hampir sama, seorang kompiler bahkan tidak bisa mulai berpura-pura mengkompilasi sebuah bahasa jika ia tidak tahu kata-kata yang membentuk bahasa itu
smac89
Tidak perlu ada bahasa yang 'diberikan'. Kompiler dapat memproses input tanpa definisi spesifik apa yang merupakan input yang valid untuknya. Cobalah untuk mendapatkan kerumunan programmer C untuk menyetujui apa yang sebenarnya dan bukan program C. Semoga berhasil!
reinierpost