Mengapa bahasa yang lebih cepat, “lebih baik” daripada bahasa C keluar? [Tutup]

147

Dengan semua bahasa "modern" baru hari ini, bagaimana mungkin C masih digembar-gemborkan sebagai yang tercepat dan "paling dekat dengan mesin"? Saya tidak benar-benar percaya bahwa hanya ada satu cara yang benar untuk melakukan sesuatu, dan C telah ada untuk waktu yang sangat lama (sejak 60-an!). Apakah kita benar-benar tidak menghasilkan sesuatu yang lebih baik daripada sesuatu yang ditulis hampir 50 tahun yang lalu?

Saya sadar bahwa bahasa modern adalah tingkat yang lebih tinggi dan menangani tugas-tugas tertentu seperti pengumpulan sampah dan alokasi memori dan menggunakan perpustakaan dan semacamnya. Saya hanya bertanya mengapa tidak pernah ada pilihan kedua yang benar untuk C.

Mungkinkah C begitu sempurna sehingga tidak ada cara lain mengoperasikan komputer yang mungkin (pengembang-adopsi samping)?

EDIT Lihat, saya tidak mencoba mengetuk C atau apa pun bahasa favorit Anda. Saya bertanya-tanya mengapa C telah menjadi standar dan mengapa alternatif lain tidak pernah muncul dan C hanya "diterima".

Jason
sumber
44
C ++ sama cepat dan jauh lebih produktif untuk menulis di <3.
GManNickG
6
um, apakah kamu lupa tentang c ++?
23
Saya berpendapat perakitan adalah yang tercepat dan "paling dekat" dengan mesin.
27
mengapa semua gerakan ditutup? aku benar-benar ingin tahu ... aku tidak mencoba untuk memulai perang api atau apapun
Jason
15
ditutup lagi? setelah dibuka kembali oleh jeff atwood sendiri? mengapa Anda ingin menutup ini?
Jason

Jawaban:

164

C adalah bahasa yang sangat sederhana, dan karena ini, bersama dengan umur panjangnya, itu cepat dan dioptimalkan. Ini juga sangat banyak didukung, berkaitan dengan lingkungan tertanam, mikroprosesor, dll.

Sulit untuk mengalahkan bahasa yang sangat sederhana dan cepat. Satu-satunya hal untuk memperbaiki bahasa seperti itu adalah kegunaan: mengurangi waktu yang diperlukan untuk membuat kode generik yang serupa, dan membuatnya lebih mudah untuk dimodelkan dengan abstraksi.

Di sinilah C ++ masuk. C ++ dapat sama cepatnya dengan C. Masalahnya adalah, C ++ adalah bahasa yang jauh lebih kompleks, yang berarti pasti meningkatkan produktivitas; selama orang tahu bagaimana menggunakannya. C ++ dan C bukan bahasa yang hampir sama lagi.

Sekarang, D adalah langkah lain. Kemampuan yang sama untuk kode cepat, pengumpulan sampah opsional, dll., Tetapi tidak pernah berhasil. Semoga itu berubah, karena itu menjatuhkan apa yang mengganggu C ++: kompatibilitas dengan C.

Jadi untuk menjawab pertanyaan Anda, "lebih baik" adalah hal yang sulit untuk dinilai. Dalam hal kesederhanaan dan kecepatan, C mungkin mendekati yang terbaik yang bisa kami lakukan. Dalam hal produktivitas versus kesederhanaan, C ++ mungkin adalah yang terbaik yang bisa kita lakukan, meskipun pendapat itu jauh lebih bervariasi. Terakhir, dalam hal bahasa yang disempurnakan dan dibersihkan, dengan kecepatan dan kesederhanaan C, D memenangkan konteks ini.

