Apakah mungkin untuk mengkompilasi bahasa tingkat yang lebih tinggi ke C ++ yang dapat dibaca? [Tutup]

12

C ++ adalah bahasa yang bagus dalam banyak hal, tetapi beberapa hal khususnya rumit untuk ditulis tanpa IDE. Sebagai pengguna VIM, akan sangat menarik jika saya memiliki akses ke bahasa tingkat yang lebih tinggi yang memungkinkan saya untuk menulis C ++ dengan S-Expressions dan mungkin dengan macro seperti Lisp, memungkinkan untuk pembuatan kode bersih sambil menghindari penulisan ulang patters yang sama lagi dan lagi.

Saya telah bertanya pada freenode dan menguji beberapa ide, seperti mengkompilasi Lisp-> C dengan kompiler seperti ECL dan Bigloo, tetapi tidak ada satupun yang menghasilkan kode C yang bersih.

Apakah ada karya tentang masalah ini?

Viktor Maia
sumber
3
Mengapa tidak menulis kode Anda dalam sebuah lisp dengan makro sedemikian rupa sehingga semuanya C ++ dan kemudian fitur-fitur yang Anda inginkan tetapi sulit untuk dibersihkan hanya perlu diperluas oleh makro LISP dari sintaksis sederhana ke C ++ yang lebih kompleks. Lebih baik lagi, Anda bisa menulis kode Anda di LISP. :)
Jimmy Hoffa
2
Apakah Anda mengharapkan terjemahan Lisp -> C ++ untuk menghasilkan kode C ++ yang bersih, ketika perakitan C ++ -> (yang bisa dibilang lebih sederhana) menghasilkan perakitan yang tidak dapat dibaca (tergantung pendapat)? Siapa target kompilasi yang dimaksudkan untuk anyways?
1
Entah bagaimana saya tidak sepenuhnya yakin ada orang yang telah menulis makro untuk memperluas apa yang ingin Anda kembangkan, tetapi sebagai aturan makro sangat mudah untuk menulis, mereka hanya daftar metode pemrosesan, Anda seharusnya tidak memiliki banyak kesulitan hanya menulisnya semua di dalam satu ekspresi-s yang Anda batasi ketika Anda ingin makro expander memperhatikan, maka cukup cetak daftar untuk mendapatkan kode C ++ Anda dengan ekspansi.
Jimmy Hoffa
2
Saya setuju bahwa Lisp dapat melakukan hal-hal tertentu yang sulit di C ++ (seperti penutupan). Apakah Anda perlu melakukan hal-hal itu? Maka karena sulit dilakukan di C ++, tidak peduli bagaimana Anda memasukkannya ke dalam C ++, secara otomatis atau manual, itu tidak akan cantik. Saran saya: Jika Anda tidak benar-benar benar-benar membutuhkan hal-hal sulit yang dapat dilakukan Lisp, jangan gunakan Lisp. Dapatkan bagus di C ++. Jika Anda harus menggunakan hal-hal itu, tetapi Anda harus kode dalam C ++, maka cari tahu bagaimana melakukannya di C ++. Itulah yang memisahkan orang dewasa dari anak-anak dalam bisnis ini.
Mike Dunlavey
3
Ada beberapa bahasa yang memiliki kompiler yang mengeluarkan kode C, jadi saya tidak melihat mengapa ini tidak layak, bahkan jika itu seperti kode C ++ seperti C. Jika pertanyaan Anda adalah "bisakah saya mendapatkan kode C ++ kanonik, praktik terbaik menggunakan semua fitur yang tersedia di C ++," itu mungkin sedikit lebih sulit.
Robert Harvey

Jawaban:

13

Mengkompilasi bahasa tingkat yang lebih tinggi ke yang lebih rendah adalah kue. Ada banyak contoh yang sedang dilakukan. Tanpa menyinggung banyak singgung, kita dapat menunjuk ke kompiler C ++ awal yang dikompilasi ke C.

Namun, ketika Anda mulai melemparkan "bersih" dan "dapat dibaca" ke dalam campuran, segalanya menjadi sangat sulit. Kode yang bersih dan mudah dibaca mengungkapkan arti dan maksud dari apa yang Anda tulis. Komputer terkenal buruk dalam menafsirkan & menciptakan makna. Anda lebih mungkin berakhir dengan variabel yang diberi nama int_147daripada input_buffer_length. Tentu, jika Anda benar - benar ingin membuat proyek ini berhasil, Anda dapat terlibat dalam proyek AI besar-besaran untuk menangani pengubahan Lisp Anda menjadi semacam C ++ yang dapat dibaca dengan baik, tetapi, jujur ​​saja, kompilator Lisp umum sangat bagus dalam apa yang mereka lakukan. .

