<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Intro_Compiler_%26_Machine_Abstraction</id>
	<title>Intro Compiler &amp; Machine Abstraction - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Intro_Compiler_%26_Machine_Abstraction"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;action=history"/>
	<updated>2026-11-01T19:54:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &#039;&#039;&#039;optimisasi compiler&#039;&#039;&#039; dan &#039;&#039;&#039;abstraksi level mesin&#039;&#039;&#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}  == Compiler Optimization ==  &#039;&#039;&#039;Optimisasi&#039;&#039;&#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &#039;&#039;&#039;tanpa mengubah perilaku program yang teramati dari luar&#039;&#039;&#039;.  Programmer menulis kode y...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862&amp;oldid=prev"/>
		<updated>2026-10-06T07:07:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &amp;#039;&amp;#039;&amp;#039;optimisasi compiler&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;abstraksi level mesin&amp;#039;&amp;#039;&amp;#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}  == Compiler Optimization ==  &amp;#039;&amp;#039;&amp;#039;Optimisasi&amp;#039;&amp;#039;&amp;#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &amp;#039;&amp;#039;&amp;#039;tanpa mengubah perilaku program yang teramati dari luar&amp;#039;&amp;#039;&amp;#039;.  Programmer menulis kode y...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &amp;#039;&amp;#039;&amp;#039;optimisasi compiler&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;abstraksi level mesin&amp;#039;&amp;#039;&amp;#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}&lt;br /&gt;
