Bisakah Pohon Sintaks Abstrak dikompilasi oleh banyak Kompiler atau Interpreter?

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


person user22092    schedule 29.03.2015    source sumber


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.

person rici    schedule 29.03.2015
comment
Terima kasih rici tetapi saya akan membuat argumen katakanlah saya membuat serial AST menjadi aliran byte, mengirimkannya melalui soket, dan membatalkan serialisasinya kembali ke pohon objek dalam program yang ditulis dalam bahasa lain. Menggunakan JSON, YAML, dan 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. Yang mana menurut saya secara teknis mungkin? Biarkan saya mendengar pendapat Anda - person user22092; 29.03.2015
comment
@ user22092: Anda tentu bebas mencoba memberi sedikit daging pada tulang itu. Ya, secara teoritis mungkin, meskipun deskripsi Anda mencakup sejumlah masalah. Seperti yang saya katakan di jawaban, sebagian besar bahasa tidak mendefinisikan kumpulan objek AST standar, apalagi menyediakannya dalam runtime standar. Selain itu, AST tidak menangkap keseluruhan parse -- ada juga, misalnya, tabel simbol -- dan tidak ada jaminan bahwa totalitas input yang diproses adalah sebuah pohon sama sekali. (Tidak ada format pertukaran yang Anda sebutkan yang dapat menangani grafik.) Tapi seperti saya katakan, lakukanlah! - person rici; 30.03.2015
comment
Oke saya akan mencobanya saat ini masih mengerjakannya - person user22092; 02.04.2015
comment
@ user22092: pertimbangkan untuk membuat Java AST untuk x+y, (+ x y), dengan x dan y adalah tipe string. Tidak ada yang akan menghentikan Anda mengirimkan pohon itu ke kompiler C yang bersedia menerimanya. Namun interpretasi C terhadap (+ ....) hanya memungkinkan aritmatika numerik. Jadi mengirimkan pohon tanpa perubahan adalah resep untuk bencana semantik. Bahasa cukup berbeda dalam penafsiran operatornya sehingga hal ini tidak akan berfungsi jika operator memiliki nama yang sama. Lebih parahnya lagi, apa yang dilakukan bahasa penerima terhadap operator yang diterimanya, yang tidak ada dalam bahasanya? (setjmp di Jawa?) - person Ira Baxter; 04.04.2015

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. Menggunakan JSON, 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:

person xmojmr    schedule 29.03.2015
comment
Terima kasih xmojmr tetapi saya akan membuat argumen katakanlah saya membuat serial AST menjadi aliran byte, mengirimkannya melalui soket, dan membatalkan serialisasinya kembali ke pohon objek dalam program yang ditulis dalam bahasa lain. Menggunakan JSON, YAML, dan 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. Yang mana menurut saya secara teknis mungkin? Biarkan saya mendengar pendapat Anda - person user22092; 29.03.2015
comment
@ user22092 Begitu. Saya telah menambahkan satu bab lagi ke jawaban saya. Jika Anda menyukainya dan tidak ada yang memberikan sesuatu yang lebih baik dalam jangka waktu yang wajar, maka cara Stack Overflow untuk mengucapkan terima kasih adalah dengan memberi suara atau dengan menerima jawabannya - person xmojmr; 30.03.2015

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.].

person Ira Baxter    schedule 14.04.2015
comment
Oke, saya sudah mempelajarinya, tetapi yang saya lakukan sekarang adalah membuat teks Sumber, dengan aturan dan Tata Bahasa saya sendiri. Kemudian ketika saya membuat pohon untuk bahasa baru itu, saya menulis dan menerjemahkan dengan python dan Java untuk mengevaluasi pohon tersebut, memberi saya hasilnya. Ya ampun, aku ingin pohon Universal ini menjadi standar. dengan begitu kita dapat melakukan benchmark kode tanpa harus menulis semuanya atau beralih dari bahasa yang sederhana - person user22092; 14.04.2015
comment
Mendefinisikan Pohon Sintaks Abstrak Spesifik (Model) [SASTM!] dengan makna yang terdefinisi dengan baik, sehingga dua aplikasi berbeda dapat membaca dan menafsirkan model spesifik tersebut dengan benar. Percaya bahwa Anda dapat membangun sintaksis Universal adalah hal lain. Anda sedang miring ke arah kincir angin. - person Ira Baxter; 14.04.2015
comment
Oke Terima kasih tapi sebagai orang CS saya tidak pernah mengatakan tidak pernah oke - person user22092; 14.04.2015
comment
Saya telah melakukan ini selama sekitar 40 tahun. Belum ada jawaban. Semoga beruntung dengan itu di sini. - person Ira Baxter; 14.04.2015