Alternatif modern yang dapat dikompilasi untuk C / C ++ [ditutup]

38

Saya sedang mempertimbangkan untuk menulis produk perangkat lunak baru. Kinerja akan menjadi sangat penting, jadi saya waspada menggunakan bahasa yang ditafsirkan atau bahasa yang menggunakan lapisan emulasi (baca java).

Yang membuat saya berpikir untuk menggunakan C (atau C ++) namun keduanya agak panjang di gigi. Saya sudah lama tidak menggunakan keduanya. Saya pikir dalam 20 tahun terakhir seseorang mungkin telah menciptakan sesuatu yang cukup populer, baik untuk dikodekan dan dikompilasi.

Apa alternatif yang lebih modern yang ada untuk C untuk menulis kode kompilasi kinerja tinggi?

Jika C ++ adalah binatang yang berbeda dari 15 tahun yang lalu, saya akan mempertimbangkannya, saya kira saya memiliki asumsi bahwa ia memiliki beberapa masalah yang melekat.

Parallelisation akan menjadi penting, tetapi mungkin tidak di beberapa mesin.

Jeremy French
sumber
21
Modern C ++ secara radikal berbeda dari C. Ini jauh lebih sebanding dengan sesuatu seperti Java atau C # daripada dengan C, kecuali fitur penghancuran deterministik bukan pengumpulan sampah, dan juga memiliki perilaku yang tidak terdefinisi karena tidak berjalan dalam VM atau dikelola lingkungan Hidup. Alternatif Anda yang lain adalah D, yang merupakan bahasa yang layak, tetapi masih sangat tidak matang dalam hal perpustakaan dan dukungan.
Charles Salvia
11
Bisakah Anda menguraikan bagian "kinerja akan sangat penting"? Mengapa ini menjadi kritis? Sudahkah Anda mengukur sesuatu?
JesperE
3
15 tahun adalah waktu yang singkat dalam hal komputer dan selama itu, orang-orang seperti Ericsson telah menggunakan bahasa fungsional seperti Erlang untuk mendukung aplikasi yang terdistribusi, toleran kesalahan, lunak-waktu-nyata, tanpa henti dalam sistem tertanam mereka! Jangan berasumsi hanya C ++ yang dapat memberikan kinerja yang Anda inginkan, Anda mungkin lebih baik membuang lebih banyak perangkat keras pada masalah dan menghemat banyak waktu implementasi dengan bahasa lain.
Mark Booth
5
@JeremyFrench: tetapi Anda mengajukan pertanyaan berdasarkan asumsi yang salah, bahwa kinerja => kompilasi statis.
vartec
4
Untuk apa nilainya, Haskell saat ini berfungsi sebagai pengganti saya untuk C ++ dalam banyak kasus.
Jon Purdy

Jawaban:

54

Ada bahasa dalam pengembangan yang disebut The Rust Programming Language yang mengejar tujuan yang sama seperti C ++, terutama abstraksi tanpa biaya dan kontrol yang baik atas manajemen memori. Yang mengatakan, itu mungkin kandidat mendatang yang paling menonjol meskipun masih sangat muda.

Selain Rust, sebenarnya tidak ada alternatif populer lain yang mengkompilasi ke kode asli. Ada Delphi dan D juga, tentu saja, tetapi mereka tidak secepat, populer atau digunakan. Bahasa Google Go bisa menjadi kandidat, tetapi masih sangat muda dan bertujuan untuk domain yang sedikit berbeda.

Namun, perlu dicatat bahwa C # (dengan asumsi platform Microsoft) dan Java mungkin tidak terlalu lambat meskipun mereka berjalan di atas mesin virtual; kompilasi kode just-in-time dapat melakukan beberapa optimisasi yang tidak dapat diterapkan oleh kompiler tradisional sebelumnya karena kurangnya informasi tentang keadaan dan lingkungan program.

