Apakah ada perbedaan besar antara bahasa assembly dan bahasa level yang lebih tinggi dalam hal pengkodean dan / atau mengelola proyek? Jelas dibutuhkan lebih banyak pernyataan dalam bahasa assembly untuk melakukan operasi tertentu daripada di kebanyakan bahasa lain, tetapi apakah ada perbedaan yang mempengaruhi bagaimana suatu proyek perlu (atau harus) dijalankan berdasarkan penargetan bahasa assembly (khususnya bahasa assembly x86 / x64) ?
Sejauh ada perbedaan antara bahasa rakitan dan bahasa lain, tampaknya masuk akal untuk menebak bahwa setidaknya beberapa di antaranya adalah kelebihan untuk bahasa lain. Adakah yang bisa menunjukkan kelemahan spesifik bahasa majelis, dan cara untuk mengurangi kerugian tersebut?
Salah satu contoh spesifik adalah ketersediaan staf. Adakah yang mengalami kesulitan menemukan programmer bahasa assembly yang berpengalaman, dan jika demikian, langkah apa yang dapat diambil untuk mengatasi masalah ini?
non-[PC|web|enterprise]
pemrograman, di mana Majelis dominan atau sangat populer. Saya berbicara pengendali mikro, otomasi industri atau robotika. Tentu, ada bahasa tingkat tinggi di area ini juga, tetapi Anda melihat Majelis banyak.Jawaban:
Ya - tetapi tidak sering.
Di satu sisi, perakitan benar-benar hanya proxy untuk bahasa mesin, jadi tentu saja Anda dapat melakukan apa pun dalam perakitan yang Anda bisa dengan bahasa tingkat yang lebih tinggi.
Sebaliknya tidak selalu demikian. Sebagai contoh, beberapa tahun yang lalu, saya bekerja pada CPU ARM yang memiliki beberapa opcode funky untuk mengubah status grafik yang hanya dapat digunakan dari mode kernel. Mereka tidak akan memiliki padanan langsung dalam bahasa tingkat yang lebih tinggi, dan saya yakin fungsi dalam driver kernel Linux untuk mengubah status tersebut termasuk beberapa perakitan.
Pada mikroprosesor di tahun 80-an dan awal-pertengahan 90-an, jika Anda memiliki beberapa kode yang Anda butuhkan untuk berjalan sangat cepat, Anda akan sering menulisnya dalam perakitan, karena manusia yang terampil dapat dengan mudah menulis perakitan yang lebih optimal daripada kebanyakan C kompiler dapat menghasilkan. Beberapa program Mac awal ditulis sepenuhnya dalam perakitan, dan mereka sangat cepat untuk era ini. Bahkan tanpa menulis seluruh program dalam perakitan, saya pasti melakukan bagian saya mengoptimalkan loop batin di C melalui perakitan tertanam.
Tetapi segalanya mulai berubah pada pertengahan 1990-an. CPU mulai menyertakan fitur-fitur seperti pipelining dan prediksi cabang, sehingga pemesanan instruksi yang paling efisien tidak selalu jelas bagi manusia. Lebih buruk dari itu, pemesanan yang paling efisien bervariasi di antara CPU dalam keluarga yang sama; misalnya, kompiler PowerPC biasanya menawarkan switch target untuk seri G3, G4, dan G5. Kode objek yang sama akan berjalan pada mereka semua, tetapi akan berjalan pada salah satu dari seri tersebut secara lebih efisien.
Sejak itu, pemesanan instruksi menjadi semakin rumit, terutama pada CPU yang lebih kompleks secara arsitektur seperti x86, PowerPC, dan SPARC. (Saya percaya ARM masih cukup sederhana seperti itu.) Faktor tambahan yang besar adalah ukuran kode - kode yang menggunakan lebih banyak siklus CPU tetapi dapat tetap dalam cache CPU akan sering berjalan jauh lebih cepat daripada kode yang menggunakan siklus CPU lebih sedikit tetapi memicu pengambilan memori lambat . Kompiler modern utama dapat melakukan pekerjaan yang jauh lebih baik untuk mengoptimalkan kode pada CPU tersebut daripada yang dapat dilakukan manusia.
Saya belum menemukan alasan yang bagus untuk menulis kebaktian setidaknya dalam 15 tahun. Saya pikir pada tahun 2011, kegunaan utama untuk perakitan adalah:
sumber
Cobalah memprogram mikrokontroler untuk "tertanam kecil" - remote alarm mobil, monitor baterai ponsel, pengontrol keyboard, pengatur kecepatan kipas, tanpa menggunakan unit.
Sementara perbatasan bergerak, selalu ada ruang untuk berkumpul.
15 tahun yang lalu odometer sepeda Anda adalah mekanik, oven microwave berada di sirkuit analog, remote TV di sirkuit digital, TV tuner Sat ditulis dalam perakitan, firmware telepon di C dan applet komputer di Jawa.
7 tahun yang lalu oven microwave berada dalam sirkuit digital, remote TV ditulis dalam perakitan, TV set-top box ditulis dalam C, ponsel Anda menjalankan UI berbasis Java.
Saat ini, odometer sepeda berada dalam sirkuit digital, oven microwave mendapatkan firmware dalam perakitan, remote TV memiliki firmware di C, set-top box TV menjalankan Java, telepon Anda dapat Linux.
Ingin bertaruh 7 tahun ke depan? Karena semakin banyak teknologi mendapatkan bahasa kontrol yang lebih maju, majelis memperoleh dasar baru, dan itu akan terus mendapatkannya. Lihatlah apa yang dilakukan hari ini dengan sirkuit mekanik atau analog. Anda bisa bertaruh perakitan di sana dalam beberapa tahun. Sakelar cahaya Anda? Keran air Anda? Ketel Anda? Sikat gigi Anda?
Akan selalu ada perangkat baru, alat, mainan, barang umum yang akan diprogram dalam perakitan.
sumber
Saya mendasarkan ini terutama assembler yang saya gunakan - terutama MASM, NASM, dan (pada tingkat lebih rendah) TASM. Beberapa versi TASM yang lebih baru memiliki (memiliki?) Beberapa fitur untuk mendukung OO, tetapi saya belum menggunakannya banyak, dan saya tidak mencoba mengomentarinya.
Pertama: sebagian besar bahasa telah bergerak ke arah struktur yang setidaknya agak mirip pohon. Apakah berorientasi objek, atau berbasis objek, atau tepatnya apa, ada cukup banyak definisi tentang hubungan antara berbagai bagian sistem. Ada juga sedikit untuk "melindungi" satu bagian dari sistem dari "campur tangan" yang tidak disengaja tetapi bagian lain (meskipun perlindungan biasanya dapat dilewati jika Anda mau). Sebaliknya, bahasa assembly relatif "datar" - sebagian besar hubungan antara kode (dan data) di berbagai bagian sistem dibuat terutama oleh dokumentasi dan pada tingkat yang lebih rendah, konvensi penamaan.
Hasil dari ini adalah bahwa seringkali lebih mudah untuk memasangkan kode jauh lebih erat daripada yang ideal. Persyaratan yang mendorong pemilihan bahasa rakitan untuk mulai dengan (kinerja yang lebih tinggi, ukuran yang lebih kecil, dll.) Sering menghargai ini juga - dengan mem-bypass antarmuka yang disetujui dan Anda sering dapat memperoleh kode yang lebih kecil dan lebih cepat (meskipun biasanya tidak banyak. lebih baik dalam dimensi apa pun). Bahasa dan alat itu sendiri melakukan jauh lebih sedikit untuk membatasi apa yang Anda lakukan (baik atau buruk), yang menempatkan beban yang jauh lebih besar pada manajer untuk mencegah masalah. Saya tidak akan mengatakan itu berbeda secara kualitatif, tetapi secara kuantitatif memang - yaitu, manajemen harus bekerja untuk mencegah masalah dengan cara apa pun, tetapi dalam kasus bahasa majelis biasanya dibutuhkan lebih banyak (dan seringkali lebih ketat) pedoman tentang apa yang ada atau tidak. tidak dapat diterima.
Mengurangi ini sebagian besar adalah masalah pedoman yang lebih hati-hati, lebih banyak bimbingan dari personel yang lebih berpengalaman, dan konvensi penamaan yang ditegakkan dengan lebih khusus dan lebih hati-hati.
Kepegawaian adalah masalah. Masalah yang saya temui, di mana, terutama bukan yang saya harapkan. Menemukan cowok dengan kepribadian "pejuang tempur" yang senang terjun ke kode bahasa assembly cukup mudah. Sebagian besar melakukan pekerjaan yang cukup masuk akal, meskipun hampir tidak memiliki pengalaman sebelumnya dalam menggunakan bahasa assembly.
Kesulitan yang saya temui adalah dalam menemukan personil yang lebih senior - orang-orang yang dapat menjaga proyek di bawah setidaknya beberapa kemiripan kontrol, dan tidak sepenuhnya terbiasa dengan bahasa yang akan memberikan (dan sebagian besar menegakkan) pedoman yang diperlukan untuk menjaga kode secara wajar dipelihara dan dimengerti.
Melihat ke belakang, saya mungkin telah / menyebabkan beberapa masalah terbesar dalam hal itu. Saya dapat melihat dua sumber masalah di pihak saya. Pertama, pada saat proyek aku memikirkan, saya telah coding terutama dalam bahasa tingkat yang lebih tinggi selama beberapa waktu, dan menggunakan bahasa assembly hanyasebagai pilihan terakhir. Karena itu, ketika saya menggunakannya, hampir setiap trik yang mungkin untuk mendapatkan kinerja bukan hanya permainan yang adil, tetapi juga diharapkan. Kedua, ketika saya telah bekerja pada beberapa sistem yang sepenuhnya ditulis (atau terutama) dalam bahasa assembly, itu berada di bawah beberapa manajer proyek yang agak terkepal. Pada waktu itu saya masih relatif muda, dan terus terang membenci cara mereka menjalankan sesuatu, jadi cenderung melakukan yang sebaliknya. Dalam retrospeksi, apa yang mereka lakukan benar-benar penting, dan tidak dilakukan hanya karena mereka sudah tua dan tidak fleksibel (yang, saya cukup yakin adalah bagaimana saya melihat sesuatu pada saat itu).
sumber
menurut pendapat saya perakitan sebagai platform pengembangan mungkin tidak relevan untuk penggunaan sehari-hari. alasan utama untuk pendapat ini mungkin karena jumlah daya komputasi yang dihilangkan dari proses yang diberikan versus jumlah waktu pengembangan yang diperlukan untuk mengoptimalkan proses yang diberikan biasanya tidak sebanding dengan waktu dan energi (ada istilah khusus untuk ini .. ini terdengar seperti man / hour atau apalah..silakan edit jika Anda tahu apa yang saya bicarakan ..) ada pengecualian yang jelas yang disebutkan di atas, tetapi sejauh pemrograman arus utama perakitan tidak sering digunakan.
ini dikatakan..sekarang masih relevan hari ini ketika belajar pemrograman dalam konteks studi rekayasa perangkat lunak, itu mengajarkan apa yang tampak seperti bahasa pemrograman berperilaku seperti dan berperilaku. Saya akan melanjutkan dan memberikan contoh apa yang kita gunakan di kelas hari ini. kami menggunakan perakitan pep / 8 yang dikembangkan oleh Stanley Warford (Pepperdine University USA) dan perangkat lunak open source yang diberikan di sini . terutama digunakan karena memvirtualisasikan cpu dan menampilkan isi memori sambil melangkah melalui kode saat sedang berjalan (cukup berguna untuk belajar, debugging).
Jadi tergantung pada perakitan penggunaan Anda mungkin atau mungkin tidak relevan menurut saya.
sumber
Saya pikir Anda bertanya "apakah truk masih relevan jika kita memiliki mobil?". Maksud saya, perakitan memiliki rentang aplikasi yang sangat luas tetapi tidak selebar pemrograman tingkat tinggi, dengan cara yang sama dengan truk yang jauh lebih sedikit daripada mobil.
Dalam bidang-bidang seperti optimalisasi algoritma, Anda dapat menggunakan register prosesor secara langsung untuk meningkatkan algoritma pemrosesan gambar / video.
Di bidang seperti kriptografi, Anda dapat menggunakannya dengan cara yang sama.
Dalam prosesor baru dengan arsitektur baru (ingat ketika mikroprosesor Sel dirilis), pasti mereka harus menulis bootloader dan seterusnya dalam perakitan (dan dengan prosesor lama juga, tetapi prosesor lama digunakan memiliki tanah yang sangat stabil dan sulit untuk ditingkatkan Itu).
Dan masih banyak lagi contoh yang bisa diberikan, jadi itu tergantung pada bidang yang menjadi fokus perusahaan Anda, jika perusahaan Anda didedikasikan untuk pengembangan web / seluler, sangat mungkin Anda tidak membutuhkannya, tetapi jika perusahaan Anda berfokus pada mikrokontroler, embedded system, dll. sangat mungkin Anda membutuhkannya.
Dan ketersediaan staf, tergantung pada, saya kira jika Anda bertanya di Intel, Qualcomm, ... mereka harus memiliki daftar programmer perakitan yang besar (seperti jika Anda bertanya di tempat kerja Anda "berapa banyak pengemudi truk di sekitar sini?" tidak banyak berpikir, tetapi itu tidak berarti bahwa tidak ada di tempat lain. Apa yang terjadi jika Anda bertanya "berapa banyak pengemudi mobil di sekitar sini?").
sumber
Jika Anda benar-benar ingin tahu mengapa belajar perakitan adalah taruhan terbaik. Berikut alasannya.
Majelis seperti Natasha Romanoff of Avengers. Itu pesona dan sihir. Pertama, itu akan menggigit Anda tetapi percayalah, Anda tidak akan pernah melupakan rasanya.
sumber