Saya tahu tidak ada dua bahasa pemrograman yang benar-benar cocok tetapi saya ingin bertanya apakah saya memiliki program sederhana seperti hello world dan saya menjalankan fase terjemahan kompilasi Seperti lex, parse lalu dapatkan pohon AST, bisakah saya mengirimkannya ke lingkungan lain, katakan Beberapa c AST pohon dan menafsirkannya dengan Java
Bisakah Pohon Sintaks Abstrak dikompilasi oleh banyak Kompiler atau Interpreter?
Jawaban (3)
Jawaban singkatnya: Tidak.
Versi yang lebih panjang:
Jika Anda memiliki dua implementasi bahasa berbeda yang mendokumentasikan dan mengekspor antarmuka AST-nya, dan kedua antarmuka tersebut cukup mirip sehingga Anda dapat menerjemahkan keduanya, maka Anda dapat mengkompilasi ke AST dan kemudian mencoba meneruskan AST ke salah satu implementasi tersebut.
Saya hanya dapat berbicara secara hipotetis di sini, karena implementasi bahasa jarang menyertakan antarmuka AST yang dapat diakses secara eksternal. (Satu pengecualian adalah Python, yang memungkinkan Anda mengkompilasi ke AST, membuat atau memodifikasi AST, lalu mengkompilasi dari AST. Di sini, "kompilasi" berarti "kompilasi ke kode VM". Lihat Dokumen Python untuk informasi lebih lanjut.)
Secara khusus, saya tidak tahu implementasi Java yang mana. Baik GCC maupun clang dapat menghasilkan keluaran yang menyerupai AST, namun tidak satu pun dari keduanya yang menerima AST, dan keluarannya mungkin tidak cukup lengkap untuk mendefinisikan semua aspek unit terjemahan.
Saya tidak mengetahui adanya format representasi AST
standar yang memungkinkan berbagi seperti itu (dengan asumsi kita berbicara tentang bahasa dengan semantik serupa), tetapi misalnya di Clang+LLVM arsitektur tampaknya keluaran AST
dapat dimasukkan ke beberapa generator kode (kompiler).
Sejauh apakah ada Java
penerjemah bahasa apa pun yang membaca AST
Saya kira hal seperti itu tidak ada dan saya ragu apakah mungkin untuk membangunnya karena arti kata dalam bahasa pemrograman yang berbeda berbeda.
EDIT 30-03-2015 setelah mengklarifikasi komentar
Katakanlah saya membuat serial
AST
menjadi aliran byte, mengirimkannya melalui soket, dan membatalkan serialisasinya kembali menjadi pohon objek dalam program yang ditulis dalam bahasa lain. MenggunakanJSON
,YAML
,XML
yang merupakan bahasa sederhana dan cukup standar untuk membuat serialisasi dan deserialisasi data arbitrer, Kemudian temukan parser untuk bahasa tersebut dalam bahasa yang diinginkan. Saya pikir secara teknis itu mungkin
Memiliki subset sederhana yang konkrit dari bahasa pemrograman yang konkrit, katakanlah bahasa prosedural yang konkrit, misalnya Tiny C, Anda dapat membuat pohon parsing di satu komputer dan mengirimkannya ke komputer lain untuk " menafsirkan". Kueri Google ast intermediate representation
dapat memberi Anda beberapa petunjuk seperti http://icps.u-strasbg.fr/~pop/gcc-ast.html atau http://lambda-the-ultimate.org/node/716, tetapi masalahnya berbeda dengan bahasa asli Anda apa pun dengan AST
dan penerjemah universal di Java
Saya sedang mengerjakan eksperimen
asm.js adalah versi modern dari "parse program dalam suatu bahasa di satu mesin dan mengirimkannya ke mesin lain mesin untuk menafsirkan masalah". Dimana mesin lainnya adalah browser web modern dan format serialisasi adalah bagian dari JavaScript
. Dengan miliaran browser web di seluruh dunia, percobaan yang menggunakan ini dapat bermanfaat secara komersial dan bermanfaat karena proyek ini memerlukan dukungan atau penelitian lebih lanjut dari orang-orang seperti Anda (?)
Lihat juga:
Menggemakan tanggapan Rici: Jawaban singkatnya, tidak.
Ide ini telah dicoba lebih dari sekali. Biasanya gagal setidaknya karena Anda tidak dapat menentukan satu simpul AST untuk "tambah" yang berarti satu hal untuk semua bahasa. Semantik jelas berbeda, dan Anda harus dapat membedakan arti operator dalam konteks bahasa tertentu di mana kata tersebut ditemukan. Ada banyak masalah lain, seperti menyepakati detail operator representasi (pohon? DAG? grafik?) dan berapa banyak informasi yang dibawa (AST? Tabel simbol? Aliran kontrol? ...)
Orang-orang terus mencoba.
Grup Manajemen Objek memiliki spesifikasi Model Pohon Sintaks Abstrak, yang berupaya mendefinisikan AST universal. Apa yang OMG temukan adalah, untuk menjadikan hal ini praktis, di samping "Model AST Umum" (ick, "GASTM" bergaya nirwana), mereka juga perlu memiliki apa yang disebut "Model AST Spesifik" ("SASTM"), misalnya, . AST yang khusus untuk bahasa tersebut, bahkan parser khusus untuk bahasa tersebut, agar dapat menafsirkan arti operator dan operan secara akurat, seperti yang dihasilkan oleh parser tersebut.
[Saya membuat alat yang menangani banyak bahasa secara bersamaan. Ini menyelesaikan masalah arti sebuah node dengan menandai setiap node dengan operator, misalnya, "+", dan "domain" (sistem notasi) di mana operator harus ditafsirkan. Sebenarnya, ini sama dengan solusi SASTM. Kami tidak percaya pada GASTM jadi jangan ambil pusing dengan hal itu.].