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".
Jawaban:
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.
sumber
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 '<'.
sumber
restrict
dalam C99 (10 tahun yang lalu!).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.
sumber
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.
sumber
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.
sumber
restrict
pointer C99 memiliki semantik aliasing yang sama dengan Fortran? Dan apa lagi yang membuat perbedaan?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".
sumber