Episode ini membedah cara kerja C++ di balik layar: proses kompilasi dari preprocessing hingga linking, model memori stack dan heap, ABI dan name mangling, struktur program dengan header dan source file, serta build workflow dengan CMake.

Kode C++ tidak berjalan begitu saja. Ada serangkaian proses yang mengubah teks yang kalian tulis menjadi instruksi mesin yang bisa dieksekusi. Memahami proses ini membuat kalian mampu membaca error linker, memperbaiki masalah simbol, dan mengoptimalkan build.
Episode 2 membahas arsitektur di balik C++: alur kompilasi empat tahap, model memori program, ABI dan name mangling, struktur proyek dengan header dan source file, serta bagaimana CMake mengatur semuanya. Ini adalah bekal teknikal yang dipakai di semua episode berikutnya.
Compiler modern mengubah main.cpp menjadi executable dalam empat tahap. Tahap preprocessing memproses direktif seperti #include dan #define. Tahap compilation menerjemahkan kode yang sudah diproses menjadi assembly. Tahap assembly mengubah assembly menjadi object file dengan instruksi mesin. Tahap terakhir, linking, menggabungkan semua object file dan library menjadi executable.
Kalian bisa melihat setiap tahap secara terpisah dengan bendera compiler:
g++ -E main.cpp -o main.i
g++ -S main.i -o main.s
g++ -c main.s -o main.o
g++ main.o -o mainPerintah g++ -E main.cpp -o main.i hanya menjalankan preprocessing dan mengeluarkan file main.i. -S menghasilkan assembly main.s, -c menghasilkan object file main.o, dan tanpa bendera tersebut dilakukan linking penuh.
Sebagian besar error yang membingungkan datang dari tahap terakhir: linking. Ketika kalian melihat pesan undefined reference, itu artinya compiler tidak menemukan definisi fungsi yang dipanggil — penyebabnya bisa header yang hilang atau library yang tidak di-link. Di episode 5, kalian akan membangun multi-file dan berhadapan langsung dengan masalah ini.
Saat executable dijalankan, sistem operasi memuatnya ke memori dan membaginya menjadi beberapa wilayah:
new. Ukurannya besar tetapi lebih lambat dan harus dikelola.main.Setiap alokasi new mengambil ruang dari heap, sedangkan variabel lokal otomatis masuk stack. Perbedaan ini menentukan bagaimana resource dikelola, dan akan dibahas mendalam di episode 7.
C++ mengizinkan beberapa fungsi dengan nama yang sama selama parameter berbeda — ini disebut overloading. Untuk membedakannya di level object file, compiler memberi nama internal yang unik lewat proses name mangling. Fungsi tambah(int, int) menjadi nama mangled seperti _Z5tambedd.
Kalian bisa melihat dan membalik name mangling dengan nm dan c++filt:
nm main.o
nm main.o | c++filtPerintah nm main.o | c++filt menampilkan daftar simbol kemudian mendemangle nama-namanya sehingga terbaca sebagai tambah(int, int). Tool ini sangat membantu saat menyelidiki error linker.
ABI (Application Binary Interface) adalah kontrak biner antara compiler, library, dan executable: bagaimana fungsi dipanggil, bagaimana struct ditata di memori, dan bagaimana exception disebar. Library yang dikompilasi dengan ABI berbeda tidak bisa di-link dengan aman. Karena itu, library C++ sering menyediakan versi biner untuk compiler dan standar tertentu.
Proyek C++ dibagi menjadi file header (.hpp) yang berisi deklarasi dan file source (.cpp) yang berisi definisi. Namespace memisahkan simbol agar tidak bertabrakan — std adalah namespace utama library standar. Directive #include <iostream> menyisipkan isi header iostream ke file kalian.
Include guards mencegah file header disertakan dua kali dalam satu translation unit:
cat > math_util.hpp <<'EOF'
#ifndef MATH_UTIL_HPP
#define MATH_UTIL_HPP
int tambah(int a, int b);
#endif
EOFPola #ifndef MATH_UTIL_HPP memastikan deklarasi hanya diproses sekali. Mulai C++20, fitur modules menawarkan alternatif yang lebih bersih, dan akan dibahas di episode 16.
Untuk proyek nyata, kompilasi manual tidak cukup. CMake mendeskripsikan build secara deklaratif dan menghasilkan build files untuk Make atau Ninja:
cat > CMakeLists.txt <<'EOF'
cmake_minimum_required(VERSION 3.20)
project(hello LANGUAGES CXX)
add_executable(hello main.cpp)
set(CMAKE_CXX_STANDARD 20)
EOF
cmake -S . -B build
cmake --build build
./build/helloAlur cmake -S . -B build mengkonfigurasi proyek ke direktori build, lalu cmake --build build menjalankan backend default (Make atau Ninja) untuk mengkompilasi. Setelah build, executable hello siap dijalankan. Pola ini akan dipakai di hampir semua episode selanjutnya.
Info
Jangan pernah menulis -std=c++20 di dalam CMakeLists; pakai set(CMAKE_CXX_STANDARD 20) agar konsisten di semua compiler dan generator.
Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan membahas sintaks dasar dan struktur program — deklarasi variabel, konstanta, dan tipe dasar, statement dan blok kode, fungsi dengan scope dan return values, serta program interaktif pertama dengan std::cin dan std::cout. Saatnya mulai benar-benar menulis kode C++.