Terus terang saya pribadi tidak akan menganggap C sebagai kandidat jika C ++ adalah pilihan, terutama karena fakta bahwa C ++ modern lebih aman, bekerja pada tingkat abstraksi yang lebih tinggi, lebih ekspresif dan secara praktis tidak memiliki kehilangan kinerja lebih dari C (dalam beberapa kasus C ++ khususnya lebih cepat). Sederhananya, C ++ menyediakan semua yang disediakan C dan banyak lagi. Sebagian besar fungsi C dianggap "usang" dan alternatif yang lebih baik, lebih aman, lebih cepat dan lebih intuitif disediakan oleh pustaka standar C ++.

zxcdw
sumber
5
Saya tidak akan mengatakan fungsionalitas C "usang", dalam arti resmi - hanya saja hampir tidak ada alasan untuk pernah menggunakan fungsi pustaka C, pointer mentah atau array-C di C ++.
Charles Salvia
20
+1 untuk berbicara dengan anggapan salah 'kompilasi diperlukan untuk asumsi kinerja'.
Telastyn
3
@ gbjbaanb mencoba mengompilasi dengan Visual Studio dan dengan MinGW di bawah Windows dan semoga berhasil dengan itu: | coba juga untuk meyakinkan seseorang yang memberi Anda perpustakaan yang dikompilasi yang dikompilasi dengan salah satu alat ini yang tidak tahu apa-apa tentang ABI bahwa ia salah dan ia harus memberi Anda sumber perpustakaan itu atau belajar bagaimana mengkompilasi ulang dan memberikan spesifikasi yang tepat . kengerian, kadang-kadang.
user827992
5
@paxRoman: Anda dapat menulis program kecil dalam C ++, dan menulisnya lebih aman daripada di C.
kevin cline
3
@ JBRWilkinson Sejauh yang saya ketahui, popularitas Objective-C tidak ada di luar platform Apple.
zxcdw
19

Ada juga Ada , yang mengkompilasi ke kode asli, dan portabel di berbagai platform dalam batas-batas dari perpustakaan standar. Bahasa ini hidup dan sehat, dengan pembaruan standar bahasa terbaru saat ini sedang berlangsung (dikenal sebagai Ada 2012).

Ringkasan cepat untuk mereka yang tidak terbiasa dengan Ada:

  • Sangat diketik
  • Dukungan bawaan untuk konkurensi
  • Berorientasi objek atau prosedural, tergantung pada kebutuhan Anda
  • Didukung oleh GNU toolchain (GCC berisi Ada frontend)
  • Sangat baik juga untuk pengembangan perangkat lunak, yaitu ketika Anda perlu berinteraksi langsung dengan perangkat keras
  • Mendukung pemrograman generik (paket generik, prosedur, fungsi)
  • Fitur mendukung pengembangan perangkat lunak skala besar (paket, paket anak, kompilasi terpisah, perbedaan ketat antara spesifikasi dan implementasi)
Schedler
sumber
1
Belum lagi Ada Tasks (Parallelisation!)
NWS
6
+1: Saya telah mencoba mempelajari beberapa Ada dan saya pikir itu adalah bahasa yang sangat kuat dan bersih. Sayang sekali tidak ada begitu banyak pekerjaan untuk bahasa pemrograman lainnya.
Giorgio
3
Sebutan yang bagus, saya mencari sesuatu yang lebih 'modern' tapi saya lupa tentang Ada
Jeremy French
4
@Jeremy French: Fitur apa yang Anda cari dalam bahasa yang lebih 'modern' yang Tidak ditawarkan?
Giorgio
17

Jika C ++ adalah binatang yang berbeda dari 15 tahun yang lalu, saya akan mempertimbangkannya, saya kira saya memiliki asumsi bahwa ia memiliki beberapa masalah yang melekat.

15 tahun yang lalu, tidak ada standar C ++. Yang kedua telah diterbitkan tahun lalu. Praktik terbaik C ++ berubah banyak dalam 5 tahun setelah penerbitan standar 98, dan mereka berubah lagi dengan penerbitan 11 standar.

Pemrogram
sumber
12