&lt;br /&gt;
== Compiler Optimization ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Optimisasi&amp;#039;&amp;#039;&amp;#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &amp;#039;&amp;#039;&amp;#039;tanpa mengubah perilaku program yang teramati dari luar&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Programmer menulis kode yang mudah dibaca manusia; compiler menerjemahkannya menjadi kode mesin yang efisien.&lt;br /&gt;
&lt;br /&gt;
=== Aturan dasar: &amp;#039;&amp;#039;as-if rule&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Compiler boleh melakukan transformasi apa pun selama program berperilaku &amp;#039;&amp;#039;&amp;#039;seolah-olah&amp;#039;&amp;#039;&amp;#039; tidak diubah. Output akhir harus tetap sama.&lt;br /&gt;
&lt;br /&gt;
{{Warning|&amp;#039;&amp;#039;Undefined behavior&amp;#039;&amp;#039; (UB) di C/C++ dapat menghasilkan perilaku yang tampak aneh justru karena aturan ini. Compiler berasumsi UB &amp;#039;&amp;#039;&amp;#039;tidak pernah terjadi&amp;#039;&amp;#039;&amp;#039;, lalu melakukan optimisasi berdasarkan asumsi tersebut. Kode yang &amp;quot;kelihatannya benar&amp;quot; bisa dihapus atau diubah total.}}&lt;br /&gt;
&lt;br /&gt;
=== Jenis-jenis optimisasi ===&lt;br /&gt;
&lt;br /&gt;
; Constant folding&lt;br /&gt;
: Ekspresi konstan dihitung saat kompilasi. &amp;lt;code&amp;gt;x = 2 * 3 + 4&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;x = 10&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Dead code elimination&lt;br /&gt;
: Kode yang tidak pernah dieksekusi, atau yang hasilnya tidak pernah dipakai, dibuang.&lt;br /&gt;
; Inlining&lt;br /&gt;
: Pemanggilan fungsi kecil diganti langsung dengan isi fungsinya, menghilangkan overhead &amp;#039;&amp;#039;call&amp;#039;&amp;#039;.&lt;br /&gt;
; Loop unrolling&lt;br /&gt;
: Badan loop &amp;quot;dibentangkan&amp;quot; untuk mengurangi overhead pengecekan kondisi dan lompatan.&lt;br /&gt;
; Common subexpression elimination&lt;br /&gt;
: Ekspresi yang dihitung berulang cukup dihitung satu kali.&lt;br /&gt;
; Vectorization (SIMD)&lt;br /&gt;
: Beberapa operasi data diproses sekaligus dalam satu instruksi, memanfaatkan &amp;#039;&amp;#039;vector register&amp;#039;&amp;#039;.&lt;br /&gt;
; Register allocation&lt;br /&gt;
: Variabel yang sering dipakai ditempatkan di register CPU, bukan di memori.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Register x86-64 hanya ada &amp;#039;&amp;#039;&amp;#039;16 buah&amp;#039;&amp;#039;&amp;#039;. Keterbatasan inilah yang membuat &amp;#039;&amp;#039;register allocation&amp;#039;&amp;#039; menjadi salah satu masalah tersulit dalam desain compiler. Variabel yang tidak kebagian register harus di-&amp;#039;&amp;#039;spill&amp;#039;&amp;#039; ke stack, dan itu jauh lebih lambat.}}&lt;br /&gt;
&lt;br /&gt;
=== Flag optimisasi ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Flag !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt; || Tanpa optimisasi. Paling nyaman untuk &amp;#039;&amp;#039;debugging&amp;#039;&amp;#039; karena kode mesin masih memetakan rapi ke kode sumber.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt; || Optimisasi dasar.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; || Standar untuk produksi.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; || Lebih agresif, termasuk vectorization dan inlining yang lebih luas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; || Mengutamakan ukuran biner yang kecil.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di Rust, mode optimisasi diaktifkan dengan &amp;lt;code&amp;gt;cargo build --release&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Saat &amp;#039;&amp;#039;debugging&amp;#039;&amp;#039;, gunakan &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt;. Pada level optimisasi tinggi, variabel bisa hilang dari &amp;#039;&amp;#039;debugger&amp;#039;&amp;#039;, urutan eksekusi berubah, dan &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; tidak mendarat di tempat yang diharapkan.}}&lt;br /&gt;
&lt;br /&gt;
== Abstraksi dalam Sistem Komputer ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Abstraksi&amp;#039;&amp;#039;&amp;#039; adalah menyembunyikan detail implementasi di balik model yang lebih sederhana. Untuk pemrograman level mesin, ada dua abstraksi yang paling penting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Instruction Set Architecture (ISA) ===&lt;br /&gt;
&lt;br /&gt;
ISA adalah &amp;quot;kontrak&amp;quot; antara perangkat keras dan perangkat lunak. ISA mendefinisikan:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Processor state&amp;#039;&amp;#039;&amp;#039; — apa saja yang disimpan prosesor (register, program counter, condition flag)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Format instruksi&amp;#039;&amp;#039;&amp;#039; — bagaimana instruksi dikodekan&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Efek tiap instruksi&amp;#039;&amp;#039;&amp;#039; terhadap state tersebut&lt;br /&gt;
&lt;br /&gt;
Sebagian besar ISA, termasuk &amp;#039;&amp;#039;&amp;#039;x86-64&amp;#039;&amp;#039;&amp;#039;, mendeskripsikan perilaku program &amp;#039;&amp;#039;&amp;#039;seolah-olah&amp;#039;&amp;#039;&amp;#039; setiap instruksi dieksekusi berurutan: satu instruksi selesai sebelum instruksi berikutnya dimulai.&lt;br /&gt;
&lt;br /&gt;
==== Kenyataan di perangkat keras ====&lt;br /&gt;
&lt;br /&gt;
Prosesor nyata jauh lebih rumit dan mengeksekusi banyak instruksi secara &amp;#039;&amp;#039;&amp;#039;konkuren&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pipelining&amp;#039;&amp;#039;&amp;#039; — beberapa tahap instruksi tumpang tindih&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Superscalar&amp;#039;&amp;#039;&amp;#039; — beberapa instruksi dieksekusi bersamaan&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Out-of-order execution&amp;#039;&amp;#039;&amp;#039; — urutan eksekusi disusun ulang sesuai kesiapan data&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speculative execution&amp;#039;&amp;#039;&amp;#039; — prosesor menebak hasil percabangan sebelum diketahui&lt;br /&gt;
&lt;br /&gt;
Prosesor menggunakan &amp;#039;&amp;#039;&amp;#039;pengaman&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;dependency checking&amp;#039;&amp;#039;, &amp;#039;&amp;#039;reorder buffer&amp;#039;&amp;#039;, &amp;#039;&amp;#039;in-order commit&amp;#039;&amp;#039;) untuk memastikan hasil akhirnya tetap identik dengan model sekuensial yang dijanjikan ISA.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Pola yang sama muncul di dua lapisan berbeda. Compiler boleh mengubah urutan kode (&amp;#039;&amp;#039;as-if rule&amp;#039;&amp;#039;), hardware boleh mengubah urutan eksekusi — keduanya sah &amp;#039;&amp;#039;&amp;#039;selama perilaku yang teramati tidak berubah&amp;#039;&amp;#039;&amp;#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Virtual Address ===&lt;br /&gt;
&lt;br /&gt;
Alamat memori yang dipakai program level mesin adalah &amp;#039;&amp;#039;&amp;#039;alamat virtual&amp;#039;&amp;#039;&amp;#039;, yang menyajikan memori sebagai &amp;#039;&amp;#039;&amp;#039;satu array byte yang sangat besar dan berurutan&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Implementasi sebenarnya jauh lebih kompleks:&lt;br /&gt;
&lt;br /&gt;
* Hierarki perangkat keras: register → cache L1/L2/L3 → DRAM → disk&lt;br /&gt;
* Perangkat lunak sistem operasi: &amp;#039;&amp;#039;page table&amp;#039;&amp;#039;, MMU, TLB, penanganan &amp;#039;&amp;#039;page fault&amp;#039;&amp;#039;, &amp;#039;&amp;#039;swapping&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Sistem operasi mengelola ruang alamat virtual dan menerjemahkan alamat virtual menjadi alamat fisik.&lt;br /&gt;
&lt;br /&gt;
==== Ukuran ruang alamat x86-64 ====&lt;br /&gt;
&lt;br /&gt;
* Alamat direpresentasikan sebagai word &amp;#039;&amp;#039;&amp;#039;64-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pada implementasi saat ini, &amp;#039;&amp;#039;&amp;#039;16 bit teratas harus bernilai nol&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Ruang alamat efektif = 2&amp;lt;sup&amp;gt;48&amp;lt;/sup&amp;gt; byte ≈ &amp;#039;&amp;#039;&amp;#039;64 terabyte&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Program biasa hanya memakai beberapa megabyte sampai beberapa gigabyte&lt;br /&gt;
&lt;br /&gt;
{{Warning|Pada satu waktu, hanya sebagian kecil rentang alamat virtual yang dianggap &amp;#039;&amp;#039;&amp;#039;valid&amp;#039;&amp;#039;&amp;#039;. Akses ke alamat yang tidak valid inilah yang memunculkan &amp;#039;&amp;#039;segmentation fault&amp;#039;&amp;#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Abstraksi yang bocor (&amp;#039;&amp;#039;leaky abstraction&amp;#039;&amp;#039;) ===&lt;br /&gt;
&lt;br /&gt;
Kedua abstraksi di atas membuat assembly bisa dipelajari sama sekali. Namun abstraksi tersebut &amp;#039;&amp;#039;&amp;#039;bocor&amp;#039;&amp;#039;&amp;#039; dalam beberapa situasi:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Performa&amp;#039;&amp;#039;&amp;#039; — ISA menjanjikan urutan, tetapi &amp;#039;&amp;#039;cache miss&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;branch misprediction&amp;#039;&amp;#039; tetap memengaruhi kecepatan nyata&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Konkurensi&amp;#039;&amp;#039;&amp;#039; — model sekuensial tidak lagi cukup ketika beberapa thread berinteraksi, sehingga diperlukan &amp;#039;&amp;#039;memory barrier&amp;#039;&amp;#039; dan operasi atomik&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Keamanan&amp;#039;&amp;#039;&amp;#039; — Spectre dan Meltdown adalah kasus di mana pengaman ternyata tidak sempurna: &amp;#039;&amp;#039;speculative execution&amp;#039;&amp;#039; meninggalkan jejak di cache yang bisa dibaca penyerang&lt;br /&gt;
&lt;br /&gt;
== Representasi Level Mesin ==&lt;br /&gt;
&lt;br /&gt;
Compiler mengerjakan bagian terberat: menerjemahkan model eksekusi C yang relatif abstrak menjadi instruksi prosesor yang sangat elementer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assembly&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;machine code&amp;#039;&amp;#039;&amp;#039; pada dasarnya sama; perbedaannya hanya representasi. Assembly berbentuk teks yang bisa dibaca manusia, machine code berbentuk biner. Hubungan keduanya nyaris satu-ke-satu.&lt;br /&gt;
&lt;br /&gt;
=== Processor state yang terlihat ===&lt;br /&gt;
&lt;br /&gt;
Bagian-bagian state prosesor berikut tersembunyi dari programmer C, tetapi terlihat jelas di level mesin.&lt;br /&gt;
&lt;br /&gt;
==== Program counter (&amp;lt;code&amp;gt;%rip&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan &amp;#039;&amp;#039;&amp;#039;alamat memori instruksi berikutnya&amp;#039;&amp;#039;&amp;#039; yang akan dieksekusi. Di C, posisi eksekusi adalah konsep implisit; di level mesin, ini register konkret yang dapat diubah lewat instruksi lompat dan pemanggilan fungsi.&lt;br /&gt;
&lt;br /&gt;
==== Integer register file ====&lt;br /&gt;
&lt;br /&gt;
16 lokasi bernama, masing-masing menyimpan nilai &amp;#039;&amp;#039;&amp;#039;64-bit&amp;#039;&amp;#039;&amp;#039;. Isinya dapat berupa alamat (setara pointer di C) atau data integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran umum (System V AMD64 ABI)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Nilai kembalian fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt; || Argumen ke-4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; || Argumen ke-3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt; || Argumen ke-2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt; || Argumen ke-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039; / &amp;#039;&amp;#039;frame pointer&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Stack pointer&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; || Argumen ke-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Caller-saved&amp;#039;&amp;#039;, data sementara&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sebagian register melacak bagian penting dari state program, sebagian lain menampung data sementara seperti argumen, variabel lokal, dan nilai kembalian.&lt;br /&gt;
&lt;br /&gt;
==== Condition code register ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan informasi status hasil operasi aritmetika atau logika &amp;#039;&amp;#039;&amp;#039;yang terakhir dieksekusi&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;zero flag&amp;#039;&amp;#039;, &amp;#039;&amp;#039;sign flag&amp;#039;&amp;#039;, &amp;#039;&amp;#039;carry&amp;#039;&amp;#039;, &amp;#039;&amp;#039;overflow&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Register inilah yang dipakai untuk mengimplementasikan perubahan alur kontrol bersyarat seperti &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Instruksi pembanding dieksekusi → flag berubah&lt;br /&gt;
# Instruksi lompat bersyarat membaca flag → alur program bercabang&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Satu pernyataan &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; di C selalu &amp;quot;dicicil&amp;quot; menjadi minimal dua langkah terpisah di level mesin: penetapan flag, lalu pembacaan flag.}}&lt;br /&gt;
&lt;br /&gt;
==== Vector register ====&lt;br /&gt;
&lt;br /&gt;
Setiap register dapat menampung &amp;#039;&amp;#039;&amp;#039;satu atau lebih&amp;#039;&amp;#039;&amp;#039; nilai integer atau floating-point sekaligus. Inilah dasar perangkat keras untuk SIMD dan &amp;#039;&amp;#039;vectorization&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Memori: tipe data adalah ilusi ===&lt;br /&gt;
&lt;br /&gt;
C menyediakan model di mana objek dengan tipe berbeda dideklarasikan dan dialokasikan di memori. Kode mesin memandang memori &amp;#039;&amp;#039;&amp;#039;semata-mata sebagai array byte besar yang dapat dialamati&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
&lt;br /&gt;
* Tipe agregat seperti &amp;#039;&amp;#039;array&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;struct&amp;#039;&amp;#039; direpresentasikan sebagai &amp;#039;&amp;#039;&amp;#039;kumpulan byte yang bersebelahan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Assembly &amp;#039;&amp;#039;&amp;#039;tidak membedakan&amp;#039;&amp;#039;&amp;#039; integer &amp;#039;&amp;#039;signed&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039;&lt;br /&gt;
* Assembly tidak membedakan jenis pointer satu sama lain&lt;br /&gt;
* Assembly bahkan &amp;#039;&amp;#039;&amp;#039;tidak membedakan pointer dari integer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{Warning|Yang membedakan &amp;#039;&amp;#039;signed&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039; bukan datanya, melainkan &amp;#039;&amp;#039;&amp;#039;instruksi mana yang dipilih&amp;#039;&amp;#039;&amp;#039; untuk mengolahnya. Pola bit-nya identik. Inilah sebabnya kesalahan tipe data di C bisa lolos tanpa gejala sampai jauh di kemudian hari.}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Hal ini juga menjelaskan mengapa &amp;#039;&amp;#039;casting&amp;#039;&amp;#039; pointer di C praktis &amp;quot;gratis&amp;quot; di level mesin — tidak ada data yang berubah, hanya cara compiler memperlakukannya.}}&lt;br /&gt;
&lt;br /&gt;
=== Isi program memory ===&lt;br /&gt;
&lt;br /&gt;
Ruang memori program berisi:&lt;br /&gt;
&lt;br /&gt;
* Kode mesin yang dapat dieksekusi&lt;br /&gt;
* Informasi yang dibutuhkan sistem operasi&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Run-time stack&amp;#039;&amp;#039;&amp;#039; untuk mengelola pemanggilan dan pengembalian prosedur&lt;br /&gt;
* Blok memori yang dialokasikan pengguna, misalnya melalui &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seluruhnya dialamati menggunakan alamat virtual.&lt;br /&gt;
&lt;br /&gt;
=== Satu instruksi = satu operasi elementer ===&lt;br /&gt;
&lt;br /&gt;
Satu instruksi mesin hanya melakukan operasi yang sangat sederhana, misalnya:&lt;br /&gt;
&lt;br /&gt;
* Menjumlahkan dua angka yang tersimpan di register&lt;br /&gt;
* Memindahkan data antara memori dan register&lt;br /&gt;
* Melompat ke alamat instruksi lain secara bersyarat&lt;br /&gt;
&lt;br /&gt;
Compiler harus &amp;#039;&amp;#039;&amp;#039;menyusun rangkaian&amp;#039;&amp;#039;&amp;#039; instruksi semacam itu untuk mengimplementasikan konstruksi program seperti evaluasi ekspresi aritmetika, loop, serta pemanggilan dan pengembalian prosedur.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Inilah gambaran besarnya. C menyediakan objek bertipe, variabel bernama, dan struktur kontrol. Mesin hanya punya 16 register, array byte, flag, dan instruksi sederhana. &amp;#039;&amp;#039;&amp;#039;Jarak antara keduanya diisi oleh compiler&amp;#039;&amp;#039;&amp;#039; — dan membaca hasil pengisian jarak itulah inti dari Bab 3 CS:APP.}}&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>