GManNickG
sumber
31
Yang dimaksud dengan "Sederhana" adalah "sederhana dari kompiler POV, bukan dari programmer POV". C sederhana karena pada dasarnya berkumpul dengan pernyataan dan ekspresi. Ini tidak sederhana cara Python sederhana.
Marius
15
Tapi untuk memperjelas, sederhana untuk compiler tidak berarti sederhana untuk menjemput. Mungkin tidak mudah untuk mengimplementasikan ide-ide yang rumit di.
GManNickG
16
Untuk apa nilainya, OCaml menghasilkan kode asli yang sangat dioptimalkan secepat C dan C ++, dan kode itu sendiri sesingkat Python. Dengan sedikit polesan, saya pikir OCaml dapat mencocokkan atau mengalahkan C sebagai bahasa pilihan ketika Anda perlu menulis kode untuk kecepatan maksimum dan jejak memori minimum. Objective-C juga melakukan pekerjaan yang cukup baik, meskipun tidak selalu secepat C, ia mendapatkan keseluruhan "C dengan objek" hal yang benar dengan cara C ++ tidak pernah bisa dan tidak akan pernah bisa.
Juliet
2
Setuju dengan @ Thorbjørn, kompatibilitas ke belakang dengan C adalah alasan mengapa C ++ menjadi populer dan D tidak. Jika kita mau menyerah, tidak ada alasan untuk menerima peningkatan bertahap yaitu D. Kita bisa menggunakan bahasa yang jauh lebih baik yang sepenuhnya keluar dari keluarga C. Seperti yang dikatakan @Juliet, OCaml bisa menjadi pesaing yang tangguh dalam hal kinerja. Tetapi begitu pula sejumlah bahasa lain, jika penulis kompiler telah menghabiskan banyak waktu pada mereka seperti pada C atau C ++. Lagi pula, jawaban yang bagus, dan +1 dari saya.
jalf
5
@Ferruccio: Ya, tetapi setiap bahasa dapat ditautkan ke perpustakaan C. Jadi, jika kita bersedia menerima hal itu, alih-alih kompatibilitas kode sumber yang sebenarnya, seperti yang ditawarkan C ++ (kurang lebih), maka sebaiknya kita memilih bahasa yang sama sekali berbeda, katakanlah, Haskell atau Python. Alasan C ++ tertangkap karena tidak bisa menautkan ke perpustakaan C. Itu bisa mengkompilasi kode C.
Jalf
64

Ada lebih cepat dari bahasa C.

Ada bahasa yang lebih cepat dari C. Misalnya Fortran seperti yang telah disebutkan berjalan dengan sangat baik karena memiliki lebih banyak aturan bahasa alias yang lebih terbatas.

Ada juga rakitan eksperimental seperti bahasa yang menyerang C di bagian depan di mana ia digunakan sebagai bahasa assember tingkat tinggi untuk contoh pembuatan kompiler. Pernah dengar tentang C-- atau Janus? Namun keduanya terbunuh oleh proyek LLVM.

Saya berani bertaruh bahwa APL atau bahasa matematika lainnya akan mengeluarkan C dari air dalam domain aplikasi khusus di sana karena mereka telah membangun dukungan untuk unit pemrosesan Vektor. Ini adalah sesuatu yang tidak mungkin untuk C (dan kawan-kawan: TIDAK! Pustaka yang dioptimalkan khusus dengan tautan C tidak ada hubungannya dengan C sebagai bahasa).

Juga produsen CPU menghapus semua hal yang membantu penulis kompiler dalam bahasa lain - ingat kode assembler aritmatika yang ditandai untuk membuat implementasi LISP pada SPARC cepat? Pergi bersama angin.

Dan jika Anda beralih dari tolok ukur mikro ke pengembangan aplikasi maka ada bahasa yang lebih cepat untuk pengembangan aplikasi. Contoh pribadi saya di sini selalu SmartEiffel. Ini menargetkan C tetapi menggunakan optimasi sistem global yang membuatnya lebih cepat daripada C dalam pengembangan aplikasi dunia nyata.

Dalam domain ini bahkan abstraksi sederhana yang salah atau tingkat rendah dapat mematikan kinerja seluruh bahasa. Karena C tidak menawarkan abstraksi yang tinggi, kebanyakan orang mengatakan ini adalah masalah pemrograman tetapi tidak. Misalnya lihat kekurangan obat generik. Di C Anda akan berakhir dengan implementasi lambat seperti fungsi perpustakaan "qsort" yang dapat ditulis lebih cepat dengan generik (di mana fungsi panggilan untuk perbandingan kunci dihilangkan).

