Saya sedang melihat Project Euler Problem 48 :
Serial, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.
Temukan sepuluh digit terakhir dari seri, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .
Dengan Python saya bisa melakukan ini dengan satu baris:
sum((x**x for x in xrange(1,1001))
Tetapi setara perakitan ini akan menjadi 100 baris dan tantangan nyata.
Haruskah saya melakukan beberapa teka-teki ini dalam perakitan untuk mendapatkan wawasan tentang pemrograman tingkat rendah dan memahami bagaimana komputer sebenarnya bekerja?
self-improvement
assembly
Nishant
sumber
sumber
*
dengan Python?Jawaban:
Selain belajar perakitan, saya percaya bahwa mempelajari bagaimana bahasa tingkat rendah seperti C dikompilasi sangat berharga. Jadi jawaban saya adalah ya, tapi sekali lagi saya mungkin bias karena saya menikmati pemrograman tingkat rendah.
Misalnya, hanya memahami bagaimana pernyataan sederhana dikompilasi. Fungsi berikut,
... menjadi (setidaknya bit yang menarik):
Kode ini mengambil argumen dari stack (val, parameter to func), menggesernya ke kiri 2 tempat (dikalikan dengan 2 ^ 2 atau 4) dan kemudian menambahkan nilai asli ke hasilnya. Hasil akhirnya adalah perkalian dengan 5. Contoh seperti ini menggambarkan sejumlah hal yang harus diperhatikan, seperti optimisasi kompiler. Alih-alih memanggil instruksi untuk secara langsung mengalikan dengan 5, itu menggeser dua tempat untuk mengalikan dengan 4 dan kemudian menambahkan nilai asli. Saya menemukan contoh seperti ini untuk sangat meningkatkan pemahaman saya tentang hal-hal di tingkat yang lebih rendah.
Hasilkan output assembler dari gcc dengan
-S
opsi. Namun, perlu diketahui bahwa hasilnya akan bervariasi berdasarkan kompiler dan tingkat optimisasi.Bagaimanapun, saya tidak berpikir menjadi programmer bahasa assembly sama dengan memahami assembly . Sekali lagi, saya merasa pemrograman dalam bahasa seperti C dan mengetahui bagaimana hal itu dimasukkan ke dalam kode mesin adalah praktik yang berharga.
sumber
Mungkin tidak perlu untuk benar-benar dapat menulis assembler (yang sebagian besar rincian inisialisasi dan konvensi pemanggilan untuk sistem Anda).
Perlu memahami beberapa, jika Anda mencoba men-debug sesuatu tanpa sumber.
TETAPI pasti layak untuk memahami mesin setidaknya pada level 'C' dan pointer (pada dasarnya assembler tingkat tinggi) sehingga Anda tahu mengapa menggabungkan string jutaan kali dalam satu lingkaran itu buruk.
sumber
for i in range(1000000): s = s + '.'
tidak (jauh) lebih buruk daripada versi "dioptimalkan" yang saya gunakan kembalis
. Demikian pula, beberapa perkembangan lainnya mematahkan asumsi yang masuk akal dengan pengetahuan C dan menganggap implementasi naif. Tetapi secara umum lebih bermanfaat daripada berbahaya. Ingatlah bahwa implementasi bahasa terkadang lebih pintar daripada Anda;)Pertanyaan bagus. Learning Assembly sudah pasti bagus dan sepadan dengan usaha.
sumber
Iya dan tidak.
Memang benar bahwa itu akan memberi Anda pemahaman yang lebih baik tentang apa yang kode Anda lakukan dan mengapa beberapa hal hanya merupakan ide buruk yang harus Anda pikirkan tentang upaya tersebut.
Belajar assembler bukanlah proyek akhir pekan, itu akan menghabiskan banyak waktu dan Anda perlu berpikir apakah waktu ini bisa dihabiskan dengan lebih baik.
Jika Anda tidak ke dalam kode yang dioptimalkan maka Anda mungkin tidak akan pernah melihat manfaat yang sama dengan upaya yang Anda lakukan.
sumber
Saya melakukan banyak assembler ketika saya masih muda dan saya pikir itu tidak membantu memahami apa pun di luar assembler. Jika Anda melihat assembler modern itu semua hal-hal bahasa makro. Saya biasanya benci analogi, tapi begini: Apakah mengetahui cara kerja mesin membuat Anda menjadi pengemudi yang lebih baik?
sumber
Cara saya telah bekerja pada pemahaman assembler adalah dengan menulis program dalam bahasa tingkat yang lebih tinggi, kemudian mengganti bagian dengan (setidaknya mudah-mudahan) setara dengan traktat kode assembled yang fungsional. Ini berarti saya bisa menggunakan HLL untuk apa yang baik untuk mengatur dan memecahkan masalah tingkat tinggi - dan saya menggunakan asm untuk memukul logam.
(Ketika saya berbicara tentang program host yang ditulis dalam HLL, maksud saya C atau ObjC ketika saya mencoba untuk belajar asm x86_64, dan BASIC ketika saya sedang mengerjakan Z80, 6502 dan 6809 asm).
sumber