Pemrograman tingkat rendah - apa untungnya bagi saya? [Tutup]

32

Selama bertahun-tahun saya telah mempertimbangkan menggali ke dalam apa yang saya anggap bahasa "tingkat rendah". Bagi saya ini berarti C dan perakitan. Namun saya belum punya waktu untuk ini, juga belum pernah diperlukan.

Sekarang karena saya tidak melihat adanya kebutuhan yang muncul, saya merasa seperti saya harus menjadwalkan beberapa saat ketika saya akan mempelajari subjek atau membatalkan rencana selamanya.

Posisi saya

Selama 4 tahun terakhir saya telah berfokus pada "teknologi web", yang dapat berubah, dan saya adalah pengembang aplikasi, yang tidak mungkin berubah.

Dalam pengembangan aplikasi, saya pikir kegunaan adalah hal yang paling penting. Anda menulis aplikasi untuk "dikonsumsi" oleh pengguna. Semakin banyak aplikasi tersebut dapat digunakan, semakin banyak nilai yang Anda hasilkan.

Untuk mencapai kegunaan yang baik, saya percaya hal-hal berikut dapat dilakukan

  • Desain bagus : Fitur yang dipikirkan dengan baik dapat diakses melalui antarmuka pengguna yang dipikirkan dengan matang.
  • Kebenaran : Desain terbaik tidak berarti apa-apa, jika tidak diimplementasikan dengan benar.
  • Fleksibilitas : Aplikasi A harus terus berkembang, sehingga penggunanya tidak perlu beralih ke aplikasi B yang berbeda, yang memiliki fitur baru, yang dapat diterapkan oleh A. Aplikasi yang menangani masalah yang sama seharusnya tidak berbeda dalam fitur tetapi dalam filosofi.
  • Kinerja : Kinerja berkontribusi pada pengalaman pengguna yang baik. Sebuah aplikasi idealnya selalu responsif dan melakukan tugasnya dengan cukup cepat (berdasarkan frekuensinya). Nilai optimasi kinerja di luar titik di mana hal itu terlihat oleh pengguna dipertanyakan.

Saya pikir pemrograman tingkat rendah tidak akan membantu saya dengan itu, kecuali untuk kinerja. Tetapi menulis seluruh aplikasi dalam bahasa tingkat rendah demi kinerja adalah pengoptimalan prematur bagi saya.

Pertanyaan saya

Apa yang bisa diajarkan oleh pemrograman tingkat rendah, bahasa apa yang tidak akan saya ajarkan? Apakah saya kehilangan sesuatu, atau hanya keterampilan, yang sangat sedikit gunanya untuk pengembangan aplikasi? Tolong mengerti, bahwa saya tidak mempertanyakan nilai C dan perakitan. Hanya saja dalam kehidupan sehari-hari saya, saya cukup senang bahwa semua seluk-beluk dunia itu disarikan dan dikelola untuk saya (kebanyakan oleh lapisan yang ditulis dalam C / C ++ dan berkumpul sendiri). Saya hanya tidak melihat konsep apa pun, yang mungkin baru bagi saya, hanya detail yang harus saya isi kepala saya. Jadi apa untungnya bagi saya?

Kesimpulan saya

Terima kasih untuk semuanya atas jawaban mereka. Saya harus mengatakan, tidak ada yang benar-benar mengejutkan saya, tetapi setidaknya sekarang saya cukup yakin saya akan menjatuhkan bidang minat ini sampai ada kebutuhan untuk itu muncul.
Untuk pemahaman saya, menulis perakitan hari ini untuk prosesor seperti yang digunakan dalam CPU hari ini tidak hanya rumit, tetapi berisiko menghasilkan kinerja runtime yang lebih buruk daripada rekan C. Mengoptimalkan dengan tangan hampir mustahil karena OOE, sementara Anda tidak mendapatkan semua jenis optimasi yang dapat dilakukan oleh kompiler secara otomatis. Selain itu, kodenya bisa dibawa-bawa, karena ia menggunakan sebagian kecil dari perintah yang tersedia, atau dioptimalkan, tetapi mungkin hanya bekerja pada satu arsitektur saja.
Menulis C tidak lagi diperlukan, seperti di masa lalu. Jika saya menulis aplikasi dalam C, saya akan menggunakan banyak perpustakaan dan kerangka kerja yang teruji dan mapan, yang akan membuat saya menerapkan rutinitas penyalinan string, pengurutan algoritma dan hal-hal lain yang berfungsi sebagai latihan di universitas. Kode saya sendiri akan dieksekusi lebih cepat dengan biaya keamanan tipe. Saya tidak tertarik untuk menemukan kembali roda dalam pengembangan aplikasi normal, atau mencoba men-debug dengan melihat dump inti: D
Saat ini saya sedang bereksperimen dengan bahasa dan penerjemah, jadi jika ada sesuatu yang ingin saya terbitkan, saya kira saya akan port konsep yang berfungsi ke C, meskipun C ++ mungkin juga melakukan trik.
Sekali lagi, terima kasih kepada semua orang atas jawaban dan wawasan Anda.