Mengapa orang selalu bersikeras mencari bahasa baru?

C ++:

  • Adalah bahasa nomor 4 oleh TIOBE, tetapi menginjak semua kompetisi jika dikombinasikan dengan C
  • Memiliki banyak kerangka kerja
  • Sangat mudah untuk dikodekan
  • Sangat mudah disetel
  • Sangat performant
  • Sangat aman
  • Memiliki dukungan industri yang sangat baik
  • Apakah lintas platform
  • Tidak perlu tambahan VMs / Frameworks / deployment jika dilakukan dengan benar
  • Dengan mudah akan mendapatkan pekerjaan Anda
  • Memiliki semua hal yang diperlukan untuk membangun .so / .dll untuk diluncurkan pada sistem yang sangat lama
  • Mudah untuk memecahkan masalah
  • Sangat mahal
  • Sangat dinamis
  • dan banyak hal menarik lainnya

Satu-satunya kelemahan C ++ adalah Anda harus belajar sedikit. Itu dia.

Bandingkan dengan bahasa lain yang merupakan satu atau lebih dari:

  • Didukung secara sempit (OCML, Fortran, ...)
  • Lambat (Jawa, Javascript)
  • Eksperimental (Silverlight)
  • Target bergerak (.NET 1/2/3/4/5? Yang mana yang terakhir sekarang?)
  • Platform terkunci (.NET)
  • Memiliki dukungan kerangka kerja yang buruk (Fortran)
  • Memiliki komunitas kecil (apa pun di luar 10 teratas)
  • Adalah mimpi buruk untuk dipecahkan (Apa pun dengan konsep dan hal-hal bodoh-tingkat tinggi)
  • Membutuhkan 500 MB preintallation pada mesin pelanggan (JVM / .NETVM)

IMHO, semakin sedikit bahasa yang akan kita gunakan dan dukung, semakin baik situasinya.

Hal ini menyebabkan perbaikan otomatis dalam kerangka kerja untuk bahasa, dukungan, dokumentasi, kerja komite standardisasi, buku yang lebih baik, lebih banyak pengetahuan, lebih mudah untuk mendukung perangkat lunak, pola yang lebih baik, siklus dukungan bahasa yang lebih lama dan kode yang lebih terampil yang ditulis dalam bahasa tersebut.

Saya tahu orang-orang akan downvote ini, tetapi pikirkanlah, sungguh.

Coder
sumber
71
C ++ "sangat mudah untuk dikodekan" hanya salah, maaf. Ini adalah bahasa yang sangat sulit untuk dipelajari dan bahkan jika Anda menggunakan idiom C ++ modern dan menghindari pointer, Anda akan dihadapkan dengan banyak kesalahan kompiler dan runtime yang membingungkan sebelum memahami itu. Dan bahkan setelah Anda menguasainya, sintaks sering menghadang. Safe C ++ sering menggunakan berantakan templat bersarang yang menghasilkan sejumlah besar kode boilerplate.
Konrad Rudolph
20
Sangat ekspresif dan sangat dinamis tidak terdengar seperti ciri khas C ++, dibandingkan dengan bahasa dinamis.
vartec
29
@ gbjbaanb "sedikit lebih sulit untuk dipelajari", sekali lagi, tidak masuk akal. Maaf. Saya telah memprogram semua bahasa itu selama bertahun-tahun, saya jelas lebih suka C ++ (dan melakukan pemrograman paling serius di dalamnya) tetapi mengatakan bahwa itu mudah hanya benar-benar menyesatkan. Dan saya tidak berbicara tentang hal-hal metaprogramming yang mewah, saya berbicara tentang kesalahan kompiler yang dihasilkan oleh kode run-of-the-mill, yang disebabkan oleh nama bersembunyi, ADL, constmasalah kebenaran dan hal-hal seperti itu. Siapa pun yang telah membaca C ++ Efektif (seperti yang diklaim oleh Coder) dan menyatakan bahwa C ++ itu mudah, memiliki mental disconnect.
Konrad Rudolph
13
@ gbjbaanb Saya seorang programmer C ++. Sekali lagi, saya tidak berpikir C ++ itu mudah. Dan utas komentar ini juga mengernyit dari obrolan C ++. Jadi bukan itu. Dan perbedaan antara gotcha C ++ dan gotcha bahasa lain adalah bahwa jika Anda tidak mengetahuinya dalam bahasa lain, Anda mungkin akan baik-baik saja. Di C ++, Anda bersulang. Dan bahkan jika Anda tahu tentang mereka, Anda masih bisa mendapatkan beberapa halaman layar dari kesalahan kompilasi untuk satu kesalahan (terjadi pada saya lagi hari ini). Dan meskipun kesalahan itu mudah diperbaiki (salah ketik), butuh waktu untuk menguraikan semua itu.
Konrad Rudolph
6
Kapan bahasa populer menjadi baik? PHP sangat populer dan tidak ada orang yang berpikir itu bahasa "baik", bahkan untuk ceruknya. Satu-satunya hal "baik" tentang bahasa populer adalah bahwa ada banyak perpustakaan untuk membuat domain tertentu lebih mudah diprogram. C ++ sendiri penuh dengan frustrasi.
weberc2
11

