Saya sedang mempertimbangkan untuk belajar C.
Tetapi mengapa orang menggunakan C (atau C ++) jika itu dapat digunakan 'berbahaya'?
Berbahaya, maksud saya dengan pointer dan hal-hal serupa lainnya.
Seperti pertanyaan Stack Overflow. Mengapa fungsi ini begitu berbahaya sehingga tidak boleh digunakan? . Mengapa programmer tidak hanya menggunakan Java atau Python atau bahasa kompilasi lain seperti Visual Basic?
Jawaban:
C mendahului banyak bahasa lain yang Anda pikirkan. Banyak hal yang sekarang kita ketahui tentang bagaimana membuat pemrograman "lebih aman" berasal dari pengalaman dengan bahasa seperti C.
Banyak bahasa yang lebih aman yang telah keluar sejak C mengandalkan runtime yang lebih besar, seperangkat fitur yang lebih rumit, dan / atau mesin virtual untuk mencapai tujuan mereka. Akibatnya, C tetap menjadi "penyebut umum terendah" di antara semua bahasa populer / umum.
C adalah bahasa yang jauh lebih mudah untuk diimplementasikan karena relatif kecil, dan lebih cenderung berkinerja memadai bahkan di lingkungan terlemah, sehingga banyak sistem tertanam yang perlu mengembangkan kompiler mereka sendiri dan alat-alat lain lebih mungkin untuk dapat menyediakan kompiler fungsional untuk C.
Karena C sangat kecil dan sangat sederhana, bahasa pemrograman lain cenderung berkomunikasi satu sama lain menggunakan C-like API. Ini mungkin alasan utama mengapa C tidak akan pernah benar-benar mati, bahkan jika kebanyakan dari kita hanya pernah berinteraksi dengannya melalui pembungkus.
Banyak bahasa "lebih aman" yang mencoba untuk meningkatkan pada C dan C ++ tidak mencoba menjadi "bahasa sistem" yang memberi Anda hampir total kontrol atas penggunaan memori dan perilaku runtime dari program Anda. Meskipun benar bahwa semakin banyak aplikasi saat ini tidak membutuhkan tingkat kontrol itu, akan selalu ada beberapa kasus di mana diperlukan (terutama di dalam mesin virtual dan browser yang menerapkan semua bahasa yang baik dan aman ini untuk kita semua).
Saat ini, ada beberapa bahasa pemrograman sistem (Rust, Nim, D, ...) yang lebih aman daripada C atau C ++. Mereka memiliki manfaat dari tinjau balik, dan menyadari bahwa sebagian besar waktu, kontrol yang baik seperti itu tidak diperlukan, jadi tawarkan antarmuka yang umumnya aman dengan beberapa kait / mode tidak aman yang dapat digunakan untuk beralih ketika benar-benar diperlukan.
Bahkan di dalam C, kami telah belajar banyak aturan dan pedoman yang cenderung secara drastis mengurangi jumlah bug berbahaya yang muncul dalam praktik. Pada umumnya tidak mungkin untuk mendapatkan standar untuk menegakkan aturan-aturan ini secara surut karena itu akan merusak terlalu banyak kode yang ada, tetapi biasanya menggunakan peringatan kompiler, serat dan alat analisis statis lainnya untuk mendeteksi jenis masalah yang mudah dicegah ini. Subset dari program C yang lulus alat-alat ini dengan warna terbang sudah jauh lebih aman daripada "hanya C", dan setiap programmer C yang kompeten hari ini akan menggunakan beberapa dari mereka.
Juga, Anda tidak akan pernah membuat kontes Java yang membingungkan sama menghiburnya dengan kontes C yang membingungkan .
sumber
Pertama, C adalah bahasa pemrograman sistem. Jadi, misalnya, jika Anda menulis mesin virtual Java atau juru bahasa Python, Anda memerlukan bahasa pemrograman sistem untuk menuliskannya.
Kedua, C memberikan kinerja yang tidak dimiliki bahasa seperti Java dan Python. Biasanya, komputasi kinerja tinggi di Jawa dan Python akan menggunakan perpustakaan yang ditulis dalam bahasa kinerja tinggi seperti C untuk melakukan pengangkatan berat.
Ketiga, C memiliki jejak yang jauh lebih kecil daripada bahasa seperti Java dan Python. Ini membuatnya dapat digunakan untuk sistem embedded, yang mungkin tidak memiliki sumber daya yang diperlukan untuk mendukung lingkungan run-time yang besar dan permintaan memori dari bahasa seperti Java dan Python.
"Bahasa pemrograman sistem" adalah bahasa yang cocok untuk membangun sistem berkekuatan industri dengan; sebagaimana adanya, Java dan Python bukan bahasa pemrograman sistem. "Tepatnya apa yang membuat bahasa pemrograman sistem" berada di luar cakupan pertanyaan ini, tetapi bahasa pemrograman sistem perlu memberikan dukungan untuk bekerja dengan platform yang mendasarinya.
Di sisi lain (dalam menanggapi komentar), bahasa pemrograman sistem tidak perlu hosting sendiri. Masalah ini muncul karena pertanyaan awal bertanya "mengapa orang menggunakan C", komentar pertama bertanya "mengapa Anda perlu bahasa seperti C" ketika Anda memiliki PyPy, dan saya mencatat bahwa PyPy tidak pada kenyataannya menggunakan C. Jadi, awalnya relevan dengan pertanyaan, tetapi sayangnya (dan membingungkan) "hosting sendiri" sebenarnya tidak relevan dengan jawaban ini. Maaf saya membawanya.
Jadi, untuk meringkas: Java dan Python tidak cocok untuk pemrograman sistem bukan karena implementasi utama mereka ditafsirkan, atau karena implementasi yang dikompilasi secara asli tidak di-host sendiri, tetapi karena mereka tidak memberikan dukungan yang diperlukan untuk bekerja dengan platform yang mendasarinya.
sumber
Maaf untuk menambahkan jawaban lain, tapi saya rasa jawaban yang ada tidak langsung menjawab kalimat pertama Anda yang menyatakan:
Mengapa? Apakah Anda ingin melakukan hal-hal yang biasanya digunakan C untuk hari ini (mis. Driver perangkat, VM, mesin game, perpustakaan media, sistem tertanam, kernel OS)?
Jika ya, maka ya, tentu pelajari C atau C ++ tergantung pada yang Anda minati. Apakah Anda ingin mempelajarinya sehingga Anda akan memiliki pemahaman yang lebih dalam tentang apa yang dilakukan bahasa tingkat tinggi Anda?
Anda kemudian menyebutkan masalah keamanan. Anda tidak perlu membutuhkan pemahaman yang mendalam tentang safe C untuk melakukan yang terakhir, dengan cara yang sama bahwa contoh kode dalam bahasa tingkat yang lebih tinggi mungkin memberi Anda intisari tanpa menjadi siap produksi.
Tulis beberapa kode C untuk mendapatkan intinya. Lalu letakkan kembali di rak. Jangan terlalu khawatir tentang keamanan kecuali Anda ingin menulis kode produksi C.
sumber
Ini adalah pertanyaan BESAR dengan banyak jawaban, tetapi versi singkatnya adalah bahwa setiap bahasa pemrograman dikhususkan untuk situasi yang berbeda. Misalnya, JavaScript untuk web, C untuk hal-hal tingkat rendah, C # untuk apa pun Windows, dll. Ini membantu untuk mengetahui apa yang ingin Anda lakukan setelah Anda tahu pemrograman untuk memutuskan bahasa pemrograman apa yang akan dipilih.
Untuk membahas poin terakhir Anda, mengapa C / C ++ lebih dari Java / Python, sering kali turun ke kecepatan. Saya membuat game, dan Java / C # baru-baru ini mencapai kecepatan yang cukup baik untuk dijalankan. Lagi pula, jika Anda ingin game Anda berjalan pada 60 frame per detik, dan Anda ingin game Anda melakukan banyak hal (rendering sangat mahal), maka Anda memerlukan kode untuk berjalan secepat mungkin. Python / Java / C # / Banyak yang lain berjalan pada "penerjemah", lapisan tambahan perangkat lunak yang menangani semua hal yang membosankan yang tidak dimiliki oleh C / C ++, seperti mengelola memori dan pengumpulan sampah. Overhead tambahan itu memperlambat segalanya, jadi hampir setiap gim besar yang Anda lihat sudah selesai (dalam 10 tahun terakhir) di C atau C ++. Ada pengecualian: mesin game Unity menggunakan C # *, dan Minecraft menggunakan Java, tapi itu pengecualian, bukan aturannya. Secara umum,
* Bahkan Unity tidak semua C #, sebagian besar adalah C ++ dan Anda hanya menggunakan C # untuk kode permainan Anda.
EDIT Untuk menanggapi beberapa komentar yang muncul setelah saya memposting ini: Mungkin saya terlalu menyederhanakan terlalu banyak, saya hanya memberikan gambaran umum. Dengan pemrograman, jawabannya tidak pernah sederhana. Ada penerjemah untuk C, Javascript dapat berjalan di luar browser, dan C # dapat berjalan pada apa saja berkat Mono. Bahasa pemrograman yang berbeda dikhususkan untuk domain yang berbeda, tetapi beberapa programmer di suatu tempat mungkin menemukan cara untuk menjalankan bahasa apa pun dalam konteks apa pun. Karena OP tampaknya tidak tahu banyak pemrograman (asumsi saya, maaf kalau saya salah), saya mencoba untuk menjaga jawaban saya sederhana.
Adapun komentar tentang C # hampir secepat C + +, kata kuncinya ada hampir. Ketika saya masih kuliah, kami melakukan tur ke banyak perusahaan game, dan guru saya (yang telah mendorong kami untuk pindah dari C # ke C ++ sepanjang tahun) bertanya kepada programmer di setiap perusahaan yang kami kunjungi mengapa C ++ lebih dari C #, dan setiap satu kata C # terlalu lambat. Secara umum berjalan cepat, tetapi pengumpul sampah dapat merusak kinerja karena Anda tidak dapat mengontrol kapan dijalankan, dan memiliki hak untuk mengabaikan Anda jika tidak ingin berjalan ketika Anda merekomendasikannya. Jika Anda membutuhkan sesuatu untuk menjadi kinerja tinggi, Anda tidak ingin sesuatu yang tidak terduga seperti itu.
Untuk menanggapi komentar "baru mencapai kecepatan" saya, ya, banyak peningkatan kecepatan C # berasal dari perangkat keras yang lebih baik, tetapi karena kerangka .NET dan kompiler C # telah meningkat, ada beberapa peningkatan kecepatan di sana.
Tentang "permainan ditulis dalam bahasa yang sama dengan mesin" komentar, itu tergantung. Beberapa ada, tetapi banyak yang ditulis dalam hibrida bahasa. Unreal dapat melakukan UnrealScript dan C ++, Unity melakukan C # Javascript dan Boo, banyak mesin lain yang ditulis dalam C atau C ++ menggunakan Python atau Lua sebagai bahasa scripting. Tidak ada jawaban sederhana di sana.
Dan hanya karena itu mengganggu saya untuk membaca "siapa yang peduli jika game Anda berjalan pada 200fps atau 120fps", jika game Anda berjalan lebih cepat dari 60fps, Anda mungkin membuang-buang waktu cpu, karena monitor rata-rata bahkan tidak menyegarkan bahwa cepat. Beberapa yang lebih tinggi dan yang lebih baru, tetapi tidak standar (belum ...).
Dan tentang komentar "mengabaikan teknologi", saya masih berusia awal 20-an, jadi ketika saya mengekstrapolasi ke belakang, saya sebagian besar menggemakan apa yang dikatakan oleh programmer yang lebih tua dan lebih berpengalaman kepada saya. Jelas itu akan diperebutkan di situs seperti ini, tetapi layak untuk dipertimbangkan.
sumber
Lucu bahwa Anda mengklaim C tidak aman karena "memiliki petunjuk". Yang sebaliknya adalah benar: Java dan C # secara praktis hanya memiliki pointer (untuk tipe non-asli). Kesalahan paling umum di Jawa mungkin adalah Null Pointer Exception (lih. Https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare ). Kesalahan kedua yang paling umum mungkin adalah memegang referensi tersembunyi ke objek yang tidak digunakan (mis. Dialog tertutup tidak dibuang) yang karenanya tidak dapat dilepaskan, yang mengarah ke program yang berjalan lama dengan jejak memori yang terus tumbuh.
Ada dua mekanisme dasar yang membuat C # dan Java lebih aman, dan lebih aman dalam dua cara berbeda:
Pointer pintar C ++ terbaru membuat pekerjaan itu lebih mudah bagi programmer.
Waktu berjalan tidak melindungi terhadap mis. Upaya buffer overruns, tetapi secara teori tidak memungkinkan eksploitasi program tersebut. Sebaliknya, dengan C dan C ++, programmer harus membuat kode dengan aman untuk mencegah eksploitasi. Ini biasanya tidak tercapai segera tetapi membutuhkan ulasan dan iterasi.
Perlu dicatat bahwa jangka waktu yang rumit juga merupakan risiko keamanan. Tampak bagi saya bahwa Oracle memperbarui JVM setiap beberapa minggu karena masalah keamanan yang baru ditemukan. Tentu saja, jauh lebih sulit untuk memverifikasi JVM daripada satu program tunggal.
Oleh karena itu, keamanan waktu lari yang rumit bersifat ambigu dan menipu: Program C rata-rata Anda dapat, dengan ulasan dan iterasi, dibuat cukup aman. Program Java rata-rata Anda hanya seaman JVM; itu tidak benar. Tidak pernah.
Artikel tentang
gets()
yang Anda tautkan mencerminkan keputusan perpustakaan historis yang akan dibuat berbeda hari ini, bukan bahasa inti.sumber
Karena "keamanan" membutuhkan kecepatan, bahasa "aman" tampil pada kecepatan yang lebih lambat.
Anda bertanya mengapa menggunakan bahasa "berbahaya" seperti C atau C ++, mintalah seseorang menulis driver video atau sejenisnya dengan Python atau Java, dll. Dan lihat bagaimana perasaan Anda tentang "keamanan" :)
Namun serius, Anda harus sedekat mungkin dengan memori inti mesin untuk dapat memanipulasi piksel, register, dll. Java atau Python tidak dapat melakukan ini dengan semua jenis kecepatan layak-kinerja ... C dan C ++ keduanya memungkinkan Anda untuk melakukan ini melalui petunjuk dan sejenisnya ...
sumber
Selain semua hal di atas, ada juga satu kasus penggunaan yang cukup umum, yaitu menggunakan C sebagai perpustakaan umum untuk bahasa lain.
Pada dasarnya, hampir semua bahasa memiliki antarmuka API ke C.
Contoh sederhana, cobalah membuat aplikasi umum untuk Linux / IOS / Android / Windows. Selain semua alat yang ada di luar sana, yang akhirnya kami lakukan adalah pustaka inti di C, dan kemudian mengubah GUI untuk setiap lingkungan, yaitu:
Dua sen saya,
sumber
Kesulitan mendasar dengan C adalah bahwa nama tersebut digunakan untuk menggambarkan sejumlah dialek dengan sintaksis yang identik tetapi sangat berbeda. Beberapa dialek jauh lebih aman daripada yang lain.
Dalam C seperti yang awalnya dirancang oleh Dennis Ritchie, pernyataan C umumnya akan dipetakan ke instruksi mesin dengan cara yang dapat diprediksi. Karena C dapat berjalan pada prosesor yang berperilaku berbeda ketika hal-hal seperti menandatangani aritmatika meluap terjadi, seorang programmer yang tidak tahu bagaimana mesin akan berperilaku jika aritmatika meluap tidak akan tahu kode C yang berjalan pada mesin itu akan berperilaku baik, tetapi jika sebuah mesin diketahui berperilaku dengan cara tertentu (mis. silent two's-melengkapi wraparound) maka implementasi pada mesin itu biasanya akan melakukan hal yang sama. Salah satu alasan mengapa C mendapat reputasi untuk menjadi cepat adalah bahwa dalam kasus di mana programmer tahu bahwa perilaku alami platform dalam skenario kasus tepi akan sesuai dengan kebutuhan mereka, tidak perlu bagi programmer atau kompiler untuk menulis kode untuk menghasilkan skenario seperti itu. .
Sayangnya, penulis kompiler telah mengambil pandangan bahwa karena Standar tidak memaksakan persyaratan pada implementasi apa yang harus dilakukan dalam kasus-kasus seperti itu (kelonggaran yang dimaksudkan untuk memungkinkan implementasi perangkat keras yang mungkin tidak berperilaku dapat diprediksi), kompiler harus merasa bebas untuk menghasilkan kode yang meniadakan hukum waktu dan kausalitas.
Pertimbangkan sesuatu seperti:
Teori kompiler hiper-modern (tetapi modis) akan menyarankan bahwa kompiler harus menampilkan "QUACK!" tanpa syarat, karena dalam kasus mana pun kondisi itu salah, program akan berakhir meminta perilaku tidak terdefinisi melakukan kelipatan yang hasilnya akan diabaikan. Karena Standar akan memungkinkan kompiler untuk melakukan apa pun yang disukainya dalam kasus seperti itu, itu memungkinkan kompiler untuk menghasilkan "QUACK!".
Sementara C dulu lebih aman daripada bahasa assembly, ketika menggunakan kompiler hyper-modern kebalikannya adalah benar. Dalam bahasa assembly, integer overflow dapat menyebabkan perhitungan menghasilkan hasil yang tidak berarti, tetapi pada sebagian besar platform yang akan menjadi sejauh efeknya. Jika hasilnya akhirnya diabaikan, melimpah tidak akan menjadi masalah. Dalam hiper-modern C, bagaimanapun, bahkan apa yang biasanya akan menjadi "jinak" bentuk Perilaku Tidak Terdefinisi (seperti overflow integer dalam perhitungan yang akhirnya diabaikan) dapat menyebabkan eksekusi program sewenang-wenang.
sumber
int arr[5][[5]
, upaya untuk mengaksesarr[0][5]
akan menghasilkan Perilaku Tidak Terdefinisi. Aturan seperti itu memungkinkan kompiler yang diberi sesuatu sepertiarr[1][0]=3; arr[0][i]=6; arr[1][0]++;
menyimpulkan yangarr[1][0]
akan sama dengan 4, tanpa memperhatikan nilaii
.Alasan historis. Saya tidak sering menulis kode baru, kebanyakan saya bisa mempertahankan dan memperpanjang hal-hal lama yang telah berjalan selama beberapa dekade. Saya senang C dan bukan Fortran.
Saya bisa kesal ketika beberapa siswa berkata, "tapi mengapa kamu melakukan X mengerikan ini ketika kamu bisa melakukan Y?". Ya, X adalah pekerjaan yang saya dapatkan dan membayar tagihan dengan sangat baik. Saya pernah melakukan Y pada kesempatan, dan itu menyenangkan, tetapi X adalah apa yang kebanyakan dari kita lakukan.
sumber
Apa itu "berbahaya"?
Klaim bahwa C "berbahaya" adalah titik pembicaraan yang sering terjadi dalam perang api bahasa (paling sering dibandingkan dengan Jawa). Namun, bukti untuk klaim ini tidak jelas.
C adalah bahasa dengan serangkaian fitur tertentu. Beberapa fitur ini memungkinkan jenis kesalahan tertentu yang tidak diizinkan oleh jenis bahasa lain (risiko manajemen memori C biasanya disorot). Namun, ini tidak sama dengan argumen bahwa C lebih berbahaya daripada bahasa lain secara keseluruhan . Saya tidak mengetahui ada orang yang memberikan bukti meyakinkan tentang hal ini.
Juga, "berbahaya" tergantung pada konteks: apa yang Anda coba lakukan, dan risiko apa yang Anda khawatirkan?
Dalam banyak konteks saya akan menganggap C lebih "berbahaya" daripada bahasa tingkat tinggi, karena mengharuskan Anda untuk melakukan lebih banyak penerapan fungsionalitas dasar secara manual, meningkatkan risiko bug. Misalnya, melakukan beberapa pemrosesan teks dasar atau mengembangkan situs web di C biasanya akan menjadi bodoh, karena bahasa lain memiliki fitur yang membuat ini jauh lebih mudah.
Namun, C dan C ++ banyak digunakan untuk sistem mission-critical, karena bahasa yang lebih kecil dengan kontrol langsung yang lebih keras dianggap "lebih aman" dalam konteks itu. Dari jawaban Stack Overflow yang sangat baik :
sumber
Untuk menambah jawaban yang ada, semuanya baik-baik saja dan pepatah mengatakan bahwa Anda akan memilih Python atau PHP untuk proyek Anda, karena relatif aman. Tetapi seseorang harus mengimplementasikan bahasa-bahasa itu dan, ketika mereka melakukannya, mereka mungkin akan melakukannya dalam bahasa C. (Atau, yah, sesuatu seperti itu.)
Jadi itu sebabnya orang menggunakan C - untuk membuat alat yang tidak berbahaya yang ingin Anda gunakan.
sumber
Izinkan saya mengulangi pertanyaan Anda:
Alat apa pun yang menarik dapat digunakan secara berbahaya, termasuk bahasa pemrograman. Anda belajar lebih banyak sehingga Anda dapat melakukan lebih banyak (dan agar lebih sedikit bahaya dibuat ketika Anda menggunakan alat ini). Secara khusus, Anda mempelajari alat itu sehingga Anda dapat melakukan hal yang baik untuk alat itu (dan mungkin mengenali kapan alat itu adalah alat terbaik dari alat yang Anda tahu).
Misalnya, jika Anda perlu meletakkan lubang silinder berdiameter 6 mm, dalam 5 cm, pada balok kayu, bor adalah alat yang jauh lebih baik daripada parser LALR. Jika Anda tahu apa dua alat ini, Anda tahu mana alat yang tepat. Jika Anda sudah tahu cara menggunakan bor, voila !, lubang.
C hanyalah alat lain. Lebih baik untuk beberapa tugas daripada untuk yang lain. Jawaban lain di sini membahas hal ini. Jika Anda belajar beberapa C, Anda akan mengenali kapan itu adalah alat yang tepat dan kapan tidak.
sumber
Tidak ada alasan khusus untuk tidak belajar C tetapi saya akan menyarankan C ++. Ia menawarkan banyak hal yang dilakukan oleh C (karena C ++ adalah kumpulan super C), dengan sejumlah besar "ekstra". Belajar C sebelum C ++ tidak perlu - mereka adalah bahasa yang terpisah secara efektif.
Dengan kata lain, jika C adalah seperangkat alat-alat pertukangan, kemungkinan akan menjadi:
Anda dapat membangun apa saja dengan alat-alat ini - tetapi segala sesuatu yang bagus berpotensi membutuhkan banyak waktu dan keterampilan.
C ++ adalah kumpulan alat-alat listrik di toko perangkat keras lokal Anda.
Jika Anda tetap menggunakan fitur bahasa dasar untuk memulai, C ++ memiliki kurva belajar tambahan yang relatif sedikit.
Karena beberapa orang tidak menginginkan furnitur dari IKEA. =)
Serius meskipun, sementara banyak bahasa yang "lebih tinggi" dari C atau C ++ mungkin memiliki hal-hal yang membuat mereka (berpotensi) "lebih mudah" untuk digunakan dalam aspek-aspek tertentu, ini tidak selalu merupakan hal yang baik. Jika Anda tidak menyukai cara sesuatu dilakukan atau fitur tidak disediakan, kemungkinan tidak banyak yang dapat Anda lakukan. Di sisi lain, C dan C ++ menyediakan fitur bahasa "tingkat rendah" yang cukup (termasuk pointer) sehingga Anda dapat mengakses banyak hal secara langsung (terutama perangkat keras atau sistem operasi) atau membangunnya sendiri, yang mungkin tidak dapat dilakukan di negara lain. bahasa sebagaimana diterapkan.
Lebih khusus, C memiliki serangkaian fitur berikut yang membuatnya diinginkan untuk banyak programmer:
Kompatibilitas - C telah ada sejak lama dan semua orang memiliki alat dan pustaka untuk itu. Bahasa itu sendiri juga tidak pilih-pilih - ia mengharapkan prosesor untuk menjalankan instruksi dan memori untuk menyimpan barang-barang dan itu saja.
Selain itu, ada sesuatu yang dikenal sebagai Application Binary Interface (ABI) . Singkatnya, ini adalah cara bagi program untuk berkomunikasi pada tingkat kode mesin, yang dapat memiliki keunggulan dibandingkan Antarmuka Pemrograman Aplikasi (API) . Sementara bahasa lain seperti C ++ dapat memiliki ABI, biasanya ini kurang seragam (disepakati) dari C, jadi C membuat bahasa dasar yang baik ketika Anda ingin menggunakan ABI untuk berkomunikasi dengan program lain karena suatu alasan.
Efisiensi (dan terkadang skema manajemen memori yang tidak dapat diimplementasikan tanpa akses langsung ke memori).
Langsung mengakses memori dengan pointer memperkenalkan banyak trik rapi (biasanya cepat) ketika Anda dapat menempatkan cakar kotor Anda pada anak-anak kecil dan nol di memori Anda lubang cubby langsung dan tidak harus menunggu itu berarti guru untuk membagikan mainan hanya saat bermain kemudian ambil lagi.
Singkatnya, menambahkan hal-hal yang berpotensi menciptakan kelambatan atau memperkenalkan kompleksitas yang tidak diinginkan.
Mengenai bahasa skrip dan sejenisnya, Anda harus bekerja keras untuk mendapatkan bahasa yang membutuhkan program sekunder untuk berjalan seefisien C (atau bahasa yang dikompilasi) secara asli. Menambahkan penerjemah saat terbang secara inheren memperkenalkan kemungkinan penurunan kecepatan eksekusi dan peningkatan penggunaan memori karena Anda menambahkan program lain ke dalam campuran. Efisiensi program Anda sangat bergantung pada efisiensi program sekunder ini sebaik seberapa baik (buruk =)) Anda menulis kode program asli Anda. Belum lagi program Anda sering benar-benar bergantung pada program kedua untuk dieksekusi. Program kedua itu tidak ada karena suatu alasan pada sistem tertentu? Kode tidak jalan.
Bahkan, memperkenalkan sesuatu yang "ekstra" berpotensi memperlambat atau mempersulit kode Anda. Dalam bahasa "tanpa penunjuk menakutkan", Anda selalu menunggu bit kode lain untuk dibersihkan di belakang Anda atau mencari cara "aman" untuk melakukan sesuatu - karena program Anda masih melakukan operasi akses memori yang sama seperti yang mungkin dilakukan dengan pointer. Anda bukan orang yang menanganinya (jadi Anda tidak dapat melakukannya, genius = P).
Per jawaban yang diterima:
Gagasan bahwa karena sesuatu dapat dilakukan dalam bahasa, itu harus dilakukan adalah konyol. Bahasa memiliki kekurangan yang diperbaiki. Untuk alasan kompatibilitas dengan kode lama, konstruk ini masih dapat digunakan. Tapi tidak ada (kemungkinan) memaksa programmer untuk menggunakan get () dan, pada kenyataannya, perintah ini pada dasarnya diganti dengan alternatif yang lebih aman.
Lebih tepatnya, masalah dengan mendapat () bukan masalah pointer per se. Ini masalah dengan perintah yang tidak perlu tahu cara menggunakan memori dengan aman. Dalam arti abstrak, ini semua masalah pointer - membaca dan menulis hal-hal yang tidak seharusnya. Itu bukan masalah dengan pointer; itu masalah dengan implementasi pointer.
Untuk memperjelas, pointer tidak berbahaya sampai Anda secara tidak sengaja mengakses lokasi memori yang tidak Anda inginkan. Itupun tidak menjamin komputer Anda akan meleleh atau meledak. Dalam kebanyakan kasus, program Anda akan berhenti berfungsi (dengan benar).
Yang mengatakan, karena pointer memberikan akses ke lokasi memori dan karena data dan kode yang dapat dieksekusi ada dalam memori bersama, ada cukup bahaya nyata dari korupsi tidak disengaja yang Anda ingin mengelola memori dengan benar.
Untuk itu, karena operasi akses memori yang benar-benar langsung sering kali memberikan manfaat yang kurang secara umum daripada yang mungkin terjadi bertahun-tahun yang lalu, bahkan bahasa yang dikumpulkan non- sampah seperti C ++ telah memperkenalkan hal-hal seperti pointer pintar untuk membantu menjembatani kesenjangan antara efisiensi dan keamanan memori.
Singkatnya, ada sangat sedikit alasan untuk takut pada pointer selama itu digunakan dengan aman. Ambil saja petunjuk dari Steve Park "The Crocodile Hunter" versi South Park, Irwin - jangan terus menempel ibu jari Anda di lubang buaya .
sumber
Seperti biasa, bahasa pemrograman hanyalah konsekuensi dari pemecahan masalah. Anda sebenarnya harus belajar tidak hanya C tetapi banyak bahasa yang berbeda (dan cara-cara lain pemrograman komputer, baik itu alat GUI atau penerjemah perintah) untuk memiliki kotak peralatan yang layak untuk digunakan saat memecahkan masalah.
Kadang-kadang Anda akan menemukan bahwa masalah cocok untuk sesuatu yang termasuk dalam pustaka default Java, dalam kasus seperti itu Anda dapat memilih Java untuk memanfaatkan itu. Dalam kasus lain, mungkin Anda perlu melakukan sesuatu pada Windows yang jauh lebih sederhana di .NET runtime, jadi Anda dapat menggunakan C # atau VB. Mungkin ada alat grafis atau skrip perintah yang memecahkan masalah Anda, maka Anda dapat menggunakannya. Mungkin Anda perlu menulis aplikasi GUI pada banyak platform, Java bisa menjadi pilihan, mengingat pustaka yang disertakan di JDK, tetapi sekali lagi, satu platform target mungkin tidak memiliki JRE jadi mungkin Anda memilih C dan SDL (atau serupa).
C memiliki posisi penting dalam set alat ini, karena bersifat umum, kecil dan cepat dan juga mengkompilasi ke kode mesin. Ini juga didukung pada setiap platform di bawah matahari (bukan tanpa mengkompilasi ulang namun).
Intinya adalah, Anda harus belajar sebanyak mungkin alat, bahasa, dan paradigma yang Anda bisa.
Jauhi pola pikir: "Saya seorang programmer X" (X = C, C ++, Java, dll.)
Cukup gunakan "Saya seorang programmer".
Seorang programmer memecahkan masalah dan merancang algoritma dengan menginstruksikan mesin untuk melakukan beban kerja. Akhir dari cerita. Ini tidak relevan dengan bahasa. Keterampilan Anda yang paling penting adalah pemecahan masalah dan pemecahan logis masalah terstruktur, keterampilan bahasa / pilihan SELALU sekunder dan / atau konsekuensi dari sifat masalah.
Jalur yang menarik jika Anda tertarik pada C adalah memperluas keterampilan Anda dengan Go. Go benar-benar merupakan peningkatan C, dengan pengumpulan dan antarmuka sampah, serta model / saluran threading bawaan yang bagus, yang juga membawa banyak manfaat C (seperti aritmatika pointer dan kompilasi ke kode mesin).
sumber
Itu tergantung pada apa yang ingin Anda lakukan dengannya. C dirancang sebagai pengganti bahasa rakitan dan merupakan bahasa tingkat tinggi yang paling dekat dengan bahasa mesin. Dengan demikian memiliki overhead dan ukuran yang rendah dalam kinerja dan cocok untuk pemrograman sistem dan tugas-tugas lain yang memerlukan jejak kecil dan mendekati perangkat keras yang mendasarinya.
sumber
Ketika Anda bekerja pada tingkat bit dan byte, memori sebagai kumpulan data homogen mentah, seperti yang sering diperlukan untuk secara efektif mengimplementasikan pengalokasi dan struktur data yang paling efisien, tidak ada keamanan yang bisa didapat. Keselamatan didominasi konsep tipe data yang kuat, dan pengalokasi memori tidak bekerja dengan tipe data. Ia bekerja dengan bit dan byte untuk menyatukan dengan bit dan byte yang sama berpotensi mewakili satu tipe data satu saat dan yang lain nanti.
Tidak masalah jika Anda menggunakan C ++ dalam kasus itu. Anda masih akan menaburkan
static_casts
seluruh kode untuk membuang darivoid*
pointer dan masih bekerja dengan bit dan byte dan hanya berurusan dengan lebih banyak kerepotan terkait dengan menghormati sistem tipe dalam konteks ini daripada C yang memiliki sistem tipe yang jauh lebih sederhana di mana Anda bebas untukmemcpy
bit dan byte di sekitar tanpa khawatir tentang melibas sistem tipe.Bahkan seringkali lebih sulit untuk bekerja di C ++, bahasa yang lebih aman secara keseluruhan, dalam konteks bit dan byte tingkat rendah tanpa menulis kode yang bahkan lebih berbahaya daripada yang Anda lakukan di C, karena Anda bisa melakukan buldoser pada sistem tipe C ++ dan melakukan hal-hal seperti menimpa vptrs dan gagal memunculkan copy constructor dan destructor pada waktu yang tepat. Jika Anda mengambil waktu yang tepat untuk menghormati jenis-jenis ini dan menggunakan penempatan yang baru dan secara manual memanggil para pengawas dan sebagainya, Anda kemudian akan terpapar ke dunia penanganan-pengecualian dalam konteks yang terlalu rendah untuk RAII menjadi praktis, dan mencapai pengecualian- keamanan dalam konteks tingkat rendah seperti itu sangat sulit (Anda harus berpura-pura seperti fungsi apa pun dapat melempar dan menangkap semua kemungkinan dan memutar balik semua efek samping sebagai transaksi yang tidak dapat dibagi seolah-olah tidak terjadi apa-apa). Kode C sering dapat "
Dan mustahil untuk menerapkan pengalokasi semacam itu dalam bahasa yang tidak memungkinkan Anda untuk menjadi "berbahaya" di sini; Anda harus bersandar pada pengalokasi apa pun yang mereka berikan (diimplementasikan paling mungkin dalam C atau C ++) dan berharap itu cukup baik untuk tujuan Anda. Dan hampir selalu ada yang lebih efisien tetapi lebih sedikit pengalokasi umum dan struktur data yang cocok untuk tujuan spesifik Anda, tetapi jauh lebih sempit karena mereka secara khusus dirancang untuk tujuan Anda.
Kebanyakan orang tidak memerlukan suka C atau C ++ karena mereka hanya bisa memanggil kode yang awalnya diimplementasikan dalam C atau C ++ atau bahkan mungkin perakitan sudah diterapkan untuk mereka. Banyak yang mungkin mendapat manfaat dari berinovasi di tingkat tinggi, seperti merangkai bersama sebuah program gambar yang hanya menggunakan pustaka dari fungsi pemrosesan gambar yang sudah diterapkan di C di mana mereka tidak terlalu banyak berinovasi pada tingkat terendah perulangan melalui piksel individu, tapi mungkin menawarkan antarmuka pengguna yang sangat ramah dan alur kerja yang belum pernah terlihat sebelumnya. Dalam hal ini, jika titik dari perangkat lunak hanya untuk membuat panggilan tingkat tinggi menjadi pustaka tingkat rendah ( "proses seluruh gambar ini untuk saya, bukan untuk setiap piksel, lakukan sesuatu" ), maka itu bisa dibilang menjadi optimasi prematur bahkan mencoba untuk mulai menulis aplikasi seperti itu di C.
Tetapi jika Anda melakukan sesuatu yang baru di tingkat rendah di mana itu membantu untuk mengakses data dengan cara tingkat rendah seperti filter gambar baru yang belum pernah dilihat sebelumnya yang cukup cepat untuk bekerja pada video HD secara realtime, maka Anda umumnya harus mendapatkan sedikit berbahaya.
Sangat mudah untuk menerima hal ini begitu saja. Saya ingat posting Facebook dengan seseorang yang menunjukkan bagaimana layak untuk membuat video game 3D dengan Python dengan implikasi bahwa bahasa tingkat rendah menjadi usang, dan itu tentu saja merupakan permainan yang tampak layak. Tapi Python membuat panggilan tingkat tinggi ke perpustakaan diimplementasikan dalam C untuk melakukan semua pekerjaan berat. Anda tidak dapat membuat Unreal Engine 4 hanya dengan melakukan panggilan tingkat tinggi ke perpustakaan yang ada. Unreal Engine 4 adalahPerpustakaan. Ia melakukan segala macam hal yang tidak pernah ada di perpustakaan dan mesin lain mulai dari pencahayaan hingga bahkan sistem cetak biru nodal dan bagaimana ia dapat menyusun dan menjalankan kode dengan cepat. Jika Anda ingin berinovasi di level mesin rendah / inti / kernel, maka Anda harus mendapatkan level rendah. Jika semua pengembang game beralih ke bahasa aman tingkat tinggi, tidak akan ada Unreal Engine 5, atau 6, atau 7. Kemungkinan orang masih menggunakan Unreal Engine 4 dekade kemudian karena Anda tidak dapat berinovasi pada level yang diperlukan untuk datang keluar dengan mesin generasi berikutnya dengan hanya melakukan panggilan tingkat tinggi ke yang lama.
sumber