back2dos
sumber
6
@TheLQ: pertanyaan saya bukan mengapa menggunakannya , tapi apa yang bisa saya pelajari darinya .
back2dos
1
Contoh: Kembali ke Dasar .
rwong
kemungkinan duplikat Apa jenis pengetahuan level rendah apa?
nyamuk

Jawaban:

9

Pemrograman tingkat rendah adalah untuk kasus sudut di mana ada persyaratan tidak segera hadir pada komputer desktop normal. Ini mungkin hambatan kecepatan, atau hambatan memori atau sesuatu yang sama sekali berbeda, dan seringkali sangat menarik untuk melihat apa yang dapat dilakukan dengan persyaratan tersebut.

Anggap saja sebagai Haikus atau Limericks, di mana pembatasan membuatnya menarik.

Untuk memberi Anda gambaran tentang apa yang mungkin dalam apa yang tampaknya mustahil hari ini, berikut adalah salah satu peretasan terhebat yang pernah ada. Catur dalam RAM 1 Kb! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


sumber
1
Saya pikir saya benar-benar akan pergi untuk "pembatasan membuatnya menarik". Dari semua hal yang disebutkan di sini, ini mungkin yang terbaik. Kembali di sekolah, saya telah memprogram permainan pada kalkulator saya dengan memori 32kB dan CPU 8Mhz. Itu menyenangkan, namun saya tidak belajar banyak yang bisa saya manfaatkan dari sekarang.
back2dos
Downvoter, tolong sebutkan mengapa?
29

Saya hanya memikirkan ini baru-baru ini. Saat ini saya menganggap diri saya sebagai pengembang C # - yang sangat baik untuk karir saya.

Namun, sering kali saya kehilangan hal-hal tingkat yang sangat rendah (pada dasarnya 'membuat tangan saya kotor' dengan melakukan assembler atau driver perangkat di C). Saya hanya ketinggalan pemrograman. Saya tidak berharap itu membantu saya dalam karier secara besar-besaran. Jika driver perangkat atau sistem tertanam adalah hal Anda, maka itu bisa sangat membantu.

Semakin banyak saya memprogram dalam bahasa-bahasa yang diabstraksikan, semakin saya merindukan apa yang membuat saya masuk ke komputer: mencari-cari komputer dan melihat apa yang berkedut. Assembler dan C sangat cocok untuk menusuk :)

Dengan menggunakan bahasa yang lebih tua, saya pikir Anda terpaksa melakukan hampir semua segalanya sendiri. Di C # saya bisa melakukan sesuatu seperti myArray.SortBy(x=>x.Name). Tidak mungkin saya bisa melakukannya dalam C. Saya menerima bahwa bahasa akan melakukan penyortiran terbaik untuk saya. Jika saya melakukannya di C, saya akan dapat kembali ke masa modul universitas saya dan merevisi berbagai jenis dan algoritma pencarian saya.

Jadi, saya pikir bahasa tingkat bawah akan membantu Anda merevisi bagian yang sudah lama terlupakan yang semuanya telah disarikan. Lebih dari tantangan pribadi daripada karir yang berkembang.

