Apakah ada bahasa yang mentransformasikan ke C, dengan sintaks yang lebih baik? [Tutup]
19
CoffeeScript adalah bahasa yang mentranslilasikan ke JavaScript, dengan sintaksis bersih, terinspirasi oleh Ruby. Apakah ada bahasa yang mirip dengan transile ke C, memungkinkan kode yang lebih mudah dibaca tanpa mengurangi kinerja? Jika tidak ada yang seperti itu, apakah ada alasan bagus untuk tidak membuatnya?
Perhatikan, bagaimanapun, bahwa "kompilasi ke C" tidak identik dengan "secepat program C asli". Ketika sesuatu dikompilasi ke C, itu akan sering menghasilkan kode yang agak (atau sepenuhnya) berbeda dari apa yang orang normal akan tuliskan dalam C. Itu mungkin dengan mudah jauh lebih lambat (atau kadang-kadang lebih cepat) daripada apa yang biasanya Anda tulis dengan tangan.
Jerry Coffin
4
Apa yang saya tidak suka tentang jawaban ini, adalah bahwa mereka mengusulkan bahasa yang sama sekali berbeda, seperti Vala. Hal tentang CoffeeScript adalah, itu IS Javascript, tetapi dengan sintaks yang berbeda.
Saya benar-benar berharap "transcompile" (kata) akan mati. Ini "kompilasi" dan "kompiler". Anda tidak perlu kata baru hanya karena bahasa output bukan x86 (dan jika Anda pikir Anda mengerti, Anda tidak mengerti kompiler).
Leushenko
2
Kata transpile berarti (atau akhir-akhir ini menjadi berarti) untuk menerjemahkan kode ke kode sumber bahasa lain dengan semantik yang sama , biasanya pernyataan untuk pernyataan setara (memungkinkan peta sumber juga dibuat). Tidak ada yang mengklaim bahwa transponder melakukan sesuatu yang berbeda dengan kompiler. Transpiler adalah jenis kompiler tertentu.
Carl Smith
Jawaban:
23
CoffeeScript mengkompilasi ke JavaScript untuk alasan yang sangat sederhana, JavaScript adalah bahasa sisi klien de facto dan tidak masuk akal untuk mengharapkan vendor peramban untuk secara asli mendukung CoffeeScript, ketika semua yang ditawarkan adalah sintaksis alternatif.
Dengan cara yang sangat mirip, poin utama dari bahasa tingkat tinggi ke penerjemah C adalah portabilitas langsung, karena ada kompiler C untuk hampir setiap platform dan banyak perpustakaan C. Vala , misalnya, dirancang untuk :
membangun executable asli (melalui compiler C mesin),
mengotomatiskan penghitungan referensi, dan
masih dapat diakses oleh programmer GNOME C
GNOME adalah proyek berorientasi C tradisional dan GObject secara khusus ditulis dalam bahasa C, Vala mungkin tidak akan menemukan banyak cinta di antara para pengembang GNOME jika dikompilasi dengan kode mesin, terlepas dari sifatnya yang lebih ramah (dan sintaksisnya). Tidak semua orang tampaknya menyukai sintaksis, sampai-sampai bahasa lain, Genie , dibangun untuk memperbaikinya.
Sebagai contoh C ++, Facebook mengembangkan HipHop , penerjemah PHP ke C ++. Mereka berusaha memecahkan masalah yang sangat spesifik, penggunaan CPU, tanpa harus mengganti semua kode PHP mereka dan melatih kembali insinyur mereka (atau yang terburuk, ganti mereka). Ini adalah contoh yang jauh lebih spesifik, karena masalah skalabilitas Facebook, yah, unik, dan sekali lagi memiliki akses ke kode C ++ menengah dapat bermanfaat, karena ekstensi PHP ditulis dalam C dan C ++.
Jadi penerjemah dari bahasa tingkat tinggi ke yang lain adalah ide yang bagus sebagian besar ketika Anda mengakses kode perantara diperlukan. Untuk CoffeeScript, kode JavaScript diperlukan karena adopsi browsernya yang luas, dan untuk Vala, Genie, dan HipHop karena basis kode yang ada. Jelas memiliki akses ke kode perantara berarti Anda dapat lebih mengoptimalkannya jika perlu.
Tetapi secara umum, itu bukan ide yang baik untuk membangun bahasa yang diterjemahkan ke C, atau bahasa lain, jika Anda tidak menggunakan kode yang dihasilkan. Ada begitu banyak bahasa di luar sana, jika Anda tidak bisa mengatasi C, pilih saja yang lain. Secara kebetulan kompiler C ++ pertama yang ditulis oleh Bjarne Stroustrup, CFront, adalah penerjemah C dengan Classes ke C, tetapi itu terutama karena sebagai bahasa baru, tidak mungkin untuk mem - bootstrap C dengan Classes.
Saya akan membahas beberapa poin Yannis Rizos tidak dalam jawaban yang bagus.
Ya, ada banyak bahasa. C adalah target umum untuk kompiler back-end karena sangat portabel dan sangat dioptimalkan, meskipun dengan LLVM tidak ada banyak gunanya.
Beberapa implementasi yang saya tahu melakukan hal ini adalah:
C ++ (Setidaknya di awal-awal)
GHC Haskell (Meskipun generator kode utama adalah C--)
Tidak, hanya karena menggunakan C sebagai bahasa perantara tidak berarti Anda akan mencapai kecepatannya. Alasan C cepat adalah karena metode penulisan kode yang jelas berbeda untuk bahasa lain. Ini hanya perakitan portabel, tidak ada yang istimewa.
Beberapa orang menganggap C sebagai "assembler tingkat tinggi". Cukup dekat dengan mesin, tapi tentu saja itu bukan sekelompok opcodes.
dstromberg
6
Rock adalah kompiler ooc yang menghasilkan sumber C99. The OOC-lang adalah bahasa pemrograman dengan objek, fungsi kelas, dan unicorn merah muda. The OOC adalah dinamis-bahasa dan berjalan begitu jauh. Ini menghasilkan kode c yang lebih gemuk dan lebih lambat. Anda perlu lebih dimodifikasi untuk menyesuaikan kebutuhan Anda. Tetapi ini adalah titik awal yang baik.
maukah Anda memperluas sedikit tentang apa yang masing-masing sumber daya miliki dan mengapa Anda merekomendasikan ini sebagai menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
4
OCaml dapat mengkompilasi untuk bytecode, untuk kode asli, dapat diartikan secara langsung, atau dapat mengkompilasi ke C .
maukah Anda menjelaskan lebih lanjut tentang apa yang dilakukannya dan mengapa Anda merekomendasikannya untuk menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
3
Saya gagal melihat bagaimana jawaban saya adalah "jawaban hanya tautan". Sebenarnya, saya bisa menghapus tautan dan itu masih akan menjadi jawaban yang valid. Pertanyaannya adalah "Apakah ada bahasa yang melakukan X" dan jawaban saya adalah "bahasa Y yang melakukan X". Komentar ini juga berlaku untuk jawaban Bilijk.
barjak
3
Kompiler C ++ asli Bjarne Stroustrop, "cfront", mengkompilasi C ++ ke C, yang kemudian akan dijalankan secara kompiler C untuk menghasilkan kode objek. C ++ kira-kira "non-teoritis" seperti yang Anda dapatkan :-)
Kompiler-kompiler Unix "yacc" dan GNU "Bison" menerjemahkan bahasa input mereka ke C. Banyak, banyak sistem canggih telah ditulis bersama mereka.
Jawaban:
CoffeeScript mengkompilasi ke JavaScript untuk alasan yang sangat sederhana, JavaScript adalah bahasa sisi klien de facto dan tidak masuk akal untuk mengharapkan vendor peramban untuk secara asli mendukung CoffeeScript, ketika semua yang ditawarkan adalah sintaksis alternatif.
Dengan cara yang sangat mirip, poin utama dari bahasa tingkat tinggi ke penerjemah C adalah portabilitas langsung, karena ada kompiler C untuk hampir setiap platform dan banyak perpustakaan C. Vala , misalnya, dirancang untuk :
GNOME adalah proyek berorientasi C tradisional dan GObject secara khusus ditulis dalam bahasa C, Vala mungkin tidak akan menemukan banyak cinta di antara para pengembang GNOME jika dikompilasi dengan kode mesin, terlepas dari sifatnya yang lebih ramah (dan sintaksisnya). Tidak semua orang tampaknya menyukai sintaksis, sampai-sampai bahasa lain, Genie , dibangun untuk memperbaikinya.
Sebagai contoh C ++, Facebook mengembangkan HipHop , penerjemah PHP ke C ++. Mereka berusaha memecahkan masalah yang sangat spesifik, penggunaan CPU, tanpa harus mengganti semua kode PHP mereka dan melatih kembali insinyur mereka (atau yang terburuk, ganti mereka). Ini adalah contoh yang jauh lebih spesifik, karena masalah skalabilitas Facebook, yah, unik, dan sekali lagi memiliki akses ke kode C ++ menengah dapat bermanfaat, karena ekstensi PHP ditulis dalam C dan C ++.
Jadi penerjemah dari bahasa tingkat tinggi ke yang lain adalah ide yang bagus sebagian besar ketika Anda mengakses kode perantara diperlukan. Untuk CoffeeScript, kode JavaScript diperlukan karena adopsi browsernya yang luas, dan untuk Vala, Genie, dan HipHop karena basis kode yang ada. Jelas memiliki akses ke kode perantara berarti Anda dapat lebih mengoptimalkannya jika perlu.
Tetapi secara umum, itu bukan ide yang baik untuk membangun bahasa yang diterjemahkan ke C, atau bahasa lain, jika Anda tidak menggunakan kode yang dihasilkan. Ada begitu banyak bahasa di luar sana, jika Anda tidak bisa mengatasi C, pilih saja yang lain. Secara kebetulan kompiler C ++ pertama yang ditulis oleh Bjarne Stroustrup, CFront, adalah penerjemah C dengan Classes ke C, tetapi itu terutama karena sebagai bahasa baru, tidak mungkin untuk mem - bootstrap C dengan Classes.
sumber
Saya akan membahas beberapa poin Yannis Rizos tidak dalam jawaban yang bagus.
Ya, ada banyak bahasa. C adalah target umum untuk kompiler back-end karena sangat portabel dan sangat dioptimalkan, meskipun dengan LLVM tidak ada banyak gunanya.
Beberapa implementasi yang saya tahu melakukan hal ini adalah:
Tidak, hanya karena menggunakan C sebagai bahasa perantara tidak berarti Anda akan mencapai kecepatannya. Alasan C cepat adalah karena metode penulisan kode yang jelas berbeda untuk bahasa lain. Ini hanya perakitan portabel, tidak ada yang istimewa.
sumber
Rock adalah kompiler ooc yang menghasilkan sumber C99. The OOC-lang adalah bahasa pemrograman dengan objek, fungsi kelas, dan unicorn merah muda. The OOC adalah dinamis-bahasa dan berjalan begitu jauh. Ini menghasilkan kode c yang lebih gemuk dan lebih lambat. Anda perlu lebih dimodifikasi untuk menyesuaikan kebutuhan Anda. Tetapi ini adalah titik awal yang baik.
sumber
Vala dan Genie keduanya bahasa yang mengkompilasi ke C. haxe mengkompilasi ke C ++, tapi saya tidak yakin itu yang Anda inginkan.
sumber
OCaml dapat mengkompilasi untuk bytecode, untuk kode asli, dapat diartikan secara langsung, atau dapat mengkompilasi ke C .
sumber
sumber