Bandingkan saja panggilan qsort pada array int megabyte dengan implementasi tulisan tangan yang bagus yang menggunakan akses array dan operator builtin '<'.

Lothar
sumber
9
Komentar yang sangat bagus Penting untuk menyadari bahwa beberapa aspek spesifikasi bahasa C (seperti aturan aliasing pointer) membuatnya tidak mungkin untuk menghasilkan kode mesin yang benar-benar optimal. Menjadi assembler tingkat tinggi, C bukanlah "yang tercepat", tetapi hanya "cukup cepat".
1
Terima kasih saya lupa menyebutkan ketidakmungkinan untuk mengembalikan beberapa nilai hasil. Aspek tingkat rendah lain yang saya rindukan sulit ketika menggunakannya sebagai assembler tingkat tinggi.
5
Modern C, ditulis dengan benar, dapat menyandikan asumsi aliasing yang sama seperti bahasa lain, memungkinkan kompiler membuat optimasi yang sama. Ini adalah fitur penting dari bahasa yang juga memungkinkan programmer untuk tidak menganggap persyaratan itu ketika mereka tidak berlaku. Poin Anda yang lain tepat, jadi +1.
Stephen Canon
1
@Rascher: Itu benar dan di sana Anda melihat pengaruh C pada perancang CPU yang selalu menentukan ABI CPU. Dan beberapa nilai kembali adalah sesuatu yang hanya tidak datang ke pikiran sana bahkan jika jumlah register tidak akan menjadi masalah (SPARC, PowerPC, Itanium)
13
Pointer aliasing dalam C telah ditangani oleh restrictdalam C99 (10 tahun yang lalu!).
35

Pertanyaan bagus. Saya pikir bahasa berhasil dengan menemukan ceruk. Penting untuk dicatat bahwa ada banyak bahasa baru yang lebih baik daripada C di ceruk mereka.

  • C dulunya banyak digunakan sebagai bahasa aplikasi, dan dalam domain itu ia terus-menerus kehilangan bahasa ke C ++, Java, dan baru-baru ini semua jenis bahasa lain (terutama bahasa dinamis).

  • C digunakan sebagai bahasa untuk menulis kode server. Web mendorong berbagai bahasa yang luar biasa ke dalam ruang itu - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - dan kasus-kasus di mana C masuk akal untuk kode server sekarang sedikit dan jauh di antara keduanya.

  • C telah digunakan untuk komputasi ilmiah, tetapi ia menghadapi persaingan dari bahasa-bahasa domain-spesifik seperti Matlab dan Mathematica, serta perpustakaan seperti SciPy . Banyak orang yang menulis kode di ceruk ini bukan coders oleh perdagangan dan C tidak cocok untuk mereka.

Tapi niche C adalah kode sistem. Kernel sistem operasi. Driver. Perpustakaan run-time. Itu sangat mapan di ruang itu yang bahkan C ++ memindahkannya agak lambat.

C menang pada tahun 1970 karena UNIX, karena bahasa yang bersaing terlalu ketat atau terlalu lambat, dan karena kode C dianggap cukup portabel (bohong, bahkan kemudian). Tetapi keuntungan terbesarnya saat ini tidak berhubungan, dan sebagian besar berasal dari dekade mendominasi ceruknya. Ada alat yang baik untuk C: mengoptimalkan kompiler, kernel debugger, analisis statis yang efektif untuk menemukan bug dalam kode driver, dll. Hampir setiap platform utama mendefinisikan C ABI, dan seringkali itu adalah bahasa perancis untuk perpustakaan. Ada sekelompok programmer yang tahu cara kode C - dan yang tahu apa masalah dan perangkap C.

Jangka panjang, ceruk ini tidak akan hilang; dan C memiliki beberapa masalah. Tetapi masih akan sangat sulit bagi pendatang baru untuk bersaing.