Jonathon
sumber
15
+1 untuk menyuarakan suka mengaduk-aduk di perangkat keras dan melihat apa yang berkedut - geek sejati
Gary Rowe
2
Anda dapat menulis sendiri fungsi sortir dalam C # jika diinginkan. Anda juga dapat menggunakan fungsi pustaka untuk mengurutkan dalam C jika Anda ingin: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Saya bahkan akan mengatakan dengan menggunakan bahasa yang lebih tua, Anda harus melakukan lebih sedikit hal sendiri. Karena sebagian besar masalah sudah diselesaikan. Itu tidak mencegah orang dari memperbarui roda:
back2dos
15

Saran saya adalah bermain-main dengan C sebagai keingintahuan intelektual. Jangan melakukan investasi waktu yang berat karena tidak sepadan.

Tujuan yang disarankan:

  • Refresh memori Anda tentang struktur data dasar dan algoritma.
    • Itu hanya beberapa hal yang baik untuk diketahui, seperti aljabar dan geometri.
    • Cobalah untuk melakukan beberapa latihan buku teks perguruan tinggi atau teka-teki program dalam C.
  • Penghargaan yang lebih baik terhadap hierarki memori (bandwidth) , mulai dari cache CPU hingga latensi jaringan transoceanic. Ini akan membantu keterampilan pengembangan aplikasi Anda di semua tingkatan.
    • Yang paling penting, itu baik untuk belajar tentang skenario di mana sebuah kecil penataan ulang mencolok kode tingkat tinggi dapat mengakibatkan dramatis peningkatan kecepatan .
      • Terkadang alasannya hanya dapat dipahami dalam implementasi tingkat rendah dalam konteks hirarki memori.
      • Tidak memahami penyebab alami dari kemungkinan ini mengarah pada ketidaktahuan , ketakutan , dan akhirnya penolakan , berpikir bahwa adalah salah bagi pengembang tingkat tinggi untuk memanfaatkan optimasi semacam ini. Pada kenyataannya tidak ada yang salah dengan itu.
  • Menghargai estetika sistem perangkat lunak berbasis komponen , yang memungkinkan komponen tingkat rendah yang dikembangkan dalam C / C ++ / Majelis untuk digunakan oleh sistem tingkat tinggi.
    • Estetika sama persis dengan kegunaan perangkat lunak:
      • Desain bagus (kuat, mudah digunakan, dipikirkan dengan matang)
      • Kebenaran
      • Fleksibilitas (ekstensi dan perilaku baru melalui komposisi bagian yang ada, masing-masing dengan tujuan yang jelas)
      • Performa (tanpa menyulitkan kegunaan)
    • Meskipun Anda mungkin tidak merancang komponen tingkat rendah Anda sendiri, pemahaman Anda akan membantu Anda mengevaluasi dan memilih komponen yang baik untuk digunakan dalam proyek tingkat tinggi Anda.
  • Akhirnya, hargai bahwa komponen tingkat rendah hampir selalu lebih rumit dalam implementasinya , jauh dari mudah dipahami hanya dengan melihat antarmuka.
    • Level rendah selalu rumit. Perpustakaan yang baik menyembunyikan kompleksitas tanpa mengurangi kekuatannya.
    • Belajar membaca "catatan teknis" yang ditulis oleh pengembang komponen, yang merupakan saran untuk pengguna komponen tingkat tinggi tentang cara terbaik memanfaatkan komponen.
rwong
sumber
8

jika ingin mengerti caranya mesin , dan bukan hanya mesin virtual yang menjadi dasar bahasa tingkat tinggi Anda, maka Assembly akan mengajarkan ini kepada Anda

jika Anda tidak punya alasan untuk peduli - dan kebanyakan programmer benar-benar tidak peduli hari ini - maka jangan khawatir tentang hal itu.

itu akan meningkatkan fondasi Anda, tetapi mungkin tidak akan meningkatkan aplikasi web Anda

Steven A. Lowe
sumber
6
C bekerja hampir juga. Sebagian besar konsep C mudah diterjemahkan ke bahasa mesin. Pelajari C dan lihat assembler dengan cepat, dan Anda dalam kondisi yang baik.
David Thornley
Saya akan mengirim jawaban yang sama. Saya berpendapat bahwa C juga memberikan apresiasi untuk cara kerja mesin, terutama ketika mengatur memori. Selain itu, banyak bahasa yang kompleksitas mesin abstraknya ditulis dalam C. Paling tidak, orang tersebut akan mendapatkan pemahaman nyata tentang seberapa dimanjakannya mereka :)
Tim Post
1
@ Jorg: menarik. dan berapa banyak dari CPU ini yang digunakan secara komersial, dibandingkan dengan, katakanlah Intel x86 atau 6502s?
Steven A. Lowe
1
@ Jorg, di mana Anda menemukan CPU ini?
1
@ Thor: kecepatan bukanlah pertanyaannya di sini, pendidikan adalah.
Steven A. Lowe
8

