Apakah belajar C penting untuk Ilmu Komputer? [Tutup]

15

Saya adalah pengembang front-end yang bahkan nyaris tidak melihat file dengan .hatau .cekstensi. Saya tahu sintaks C dasar, saya sudah mempelajarinya di Unreality tetapi tidak pernah tertarik pada pemrograman tingkat rendah karena itu terlalu banyak pengaturan untuk hal-hal sederhana.

Saya sangat tertarik mempelajari semua aspek Ilmu Komputer tetapi saya ingin percaya bahwa saya tidak benar-benar harus tahu bahasa tertentu untuk memahami sebagian besar konsep dalam Ilmu Komputer. Namun ketika saya mulai membaca buku dan artikel tentang konsep-konsep dasar Ilmu Komputer seperti Struktur Data dan Desain Algoritma, saya harus belajar C, karena semua contoh dan bahkan pelajaran ada di C (dan kadang-kadang Java).

Pertanyaan saya adalah, apakah C sebagai bahasa pemrograman penting untuk Ilmu Komputer atau kami kebetulan memiliki semua sumber daya kami di CS yang ditulis dalam C? Bisakah seseorang belajar Ilmu Komputer tanpa belajar C?

Mohsen
sumber
4
Berikut ini pendapat Joel Spolsky tentang hal itu: joelonsoftware.com/articles/CollegeAdvice.html Hal ini dapat didiskusikan , tetapi saya pikir ia memiliki poinnya.
Doc Brown
2
Purists akan berpendapat bahwa ilmu komputer bukan tentang komputer, yang membuat bahasa pemrograman tidak perlu.
Blrfl
1
Apa yang Anda maksud dengan "Ilmu Komputer"? Apa yang Anda jelaskan sebagian besar merupakan bagian Rekayasa Perangkat Lunak dari ilmu komputer yang saya kira. Juga, saya gagal melihat bagaimana semua sumber daya ditulis dalam C. Saya sudah membaca beberapa buku tentang algoritma / struktur data dan tidak ada yang menggunakan C. Hampir semua dari mereka menggunakan semacam bahasa kode pseudocode, mudah dimengerti oleh semua orang (well, kecuali TAOCP yang menggunakan perakitan ... tapi itu cerita lain)
Bakuriu
Tidak nyata? Apakah itu seharusnya merupakan kekhasan koreksi-otomatis dari Universitas atau itu sekolah ilmu hitam? Saya tahu Unseen University: [
Deer Hunter

Jawaban:

31

Saya akan menentang arus di sini dan mengatakan ya, Anda harus belajar C. Saya sebenarnya setuju dengan poin-poin dalam banyak jawaban lain, tetapi Anda membuat pernyataan yang sangat kuat bahwa

Saya sangat tertarik mempelajari semua aspek Ilmu Komputer tetapi saya ingin percaya bahwa saya tidak benar-benar harus tahu bahasa tertentu untuk memahami sebagian besar konsep dalam Ilmu Komputer.

(penekanan milikku)

Nah, sistem operasi dan tumpukan jaringan adalah dua aspek besar Ilmu Komputer, dan semua sistem operasi dan tumpukan jaringan yang dominan ditulis sebagian besar dalam C. Jika Anda ingin memahami itu, Anda harus belajar C. Ya, beberapa sekolah memang berhasil mengajar kelas OS mereka di Jawa, tapi itu seperti membaca Homer dalam bahasa Inggris.

Selain itu, bahasa C tidak terlalu besar. Jika Anda benar-benar ingin mempelajari semua aspek ilmu komputer, Anda harus mengangkat bahu dan berkata 'meh', 'apa bahasa lagi?'

Charles E. Grant
sumber
Saya umumnya setuju dengan ini, meskipun bagi saya "belajar" C berarti bahwa saya pada dasarnya cukup fasih dalam bahasa untuk menulis program non-sepele di dalamnya tanpa bantuan. Saya tidak yakin apakah tingkat pemahaman itu merupakan prasyarat untuk sistem operasi dan pemrograman jaringan.
Telastyn
3
@ Telastyn: itu berarti Anda cukup fasih untuk memahami dan memodifikasi kode sistem operasi dan kode jaringan - domain tempat C digunakan, dan hanya itu. Itu tidak berarti Anda harus tahu cara menulis game di C, membuat UI yang cantik, dan membuat bagan aplikasi dalam C, grafik, atau mesin intelijen mesin di C; karena untuk setiap domain CS lainnya ada pilihan bahasa lain.
rwong
12

Untuk waktu yang sangat lama, selama puncak ilmu komputer sebagai ilmu daripada panggilan, ada beberapa pilihan terbatas untuk bahasa yang berjalan pada semua sistem yang digunakan oleh semua universitas yang berbeda.

Sejauh ini, universitas cenderung menggunakan sistem Unix. Mudahnya, ini diprogram dalam C. Seseorang dapat mulai dengan belajar C pada mesin apa pun, dan akhirnya masuk ke kode sumber unix dalam C. Di rumah, siswa dapat menggunakan kompiler C seperti Borland Turbo C pada Windows, atau MPW pada Mac - itu bekerja di mana-mana.

Pascal adalah pilihan lain, tetapi itu cenderung memiliki masalah bahwa pada titik tertentu dalam pemrograman, itu tidak cukup dari bahasa untuk melakukan apa yang benar-benar perlu Anda lakukan (pemrograman OS dalam pascal akan menyakitkan).

Beberapa sekolah yang lebih tua mempelajari Fortran, tetapi sekali lagi, itu bukan bahasa yang cukup kuat dalam banyak kasus untuk dapat mengajar kelas CS tingkat yang lebih tinggi (teori AI di fortran? Dapat dilakukan tetapi menyakitkan).

Jadi, untuk waktu yang lama C adalah pilihan.

Itu bukan satu-satunya pilihan dan ada banyak perguruan tinggi sekarang yang mengajar dalam bahasa lain untuk menutupi beberapa internal dan mempelajari konsep tingkat yang lebih tinggi tanpa harus berurusan dengan keburukan manajemen memori dan sejenisnya. Beberapa orang berpikir ini bagus, beberapa berpikir ini buruk .


Jadi tidak, belajar C tidak penting untuk belajar ilmu komputer. Anda dapat menemukan banyak buku lain di luar sana yang mengajarkan ilmu komputer dari Java atau Python. Hanya saja untuk waktu yang lama, C adalah pilihan dan buku-buku akademik bergerak lambat.


sumber
Sebagai catatan, pelatihan AI secara tradisional dilakukan dengan rekan egghead C melalui tahun 70-an dan 80-an, LISP, tetapi jawabannya ada di kepala.
jwrush
@ jwrush jawaban saya lebih sesuai dengan yang Anda bisa lakukan studi AI di C juga, dibandingkan dengan bahasa lain pada waktu itu (bukan LISP - dan saya mengambil kelas kacangan di tahun 90-an untuk AI). Memang, MIT (rumah orang-orang terpelajar) pada waktu itu mengajar banyak kelas mereka di LISP - dan itu tentu saja pilihan lain, tetapi tidak cukup praktis di bidang lain. Dalam mengajar, penting untuk bekerja dari dasar yang sama di setiap kelas sehingga orang tidak perlu menghabiskan satu atau dua minggu pertama mengajar siswa bahasa lain yang dikhususkan untuk kelas itu.
12

Saya akui bahwa seseorang bisa mendapatkan pekerjaan bergaji tinggi dan menjadi produktif tanpa pernah menyentuh C, tetapi saya sangat merekomendasikan belajar C untuk siapa saja yang serius memiliki pemahaman yang kuat tentang ilmu komputer.

Meskipun ilmu komputer adalah tentang konsep, yang bisa dipelajari terlepas dari bahasa pemrograman tertentu, ada bidang yang mungkin lebih baik dipahami dengan mempelajari C atau dengan mempelajari bidang itu menggunakan C.

  • Algoritma dan Struktur Data. Standar C hampir tidak memiliki ini - memiliki ini sudah diimplementasikan dalam bahasa atau di perpustakaan standarnya cenderung demotivasi untuk siswa: " Mengapa saya harus repot-repot menerapkan sesuatu yang tersedia?"Melihat sepotong kode C, Anda langsung melihat biaya algoritmiknya, karena semua yang ada di C hanya mengkompilasi beberapa instruksi mesin. Bahasa tingkat tinggi (misalnya Perl atau Python) sering menggunakan struktur data lanjutan di bawah kap sintaksis ringan. Kode terasa ringan, tetapi tidak. Anda sudah membutuhkan banyak pengetahuan untuk alasan yang benar tentang kompleksitas algoritme dari potongan kode tersebut. Oleh karena itu bahasa tersebut tidak cocok untuk mempelajari algoritma dan struktur data, dan banyak programmer yang selalu hidup pada bahasa tingkat tinggi, cenderung tidak mampu menangani masalah kinerja, ketika mereka mengalami masalah.

  • Sistem operasi. Sebagian besar sistem operasi ditulis dalam C. Bagaimana Anda ingin memahami proses pembuatan tanpa pernah memanggil fork? Lapisan abstraksi dari Java VM tidak membantu di sini. Dan hanya membicarakannya tanpa pernah membuat proses bahkan lebih buruk ... Bagaimana Anda bisa menulis perangkat lunak seperti Eclipse yang dapat mengarahkan output standar ke salah satu jendelanya? Anda perlu memahami konsep tingkat OS untuk itu, dan Anda dapat menyentuh mereka secara langsung dalam C saja.

  • Tipuan. Anda tidak dapat melakukan C tanpa berurusan dengan pointer. Pointer memaksa Anda untuk berpikir pada dua tingkat, dan itu memperluas keterampilan abstraksi Anda.

Ada juga beberapa keunggulan teknis dari pengetahuan C:

  • Interoperabilitas lintas bahasa. Anda ingin mengintegrasikan modul Ruby yang hebat ke dalam proyek Python Anda (gantikan dua bahasa yang sewenang-wenang di sini). Kemungkinannya adalah bahwa satu-satunya cara untuk melakukan itu, adalah melalui C, karena kedua bahasa memiliki antarmuka asing ke C.

  • Menulis perangkat lunak penting kinerja. Seseorang tidak dapat menghilangkan tingkat rendah untuk melakukan ini.


Saya tidak mengatakan, bahwa setiap program harus ditulis dalam C. Tapi C dapat membantu Anda untuk pengetahuan, yang berguna bahasa apa pun yang Anda program.

Miklós Homolya
sumber
Pointer aritmatika sangat penting untuk memahami sistem operasi karena mengarah pada alasannya. Misalnya mengapa tumpukan dan tumpukan berbeda, mengapa memori virtual berkinerja baik atau buruk, mengapa beberapa loop bekerja lebih cepat daripada yang lain, dll.
Michael Shopsin
6

Saya juga akan menentang butir di sini dan mencoba membuat kasus estetika (sedikit lucu) untuk C. Sementara beberapa orang mungkin menyebutnya "jelek" untuk alasan yang berbeda, seperti kurangnya konstruksi tingkat tinggi seperti kelas atau dengan mengandalkan pointer, saya menemukan bahwa itu tidak terjadi pada saya .

TL; DR : Menurut saya, C itu sederhana, C bagus bisa dibaca dan ada kegembiraan tertentu yang bisa ditemukan dalam memukul-mukul bit.

C itu sederhana

Standar C hanya mendefinisikan beberapa tipe dan mekanisme dasar untuk membuat fungsi, pointer dan array darinya. Selain itu, ada sejumlah kecil konstruksi komposisi untuk membuat tipe yang lebih kompleks dari primitif (seperti struct dan serikat pekerja). Perhatikan bagaimana saya menggambarkan sebagian besar bahasa dalam dua kalimat. Ini berarti Anda tidak harus menyimpan terlalu banyak aturan dan formulir sintaksis di kepala Anda saat melakukan pengodean.

Sederhana itu indah .

C tidak misterius

Tidak seperti banyak bahasa tingkat tinggi, Anda akan kesulitan menemukan banyak simbol aneh dan tidak dapat dipahami di C. Di dunia C, fasilitas utama untuk abstraksi dan "kompresi sintaksis" adalah fungsi - semantik yang sangat sederhana dan konstruk penjelasan sendiri. Gaya C yang baik mendorong kecantikan yang hampir puitis dan mudah dibaca. Untuk mengilustrasikannya, mari kita coba membaca cuplikan berikut dari kernel Linux. Bahkan tanpa memahami struktur data yang mendasari dan detail implementasi, kami dapat memahami banyak hal berikut ini:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Bagian tengah fungsinya bertuliskan "jika tidak mungkin arus membeku, tanyakan pada kulkas apakah pembekuan benar-benar terjadi". Seuss tidak bisa menulisnya dengan lebih baik.

Dapat dibaca itu indah .

C transparan

Kecuali pernyataan C menyertakan pemanggilan fungsi, Anda biasanya bisa mendapatkan ide yang sangat bagus tentang biaya run-time dan efek sampingnya. C memberikan kontrol programmer dan akhirnya percaya padanya untuk melakukan hal yang benar. Kita bisa mendapatkan gambaran tentang apa yang terjadi ketika potongan ini (sedikit diformat ulang untuk SE) keluar dari implementasi strlen()dalam pustaka GNU C berjalan, karena setiap operator memiliki semantik yang didefinisikan dengan baik. Tidak ada overloading di C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Untuk tujuan "optimisabilitas", properti ini sangat bagus. Boleh dibilang, beberapa bahasa tingkat tinggi membuat ekspresi ringkas dari algoritma tingkat tinggi lebih mudah (seperti C ++ dengan kelas dan overloading), tetapi untuk tujuan C dirancang untuk - bertindak sebagai assembler portabel - C sangat ideal. Kadang-kadang, setelah eksekusi kode tingkat rendah yang berhasil, seorang programmer mungkin merasakan satu dengan mesin, dalam arti (atau nol - ini adalah detail implementasi). Ini bukan untuk mengatakan bahasa lain itu buruk, tidak "zen" cukup atau sesuatu yang konyol seperti itu, hanya saja IMO C dapat menarik dengan cara yang banyak bahasa lain telah memilih untuk tidak menjadi, karena banyak alasan yang valid.

Menurut pendapat saya, tiga poin yang disajikan di atas membuat pengelolaan sistem yang kompleks - namun efisien - dapat dikelola, yang terkandung dalam pikiran saya oleh Linux. Saya menemukan bahwa dunia ini menarik bagi kepekaan estetika saya dan saya akan menyarankan siapa pun mempertimbangkan C sebagai target berikutnya untuk mempertimbangkan poin-poin ini. Saya merasa bahwa argumen tentang sistem operasi dan yang lainnya lebih baik didukung dengan secara eksplisit menyatakannya karena orang tentu tidak perlu memahami kernel untuk menjadi programmer yang sukses, tetapi orang mungkin menemukan bidang ini menarik secara subyektif.

idoby
sumber
3

Bahasa pemrograman yang Anda gunakan untuk membahas ilmu komputasi sebagian besar tidak relevan dengan tugas mempelajari cara dan ilmu komputasi.

Karya (yang bisa dibilang) mani pada Ilmu Komputer, Seni Pemrograman Komputer , tidak menggunakan bahasa yang ada untuk menginformasikan subjek. Sebagai gantinya, Donald Knuth memilih untuk mendefinisikan komputer fiksi dan bahasa mesin fiksi (dan bahasa rakitan yang terkait) dalam hal yang ia membahas semua topik.

Karya lain yang sangat dihargai pada subjek, Struktur dan Interpretasi Program Komputer , mengambil pendekatan serupa, merancang dialek yang disederhanakan dari bahasa pemrograman LISP untuk bertindak sebagai konteksnya sendiri. Bahasa ini adalah apa yang kita kenal sekarang sebagai Skema.

Namun karya lain yang sangat bagus dalam Ilmu Komputer, Unsur-unsur Sistem Komputasi (yang sebenarnya merupakan bagian yang sama dengan Teknik Komputer dan Ilmu Komputer, dan sangat singkat), mengambil pendekatan yang lebih mendasar dalam mengajarkan logika digital, dari mana ia membangun mesin, alat-alat , dan bahasa, sebelum mengajar Ilmu Komputer dasar.

Jadi, tidak, C tidak perlu untuk memahami Ilmu Komputer. Yang penting adalah pemahaman Anda tentang konsep inti algoritma dan aplikasinya.

greyfade
sumber
2

Saya memulai karir dalam pemrograman dengan mempelajari vb3 dari manual yang dikirimkan bersama dengan floppy disk. Saya belajar beberapa java dan mampu menghasilkan beberapa program terhormat tetapi tidak sampai saya belajar C di universitas saya merasa bahwa saya benar-benar mengerti apa yang terjadi "di bawah tenda". Saya sekarang bekerja hanya dengan .net dan tidak pernah benar-benar khawatir tentang pointer, alamat tidak valid atau meluap - tapi saya mengerti mereka, ini menginformasikan keputusan yang saya buat setiap hari dan beberapa barang sekolah lama masih ada dalam bahasa yang ditafsirkan modern, bendera , operasi sedikit bijak, logika Boolean, semua alat yang kuat dan sangat efisien.

Learn C. Ini akan membantu Anda. Saya menyimpan salinan buku pegangan programmer selama bertahun-tahun dan membaca Kernighan dan Ritchie dari depan ke belakang. Tidak masalah bahasa apa yang akhirnya Anda gunakan dengan Memahami C pasti akan membantu.

Mat
sumber
1

Bisakah seseorang belajar Ilmu Komputer tanpa belajar C?

Jawabannya iya. Saya memiliki gelar saya di CS dan tidak diharuskan untuk belajar C, melainkan Jawa. Setidaknya di sekolah saya, penekanannya adalah pada pembelajaran Pemrograman Berorientasi Objek, dengan beberapa ajaran tentang Bahasa Perakitan, Struktur Data dan Desain Basis Data.

PhillyNJ
sumber
7
Apakah Anda yakin gelar Anda mencakup " semua aspek" CS?
SK-logic
Saya akan mengatakan semua aspek yang diperlukan. Tidak ada gelar yang mencakup semua aspek program sarjana. Plus "semua" bersifat subjektif.
PhillyNJ
1
Bagaimana Anda mendefinisikan "perlu"? Semua adalah segalanya , mencakup semua aplikasi CS yang mungkin. Ini bukan "subyektif", itu cukup dapat diukur.
SK-logic
Saya mendefinisikan 'perlu' dalam konteks bahwa CS mencakup studi tentang komputasi dan teknologi komputer, perangkat keras, dan perangkat lunak dan bukan bahasa tertentu, yang menjawab pertanyaan awal.
PhillyNJ
Oke, dan bagaimana Anda akan mencakup perangkat keras tanpa bahasa tingkat rendah? Bagaimana Anda akan membahas sejarah bahasa pemrograman (yang merupakan bagian yang sangat penting dari "semua" CS) tanpa bahasa kunci seperti itu? Bagaimana Anda akan membahas semantik bahasa pemrograman tanpa setidaknya satu bahasa dengan pointer arithmetics? Satu atau lain cara, tetapi bahasa yang mirip dengan C harus ada dalam kurikulum CS komprehensif.
SK-logic
0

Itu benar-benar tergantung pada apa yang ingin Anda lakukan dengan apa yang Anda pelajari. Memang benar bahwa banyak algoritma diberikan dalam C, atau turunannya. Namun, selama bertahun-tahun saya telah melihat lebih banyak contoh C ++, C #, dan Java. Apa yang dimaksudkan CS untuk diajarkan adalah pemahaman umum tentang komputasi, dan oleh karena itu bagaimana cara mengambil atau membuat bahasa yang sesuai untuk tugas yang dihadapi.

Namun, masih ada banyak orang yang bahasa pertamanya dan terakhir adalah beberapa variasi C atau Java, dan tidak semua dari mereka akan memiliki pelatihan untuk memahami bahasa apa pun yang diberikan oleh gelar CS. Bahkan beberapa lulusan CS memiliki masalah dengan pemrograman. Jadi, Anda mungkin perlu memiliki pemahaman yang cukup baik tentang bahasa-bahasa yang dapat Anda komunikasikan dengan mereka, tergantung pada jalur karier Anda. Jika Anda berencana untuk tetap berpegang pada akademisi, maka Anda akan memiliki lebih banyak hambatan bahasa untuk konten, terutama di bidang interdisipliner (di mana orang menggunakan prolog, lisp, haskell, Mathematica, dll.)

jzx
sumber
-1

Jika Anda benar-benar akan mempelajari "semua aspek Ilmu Komputer" (rencana ambisius!), Anda harus berurusan dengan beberapa bahasa assembly yang berbeda, dan setidaknya satu HDL (dan berlatih koding pada level netlist di dalamnya).

Dan sebagai langkah level yang lebih tinggi untuk mendekati hal-hal yang benar-benar mendasar ini Anda harus mengambil sesuatu seperti C atau Pascal, itu tidak dapat dihindari. Melewati langkah-langkah di tangga abstraksi adalah kontraproduktif.

Pokoknya, saya meragukan pertanyaan ini bahkan layak ditanyakan. Lagipula, C hanyalah bahasa kecil. Anda bisa mempelajari dasar-dasarnya dalam waktu yang lebih singkat daripada yang Anda buang untuk merenungkan apakah Anda harus belajar C atau tidak.

Logika SK
sumber