Apakah Majelis masih relevan? [Tutup]


18

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?


Mengapa ada orang yang menulis proyek lengkap hanya dalam bahasa assembly hari ini? Atau apakah Anda bertanya tentang lingkungan bahasa campuran, yang merupakan cara perakitan biasanya digunakan hari ini?
Martin Vilcans

6
Perhatikan bahwa ada bidang 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.
Mchl

1
@ Mcch: Bukankah proyek ini dibuat dalam C (atau bahkan C ++) dan mungkin perakitan? Saya menduga bahwa sangat jarang menggunakan perakitan secara eksklusif.
Martin Vilcans

1
Sebenarnya dalam otomasi industri Anda dapat memenuhi seluruh cabang bahasa yang tidak ada di luar bidang itu. Sebagian darinya berasal dari perbedaan perangkat keras (arsitektur Harvard yang bertentangan dengan arsitektur von Neumann yang sudah biasa kita gunakan). serta dari sejarah membuat pengendali ini dapat diakses oleh listrik, yang terbiasa bekerja dengan sakelar dan relay. Begitulah LD ( en.wikipedia.org/wiki/Ladder_logic ) ada, yang sebenarnya merupakan interpretasi grafis dari perakitan. Lihat artikel tertaut untuk beberapa bahasa lain yang digunakan dalam otomatisasi.
Mchl

2
Saya punya penginstal kecil yang saya dukung sekarang yang sedang dirakit. Mudah menulis dalam perakitan (dengan Windows API) seperti yang lainnya, jadi mengapa tidak? Saya juga punya antarmuka swiper kartu kredit yang ditulis dalam perakitan. Dimulai dalam bahasa tingkat tinggi, tetapi mengalami begitu banyak kesulitan untuk membuatnya bekerja sehingga saya menulis ulang dalam perakitan untuk mendapatkan kontrol yang lebih baik dari semua bit yang mengalir ...
Brian Knoblauch

Jawaban:


25

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:

  • Untuk membaca dump pembongkaran saat debugging, yang kadang-kadang saya lakukan bahkan hari ini.
  • Berurusan dengan fitur CPU non-standar, seperti itu mode grafis yang funky.
  • Penulisan kompiler - ini menyediakan format perantara yang dapat dibaca manusia untuk menerjemahkan bahasa tingkat yang lebih tinggi ke dalam.

1
Dan bahkan alasan Anda # 3 mulai menghilang dengan kompiler yang menargetkan kerangka kerja kompiler tingkat tinggi seperti LLVM, nanojit atau libjit atau sesuatu seperti JVM, CIL, Parrot, Rubinius atau Neko bytecode.
Jörg W Mittag

Kadang-kadang masih diperlukan untuk melakukan sedikit SSE2 dalam pekerjaan grafis / video. Meskipun patokan terhadap TBB / OMP pertama!
Martin Beckett

@ Martin: OMP bersifat ortogonal ke SSE2. (dengan asumsi praktik tata letak data yang baik)
rwong

@ rwong - tetapi prosesnya masih, 1, ternyata terlalu lambat. 2, harap OMP / TBB mempercepatnya. 3, resor untuk menulis versi SSE2! (dalam urutan rasa sakit)
Martin Beckett

2
Sebagai contoh, keseluruhan Roller Coaster Tycoon ditulis dalam perakitan (minus grafik yang dilakukan pada c) dan sangat luar biasa kuat untuk waktunya. Ratusan AI individu bertindak secara independen, hampir mulus, ketika sebagian besar permainan memiliki sprite 16x16 piksel yang melakukan gerakan yang telah ditentukan. Saya selalu suka menggunakannya untuk menunjukkan kekuatan perakitan.
Ampt

19

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.


3
jawaban yang bagus. Berapa banyak orang lebih suka membayar dua kali lebih banyak untuk sesuatu yang baterai setengah panjang hanya karena java atau sesuatu digunakan sebagai platform pengembangan? Lihatlah groupon dan semua cara lain yang dilakukan orang untuk menghemat uang, lihat gerakan hijau menghemat sumber daya. Mengapa mengarahkan biaya dan menyalakan semua produk tertanam hanya untuk menghindari perakitan?
old_timer

1
Anda lupa menambahkan bahwa sekarang komputer menjalankan Javascript (Chromebook). Bagi saya kemajuan itu cukup menyedihkan tetapi benar.
Hawken

Pada 2017, CIA masuk ke TV Anda yang menjalankan Linux, sinyal dari Jawa yang berjalan pada kunci mobil dapat dipalsukan, siapa pun dapat terhubung melalui WIFI ke C ++ firmware dari kamera dildo , sikat gigi mendapat exploit jarak jauh pada 2013, tapi untungnya masih earphone dengan pembatalan kebisingan dibuat dalam pekerjaan perakitan. Meskipun rakitan kehilangan posisi sebagai pengontrol tingkat atas apa pun , alih-alih pindah ke sub-komponen. Tirai jendela Anda sudah menjalankan Java, tetapi papan kontrol Java tersebut berbicara ke blinds pengontrol motor yang bekerja dengan perakitan.
SF.

8

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).


Saya memiliki kenangan indah tentang TASM dan perakit Orca / M =)
Patrick Hughes

0

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.


0

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?").


-3

Jika Anda benar-benar ingin tahu mengapa belajar perakitan adalah taruhan terbaik. Berikut alasannya.

  1. Tidak perlu belajar perakitan, jika Anda akan melakukan pemrograman pada visual basic dan hal-hal MS.
  2. Tidak perlu belajar perakitan, jika Anda harus membuat gadget mikrokontroler yang serius.
  3. Tidak perlu belajar perakitan, jika Anda memiliki real estat memori yang Anda inginkan saat bekerja pada mikrokontroler (tuhan membantu Anda saat menghubungkan memori dengan mikrokontroler)
  4. Tidak perlu belajar perakitan, jika Anda tidak ingin dewa seperti kekuatan atas mikrokontroler / mikroprosesor Anda.
  5. Tidak mengetahui perakitan seperti mengetahui gunung es. Anda dapat melihat 25% dari apa yang Anda dan kemampuan mikronik Anda dan 75% Anda tidak akan pernah tahu atau mengerti
  6. Coba jalankan Kolibris OS sepenuhnya ditulis dalam Majelis !!! Pernahkah Anda melihat OS yang boot dalam waktu kurang dari 5 detik dan aplikasi mulai berjalan dengan dalam 1 detik klik mouse.
  7. Kompiler modern memiliki fungsi tujuan umum di backend dan karenanya kode akhir yang dihasilkan akan lebih berat dibandingkan dengan Assembly.

Majelis seperti Natasha Romanoff of Avengers. Itu pesona dan sihir. Pertama, itu akan menggigit Anda tetapi percayalah, Anda tidak akan pernah melupakan rasanya.


1
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam 5 jawaban sebelumnya
nyamuk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.