“Dunia Hening Tanpa Kehebohan”
Dunia bahasa pemrogramman assembly adalah dunia yang sangat sepi dari hiruk pikuk persaingan ataupun masalah yang sering anda temukan pada bahasa pemrogramman pada umumnya. Bahkan anda tidak memiliki saingan dalam bentuk apapun sehingga nampak sangat tidak bersahabatnya dunia bawah tanah ini. Sebagian orang masih menggunakan bahasa pemrogramman assembly namun juga sebagian lagi meninggalkannya yang disebabkan karena terlalu menguras waktu dan tenaga.
Jika ditinjau dari beragam literatur yang ada dalam pembagian level bahasa pemrogramman maka assembly digolongkan sebagai bahasa pemrogramman level rendah (low level) namun ada juga yang mengklasifikasikannya sebagai bahasa pemrogramman intermediate. Bahasa pemrogramman yang paling rendah tentu saja adalah bahasa mesin itu sendiri yang merupakan instruksi binari secara langsung pada CPU, namun karena assembly melakukan hal yang sama yaitu instruksi langkah per langkah pada cpu walaupun masih perlu untuk dikompilasi oleh assember (sebutan untuk assembly compiler) maka bisa disebut sebagai bahasa pemrogramman paling rendah atau low level tadi dimana bahasa mesin sudah tidak flexible dan tidak bisa lagi disebut sebagai bahasa pemrogramman melainkan instruksi mesin secara langsung. Klasifikasi ini yang saya ambil yaitu assembly merupakan bahasa pemrogramman low level yang dapat digunakan oleh programmer untuk membuat program.
Saat ini yang masih digunakan oleh para programmer hanya ada 4 yaitu
- Netwide Assembler (NASM)
- Flat Assembler (FASM)
- Microsoft Assembler (MASM)
- GNU Assembler (GAS)
- Clang Assembler (LLVM)
Keempat bahasa pemrogramman assembly tersebut diatas adalah bahasa pemrogramman umum yang digunakan untuk arsitektur processor yang sering digunakan seperti keluarga besar x86 dan dan ARM. Sementara itu untuk jenis processor sekelas microcontroller menggunakan instruksi tersendiri yang seringkali menggunakan custom assembler yang dipaket menjadi satu kesatuan program guna mengatur atau memprogram chip microcontroller tersebut diantaranya adalah Arduino, PIC dan ESP.
Untuk NASM dan FASM adalah assembly compiler yang masih berdiri sendiri walaupun yang terakhir yaitu MASM dibundle dalam Visual Studio bersama saudara high level nya yaitu C/C++. Sementara itu GAS adalah bagian dari GCC atau GNU Compiler Collection yang mirip dengan Visual Studio namun diperuntukan bagi sistem operassi Linux. Sedangkan Clang Assembler adalah bagian dari Project LLVM yang juga merupakan toolchain seperti GCC dan Visual Studio namun banyak digunakan untuk custom assembler.
Yang banyak digunakan pada sistem operasi Windows adalah MASM karena bundle dengan visual studio, sementara itu di Linux tentu saja GAS yang paling banyak digunakan. Selanjutnya pada MacOS menggunakan Clang Assembler dari LLVM, dan pada embedded system seperti Microkontroler dan Arduino menggunakan Toolchain yang dikeluarkan oleh masing-masing pembuat chip tersebut seperti AVR atau menggunakan GCC sebagai toolchain nya. Dulu pernah ada juga Turbo Assembler (TASM) yang cukup terkenal dan dibundle dengan bahasa pemrogramman PASCAL (sekarang namanya Delphi) buatan dari Borland namun kini sudah tidak digunakan lagi dan reinkarnasi bahasa pemrogrammannya yaitu Delphi tidak lagi menjadikan TASM sebagai bagian mandatory.
Tinggal ada NASM dan FASM sebagai penjaga netralitas terakhir bagi bahasa pemrogramman assembly tanpa harus tergantung bundle toolchain bahasa pemrogramman tingkat tinggi lainnya. Sebagian besar bahasa pemrogramman tingkat tinggi menjadikan Assembly sebagai perantara dimana program yang ditulis dengan bahasa pemrogramman tertentu dikompilasi menjadi bahasa pemrogramman assembly sesuai dengan arsitektur tujuan dimana program tersebut akan dibuat dan terakhir dikompilasi dengan assembler menjadi program yang siap digunakan.
Metode ini digunakan oleh para pembuat compiler agar bahasa pemrogrammannya bisa portable alias bisa dikompilasi untuk komputer yang memiliki arsitektur cpu atau sistem operasi yang berbeda. Tidak perlu terkejut karena sebenarnya di bahasa tingkat tinggi sekalipun hal ini terjadi dimana anda tidak bisa membuat program untuk sistem operasi Windows dari compiler toolchain Linux demikian pula sebaliknya. Padahal mereka menggunakan arsitektur CPU yang sama, apalagi jika menggunakan arsitektur yang berbeda dimana perlu dilakukan porting ataupun menggunakan virtual device (seperti pada Android Studio) jika hendak membuat dan menjalankan suatu program yang dibuat pada arsitektur yang berbeda. Padahal itu adalah bahasa pemrogramman tingkat tinggi yang katanya paling ketat bersaing bahkan sudah seperti persaingan keyakinan.
Lantas kenapa bahasa pemrogramman Assembly menjadi dunia yang hening, tak lebih karena instruksi yang kita lakukan pada CPU dilakukan secara langkah per langkah sehingga untuk melakukan sesuatu bahkan kita harus mengetik puluhan baris untuk mendapatkan hasil yang sama dari sebaris instruksi pada bahasa pemrogramman tingkat tinggi. Lantas tentu saja muncul pertanyaan berikutnya, kenapa bahasa assembly tidak punah? Tidak lain karena kecepatan dan efisiensi yang didapat jika kita melakukan proses langkah per langkah secara efisien. Apa yang membedakan keduanya? Pada bahasa tingkat tinggi, proses penterjemahan menjadi instruksi spesifik CPU (bahasa mesin) atau menjadi bahasa assembly dilakukan oleh compiler atau dengan kata lain diserahkan secara penuh pada compiler untuk menterjemahkan dan melakukan optimisasi jalur atau instruksi apa yang akan dilakukan oleh CPU secara langsung. Sementara itu jika kita menggunakan bahasa pemrogramman assembly maka kita melakukan segala halnya secara sendiri.
Salah satu kelemahan dari bahasa pemrogramman tingkat tinggi adalah penyerahan secara penuh pada compiler yang menyebabkan para pembuat compiler akan menggunakan cara yang paling umum berbanding dengan cara yang lebih cepat atau menggunakan fasilitas atau fitur baru yang sebenarnya sudah tersedia pada CPU dengan pertimbangan bahwa user yang menggunakan program hasil kompilasi tersebut belum tentu memiliki atau menggunakan CPU yang mendukung fitur dimaksud.
Contoh yang paling sering adalah fitur SIMD (Single Instruction Multiple Data) seperti fitur SSE (Streaming SIMD Extension) atau yang lebih baru seperti AVX, AVX2 dan AVX512 pada processor x86. SIMD adalah suatu bagian dari CPU yang khusus menangani proses kalkulasi matematis dengan beragam fitur yang diberikan untuk mempercepat proses kalkulasi selain dari menggunakan register yang biasa. Jika kembali ke sejarah era 90-an, dimana pada awal era tersebut gebrakan yang cukup besar dari Intel sebagai pemimpin pasar chip komputer adalah dengan arsitektur Pentium yaitu menggunakan metode super scalar setelah sebelumnya pada versi 486 mengintegrasikan co-processor matematik (80387) yang terpisah dari 80386 menjadi satu chip tunggal. Akibatnya terjadi peningkatan signifikan kemampuan pemrosesan CPU pada saat itu dari pendahulunya. Namun komputer pada zaman itu belum mampu untuk melakukan pemrosesan video terkompresi kecuali menggunakan chip tambahan yang sering disebut multimedia card agar para pemilik komputer zaman jadul dapat memutar fim atau video dari CD. Sesuai dengan namanya yaitu MMX yang berarti Multi Media eXtension adalah penambahan kemampuan pemrosesan integer (bilangan bulat) secara berantai yang sangat dibutuhkan untuk memproses data gambar dari format mpeg yang menjadi standar dari video zaman itu (format yang lebih baru sudah lebih rumit lagi). Jadi jangan harap komputer saat itu bisa digunakan untuk proses editing video, untuk menampilkannya pun masih tersengal-sengal.
Walaupun kemudian pemrosesan pixel dan video diambil alih oleh GPU namun kemampuan dari pemrosesan dengan metode berantai SIMD tetap menjadi kebutuhan yang disebabkan pemrogramman langsung pada chip GPU yang memang memiliki kemampuan pemrosesan berantai masih terlalu sulit dan memusingkan bahkan hingga saat ini (dibahas pada CUDA Programming dan OpenCL programming). Secara bertahap, Intel menambahkan SSE (untuk floating point atau bilangan pecahan berbanding dengan MMX yang khusus untuk bilangan bulat) sejak Pentium III pada tahun 1999, sebagai jawaban terhadap fitur 3DNow yang diperkenalkan oleh pesaingnya AMD sebagai vector processing pada chipnya. Kemampuan ini untuk membantu pemrosesan vector yang sering dilakukan oleh game 3D yang sedang marak pada saat itu. Tidak cukup sampai disitu, Intel pada tahun berikut nya meluncurkan SSE2 pada Pentium4 dan dengan tegar mengambil alih kembali tampuk pimpinan inovasi dibidang chip computer. dan seperti yang kita tahu sekarang ini bahwa ada SSE3 yang diluncurkan pertama tahun 2003 dan terakhir SSE 4 pada tahun 2006. Untuk diketahui, SSE menggunakan 8 register 128 bit tambahan yang saat itu hanya bisa diakses jika menggunakan bahasa assembly dengan pertimbangan bahwa tidak semua user memiliki CPU Pentium yang mendukung fitur tersebut. Belum lagi kemudian pengembangan lebih lanjut dari SSE yaitu dengan diperkenalkannya AVX yang menjadikan rentang lebar register menjadi 256 bit dan menambahkan lagi 8 register hingga total menjadi 16 register yang dapat digunakan oleh program.
Nah ini bagian serunya, AVX dengan 16 register tambahan tersebut diperkenalkan sejak CPU seri SandyBridge yang diluncurkan awal 2011 dan AMD Buldozer (akhir 2011), akibatnya Visual Studio 2011 belum menggunakan fitur tersebut untuk proses optimasi dalam kompilasinya dan update dari Visual Studio 2011 didukung hanya lewat assembly, baru pada Visual Studio 2013 didukung penuh untuk instruksi AVX walaupun dengan pemakaian terbatas (butuh flag khusus) sedangkan optimasi hanya dilakukan pada fitur SSE saja. Hingga peluncuran Visual Studio 2015 dan 2017 pun optimasi masih menggunakan SSE sementara jika kita hendak mendapatkan fitur AVX terpaksa menggunakan instruksi dalam bahasa assembler. Karena faktor perbedaan adopsi dari fitur yang sering terlambat terutama pada AVX-512 dimana AMD baru mengadopsinya pada microarchitecture Zen4 (tahun 2022) maka sebagian besar compiler tidak mendukung AVX-512 secara langsung kecuali dipersyarat khusus oleh kita lewat flag atau tab optimasi. Hal ini menyebabkan ketimpangan yang sangat besar antara optimasi manual kita lewat bahasa pemrogramman assembly memanfaatkan fitur SIMD untuk melakukan kalkulasi berbanding dengan bahasa pemrogramman tingkat tinggi yang dikompilasi secara standar.
Dengan ilustrasi diatas, tentu kita faham kenapa pada pembahasan tentang bahasa assembly seringkali kita menemukan bahwa bahasa pemrogramman assembly lebih ditujukan pada aplikasi yang membutuhkan kemampuan tinggi (High Performance Computing) ketimbang aplikasi kebanyakan. Bahkan bahasa pemrogramman Python yang menjadi anak emas para perancang AI, scientist dan deep learning melirik assembly dan membuat fork (antarmuka) antara python dengan Assembler karena dapat memangkas proses training AI menjadi jauh lebih singkat dengan memanfaatkan fitur seperti AVX dan AVX-512.
Beberapa program video editing atau converting seperti handbrake memberikan hasil pengukuran kecepatan rendering yang berbeda antara chip Intel dan AMD yang disebabkan oleh perbedaan dukungan terhadap fitur AVX-512 yang sudah ditanamkan pada processor Intel seri Skylake tahun 2015 sementara itu baru didukung oleh AMD seri 7000 (Zen4) pada tahun 2022. Sebagian besar programmer game baik yang menggunakan game engine seperti Unreal Engine dan lain sebagainya secara benchmark AMD dan Intel dapat bersaing bahkan beberapa kali AMD mempecundangi Intel, hal ini karena game engine tersebut tidak menggunakan fitur AVX-512 dengan pertimbangan bahwa hanya processor intel yang memilikinya sementara game engine akan crash jika dijalankan pada komputer intel dengan chip sebelum 2015 atau pada processor AMD.
Dunia yang hening dan senyap tanpa persaingan ini terlalu cepat 10 tahun dari dunia hiruk pikuk dunia bahasa pemrogramman level atas. Terlalu canggih dengan pemanfaatan fitur terbaru yang justru tidak dilakukan oleh sebagian besar bahasa pemrogramman tingkat atas.