Jason Orendorff
sumber
9
C masih banyak digunakan untuk kode server. Tidak hanya Web, paling DNS, email, dll server yang ditulis dalam C. Bahkan untuk Web, Apache di C.
@bortzmeyer: Apache sudah cukup tua. Saya tidak mengatakan itu tidak berguna atau telah digantikan, itu baru saja dibuat ketika C ada dan tidak ada banyak alternatif yang baik.
Macke
1
Saya ingin tahu mengapa Anda menganggap C "tidak cocok" untuk komputasi ilmiah. Python memang diakui lebih menyenangkan untuk dikerjakan, tetapi saya telah menemukan C menjadi alternatif yang solid ketika kode lebih cepat diperlukan dan banyak alternatif yang mungkin (C ++) tidak membawa sejumlah besar lebih ke meja, tidak seperti dalam aspek pemrograman lainnya .
Fomite
1
Selain itu, jumlah barang dalam SciPy / NumPy dll yang ditulis dalam C sudah membuatnya berguna untuk diketahui.
Fomite
1
@EpiGrad Mungkin C adalah alternatif yang solid untuk Anda. Tetapi C memiliki kurva belajar yang sangat curam, terutama bagi orang-orang yang tidak memiliki latar belakang dalam pengkodean. Secara khusus, kadang-kadang crash, dan jika Anda bukan seorang pembuat kode Anda memiliki sedikit harapan untuk mencari tahu. Mathematica membuat banyak hal lebih mudah untuk ditulis dan Anda berakhir dengan lebih sedikit kode dengan faktor ratusan. Dan itu tidak crash.
Jason Orendorff
25

Mengutip komentar yang sangat baik: Tidak ada banyak cara untuk membuat bahasa cepat dan "dekat dengan mesin" - C melakukannya dengan baik, dan hampir tidak ada ruang untuk memperbaikinya.

Jawaban asli:

Cepat untuk mengeksekusi atau cepat untuk menulis barang?

Bahasa tidak cepat atau lambat untuk dieksekusi, implementasi spesifik. Languge hanya dapat dianggap lebih cepat daripada yang lain ketika entah bagaimana membuatnya lebih mudah untuk memiliki implementasi yang cepat . Selalu, itu berarti "dekat dengan mesin". Tetapi dengan mesin yang semakin cepat secara eksponensial, itu menjadi semakin tidak menarik dari waktu ke waktu. Sebaliknya, kemudahan dan kecepatan pengembangan dan portabilitas menjadi jauh lebih penting, jadi "lebih baik" berarti "jauh dari mesin" . Hampir semua upaya dalam desain bahasa telah mengarah ke arah itu selama 5 dekade terakhir.

Jadi begitulah Anda: lebih dekat ke mesin dan bahasa lebih cepat dari C ada; mereka yang datang sebelum C : Assembler, Fortran. Mungkin beberapa yang terlupakan.

Michael Borgwardt
sumber
@ Michael - tetapi masih ada pasar untuk pemrograman super-ramping, super cepat, terutama dengan gempuran semua perangkat mobile ini ... mengapa C masih merupakan pilihan terbaik untuk beberapa perangkat ini, yaitu, mengapa tidak ada lagi bahasa tingkat itu, seperti .NET-vs-Python-esque?
Jason
5
Pelat. Tidur nyenyak tapi tidak dilupakan! :)
2
@Jason: Pertanyaannya adalah, berapa banyak perakit portabel yang Anda butuhkan? C terkenal dan sangat sulit untuk menulis bahasa dengan implementasi yang lebih cepat, jadi mengapa repot-repot? Dalam setelan jas, tidak ada persyaratan, tidak ada pasar, tidak ada motivasi.
4
@ Michael, permintaan maaf karena komentar-jacking jawaban Anda. Alasan ada lebih banyak di medan python / ruby ​​/ java dll adalah bahwa setelah Anda berhenti mencoba bahasa yang paling efisien, Anda mendapatkan lebih banyak opsi untuk fitur yang diprioritaskan, dan setiap pendekatan dapat menghasilkan bahasa baru. Ada jauh lebih sedikit cara untuk menulis bahasa secepat mungkin.
1
-1 untuk "dan hampir tidak ada ruang untuk memperbaiki itu" - ada banyak ruang untuk meningkatkan C / C ++ tanpa mempengaruhi kinerja.
BlueRaja - Danny Pflughoeft
21

