File C# yang kita tulis hanyalah teks biasa, sedangkan prosesor komputer hanya mengerti instruksi bahasa mesin. Ada jurang besar di antara keduanya, dan memahami jembatan yang menghubungkan keduanya menjelaskan banyak hal: kenapa ada file .dll, kenapa error sintaks terdeteksi sebelum program berjalan, dan kenapa program yang sama dapat berjalan di Windows maupun Linux. Chapter ini mengikuti perjalanan sebuah program C# dari teks sampai output di layar.

Perjalanan Source Code Menjadi Output #

Ketika kita menjalankan perintah dotnet run, rangkaian berikut terjadi di belakang layar:

Tahapan tersebut dapat kita ringkas menjadi tiga langkah:

  1. Kompilasi. Compiler Roslyn memeriksa sintaks dan tipe data, lalu menerjemahkan source code menjadi bytecode bernama IL (Intermediate Language). Hasilnya disimpan sebagai file assembly — biasanya .dll.
  2. Eksekusi. Runtime CLR mengambil assembly tersebut. JIT compiler (just-in-time) menerjemahkan setiap method IL menjadi machine code sesuai prosesor komputer yang sedang dipakai.
  3. Hasil. Machine code dijalankan prosesor, dan program mulai menampilkan output.

Contoh Program Sederhana #

Mari kita lihat program yang akan menjadi teman utama kita di awal course. Berikut isi file Program.cs:

csharp
string nama = "Budi";
int tahunMulai = 2025;
int lamaBelajar = 1;

Console.WriteLine($"Halo, {nama}!");
Console.WriteLine($"Kamu mulai belajar C# pada tahun {tahunMulai}.");
Console.WriteLine($"Tahun ini adalah {tahunMulai + lamaBelajar}.");

Ketika file tersebut dieksekusi dengan dotnet run, compiler dan runtime bekerja sesuai urutan di atas, lalu menghasilkan:

Output yang Dihasilkan:

text
Halo, Budi!
Kamu mulai belajar C# pada tahun 2025.
Tahun ini adalah 2026.

Mari kita telaah baris-baris kode di atas:

  1. Baris 1 (string nama = "Budi";): variable nama dideklarasikan dengan tipe string dan diisi teks "Budi". Compiler mengingat bahwa nama hanya boleh menampung teks.
  2. Baris 2 (int tahunMulai = 2025;): variable tahunMulai bertipe int menyimpan bilangan bulat 2025.
  3. Baris 3 (int lamaBelajar = 1;): variable lamaBelajar menyimpan angka 1 sebagai data untuk perhitungan.
  4. Baris 5 (Console.WriteLine($"Halo, {nama}!");): string interpolation — tanda $ sebelum tanda kutip membuat compiler menyisipkan nilai nama ke posisi {nama}. Method Console.WriteLine() mencetak hasilnya beserta pindah baris.
  5. Baris 6 (Console.WriteLine($"Kamu mulai ...");): pola yang sama berlaku; nilai tahunMulai disisipkan ke dalam teks sebelum dicetak.
  6. Baris 7 (Console.WriteLine($"Tahun ini adalah {tahunMulai + lamaBelajar}.");): expression tahunMulai + lamaBelajar dievaluasi terlebih dahulu menjadi 2026, baru kemudian hasilnya disisipkan ke string.

Konsekuensi Bagi Kita #

Alur ini menjelaskan dua perilaku yang akan sering kita temui:

  • Error sintaks terdeteksi lebih dulu. Kompilasi berlangsung sebelum eksekusi; kesalahan penulisan menghentikan proses build dan compiler melaporkan nomor barisnya.
  • Satu assembly, banyak platform. Assembly berisi IL yang netral terhadap prosesor; JIT compiler di tiap sistem operasi menerjemahkannya menjadi machine code yang sesuai.

Tahapan kompilasi dan eksekusi tersebut melibatkan dua aktor besar: compiler dan runtime. Keduanya kita bedah lebih dalam pada Chapter Compiler dan Runtime.