Setiap bahasa pemrograman berubah sedikit tentang bagaimana Anda berpikir tentang pemrograman secara umum. Contoh konkret yang bisa saya berikan adalah ketika saya mulai belajar haskell dan tiba-tiba bit fungsional javascript, ruby, dan python menjadi jauh lebih masuk akal. Saya belum pernah menggunakan foldl di salah satu kode saya sebelumnya tetapi setelah haskell saya cukup banyak melihatnya di mana-mana saya melihat array. Jadi kemungkinan besar bahwa jika Anda belajar C Anda akan menjadi lebih sadar akan karakteristik kinerja relatif dari berbagai konstruksi dalam bahasa favorit Anda. Beberapa menit yang lalu saya mendengarkan ceramah tentang menulis javascript cepat dan dioptimalkan dan pembicara berkata "Jika sulit dilakukan di C maka itu akan sangat lambat dalam javascript." Maksudnya adalah bahwa javascript adalah bahasa yang ditafsirkan dan penerjemahnya ditulis dalam C atau C ++.

davidk01
sumber
2
+1 untuk gagasan tentang bagaimana setiap bahasa mengubah cara Anda berpikir.
Sean
7

Jika Anda tidak melakukannya hanya untuk bersenang-senang, karena Geeks sangat suka memiliki kontrol penuh atas perangkat keras mereka, Anda mungkin setidaknya mendapatkan perasaan yang lebih baik tentang seberapa cepat suatu program dapat ditulis ketika ditulis dalam C daripada, katakanlah, Java. Anda mungkin juga belajar untuk benar-benar menghargai fitur bahasa tingkat tinggi, seperti pengumpulan sampah.

pengguna281377
sumber
1
+1 untuk kesenangan geek. Meskipun saya harus mengatakan, saya tidak terlalu ahli. Dan saya benci perangkat keras :)
back2dos
1
Perbedaan kecepatan biasanya tidak relevan. Ini terutama berlaku untuk aplikasi web, di mana pemrosesan sisi server biasanya bukan hambatan.
David Thornley
David: Saya sepenuhnya setuju untuk aplikasi web roti dan mentega rata-rata. Di domain lain, perbedaannya bisa sangat relevan.
user281377
1
@ back2dos, jika ide pemrograman dekat dengan perangkat keras tidak menarik bagi Anda, maka saya akan mengatakan jangan repot-repot dengan itu. Ini seperti memaksakan diri Anda untuk belajar bahasa Latin hanya karena itu adalah dasar bagi banyak bahasa Romawi di kemudian hari.
tcrosley
2
mengingat memori yang cukup, Java lebih cepat atau lebih cepat dari C.
5

Hore untuk rasa ingin tahu!

Sangat baik untuk memiliki gagasan tentang apa yang sebenarnya terjadi pada tingkat terendah dari sistem yang kompleks, bahkan jika tidak ada kebutuhan logis untuk mengetahui tugas sehari-hari seseorang. Sejauh ini cara terbaik untuk grok hal-hal di tingkat bit adalah membangun CPU Anda sendiri. Anda harus berpikir tentang opcode tingkat bahasa mesin, mengerti mengapa set instruksi ortogonal begitu baik, komplikasi penanganan interupsi, pengorbanan antara sirkuit kompleks vs mikrokode (misalnya dalam unit multiplikasi), dan oh sangat menyenangkan!

Tapi itu, tentu saja, membutuhkan pengetahuan elektronik dan memakan waktu, jadi hal terbaik berikutnya adalah bermain-main dengan CPU 8-bit bergaya antik. Mikrokontroler seperti 8051 masih digunakan secara luas dan tersedia untuk penggemar. Itu masih membutuhkan beberapa pengetahuan dalam menggiring elektronik dan membuat LED menyala tanpa merokok, dan biaya $$ jika Anda belum dilengkapi untuk elektronik.