Fortran lebih cepat daripada C untuk tugas-tugas numerik karena cara menangani referensi memori (pointer C lebih sulit untuk dioptimalkan). Perpustakaan numerik kelas berat di dasar hal-hal seperti Matlab dan Numpy masih ditulis dalam Fortran.

Di sisi lain, C ++ bisa secepat C, tetapi memiliki banyak fitur pemrograman yang lebih canggih. Ini bahasa yang jauh lebih baru, dari pertengahan 80-an.

zaharpopov
sumber
1
Dan C ++ masih diperbarui.
GManNickG
5
@ GMan: begitu juga C.
3
Perbaiki saya jika saya salah, tetapi bukankah restrictpointer C99 memiliki semantik aliasing yang sama dengan Fortran? Dan apa lagi yang membuat perbedaan?
9
Saya pikir ide bahwa Fortran lebih cepat daripada C agak mitos, tergantung pada apa yang dikodekan dan siapa yang melakukannya. Alasan perpustakaan numerik kelas berat berada di Fortran bukan karena Fortran lebih cepat, tetapi karena rutinitas awalnya dikodekan dalam Fortran dan beberapa orang memiliki keberanian atau perlu menulis ulang. Sejumlah kecil guru matematika yang menulis dan memeriksa algoritma ini senang di Fortran dan melihat tidak perlu berubah, terutama karena mereka membayangkan Fortran lebih cepat.
Mike Dunlavey
16

Apa-apaan, aku akan berpadu dengan $ 0,02 saya.

Dalam banyak kasus ada perbedaan nyata atau yang dirasakan antara bahasa "sistem" dan bahasa tingkat yang lebih tinggi. Saya akan mengabaikan sebagian besar bahasa "tingkat lebih tinggi", karena tidak seorang pun (setidaknya tidak banyak) akan berpendapat bahwa untuk banyak tugas, bahasa seperti Python, Ruby, dll. Lebih mudah untuk digunakan.

C dirancang untuk menjadi bahasa sistem, yang berarti ia dirancang sebagai bahasa tempat sistem operasi Unix ditulis. Dengan demikian, ia dirancang untuk menjadi sederhana, kuat, dan cepat. Bahasa sederhana mendapatkan kekuatan dengan cara yang sering dianggap berbahaya oleh pemrogram-sistem: pointer, manajemen memori manual, dll. Seperti yang telah disebutkan, C cukup sederhana. K&R adalah buku terkecil di rak pemrograman saya sejauh ini (tidak termasuk Referensi O'Reilly Pocket) dan hanya sedikit "lebih besar" dari Referensi Saku Ruby saya. C cukup kuat. Jika Anda perlu berbicara dengan perangkat keras, periksa secara manual dan mainkan memori, dll. C memiliki kemampuan.

Dari sudut pandang programmer, C tidak sesederhana itu. Kecepatan dan daya datang dengan harga manajemen memori manual dan tidak banyak dukungan OOP untuk bahasa ini. C ++ (bukan bahasa favorit saya) jauh lebih sederhana dari perspektif programmer, tetapi jauh lebih sederhana dari perspektif kompiler. Objective-C (mungkin bahasa favorit saya) memiliki tradeoff yang sama, dengan sedikit condong ke arah menjaga bahasa sederhana (pengumpulan sampah adalah pendatang baru untuk Objective-C, misalnya). Tetapi karena dunia komputasi seperti yang kita ketahui ditulis dalam bahasa C, sulit untuk bahasa yang lebih baru, lebih rumit tetapi "lebih mudah" untuk mendapatkan adopsi luas.

Dalam beberapa kasus, terutama ketika "standar" saat ini adalah "cukup baik" seperti C, tidak ada banyak insentif untuk sesuatu yang "lebih baik" (C ++, Objective-C, D dll.) Untuk mendapatkan daya tarik, ketika ada bahkan insentif yang cukup untuk menciptakan sesuatu yang "lebih baik".

alesplin
sumber