C / C ++ agak panjang di gigi .... ini adalah hal yang baik . Ini menyiratkan bahwa mereka dirancang cukup baik (ahem) sehingga mereka masih sangat bermanfaat, bahwa banyak orang menggunakannya untuk tugas sehari-hari, dan bahwa Anda akan menemukan sejumlah besar pengembang yang ahli dalam hal itu. Kedewasaan adalah sesuatu yang harus dihargai.

Jika Anda menghabiskan seluruh waktu Anda untuk mencari sesuatu yang baru, hanya karena itu baru dan karena itu pikir itu entah bagaimana harus lebih baik, Anda berada dalam banyak kekecewaan. Ini berlaku untuk bahasa perangkat lunak, sistem GUI (perhatikan, Microsoft dan Gnome) dan kekasih (perhatikan, wanita muda :))

Sekarang diakui, jika pengalaman Anda C + + adalah 20 tahun, ketika kode C ++ umumnya dikodekan seperti C, maka mungkin saatnya untuk mengevaluasi kembali bahasa, semua fitur yang ada di hari yang tidak pernah cukup digunakan digunakan lebih banyak hari ini, dan beberapa upaya standardisasi telah sedikit memperluas bahasa untuk membuatnya tampak jauh berbeda dari perkembangan gaya C lama. Bukan berarti C buruk juga - itu bahasa yang sempurna untuk banyak jenis tugas pengkodean juga!

gbjbaanb
sumber
16
Saya pikir C dan C ++ mencontohkan komentar Hoare pada desain perangkat lunak: membuatnya sangat sederhana tidak ada kekurangan, atau membuatnya sangat rumit tidak ada kekurangan yang jelas.
TMN
1
Bagaimana kerentanan keamanan berulang karena beberapa bentuk buffer mengeksploitasi "hal yang baik", terlepas dari berapa lama atau mengakar suatu bahasa? Dan, apakah ini benar-benar berbeda dari berdebat kelanjutan dari pernikahan yang mapan setelah penganiayaan berulang?
user2864740
@ user2864740 apa yang Anda sarankan adalah perceraian karena istrinya sudah tua dan Anda menginginkan model baru yang menarik ... Saya katakan Anda tetap dengan apa yang Anda miliki karena Anda tahu kelemahan dan kebiasaan. Berapa banyak dari yang baru, keren, bahasa menyelesaikan masalah seperti buffer overflow dan kemudian ternyata memiliki cara halus buffer yang meluap? Jadi apa yang lebih baik - luapan yang bisa Anda hindari dengan tidak malas atau menggunakan konstruk yang tepat, atau yang Anda pilih karena Anda tidak tahu ada di sana?
gbjbaanb
@ gbjbaanb Tidak, saya tidak pernah mengatakan itu. Saya menggambar perumpamaan khusus untuk kerusakan yang disebabkan oleh tidak meningkatkan konteks situasi. Saya umumnya cukup rasional dan tidak cenderung memilih "fanboi" topik atau alat trending (ini hanya sifat saya). Lebih lanjut, C dan C ++ adalah bahasa yang berbeda; namun keduanya dibenarkan karena alasan yang sama. Dan itu adalah masalah dengan seperti.
user2864740
8