Lebih penting daripada kesulitan menghasilkan C ++ dari Lisp adalah kegunaannya. Apa gunanya agar C ++ yang dihasilkan dapat dibaca? Jika Lisp adalah kode sumber Anda, representasi perantara seharusnya tidak relevan. Jika Anda ingin bisa menyerahkan C ++ ke programmer yang tidak mengerti Lisp asli Anda, Anda sekarang punya masalah lain . Apa yang terjadi ketika mereka ingin memodifikasi C ++ yang Anda hasilkan? Apa yang terjadi jika mereka menulis hal-hal dalam C ++ yang tidak diterjemahkan dengan rapi ke Lisp Anda?

Katakanlah kita telah menyelesaikannya. Ini satu dekade kemudian dan, setelah membakar ratusan juta dolar dari uang hibah DoD, kami telah membangun mesin terjemahan bahasa yang masif, kompleks (tapi tanpa cacat) ini yang dapat mengubah Lisp menjadi C ++ yang idiomatis dan sebaliknya. Apa yang benar-benar kita peroleh yang tidak akan lebih baik dicapai dengan mengajar orang lain bahasa pemrograman baru atau hanya mengembangkan kompiler baru yang memungkinkan kita menghubungkan kedua bahasa?

Oh benar Bos Anda ingin Anda menulis C ++ dan Anda lebih suka tidak melakukannya. Perbarui resume Anda & cari pekerjaan baru.

