VB.NET adalah bahasa .NET yang dikompilasi, bukan bahasa skrip yang ditafsirkan per baris saat berjalan. Mental model yang tepat atas proses tersebut membantu menafsirkan pesan error, menjelaskan mengapa kode VB dapat menggunakan seluruh pustaka .NET, dan memperlihatkan hubungannya dengan C#. Topik ini menguraikan alur dari berkas kode sumber sampai program berjalan, kemudian menunjukkan sifat keterbacaan sintaks VB pada program console yang benar-benar dieksekusi.
Dari kode sumber ke program berjalan#
Prosesnya terdiri atas dua tahap besar. Tahap kompilasi dilakukan oleh compiler VB bernama vbc, bagian dari platform .NET Compiler Platform (Roslyn). Compiler ini membaca berkas kode sumber berekstensi .vb dan menerjemahkannya menjadi Intermediate Language (IL), yaitu rangkaian instruksi netral mesin milik platform .NET. Hasil kompilasi beserta metadata tipenya dikemas ke dalam assembly, yaitu berkas .exe atau .dll yang siap dieksekusi.
Tahap eksekusi dilakukan oleh Common Language Runtime (CLR), yaitu mesin eksekusi milik .NET. CLR memuat assembly, memeriksa kesesuaian tipenya, lalu menerjemahkan IL menjadi kode mesin melalui kompilasi Just-In-Time (JIT) tepat sebelum bagian yang bersangkutan berjalan. Memori juga dikelola oleh CLR melalui garbage collection, sehingga objek yang tidak lagi dirujuk dibersihkan oleh runtime tanpa perintah eksplisit dari kode program.
Rangkaian tersebut diringkas oleh diagram berikut.
Karena kompilasi selalu terjadi sebelum program berjalan, kesalahan sintaks terdeteksi pada tahap kompilasi, bukan ketika baris tertentu dieksekusi. Sifat ini membedakan VB.NET dari bahasa skrip yang menemukan kesalahan serupa di tengah operasi program. Pesan error compiler VB diberi kode berawalan BC, misalnya BC30451 untuk pengenal yang tidak dikenal, dan kode itu menjadi rujukan yang tepat ketika mencari penjelasannya.
Runtime yang digunakan bersama C##
C# menghasilkan IL yang sama dan berjalan pada CLR yang sama dengan VB.NET. Kedua bahasa berbagi pustaka kelas .NET yang identik, sehingga assembly hasil kompilasi VB.NET dapat dipanggil dari kode C# dan sebaliknya tanpa penghubung tambahan. Tipe seperti String, List(Of T), dan DateTime memiliki definisi yang sama untuk kedua bahasa. Satu aplikasi pun dapat mencampur keduanya, misalnya pustaka kelas VB.NET yang digunakan oleh aplikasi C#.
Konsekuensi praktisnya luas. Dokumentasi .NET di Microsoft Learn kerap menampilkan contoh dalam C#, dan contoh tersebut tetap dapat diterjemahkan karena API yang dirujuk sama persis. Paket NuGet yang ditulis dalam bahasa lain di .NET dapat dipasang dan dipanggil langsung dari VB.NET. Ketika kesalahan terjadi di dalam pustaka yang ditulis dalam C#, stack trace yang ditampilkan juga tetap terbaca karena tipe dan metodenya berbagi nama yang sama. Perbedaan kedua bahasa terletak pada sintaks dan fitur yang diterima masing-masing compiler, bukan pada platform yang menjalankannya.
Keterbacaan sebagai arah desain sintaks#
Kata kunci VB berupa kata bahasa Inggris utuh. Pembungkus program adalah Module, prosedur dinyatakan dengan Sub, deklarasi variabel menggunakan Dim beserta As, dan setiap blok ditutup dengan kata End seperti End Sub. Tanda kurung kurawal dan titik koma yang menjadi baku di banyak bahasa lain tidak ada dalam VB, sehingga struktur program terbaca dari kata-katanya.
VB juga tidak membedakan huruf besar dan huruf kecil pada pengenal maupun kata kunci. Penulisan console.writeline dan Console.WriteLine merujuk metode yang sama. Konvensi .NET tetap menetapkan kapitalisasi PascalCase untuk tipe dan metode, dan seluruh contoh jalur ini mengikutinya.
Program berikut memperlihatkan kedua sifat itu sekaligus, yaitu struktur kata kunci dan ketidakpekaan huruf. Baris pemanggilan kedua sengaja ditulis dengan huruf kecil. Simpan isi program sebagai berkas Program.vb, lengkapi dengan berkas proyeknya, lalu jalankan perintah dotnet run dari folder proyek tersebut.
Module Program
Sub Main()
Dim pesan As String = "VB.NET berbagi runtime dengan bahasa .NET lain"
Console.WriteLine(pesan)
console.writeline(pesan.Length)
End Sub
End ModuleVB.NET berbagi runtime dengan bahasa .NET lain
46Baris pertama keluaran adalah isi variabel pesan yang ditulis oleh pemanggilan pertama. Baris kedua berisi 46, yaitu banyaknya karakter pada string tersebut yang dihitung oleh properti Length. Kedua pemanggilan menghasilkan bentuk keluaran yang sama meskipun penulisannya berbeda huruf, karena compiler memperlakukan keduanya sebagai pengenal yang identik.
Program.vb tidak berdiri sendiri. Kompilasi memerlukan berkas proyek yang menyatakan jenis keluaran, kerangka target, dan opsi bahasa. Berkas berikut adalah proyek minimal untuk program di atas, dengan opsi Option Strict On yang memerintahkan compiler menolak konversi tipe berisiko. Opsi ketat ini menyertai seluruh contoh pada jalur ini.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<OptionStrict>On</OptionStrict>
<OptionExplicit>On</OptionExplicit>
<OptionInfer>On</OptionInfer>
<RootNamespace></RootNamespace>
</PropertyGroup>
</Project>Elemen OutputType bernilai Exe menyatakan hasil kompilasi berupa program yang dapat dieksekusi, sedangkan TargetFramework bernilai net10.0 menetapkan kerangka targetnya. Tiga opsi berawalan Option mengatur ketegasan compiler. Option Strict mengunci konversi tipe, Option Explicit mewajibkan setiap variabel dideklarasikan, dan Option Infer memperbolehkan tipe ditentukan otomatis dari nilainya. Dengan kedua berkas tersebut di satu folder, perintah dotnet run mengompilasi program menjadi IL lalu mengeksekusinya pada CLR.
Kesalahan umum#
- Menyimpan berkas Program.vb lalu mengharapkannya berjalan seperti skrip. Penyebabnya, VB.NET adalah bahasa terkompilasi, sehingga berkas .vb harus dikompilasi menjadi assembly terlebih dahulu. Perbaikannya, letakkan kode di dalam proyek dan jalankan dengan dotnet run, yang melakukan kompilasi secara otomatis sebelum eksekusi.
- Menganggap VB.NET sebagai platform yang berbeda dari C# karena sintaksnya berbeda. Penyebabnya, perbedaan kata kunci yang mencolok mudah dibaca sebagai perbedaan teknologi. Perbaikannya, tinjau produk akhirnya, yaitu IL pada CLR yang sama dengan pustaka .NET yang sama.
- Mematikan Option Strict agar pesan error konversi tidak muncul. Penyebabnya, mode longgar membiarkan konversi tipe berisiko lolos dan baru menimbulkan error saat program berjalan. Perbaikannya, aktifkan kembali Option Strict On, lalu perbaiki konversi yang ditandai oleh compiler.
Ringkasan#
- VB.NET dikompilasi menjadi IL yang dikemas dalam assembly, lalu dijalankan oleh CLR melalui JIT dengan memori yang dikelola garbage collection.
- C# berbagi CLR dan pustaka .NET yang sama dengan VB.NET, sehingga assembly dan API saling dapat dipanggil.
- Kata kunci berupa kata utuh, blok yang ditutup End, dan ketidakpekaan huruf besar-kecil menjadi ciri keterbacaan VB.
- Option Strict On memerintahkan compiler menolak konversi tipe berisiko, dan opsi ini menyertai seluruh contoh jalur ini.
Referensi#
- Structure of a Visual Basic Program — Microsoft Learn — Struktur program VB dari Module, prosedur, sampai penutup blok End.
- Managed Execution Process — Microsoft Learn — Alur resmi dari kode sumber menjadi IL hingga dieksekusi pada CLR.
- Common Language Runtime (CLR) — Microsoft Learn — Peran CLR sebagai mesin eksekusi, termasuk JIT dan garbage collection.
- Language Reference — Visual Basic — Microsoft Learn — Rujukan kata kunci dan aturan bahasa VB.NET.