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.
Jawaban:
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
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.
sumber
Saran saya adalah bermain-main dengan C sebagai keingintahuan intelektual. Jangan melakukan investasi waktu yang berat karena tidak sepadan.
Tujuan yang disarankan:
sumber
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
sumber
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 ++.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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 :)
sumber
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:
String:
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.
sumber
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