Hal terbaik berikutnya setelah itu: bermain-main dalam simulator CPU (emulator? Saya mendapatkan istilah-istilah itu campur aduk) - ini ada untuk Z80, 6502, 8086 ... semua yang lama 8-pahit. Itu mungkin yang paling mendidik dan menyenangkan bagi seorang pemrogram aplikasi yang tidak tahu ujung mana dari solder yang harus dipegang (meskipun orang mengetahui itu cukup cepat :) Bagaimana teks ditulis ke memori video, bagaimana trik kode perakitan membantu kinerja. .. ada banyak hal menyenangkan untuk dijelajahi di tingkat ini.

Saya tidak begitu yakin tentang belajar C hanya sebagai bahasa lain, tanpa pemahaman awal tentang cara kerja CPU. Mengetahui bagaimana bit dikirim antara register CPU dan bagaimana memori diakses, sangat membantu dengan benar-benar mendapatkan pointer dan konsep bahasa C lainnya.

Sayang
sumber
+1 karena ini adalah satu-satunya jawaban yang menyebutkan petunjuk. Saya pikir itu akan menjadi jawaban # 1 dan diterima.
Erik
4

Singkatnya, menyenangkan. Ketika saya biasa bermain-main dengan assembler (setelah bekerja turun dari VB ke C ++, C dll) itu luar biasa untuk memindahkan data dari satu bagian prosesor ke yang lain. Perasaan yang hebat mengetahui dengan pasti apa yang terjadi di dalam CPU, tanpa khawatir tentang apa yang terjadi di bawahnya yang tidak Anda ketahui. Ditambah rasa kebebasan yang luar biasa - Anda dapat melakukan apa saja, karena tidak ada batasan bawaan yang Anda temukan dalam bahasa tingkat yang lebih tinggi.

Juga, bisa berbalik kepada siapa saja yang memprogram dalam bahasa lain apa pun dan pergi 'baiklah, jika Anda tidak cukup hardcore ...' adalah kekanak-kanakan, menyenangkan kekanak-kanakan.

Dan O
sumber
4
Sebenarnya ada banyak hal yang terjadi di dalam CPU yang tidak Anda lihat dari assembler. Hal-hal seperti eksekusi out-of-order, hyperthreading, dan caching memori sedang dilakukan oleh CPU secara otomatis. Anda selalu dapat naik satu langkah lebih rendah, sampai Anda mencapai partikel materi yang mendasar. Atau materi hanya energi?
Kevin Panko
Seseorang dapat menghindari misteri tersembunyi seperti itu dengan membangun CPU mereka sendiri dari transistor dan chip logika: D (Salah satu fantasi teknologi favorit saya!) Pokoknya memberi +1 jawaban yang bagus.
DarenW
Titik adil! Meskipun ketika saya terakhir benar-benar menggunakan assembler hyperthreading mungkin lebih sering dianggap merujuk pada menjahit cepat, bukan CPU ...
Dan O
2

Apakah ada alasan bagus untuk mempelajari / mempraktikkan pemrograman tingkat rendah. Saya sendiri memiliki berbagai jawaban tergantung pada konteksnya.

Pertama, saya mengajar pemrograman C (tetapi juga OCaml dan Java), memotivasi siswa untuk belajar pemrograman dari sisi yang sulit mungkin merupakan bagian tersulit dari tugas tersebut. Argumen terbaik yang saya temukan sejauh ini adalah "pemahaman": bahasa tingkat yang lebih tinggi menyembunyikan banyak mekanisme yang mendasari dan beberapa kali tidak untuk selamanya, mereka juga mendorong Anda untuk tetap berada di tingkat yang lebih tinggi bahkan ketika beberapa trik tingkat rendah benar-benar dapat berguna ( untuk kinerja, sebagian besar waktu.) Memahami apa yang Anda gunakan dapat sangat membantu menggunakannya dengan lebih baik. Pengalaman mengajar saya membuktikan kepada saya bahwa siswa yang telah mempelajari pemrograman tingkat rendah (dan yang tidak berorientasi pada pengguna, penyusun semacam itu) lebih mudah beradaptasi dan belajar lebih cepat konsep atau perangkat tingkat tinggi yang baru.

