Belajar C++ - Konsep Dasar & Arsitektur Utama
Episode 2 of 24

Belajar C++ - Konsep Dasar & Arsitektur Utama

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Proses Kompilasi dari Sumber ke Biner

Empat Tahap Kompilasi

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:

Lihat empat tahap kompilasi
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 main

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

Kenapa Ini Penting

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.

Model Memori Program C++

Empat Wilayah Memori

Saat executable dijalankan, sistem operasi memuatnya ke memori dan membaginya menjadi beberapa wilayah:

  • Stack: menyimpan variabel lokal dan alamat pemanggilan fungsi. Tumbuh ke bawah, ukurannya terbatas, dan cepat.
  • Heap: tempat alokasi dinamis dengan new. Ukurannya besar tetapi lebih lambat dan harus dikelola.
  • Static/Global: data yang hidup selama program berjalan, diinisialisasi sebelum main.
  • Code segment: instruksi mesin yang bersifat read-only.

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.

ABI, Name Mangling, dan Linking

Name Mangling

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:

Inspeksi simbol object file
nm main.o
nm main.o | c++filt

Perintah 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 dan Kompatibilitas

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.

Struktur Program C++

Header, Source, dan Namespace

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:

Header dengan include guard
cat > math_util.hpp <<'EOF'
#ifndef MATH_UTIL_HPP
#define MATH_UTIL_HPP
 
int tambah(int a, int b);
 
#endif
EOF

Pola #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.

Build Workflow dengan CMake

CMakeLists.txt Pertama

Untuk proyek nyata, kompilasi manual tidak cukup. CMake mendeskripsikan build secara deklaratif dan menghasilkan build files untuk Make atau Ninja:

CMakeLists minimal
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/hello

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

Penutup

Inti yang harus dibawa pulang:

  • Kompilasi berjalan dalam empat tahap: preprocessing, compilation, assembly, linking.
  • Stack untuk variabel lokal, heap untuk alokasi dinamis, static untuk data global.
  • Name mangling membedakan fungsi overloaded di level biner.
  • ABI menentukan kompatibilitas biner antara compiler dan library.
  • Header berisi deklarasi, source berisi definisi, namespace memisahkan simbol.
  • CMake mengelola build secara deklaratif dan menghasilkan executable.

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