CLR (Common Language Runtime), sebagaimana namanya, adalah sebuah runtime yang bisa digunakan oleh banyak bahasa pemrograman. Fitur-fitur yang dimiliki CLR akan tersedia di semua bahasa pemrograman yang berjalan di atasnya. Sebagai contoh, CLR menggunakan exception untuk melaporkan terjadinya kesalahan. Maka semua bahasa pemrograman yang berjalan di atas CLR juga akan menggunakan exception untuk pelaporan kesalahan. Contoh yang lain, CLR mengizinkan kita untuk membuat thread, maka semua bahasa yang berjalan di atas CLR juga bisa membuat thread.
Sebenarnya, saat sedang berjalan (runtime), CLR tidak akan mengetahui dengan bahasa apa aplikasi yang sedang berjalan dibuat. Hal ini berarti kita bebas memilih bahasa pemrograman selama bahasa pemrograman tersebut berjalan di atas CLR. Jadi pilihlah bahasa yang paling mudah untuk mengekspresikan keinginan kita.
Lalu jika seperti itu, apa keuntungan menggunakan bahasa yang satu dibandingkan dengan bahasa yang lain? Baiklah, kita anggap saja sebuah compiler sebagai alat untuk mengecek sintaks. Ia akan memeriksa source code yang kita tulis, memastikan semuanya benar, lalu ia akan mengkonversi kode program kita menjadi bahasa yang lebih rendah (IL). Masing-masing bahasa pemrograman menawarkan sintaks yang berbeda. Jangan menganggap remeh perbedaan sintaks ini. Untuk aplikasi matematis atau keuangan, menulisnya dalam APL akan sangat menghemat waktu development jika dibandingkan membuatnya dalam sintaks Perl misalnya.
Microsoft telah membuat beberapa bahasa pemrograman yang berjalan di atas CLR, yaitu C++/CLI, C#, Visual Basic, Jscript, J#, dan Intermediate Language (IL) Assembler. Selain itu, beberapa perusahaan lain serta akademisi juga telah membuat compiler yang mentarget CLR untuk bahasa-bahasa yang telah ada, misalnya Ada, APL, COBOL, Heskell, Python, dll
Gambar 01 menunjukkan proses kompilasi source code. Sebagaimana terlihat, kita bisa menulis source code dengan bahasa apapun yang mendukung CLR. Lalu kita gunakan compiler dari bahasa yang bersangkutan untuk mengecek sintaks dan menganalisis source code. Apapun compiler yang kita gunakan, hasilnya akan berupa sebuah managed module. Managed module ialah sebuah standar Windows 32 bit untuk file portable executable (PE32) atau Windows 64 bit portable executable (PE32+) yang membutuhkan CLR untuk menjalankannya.
Gambar 01. Mengcompile source code menjadi managed module.
Managed module terdiri dari beberapa bagian sbb:
- PE32 atau PE32+ header: Berisi standar file header Windows PE. Di dalam header ini juga menyebutkan tentang tipe file: GUI, CUI, atau DLL, dan juga berisi informasi timestamp kapan file tersebut dibuat.
- CLR header: Berisi informasi yang akan dibaca oleh CLR. Informasi ini meliputi versi CLR yang dibutuhkan, beberapa flag, lokasi serta ukuran dari metadata, resource, strong name, dll.
- Metadata: setiap managed module berisi tabel metadata. Ada dua macam tabel ini, yaitu tabel yang mendeskripsikan tipe data dan member yang didefinisikan di dalam source code dan tabel yang mendeskripsikan tipe data dan member lain yang dijadikan referensi oleh source code.
- Kode Intermediate Language (IL): kode yang dibuat oleh compiler sebagai hasil proses kompilasi source code. Saat runtime, CLR akan meng-compile IL menjadi native CPU instruction.
Native compiler (seperti C dan C++) akan menghasilkan kode yang khusus untuk sebuah arsitektur CPU, seperti x86, x64, atau IA64. Namun, semua compiler yang mendukung CLR akan menghasilkan kode Intermediate Language (IL). Kita akan membahas tentang IL lebih dalam pada artikel berikutnya. Kode IL sering disebut sebagai managed code karena CLR-lah yang mengelola eksekusinya.
Selain menghasilkan IL, semua compiler yang mendukung CLR akan menuliskan metadata ke dalam setiap managaed module yang dibuatnya. Metadata merupakan superset dari teknologi yang lebih lama seperti Type Libraries dan Interface Definition Language (IDL). Hal penting yang perlu kita ketahui ialah bahwa metadada CLR lebih lengkap. Selain itu, tidak seperti Type Libraries dan IDL, metadata selalu diasosiasikan dengan file yang berisi kode IL. Pada kenyataannya, metadata selalu ditempatkan di dalam file EXE atau DLL yang dibuat oleh compiler sehingga tidak mungkin memisahkan antara kode IL dan metadata-nya. Karena compiler membuat metadata dan kode IL pada saat yang sama dan menggabungkan keduanya menjadi sebuah managed module, maka kode IL dan metadata-nya akan selalu sinkron.
Metadata mempunyai banyak kegunaan. Berikut ini beberapa diantaranya:
- Metadata membuat kita tidak memerlukan lagi header
file ketika melakukan proses kompilasi karena semua informasi tentang tipe data yang dirujuk telah ada di dalam managed module bersama dengan kode IL. Compiler bisa langsung membaca metadata ini untuk mendapatkan informasi yang dibutuhkan. - Microsoft Visual Studio menggunakan metadata ini untuk membantu kita dalam penulisan source code. Fitur IntelliSense akan membaca metadata ini untuk memberitahukan kepada kita tentang method, property, event, dan field apa saja yang dimiliki oleh sebuah tipe data, serta jika berkaitan dengan method, parameter apa saja yang dimiliki oleh method tersebut.
- Proses verifikasi kode yang dilakukan oleh CLR akan menggunakan metadata ini untuk memastikan bahwa kode yang kita tulis hanya boleh melakukan safe operation.
- Metadata memungkinkan kita melakukan serialisasi sebuah field milik sebuah obyek lalu mengirimkannya ke komputer lain, lalu melakukan deserialisasi, membuat kembali obyek dengan state yang sama di remote machine.
- Metadata memungkinkan garbage collector untuk menentukan masa hidup sebuah obyek. Garbage collector bisa menentukan tipe data sebuah obyek, dan melalui metadata, ia bisa mengetahui field apa saja dari obyek tersebut yang menunjuk ke obyek yang lain.
Secara default, Microsoft C++ compiler akan membuat modul EXE/DLL yang berisi unmanaged code. Modul ini tidak membutuhkan CLR untuk eksekusinya. Namung dengan menambahkan command-line switch /CLR, compiler C++ akan menghasilkan modul yang berisi managed code, dan tentu saja CLR harus diinstal untuk menjalankan modul ini. Compiler C++ sangat unik karena ia satu-satunya compiler yang mengizikan developer menulis managed code serta unmanaged code yang kemudian akan di-compile ke dalam modul yang sama. Ia juga mengizinkan developer untuk mendefinisikan managed data type serta unmanaged data type dalam source code yang sama.
source : firstyuyu.wordpress.com