Standar saat ini dari C ++ adalah C ++ 11 , yang diterbitkan pada tahun 2011. Jadi itu bukan standar 20 tahun. Dan ada banyak standar di antaranya. Masing-masing dari mereka memperkenalkan banyak peningkatan kinerja.

Compiler juga terus meningkat. Mereka jauh lebih baik dalam mengoptimalkan, daripada dulu.

Format yang dapat dieksekusi juga meningkat, 20 tahun yang lalu Anda memiliki a.out , sekarang Anda memiliki ELF .

Secara keseluruhan, saran bahwa C ++ tidak berubah dalam 20 tahun tidak bisa jauh dari kebenaran.

Juga, perlu diingat, bahwa C dan C ++ adalah bahasa yang sangat berbeda.

vartec
sumber
2
Asumsi saya adalah bahwa sesuatu yang pertama kali dikandung 20 tahun yang lalu akan memiliki keterbatasan arsitektur yang melekat yang hanya dapat ditingkatkan dengan papan tulis kosong. Saya pikir anggapan ini mungkin salah.
Jeremy French
4
@JeremyFrench: Seperti arsitektur x86?
TMN
2
@ TMN apakah itu membuktikan atau menyangkal asumsi saya?
Jeremy French
6
Arsitektur x86 asli adalah kompromi buruk antara kompatibilitas ke belakang dengan 8080 dan serangkaian fitur untuk bersaing dengan 68000 dan NS32032. Memori tersegmentasi (dengan pointer "jauh" dan "dekat"), hanya 4 register tujuan umum, pengkodean instruksi panjang variabel, lebih dari 50 rasa instruksi JMP, bus sistem tri-state multiplexed ... Namun hari ini, itu sama desain dasar menjadi lebih kuat dari sebelumnya, setelah banyak desain papan tulis "unggul" (Alpha, MIPS, PowerPC) gagal menggantikannya.
TMN
1
@JeremyFrench tidak, anggapan Anda tidak salah, setidaknya dalam kasus C ++. Fitur C ++ 11 sangat berguna; Namun, pada titik ini mereka hanya lebih banyak omong kosong di tumpukan sampah. Mereka mencoba membangun fitur bahasa modern, tetapi untuk mengatasi kekacauan C ++ yang ada, mereka harus memiliki pengecualian, dan pengecualian itu akan memiliki pengecualian dan seterusnya dan seterusnya.
weberc2
6

Saya bukan ahli besar bahasa ini, tapi saya pikir OCaml bisa menjadi pilihan yang menarik untuk dilihat.

OCaml adalah bahasa yang dikompilasi, fungsional / berorientasi objek. Untuk perbandingan kinerja dengan C ++ lihat perbandingan C ++ vs OCaml: Ray tracer . Tentu saja, ini adalah contoh yang sangat spesifik dan seseorang harus melakukan pengujian yang lebih luas untuk memiliki perasaan yang lebih baik terhadap kinerja OCaml.

Giorgio
sumber
Bisakah para downvoter memberikan petunjuk bagaimana jawaban ini dapat ditingkatkan? Terima kasih.
Giorgio
3

Tergantung pada apa yang akan dilakukan produk Anda. Jika kinerja benar-benar kritis, maka pilihan bahasa masuk masih FORTRAN . Saya juga tidak akan mengesampingkan Jawa - itu digunakan dalam banyak aplikasi perdagangan keuangan volume tinggi. Erlang patut dilihat jika domain masalah Anda memerlukan konkurensi tinggi. Objective-C bagus, meskipun saya tidak tahu seberapa baik didukung di luar ekosistem Apple (di luar kompiler dan runtime dasar). Saya juga mendengar hal-hal baik tentang kinerja Haskell, tetapi saya tidak yakin apakah itu kinerja absolut atau hanya kinerja relatif terhadap bahasa fungsional lainnya.

