ISA (instruction set architecture) adalah kontrak yang mengikat dua sisi komputer sekaligus, yaitu perangkat keras yang mengeksekusi instruksi dan perangkat lunak yang dibangun di atasnya. Topik ini membahas isi kontrak tersebut, mulai dari register yang dijanjikan, daftar instruksi yang tersedia, aturan memori yang berlaku, hingga semantik setiap instruksi. Setelah pembahasan selesai, batas antara hal yang dijanjikan kontrak dan hal yang bebas ditentukan perancang prosesor akan terpisah dengan jelas.
Kontrak antara dua sisi komputer#
Kontrak ISA mengikat dari dua arah yang berlawanan. Sisi perangkat lunak berhenti pada ISA, karena kompilator (compiler), yaitu program penerjemah dari bahasa sumber ke instruksi mesin, menerjemahkan setiap program menjadi deretan instruksi yang tercantum pada kontrak, sehingga tidak perlu mengetahui isi chip. Sisi perangkat keras berangkat dari ISA, karena CPU menjanjikan perilaku yang persis sama untuk setiap instruksi pada daftar itu, apa pun rancangan internalnya. Kedua sisi tidak pernah bertemu secara langsung, dan ISA-lah satu-satunya perantara yang dipegang bersama.
Konsekuensi dari kontrak ini bersifat praktis. Dua prosesor dari rancangan yang sama sekali berbeda dapat mematuhi kontrak yang sama, dan program biner yang sama berjalan pada keduanya tanpa perubahan apa pun. Sebaliknya, program yang ditargetkan pada kontrak lain tidak dapat berjalan sebelum dikompilasi ulang untuk kontrak tersebut. Sifat inilah yang membuat perangkat lunak dapat berpindah antargenerasi prosesor, sekaligus menjadi alasan sebuah keluarga prosesor menjaga kontraknya tetap stabil selama puluhan tahun.
Diagram berikut menempatkan ISA sebagai lapisan perantara yang dipegang kedua sisi. Sisi atas menargetkan kontrak, sedangkan sisi bawah menepatinya, dan isi tengahnya adalah daftar hal yang diikat.
Apa saja yang diikat oleh ISA#
Bagian pertama kontrak adalah register, yaitu penyimpanan kecil di dalam prosesor yang paling cepat diakses program. ISA menetapkan jumlah dan lebar register yang terlihat oleh program, pada RV32I berupa 32 register umum berukuran 32 bit yang diberi nomor x0 sampai x31, dengan x0 selalu bernilai 0. ISA juga menetapkan register khusus seperti program counter yang memegang alamat instruksi berikutnya, meskipun register itu tidak terjangkau oleh instruksi aritmetika biasa. Program yang ditulis untuk RV32I berhak mengasumsikan keberadaan dan ukuran seluruh register ini.
Bagian kedua adalah daftar instruksi beserta bentuk binernya. Setiap instruksi memiliki notasi teks yang disebut mnemonic sekaligus pola bit tetap yang disebut encoding, dan keduanya tercantum pada kontrak. Tabel berikut memperlihatkan sebagian kecil daftar itu beserta operasi yang dijanjikannya.
| Instruksi | Operasi yang dijanjikan |
|---|---|
addi rd, rs1, imm | mengisi rd dengan nilai rs1 ditambah sebuah konstanta |
add rd, rs1, rs2 | mengisi rd dengan hasil penjumlahan dua register |
lw rd, offset(rs1) | memuat satu kata 4 byte dari memori ke rd |
sw rs2, offset(rs1) | menyimpan isi rs2 ke memori sebagai satu kata |
beq rs1, rs2, label | melompat ke label bila kedua register bernilai sama |
jal rd, label | melompat ke label dan menyimpan alamat kembali di rd |
Bagian ketiga adalah model memori dan semantik. RV32I memandang memori sebagai deretan byte yang beralamat 32 bit, dan akses satu kata 4 byte pada set dasar wajib sejajar, yaitu alamatnya habis dibagi 4. Semantik setiap instruksi diikat dengan pasti, misalnya hasil penjumlahan yang melampaui jangkauan 32 bit dibungkus kembali ke jangkauan tersebut, dan perbandingan tersedia dalam versi bertanda maupun tidak bertanda. Tanpa ketepatan semantik, dua implementasi dapat menghasilkan jawaban berbeda untuk program yang sama, dan kontrak itu kehilangan maknanya.
Kebebasan yang tersisa bagi implementasi#
ISA tidak menetapkan cara perilakunya diwujudkan di dalam chip. Jumlah tahap pipeline, keberadaan cache, frekuensi clock, dan teknologi transistor semuanya bebas ditentukan perancang. Pipeline adalah rangkaian tahap eksekusi instruksi yang tumpang tindih, sedangkan cache adalah memori kecil di dalam prosesor. Wilayah kebebasan ini disebut mikroarsitektur, yaitu rancangan internal satu implementasi tertentu dari sebuah ISA. Dua prosesor yang mematuhi kontrak yang sama boleh memiliki mikroarsitektur yang tidak mirip sama sekali, sepanjang perilaku yang terlihat oleh program tetap identik.
Kebebasan itu memicu persaingan pada kontrak yang sama. Implementasi baru dapat lebih cepat, lebih hemat energi, atau lebih murah, sedangkan program yang sudah ada tetap berjalan tanpa diubah. Kontrak pun menjadi aset jangka panjang yang dijaga ketat, misalnya keluarga x86-64 pada banyak komputer meja kerja dan keluarga ARM pada banyak perangkat bergerak, sehingga program yang disusun puluhan tahun lalu masih dapat dieksekusi prosesor terbaru.
RISC-V menata kontraknya secara bertingkat. Set dasar RV32I sengaja dibuat kecil, kemudian instruksi tambahan hadir melalui ekstensi, misalnya ekstensi M untuk perkalian dan pembagian bilangan bulat serta ekstensi F untuk bilangan pecahan. Program dapat menyatakan ekstensi yang dibutuhkannya, dan implementasi cukup mewujudkan kombinasi yang dipilihnya. Model ini menjaga set dasar tetap sederhana untuk dipelajari, termasuk pada modul ini.
Kesalahan umum#
Tiga kesalahan berikut paling sering muncul ketika ISA baru dipelajari, dan ketiganya dapat dipisahkan lewat satu pertanyaan yang sama.
- Menganggap ISA identik dengan rancangan di dalam chip. Diagram CPU yang memuat ALU, register, dan memori memang menyerupai isi kontrak, tetapi ISA hanya menetapkan perilaku yang dijanjikan, sedangkan rincian rangkaian termasuk mikroarsitektur. Perbaikannya, periksa apakah suatu hal mengubah hasil program atau hanya mengubah cara chip bekerja, karena yang kedua bukan bagian dari ISA.
- Menyamakan assembly dengan ISA. Assembly adalah notasi teks yang mudah dibaca manusia, sedangkan ISA mengikat pola bit yang benar-benar dieksekusi, dan assembler menerjemahkan antara keduanya. Perbaikannya, apabila yang menentukan adalah perilakunya, periksa encoding instruksinya dan bukan hanya tulisannya.
- Mengira satu program biner berlaku untuk semua prosesor. Program biner memuat pola bit yang hanya berarti pada kontrak yang ditargetkannya, sehingga program untuk keluarga ISA lain harus dikompilasi ulang dari sumbernya. Perbaikannya, susun ulang program untuk setiap target ISA yang disasar.
Pertanyaan yang memisahkan ketiganya adalah apakah perbedaan itu terlihat oleh program yang berjalan. Hal yang terlihat program termasuk kontrak, sedangkan yang hanya terlihat oleh perancang chip termasuk mikroarsitektur.
Ringkasan#
- ISA adalah kontrak yang menetapkan register, daftar instruksi beserta encodingnya, aturan memori, dan semantik setiap instruksi yang dijanjikan sebuah prosesor.
- Perangkat lunak menargetkan kontrak, sedangkan perangkat keras menepatinya, sehingga satu program biner berjalan pada semua implementasi yang mematuhi kontrak yang sama.
- Rancangan internal seperti pipeline, cache, dan frekuensi clock bukan bagian kontrak, melainkan wilayah mikroarsitektur yang bebas berbeda antarimplementasi.
- RISC-V menyusun kontraknya bertingkat melalui set dasar RV32I yang kecil beserta ekstensi tambahan seperti ekstensi M untuk perkalian bilangan bulat.
Referensi#
- RISC-V ISA Manual — RISC-V International — Dokumen spesifikasi resmi ISA RISC-V yang merinci register, instruksi, dan semantik RV32I.
- Computer Systems: A Programmer’s Perspective — Bryant dan O’Hallaron — Buku yang membahas lapisan bahasa mesin dan ISA dari sudut pandang pemrogram pada bab machine-level programming.