Kedua, saat Anda menyatakan, kinerja adalah bagian dari pengalaman pengguna. Sebagian besar waktu, kinerja dipandang sebagai masalah penulisan yang kompleks dan dekat dengan kode mesin. Ini tidak selalu terjadi, kinerja lebih merupakan masalah algoritma dan struktur data tetapi juga interaksi antara algo dan data. Saya menggunakan proyek khusus pada subjek, pada dasarnya ini adalah pencarian jalur sederhana, tetapi masalah sebenarnya adalah ukuran data: grafik tidak terbatas. Satu-satunya cara untuk mencapai kinerja keturunan dan agar sesuai dengan memori adalah menulis pengalokasi memori khusus (pada kenyataannya dua, pengalokasi kumpulan dan pengalokasi daur ulang.) Ini adalah sesuatu yang tidak dapat Anda lakukan dalam sebagian besar bahasa tingkat yang lebih tinggi. Bahkan, sebagian besar bahasa yang dikumpulkan sampah akan memiliki masalah kinerja dan memori.

Mungkin ada lebih banyak argumen seperti stabilitas (dalam arti sejarah dan umur panjang) dari bahasa tingkat rendah terhadap "hype" (fakta bahwa bahasa yang dianggap sebagai referensi masa depan untuk pemrograman dapat menghilang dalam beberapa tahun adalah panjang cerita, seseorang tidak dapat memprediksi umur panjang dari hal baru, tetapi argumen ini tetap berlaku untuk bahasa yang lebih tua ...), tentu saja ada juga masalah selera, atau fakta bahwa apa yang dapat dilakukan dalam sebagian besar bahasa tingkat tinggi juga bisa dilakukan dalam bahasa tingkat yang lebih rendah tetapi tidak sebaliknya (tapi mengingat itu, kita semua harus kode dalam perakitan saja ...)

Saya sendiri terperangkap di kedua dunia (sangat berbeda), saya menghabiskan beberapa tahun bekerja pada konsep pemrograman teoretis, tipe sistem desain dan bukti, dan melakukannya saya hanya menggunakan dan mempelajari bahasa tingkat yang sangat tinggi (kebanyakan fungsional, tetapi juga murni berorientasi objek.) Baru-baru ini saya kembali ke sisi lain (kebanyakan pemrograman sistem dan kernel) dan merasa nyaman di area ini. Saya bersenang-senang! Bagi saya, langkah selanjutnya adalah menemukan titik bersama: fitur bahasa tingkat tinggi untuk pemrograman tingkat bawah! Jadi, sejauh ini tidak ada bahasa untuk itu (mungkin google pergi untuk pemrograman sistem userland) dan saya sedang mempertimbangkan ide membangun bahasa saya sendiri, tetapi ini adalah cerita lain.

Marwan Burelle
sumber
1

Saya akan mengatakan tidak ada banyak alasan di domain Anda, namun jika Anda ingin melakukan komputasi kinerja tinggi (misalnya Gaming, Sains, dll) hal itu akan dibenarkan.

Malam gelap
sumber
1
Saya tidak begitu yakin ada banyak area kinerja tinggi yang tersisa. Permainan tentu tidak membutuhkan bahasa tingkat rendah. Untuk bermain game, Anda biasanya menggunakan mesin atau setidaknya Anda mulai dengan OpenGL atau sesuatu. Dan untuk paralelisasi sains sangat penting, dan benar. Saya kira Anda akan lebih baik dengan OCaml atau sesuatu. Area kritis kinerja bukan lagi area yang memiliki banyak angka, tetapi yang sangat sering digunakan, seperti kernel, driver, mesin penyimpanan dan semacamnya. Saya kira kurang dari 1% dari semua pengembang benar-benar menyentuh itu.
back2dos
4
@ back2do, mesin game tidak muncul begitu saja - seseorang harus menulisnya. Dan menurut Anda apa yang ditulis OpenGL? Bukan C #. Orang tidak perlu menggunakan bahasa tingkat rendah untuk sebagian besar aplikasi hari ini ... tetapi banyak orang bekerja di daerah lain yang memang membutuhkannya.
GrandmasterB
1