TMN
sumber
2
setiap pekerjaan keuangan yang saya lihat ingin pengembang C / C ++, bukan Java. Dari pengalaman dengan Java, saya tidak bisa melihat ada yang berkinerja tinggi kecuali Anda melemparkan banyak perangkat keras padanya.
gbjbaanb
Ada banyak sistem perdagangan Jawa yang beroperasi di Wall Street dan di berbagai bank investasi di AS dan Inggris. Ini juga cukup banyak digunakan di Chicago Mercantile Exchange.
TMN
3

Ketika Anda mengatakan proyek Anda sensitif terhadap kinerja, maksud Anda setiap baris kode itu? Atau, seperti biasa, apakah ada persentase yang lebih kecil yang kinerja kritis sedangkan sisanya adalah menjalankan biasa dari kode bisnis pabrik?

Setelah Anda menjawab itu, apa risiko lebih besar untuk proyek Anda: bahwa hasil akhirnya terlalu lambat, atau bahwa Anda tidak pernah menyelesaikannya sejak awal?

Dengan asumsi Anda menjawab yang kedua untuk keduanya, Anda harus mengembangkan bahasa tingkat yang lebih tinggi yang mendukung interop asli (Python, Ruby, .Net Family semuanya memiliki ini). Pertama, selesaikan proyek. Kemudian profil, optimalkan, bilas, ulangi. Hanya setelah itu, pertimbangkan untuk menulis ulang segmen pilihan aplikasi Anda dalam kode asli dan mengintegrasikan kode asli itu dengan produk jadi Anda.

Chris Pitman
sumber
Setelah Java, Anda tidak bisa menyelamatkannya jika terlalu lambat.
Coder
6
@Coder Java memiliki FFI (JNI) yang memungkinkan Anda untuk 'membuat kekacauan' dalam bahasa pilihan Anda. Jadi jika Anda telah mendesain antarmuka dengan baik, Anda bisa mengganti implementasi Java dengan yang asli. Platform Java sudah dipikirkan dengan baik.
K.Steff
1

Vala mirip dengan Java dan C #, mengkompilasi ke kode asli (atau kode sumber C jika Anda suka), dan sangat cepat . Memang membutuhkan GLib untuk bit berorientasi objeknya, dan itu ditulis oleh peretas Linux untuk peretas Linux, jadi jika domain Anda adalah Windows, itu mungkin tidak terlalu baik.

Pasang kembali Monica
sumber
1

Objective-C adalah alternatif kompilasi modern untuk C lurus dan C ++. Ia memiliki manajemen memori yang dikumpulkan dan deterministik serta runtime OO penyaluran pesan telah dioptimalkan untuk kinerja.

Ini tersedia melalui GCC dan CLang dan ada perpustakaan aplikasi seperti GNUStep dan Cocotron yang bekerja pada berbagai platform.

Jika Anda melakukan pekerjaan berkinerja tinggi, saya akan berasumsi bahwa itu semacam kerja menghitung angka atau membagi-dan-menaklukkan lainnya alih-alih UI, sehingga itu berarti Anda bisa melakukan UI dalam bahasa apa pun yang paling mudah bagi Anda, mis. HTML via server http mini.

JBRWilkinson
sumber
0

Saya tidak pernah menggunakannya, tetapi seorang teman saya bersumpah oleh Cython yang memungkinkan Anda menggunakan primitif gaya C di bagian-bagian penting kinerja kode Anda sambil menjaga sintaksis python umum dan mampu mengambil keuntungan penuh dari ular python tingkat tinggi untuk membangun pembangunan waktu di tempat lain.

Dan Neely
sumber