Sean McSomething
sumber
Saya berharap dapat memperbarui resume saya dan mencari pekerjaan lain. Sayangnya itu tidak begitu mudah ketika pekerjaan = "mahasiswa" dan bos = "profesor". Dan yang paling disayangkan, saya seharusnya memiliki ijazah. Terlepas dari kenyataan saya tidak pergi ke kelas, tetapi mempelajarinya sendiri di rumah. Kenyataannya saya sudah bekerja di industri dan menghasilkan lebih banyak uang daripada kebanyakan lulusan yang saya tahu. Begitulah cara kerjanya. Dengan sedih. Syukurlah prof saya menerima saya jika saya menulis sesuatu yang menyulitkan di C ++. Saya sudah tahu C ++. Jadi saya lebih suka mengambil kesempatan untuk mempelajari sesuatu yang berbeda (; Sampaikan kata-kata kasar, jawaban yang bagus. Terima kasih.
MaiaVictor
@ Dokkat: Saya tidak percaya Anda tahu C ++. Bisakah Anda menulis template dengan implementasi khusus tergantung pada apakah parameter memiliki beberapa metode atau fungsi? Sudahkah Anda melakukan perhitungan waktu kompilasi menggunakan Boost.MPL? Apakah Anda memahami cara kerja Boost.ForEach? Jika Anda harus melakukannya di C ++, gunakan sebagai kesempatan untuk mempelajari lebih lanjut C ++. Ini akan lebih bermanfaat untuk pekerjaan Anda juga.
Jan Hudec
1
Yah saya telah melakukan beberapa template yang cukup rumit ketika saya bekerja dengan C ++ tahun-tahun yang menyedihkan. Ya saya menggunakan Boost. Selama setiap banyak, saya ingat mendefinisikan banyak makro untuk membuatnya lebih berguna. Lagi pula saya masih kecil, itu bukan pengalaman yang menyenangkan. Saya tidak mendapatkan poin dalam belajar lebih jauh, ketika Lisp menyediakan sistem makro yang jauh lebih solid, tidak begitu menyakitkan, yang mencapai metaprogramming semacam itu sehingga C ++ membutuhkan keterampilan guru.
MaiaVictor
3

Jawaban singkat, tidak ada yang tersedia saat ini yang akan membantu Anda mengonversi Lisp menjadi READABLE C ++. Tentu Anda dapat mengonversi apa pun menjadi C ++ atau C tetapi kode yang dapat dibaca ditulis oleh manusia, bukan program. Tentu Anda dapat menampilkan kode C ++ dengan pemformatan yang tepat, indentasi, nama kelas yang bagus, dan mungkin bahkan mendapatkan terjemahan yang sempurna dari objek kelas Lisp ke kelas C ++. Mungkin Anda bisa membuat tautan dependensi perpustakaan Anda terhubung dengan benar, dan mungkin Anda bisa mengkompilasi binari yang sangat dekat dengan apa yang akan dihasilkan oleh bahasa C seandainya Anda menulis semuanya dalam C. Tapi pada akhirnya, kode yang dapat dibaca adalah keindahan yang tidak dipahami. oleh siapa pun, setidaknya belum, dan mungkin tidak pernah mempertimbangkan bahwa istilah itu dapat dibaca cukup subyektif untuk memulai dan apa yang dianggap dapat dibaca di antara satu kelompok pengembang dapat dianggap mengerikan oleh yang lain.

Agar C ++ dapat dibaca, Anda harus menulis dalam C ++, bukan di Lisp. Anda juga harus dapat mengubah gaya pengkodean Anda sesuai dengan apa yang orang-orang yang akan membaca kode Anda akan mengerti. Sama seperti buku, program ditulis dengan khalayak tertentu dalam pikiran dan dapat menjadi indah dan menyentuh jika ditulis dengan baik, dan dikaburkan dan membosankan jika tidak. Dan jika kita tidak dapat membuat program untuk menulis novel fiksi yang indah untuk kita, maka kita tidak akan dapat membuat sesuatu untuk dikonversi menjadi C ++ yang dapat dibaca.

Shashank Gupta
sumber
Saya kira Anda terlalu mengerti apa yang saya maksud dengan "dapat dibaca"! Itu tidak harus benar-benar indah. Cukup sehingga Anda dapat membacanya dan memahami apa yang sedang terjadi. Saya kira saya akan pergi dengan beberapa makro Lisp untuk terjemahan langsung, seperti yang disarankan JimmyHoffa pada komentar.
MaiaVictor
3

ViM adalah IDE yang bagus untuk C ++. Ini memiliki penyelesaian terbaik yang pernah saya lihat sejauh ini, meskipun akan sedikit lambat jika Anda menarik banyak header, dentang lengkap . Dan untuk kompilasi saya menemukan semua IDE kurang; Anda akhirnya menulis membangun sistem di CMake atau apalah. Dan saya tidak melihat apa-apa untuk memberikan setiap bantuan untuk cadel, periode.

Benar, C ++ tidak memiliki makro gaya lisp, tetapi templat dapat melakukan semua makro yang higienis, dan sebagian lagi, karena Anda dapat mengimplementasikannya secara berbeda berdasarkan jenis dan berdasarkan kemampuannya. Benar, kurangnya pengumpul sampah membuat penutupan sedikit lebih membosankan, tetapi idiom RAII yang digunakan untuk pengelolaan sumber daya memiliki kelebihan dan sifat menarik.

Jika Anda seorang siswa, apakah Anda benar-benar tahu semua C ++ lanjutan? Dari pustaka algoritma atas penulisan templat dengan implementasi alternatif berdasarkan properti tipe argumen, kompilasi perhitungan waktu menggunakan templat meta-pemrograman (menggunakan Boost.MPL) hingga memahami bagaimana Boost bekerja di bawah tenda? Jika tidak, saya sarankan mengambil ini sebagai kesempatan untuk mempelajari beberapa C ++ lanjutan. Tugas sekolah tidak perlu dipertahankan, sehingga Anda dapat bermain dengan bahasa untuk melihat apa fitur yang layak di mana dalam kode produksi Anda harus berhati-hati tentang keterbacaan.


Dan untuk menjawab pertanyaan langsung terakhir: C ++ memiliki lebih banyak idiom di bawah ikat pinggangnya sehingga tidak ada cara untuk menghasilkan C ++ idiomatik dari apa pun. Hanya karena tidak akan ada cara untuk mengekspresikan sebagian besar idiom itu dalam hal lain. Mulai dari fakta bahwa apa pun yang akan pengumpulan sampah akan mengalokasikan semua yang ada di heap sementara di C ++ adalah idiomatis untuk mengambil keuntungan dari stack.

Jan Hudec
sumber
Setuju pada VIM. Ini cocok seperti sarung tangan untuk pengembangan C. Saya adalah pengguna Vim tetapi untuk Lisp saya menggunakan Emacs dalam mode kejahatan dengan SLIME dan Paredit. Ada beberapa dukungan untuk Lisping in vim dengan kait REPL dasar tetapi mereka tidak mendekati SLIME.
mike30