Saya pikir pemrograman tingkat rendah dan tinggi saat ini dapat dipisahkan. Pada dasarnya ini berarti bahwa Anda dapat menjalani semua kehidupan profesional Anda tanpa mengetahui C dan assembler tanpa masalah sama sekali. Yang mengatakan bahasa pemrograman C tidak bisa mengajarkan Anda banyak hal dari sudut pandang pemrograman dan desain.

Hanya karena penasaran Anda bisa belajar bagaimana segala sesuatu bekerja di tingkat yang lebih rendah. Ketika saya masih di Universitas, misalnya, saya menikmati menggunakan gcc untuk menghasilkan kode assembler dari C ++. Berguna untuk memahami bagaimana polimorfisme dan pengecualian diterapkan. Namun terlepas dari itu satu-satunya hal yang dapat Anda pelajari dari C saat ini adalah:

1) trik memori kotor. C adalah cara terbaik untuk memahami bahwa tidak ada bottom down di programmer kegilaan :)

2) GOTO sebenarnya digunakan (dan bermanfaat) untuk mengembalikan kesalahan

3) belajar lebih baik bagaimana alokasi memori bekerja (perbedaan antara tumpukan dan tumpukan siapa pun?).

Jadi pada dasarnya tesis saya adalah: jika Anda sudah menyelesaikan Universitas dan Anda masih tidak membutuhkan C, daripada tidak mempelajarinya :)

Emiliano
sumber
2
Mengetahui C untuk mengetahui bagaimana berbagai hal bekerja pada level rendah dapat membantu memahami mengapa segala sesuatunya salah ketika Anda memiliki abstraksi yang bocor.
Michael Shaw
1

Anda tidak perlu memahami bahasa tingkat rendah, tetapi Anda harus memahami apa yang terjadi di bawah sampul bahasa tingkat tinggi yang Anda pilih. Menggunakan bahasa tingkat rendah akan mengajarkan Anda hal ini, tetapi itu bukan satu-satunya cara.

Berikut adalah beberapa contoh konsep tingkat rendah yang dapat berdampak pada bahasa tingkat tinggi.

Pointer:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

String:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Daftar:

Kapan Anda menggunakan daftar vs daftar tertaut? (Hampir mustahil untuk mengetahui hal ini tanpa memahami pada tingkat yang cukup rendah tentang cara kerja daftar)

-

Apakah perlu mengetahui semua hal ini? Tidak, tetapi ini bisa berdampak dan jika Anda ingin menjadi master bahasa tingkat tinggi, Anda harus memiliki gagasan yang cukup bagus tentang cara kerja bagian dalam.

Alistair
sumber
1

Apa yang bisa diajarkan oleh pemrograman tingkat rendah kepada saya, bahasa apa yang tidak akan saya ajarkan?

Terutama itu akan mengajarkan Anda bagaimana sebenarnya komputer bekerja. Tidak ada cara lain untuk mempelajari ini selain melalui pemrograman tingkat rendah. Apa pun jenis aplikasi yang Anda program, ini akan selalu membantu. Anda benar-benar akan mengerti apa yang terjadi jauh di bawah semua hal web itu. Dan jika Anda bekerja dengan Windows, seluruh API ditulis dalam C, jadi mengetahui bahwa bahasa akan memungkinkan Anda untuk berkomunikasi secara langsung dengan OS, setiap kali Anda perlu menggunakan fitur yang tidak dimiliki oleh bahasa Anda saat ini dan perpustakaan mereka.

Tentu saja pemrograman tingkat rendah akan memungkinkan Anda untuk bekerja dengan hal-hal yang sama sekali berbeda, seperti pemrograman tertanam dan pemrograman waktu nyata di mana asm / C / C ++ adalah suatu keharusan. Jika Anda tidak tertarik pada aplikasi semacam ini, memang tidak banyak yang perlu dipelajari asm / C / C ++.

Anda juga akan belajar bit dan byte. Manipulasi bit, heksadesimal, dll. Hal-hal ini mungkin Anda temui sekarang dan kemudian bahkan ketika melakukan pemrograman web / desktop. Algoritma enkripsi adalah salah satu contoh dimana digunakan.


sumber