jump to navigation

Native Code vs JIT Compilation 29 Februari 2008

Posted by firstyuyu in CLR.
trackback

Ada hal yang menarik dalam execution model yang digunakan oleh CLR (Virtual Machine-nya .NET). Di .NET, semua program yang kita buat tidak akan dicompile menjadi native code tetapi akan dicompile menjadi bahasa peralihan yang disebut MSIL (Microsoft Intermediate Language). Ketika progam yang di buat di .NET dijalankan, maka CLR akan meng-compile MSIL ini menjadi native code. Nah, native code inilah yang akan akhirnya akan dieksekusi. Jadi di .net (dan juga virtual machine yang lain, misalnya java) terdapat dua tahap kompilasi.

  1. Kompilasi dari source code yang kita buat (C#, VB.NET, C++/CLI, J#, dll) menjadi MSIL. Ini terjadi ketika kita menkan tombol F6 di Visual Studio atau menjalankan command line compiler (misalnya csc.exe untuk compiler C#).
  2. Kompilasi dari MSIL menjadi native code yang dilakukan oleh CLR dan terjadi saat runtime.

Banyak orang beranggapan bahwa inilah yang membuat platform virtual tidak akan secepat native karena di platform virtual terdapat satu tambahan layer, yaitu intermediate language/bahasa peralihan yang harus dicompile ke native code dahulu baru bisa dijalankan. Hal ini tentu berbeda dengan platform native yang hasil kompilasinya bisa langsung dijalankan di mesin.

Tapi ada yang menarik di sini. Ketika kita menjalankan program yang kita buat dengan .NET, CLR tidak otomatis meng-compiile semua MSIL program tersebut menjadi native code. Tapi kompilasi MSIL menjadi native code dilakukan sesuai kebutuhan atau biasa disebut JIT (Just In Time) compilation. Secara sederhana bisa kita gambarkan sbb. Misalnya kita punya class sbb

native-code-vs-jit-compilation.jpg 
lalu kita jalankan, maka CLR akan melihat bahwa pertama kali method Main() akan dijalanka. Maka CLR akan meng-compile MSIL dari method Main menjadi native code. Lalu CLR juga melihat bahwa untuk menjalankan method Main() dibutuhkan Method_A(). Maka CLR juga akan mengcompile MSIL Method_A() menjadi native code. Setelah semua method yang dibutuhkan telah dicompile menjadi native code, baru native code tersebut dieksekusi.

Di sini bisa kita lihat, bahwa Method_B() tidak pernah dicompile menjadi native code karena Method_B() tidak dibutuhkan untuk menjalankan main program MyClass. Ada beberapa implikasi yang terjadi pada execution model seperti ini jika dibandingkan dengan yang terjadi pada native code

  1. Start up time ketika program dijalankan akan lebih lama karena dibutuhkan waktu untuk meng-compile dari MSIL menjadi native code.
  2. Kompilasi dari MSIL menjadi native code hanya dilakukan sekali. Artinya jika method tersebut dieksekusi kedua kali dan seterusnya, proses kompilasi dari MSIL ke native code tidak terjadi lagi dan eksekusi akan berjalan sangat cepat secepat native code.
  3. Karena kompilasi menjadi native code terjadi benar-benar pada mesin di mana kode itu dijalankan, maka CLR bisa melakukan optimasi dengan memanfaatkan instruksi-instruksi mesin yang spesifik untuk hardware dimana program tersebut dijalankan. Hal ini tentu berbeda dengan compiler C/C++ misalnya. Karena compiler C/C++ harus meng-c0mpile source code C/C++ menjadi native code, maka compiler C/C++ harus mengambil instruksi-instruksi yang ada di semua arsitekur. Dia tidak bisa melakukan optimasi misalnya dengan menggunakan instruksi yang khusus untuk arsitektur Intel saja karena tidak ada jaminan hasil kompilasi ini akan dijalankan di Intel, Mac, atau yang lain.

Di sini bisa kita ambil kesimpulan bahwa saat start up, mungkin manage code (code yang dibuat menggunakan .net) sedikit lebih lambat daripada native code. Tapi ketika telah berubah menjadi native code, sangat mungkin eksekusi manage code akan lebih cepat daripada native code karena CLR telah melakukan optimasi untuk hardware dimana manage code tersebut dieksekusi.

Iklan

Komentar»

1. rizki - 15 Maret 2009

compilasi dan linking ke native code, bukan saja untuk kecepatan, mas…tapi untuk deployment aplikasi agar bisa mandiri. jadi ngga perlu maksa2 end user untuk lebih dulu install .NET framework sebelum bisa pakai aplikasi kita.

2. Yudi - 16 Maret 2009

Iya mas, setuju.
Terima kasih atas masukannya 🙂

3. hend - 5 Juli 2012

kok cuma teori,,, gmn cara merubahnya menjadikan exe native code?

4. hend - 5 Juli 2012

:BZ


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: