Apakah bijaksana bagi pengembang tingkat tinggi untuk menghabiskan waktu mempelajari perakitan? [Tutup]

33

Jelas bahwa pengetahuan tentang hal-hal tingkat rendah sangat penting dalam pekerjaan kami.

Tetapi dalam situasi di mana Anda sudah mengembangkan perangkat lunak komersial pada tingkat tinggi, dan ketika Anda sudah memiliki arahan yang dipilih tetapi tidak memiliki keterampilan perakitan, bukankah lebih masuk akal untuk fokus mempelajari hal-hal yang berkaitan dengan arahan Anda? Atau adakah alasan mengapa Anda harus meluangkan waktu untuk mempelajari dasar-dasar tingkat rendah?

Kapan terlambat, dan kapan tidak? Dan jika belum terlambat, lalu bagaimana cara belajar secara optimal (dalam arti tidak menghabiskan waktu berlebihan untuk mendapatkan kedalaman dan pemahaman)?

zkaje
sumber
Banyak pertanyaan dalam satu posting :)
Shamim Hafiz
Saya menikmati Bahasa Assembly Step by Step. Banyak pemrograman hal noobie-ish pada awalnya, tetapi penulis sangat menghibur. Saya mendapati memiliki ide umum sangat membantu dan saya terutama menulis JavaScript.
Erik Reppen
Bahasa pertama saya (yang diajarkan) adalah dialek majelis. Saya bisa melihat bagaimana itu akan berguna (dalam banyak cara yang orang lain tunjukkan), dan ini membantu Anda untuk memberikan input yang berbeda untuk anggota tim lainnya.
Jamie Taylor

Jawaban:

43

Tidak percaya tidak ada yang menyebutkan debugging ...

Saya belum menulis garis kode perakitan selama bertahun-tahun sekarang. Tetapi saya cukup sering membacanya . Melakukan debug tingkat tinggi sangat bagus ketika Anda memiliki informasi sumber dan simbol, tetapi ketika perpustakaan mewah Anda melemparkan pengecualian yang tidak tertangani pada mesin pelanggan, sudah terlambat untuk mengharuskannya dimasukkan dalam lisensi ...

Tapi aku masih bisa membuka disassembler dan melihat apa logika tingkat tinggi Anda akhirnya berakhir melakukan , melacak buruk kembali data ke asalnya, cari tahu yang mengubah kontrol FPU mendaftar ...

Ini telah menghemat bacon saya lebih sering daripada yang saya pikirkan. Dan tidak ada kata terlambat untuk belajar - ada banyak referensi dan tutorial hebat di 'Net, dan hampir semua program yang berjalan di komputer Anda dapat menyediakan lingkungan yang praktis.

Shog9
sumber
10
+1, dan saya akan lebih meningkatkannya jika saya bisa. Setiap pengembang yang serius harus dapat membaca ASM untuk ini jika tidak ada alasan lain.
Mason Wheeler
3
Akibat dari hal ini adalah optimasi. Mengetahui bagaimana kompiler menerjemahkan kode Anda ke dalam perakitan dapat membantu Anda membuatnya lebih cepat secara dramatis!
lambacck
3
+1 Assembly adalah satu-satunya bahasa yang memaksa Anda untuk memahami cara kerja prosesor. Ini membantu Anda dalam perkembangan Anda dengan bahasa tingkat tinggi. Harus baca: blogs.msdn.com/b/ericlippert/archive/2010/09/30/...
Mengetahui komputer yang mendasarinya SANGAT membantu, baik untuk debugging, optimisasi, atau keingintahuan belaka. Serius, belajar membaca setidaknya satu atau dua keluarga bahasa assembly. Bahkan jika Anda tidak pernah membacanya atau menulisnya setelah mempelajarinya, itu akan mempengaruhi cara Anda memahami sesuatu di masa depan. Sekarang, jika Anda lebih suka menulis dalam bahasa lain, itu mungkin sedikit banyak ...
Michael Trausch
1
@ Alasan: Saya tidak tahu apakah "setiap pengembang serius" harus dapat membaca ASM. Jika Anda menulis JavaScript atau menggunakan bahasa pemrograman yang dibangun di atas kerangka kerja yang tebal (seperti .NET atau Java), saya tidak akan menganggap dapat membaca ASM sebagai hal yang penting untuk menjadi pengembang yang serius. Yang sedang berkata, memiliki pemahaman tentang bagaimana komputer menjalankan instruksi pada tingkat yang sangat rendah bisa sangat membantu, bahkan dalam bahasa dan lingkungan pemrograman tingkat tinggi.
Scott Mitchell
15

Anda tidak perlu belajar bahasa assembly, Anda hanya perlu memahami cara kerjanya. Anda perlu tahu apa itu XOR dan menghitung dalam biner dalam tidur Anda, dll. Tapi saya tidak pernah membutuhkan kode perakitan dalam pekerjaan saya, tidak pernah.

Jadi seperti yang Anda katakan, pengetahuan tentang hal-hal tingkat rendah adalah penting, tetapi pengetahuan praktis dalam perakitan tidak.

Lennart Regebro
sumber
1
Saya kedua. Anda bisa mendapatkan pemrograman hidup yang baik dan tidak perlu membaca / menulis ASM. Ada beberapa posisi yang membutuhkannya. Membaca dump setelah kondisi balapan di kode Anda mencatat proses. Atau jika Anda menulis program yang sangat intensif (seperti GPU paralelisasi / OpenCL). Persentase pekerjaan dev di mana Anda akan diminta untuk melakukan tugas-tugas ini sangat kecil.
yzorg
11

Jika Anda benar-benar tidak memiliki keterampilan pemrograman tingkat rendah, saya akan sangat menyarankan untuk belajar beberapa di waktu luang Anda. Anda tidak perlu menjadi ahli dalam hal itu; hanya mencapai beberapa tingkat kemahiran. Anda harus melakukan banyak pekerjaan matematika sendiri, daripada bergantung pada kompiler atau perpustakaan untuk melakukannya untuk Anda. Ini akan membantu Anda memahami keterbacaan dalam pemrograman, karena sebagian besar instruksi perakitan sesuai dengan satu instruksi prosesor. Anda harus mengelola sendiri kompleksitas dalam program yang sedikit lebih besar, tanpa manfaat dari hal-hal seperti if...else. Ini akan membantu Anda menulis program tingkat tinggi yang lebih sederhana, karena pengalaman perakitan akan mengajarkan Anda betapa mudahnya membaca.

Juga, ingatlah bahwa majelis bukanlah bahasa! Ini adalah istilah generik, yang pada dasarnya berarti kumpulan instruksi prosesor yang telah diabstraksi menjadi bahasa simbolik. Prosesor yang berbeda memiliki set instruksi yang berbeda, dan karena itu bahasa assembly berbeda. Ketika Anda belajar 'berkumpul', Anda belajar suatu proses, bukan bahasa.

Michael K.
sumber
8

Anda akan selalu mendapat manfaat dari memuncak di bawah selimut dan sedikit lebih memahami tentang apa yang duduk di bawah abstraksi Anda berdiri di atas. Seperti yang dinyatakan oleh seorang profesor perguruan tinggi saya sekali "Semua programmer yang baik memahami perangkat keras" - Anda tidak harus dapat membuat dan memanipulasi sirkuit, tetapi Anda harus memiliki pemahaman tentang apa yang terjadi di sana - itu hanya akan membuat Anda lebih baik.

Coba Desain dan Organisasi Komputer

Watson
sumber
1

Ya - Pembelajaran berkelanjutan dan seumur hidup adalah komponen penting dari karier dalam pengembangan Perangkat Lunak. Jika Anda tertarik untuk terus belajar tentang pemrograman dan bagaimana meningkatkan keterampilan Anda maka ya, pada titik tertentu Anda harus belajar perakitan karena akan membuat Anda terpapar pada bahasa yang sama sekali baru dan cara penulisan kode. Untuk alasan yang sama, saya sarankan bereksperimen dengan banyak bahasa / gaya pemrograman termasuk Ruby / Python (bahasa dinamis), Haskell / F # (bahasa fungsional murni), Lisp / Skema (bahasa fungsional), dll ...

Saya akan mengatakan bahwa sudah terlambat jika Anda tidak lagi tertarik untuk belajar lebih banyak tentang kerajinan pemrograman. Misalnya, jika Anda telah mencapai titik dalam karir Anda di mana Anda mungkin akan segera pindah dari pemrograman ke bidang lain seperti Manajemen, Teknik Sistem, Penjualan / Pemasaran, dll. Jika Anda berpikir Anda mungkin ingin pindah ke area baru di beberapa tahun ke depan saya akan lebih fokus pada keterampilan yang diperlukan untuk mengembangkan di bidang itu, daripada pada keahlian pemrograman.

Justin Ethier
sumber
1

Anda harus tahu apa itu dan apa yang dilakukan komputer. Mempelajari sesuatu seperti MIX Knuth akan membantu Anda. Sebagian besar dapat menilai efisiensi kode Anda. Dapatkan Seni Pemrograman Komputer dan bacalah. Itu akan membuat Anda seorang programmer yang lebih pintar.

Theo Belaire
sumber
1

Bukankah lebih masuk akal untuk fokus mempelajari hal-hal yang berkaitan dengan arah Anda? Atau adakah alasan mengapa Anda harus meluangkan waktu untuk mempelajari dasar-dasar tingkat rendah?

Menjawab:

  1. Jika Anda tidak berencana untuk mengubah arah Anda ke program embedded system, tidak ada alasan untuk mempelajari assamble. Bahkan berpikir bahwa perakitan tergantung pada CPU Anda dapat mempelajari beberapa dasar-dasar tetapi pengetahuan Anda akan didasarkan pada arsitektur CPU dan set instruksi untuk CPU itu.
  2. Katakanlah Anda kode untuk Windows. Jika ingin mempelajari bahasa tingkat rendah daripada bahasa tingkat tinggi yang mungkin bermanfaat bagi Anda saat ini, saya akan merekomendasikan Anda untuk mempelajari Windows I deep, Windows API, manajemen memori Windows dll. Cukup pelajari OS / Platform yang Anda koding.
  3. Tingkatkan keterampilan Anda pada bahasa tingkat tinggi Anda saat ini, seperti manajemen memori, pengumpulan sampah dll. Jika Anda ingin tingkat rendah.
Amir Rezaei
sumber
0

Saya pikir Anda mencapai titik pengembalian yang semakin berkurang seiring kemajuan karier Anda. Artinya, Anda harus belajar bahasa assembly sejak dini, karena itu mengarah pada pemahaman fundamental yang lebih baik tentang segala sesuatu yang terjadi setelahnya. Namun, jika Anda sudah menjadi pekerja dan memiliki pengalaman beberapa tahun, Anda sudah akan merasakan bagaimana cara kerjanya, jadi mempelajari detail baut dan baut yang sebenarnya mungkin tidak memberi Anda wawasan sebanyak mungkin. .

TMN
sumber
0

Saya tidak tahu berapa banyak gunanya belajar perakitan. Tetapi paling tidak melakukan beberapa pemrograman dalam bahasa seperti C akan bermanfaat. Saya baru-baru ini harus melakukan beberapa pemrograman dalam C dan saya merasa agak mencerahkan. C menghilangkan banyak abstraksi yang ada dalam bahasa tingkat yang lebih tinggi. Abstraksi itu tidak datang tanpa biaya. Anda harus mengelola lebih banyak detail level lebih rendah di C, di mana seperti dalam bahasa level yang lebih tinggi detail itu dikelola untuk Anda. Dengan melakukan beberapa pemrograman dalam C Anda harus mengetahui detail-detail itu. Jadi, ketika Anda kembali ke bahasa sehari-hari Anda, Anda masih akan memiliki kesadaran itu dan akan lebih menghargai apa yang sebenarnya terjadi. Itu akan membantu menjadikan Anda seorang programmer yang lebih baik.

Ross Goddard
sumber
0

Dalam profesi Pengajaran, setidaknya di Inggris, guru harus memiliki kualifikasi yang jauh melebihi apa yang mereka ajarkan. Guru sekolah menengah (sekolah menengah) diharapkan memiliki gelar dalam mata pelajaran yang mereka ajarkan, dan guru sekolah dasar (sekolah dasar) juga memiliki gelar, dan harus mahir dalam semua mata pelajaran utama hingga tingkat GCSE tingkat yang baik (sekolah menengah) keluar dari ujian ?, tidak ada yang setara dengan AS sebenarnya).

Mengapa? Karena untuk mengajarkan sesuatu dengan baik, atau memang menggunakan sesuatu dengan baik, Anda harus memahaminya. Ini membutuhkan pemahaman tentang struktur yang mendasarinya, rantai keputusan sebelum Anda bekerja dengan yang mengarah padanya. Agar dapat memahami kode tingkat tinggi dengan benar, Anda harus memahami lapisan tempat kode itu dibangun, bagaimana operasinya, di mana kekuatan dan kelemahannya berada. Ini bersifat rekursif, untuk memahami lapisan di bawahnya, Anda juga harus memahami lapisan di bawahnya.

Pada akhirnya, inilah mengapa program universitas / perguruan tinggi yang layak dalam bidang Komputasi meminta kemampuan matematika yang baik sebelum yang lainnya, karena hal itu secara efektif menjadi dasar.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Jika Anda kurang pengetahuan dalam bidang-bidang ini, maka pemahaman Anda dikompromikan di bawahnya. Semakin dekat ke tingkat Anda mengoperasikan lapisan lain, semakin penting untuk memiliki landasan di dalamnya.

Jadi: Apakah Anda perlu tahu assembler sebagai pembuat kode tingkat tinggi?  Itu akan membantu.

Orbling
sumber
0

Itu sangat penting dalam kehidupan saya sebelumnya sebagai guru supercompuer. Saat itu saya merasa Anda tidak mengerti mesin sampai Anda telah menulis setidaknya beberapa ratus assembler, dan bermain-main dengan itu mencoba untuk memeras kinerja. Karena sangat sedikit programmer yang ingin melakukannya sedalam itu, itu membuat saya sangat diperlukan. Dan saya masih memiliki bahasa yang sama ketika berbicara dengan tipe desainer HW.

Tapi, sebenarnya kebutuhan / manfaat untuk ini sebagian besar beberapa dekade yang lalu. Di antara kemajuan kompiler, dan eksekusi di luar urutan HW ada sangat sedikit ruang untuk bisa memainkan pahlawan dengan menulis assembler lagi. Meskipun saya pikir itu berguna untuk memahami cara kerja. Saya berencana untuk mengajar anak-anak saya (mahasiswa baru CS jurusan) untuk memprogram dalam assembler yang sangat sederhana pada mesin virtual sederhana, supaya mereka dapat merasakan apa yang terjadi. Semoga kita bisa bermain dengan hal-hal seperti membuka gulungan, pipelining perangkat lunak, cache, dan prefetching, memuat bawah dll. Jadi setidaknya mereka akan tahu bahwa pada tingkat tertentu hal ini sedang terjadi.

Omega Centauri
sumber