Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Proses eksekusi terkelola mencakup langkah-langkah berikut, yang dibahas secara rinci nanti dalam topik ini:
- Memilih pengkompilasi. Untuk mendapatkan manfaat yang disediakan oleh runtime bahasa umum, Anda harus menggunakan satu atau beberapa pengkompilasi bahasa yang menargetkan runtime bahasa umum.
- Mengkompilasi kode Anda ke bahasa perantara. Mengkompilasi menerjemahkan kode sumber Anda ke dalam bahasa perantara umum (CIL) dan menghasilkan metadata yang diperlukan.
- Mengkompilasi CIL ke kode asli. Pada waktu eksekusi, kompilator just-in-time (JIT) menerjemahkan CIL ke dalam kode asli. Selama kompilasi ini, kode harus melewati proses verifikasi yang memeriksa CIL dan metadata untuk mengetahui apakah kode dapat ditentukan sebagai jenis yang aman.
- Menjalankan kode. Runtime bahasa umum menyediakan infrastruktur yang memungkinkan eksekusi berlangsung dan layanan yang dapat digunakan selama eksekusi.
Pilih pengkompilasi
Untuk mendapatkan manfaat yang diberikan oleh runtime bahasa umum (CLR), Anda harus menggunakan satu atau beberapa pengkompilasi bahasa yang menargetkan runtime bahasa umum, seperti Visual Basic, C#, Visual C++, F#, atau salah satu dari banyak pengkompilasi pihak ketiga seperti Eiffel, Perl, atau pengkompilasi COBOL.
Karena merupakan lingkungan eksekusi multilanguage, runtime mendukung berbagai jenis data dan fitur bahasa. Pengkompilasi bahasa yang Anda gunakan menentukan fitur runtime mana yang tersedia, dan Anda merancang kode Anda menggunakan fitur-fitur tersebut. Pengkompilasi Anda, bukan runtime, menetapkan sintaks yang harus digunakan kode Anda. Jika komponen Anda harus benar-benar dapat digunakan oleh komponen yang ditulis dalam bahasa lain, jenis komponen Anda yang diekspor hanya harus mengekspos fitur bahasa yang disertakan dalam Spesifikasi Bahasa Umum (CLS). Anda dapat menggunakan CLSCompliantAttribute atribut untuk memastikan bahwa kode Anda sesuai dengan CLS. Untuk informasi selengkapnya, lihat Kemandirian bahasa dan komponen independen bahasa.
Mengkompilasi ke CIL
Saat mengkompilasi ke kode terkelola, pengkompilasi menerjemahkan kode sumber Anda ke dalam bahasa perantara umum (CIL), yang merupakan serangkaian instruksi independen CPU yang dapat dikonversi secara efisien ke kode asli. CIL mencakup instruksi untuk memuat, menyimpan, menginisialisasi, dan memanggil metode pada objek, serta instruksi untuk operasi aritmatika dan logis, alur kontrol, akses memori langsung, penanganan pengecualian, dan operasi lainnya. Sebelum kode dapat dijalankan, CIL harus dikonversi ke kode khusus CPU, biasanya dengan pengkompilasi just-in-time (JIT). Karena runtime bahasa umum menyediakan satu atau beberapa kompilator JIT untuk setiap arsitektur komputer yang didukungnya, set CIL yang sama dapat dikompilasi JIT dan dijalankan pada arsitektur apa pun yang didukung.
Ketika compiler menghasilkan CIL, ia juga menghasilkan metadata. Metadata menjelaskan tipe dalam kode Anda, termasuk definisi setiap tipe, tanda tangan anggota dari setiap tipe, anggota yang dirujuk oleh kode Anda, serta data lain yang digunakan oleh runtime saat eksekusi. CIL dan metadata terkandung dalam file portable executable (PE) yang didasarkan pada Microsoft PE yang diterbitkan serta memperluas format file objek umum (COFF) yang digunakan secara historis untuk konten yang dapat dieksekusi. Format file ini, yang mengakomodasi CIL atau kode asli serta metadata, memungkinkan sistem operasi mengenali gambar runtime bahasa umum. Kehadiran metadata dalam file bersama dengan CIL memungkinkan kode Anda menggambarkan dirinya sendiri, yang berarti bahwa tidak perlu pustaka jenis atau Bahasa Definisi Antarmuka (IDL). Runtime menemukan dan mengekstrak metadata dari file sesuai kebutuhan selama eksekusi.
Mengkompilasi CIL ke kode asli
Sebelum Anda dapat menjalankan bahasa perantara umum (CIL), bahasa perantara harus dikompilasi terhadap runtime bahasa umum ke kode asli untuk arsitektur komputer target. .NET menyediakan dua cara untuk melakukan konversi ini:
- Pengkompilasi .NET just-in-time (JIT).
- Ngen.exe (Native Image Generator).
Kompilasi oleh pengkompilasi JIT
Kompilasi JIT mengonversi CIL ke kode asli sesuai permintaan pada runtime aplikasi, ketika konten rakitan dimuat dan dijalankan. Karena runtime bahasa umum menyediakan pengkompilasi JIT untuk setiap arsitektur CPU yang didukung, pengembang dapat membangun serangkaian rakitan CIL yang dapat dikompilasi JIT dan berjalan di komputer yang berbeda dengan arsitektur komputer yang berbeda. Namun, jika kode terkelola Anda memanggil API asli khusus platform atau pustaka kelas khusus platform, kode tersebut hanya akan berjalan pada sistem operasi tersebut.
Kompilasi JIT memperhitungkan kemungkinan bahwa beberapa kode mungkin tidak pernah dipanggil selama eksekusi. Alih-alih menggunakan waktu dan memori untuk mengonversi semua CIL dalam file PE ke kode asli, itu mengonversi CIL sesuai kebutuhan selama eksekusi dan menyimpan kode asli yang dihasilkan dalam memori sehingga dapat diakses untuk panggilan berikutnya dalam konteks proses tersebut. Loader membuat dan melampirkan stub ke setiap metode dalam tipe ketika tipe tersebut dimuat dan diinisialisasi. Ketika metode dipanggil untuk pertama kalinya, stub meneruskan kontrol ke pengkompilasi JIT, yang mengonversi CIL untuk metode tersebut menjadi kode asli dan memodifikasi stub untuk menunjuk langsung ke kode asli yang dihasilkan. Oleh karena itu, panggilan berikutnya ke metode yang dikompilasi JIT langsung masuk ke kode asli.
Pembuatan kode saat penginstalan menggunakan NGen.exe
Karena kompiler JIT mengonversi CIL dari assembly ke kode asli ketika metode individu dalam assembly tersebut dipanggil, hal ini berdampak negatif pada performa selama runtime. Dalam kebanyakan kasus, performa yang berkurang dapat diterima. Lebih penting lagi, kode yang dihasilkan oleh pengkompilasi JIT terikat pada proses yang memicu kompilasi. Ini tidak dapat dibagikan di antara beberapa proses. Untuk memungkinkan kode yang dihasilkan dibagikan di beberapa pemanggilan aplikasi atau di beberapa proses yang berbagi sekumpulan rakitan, common language runtime mendukung mode kompilasi dini. Mode kompilasi sebelumnya ini menggunakan Ngen.exe (Native Image Generator) untuk mengonversi rakitan CIL ke kode asli seperti yang dilakukan kompilator JIT. Namun, pengoperasian Ngen.exe berbeda dari pengkompilasi JIT dengan tiga cara:
- Ini melakukan konversi dari CIL ke kode asli sebelum menjalankan aplikasi alih-alih saat aplikasi sedang berjalan.
- Ini mengompilasi seluruh assembly sekaligus, alih-alih satu metode pada satu waktu.
- Ini mempertahankan kode yang dihasilkan di Native Image Cache sebagai file pada disk.
Verifikasi kode
Sebagai bagian dari kompilasinya ke kode asli, kode CIL harus melewati proses verifikasi kecuali administrator telah menetapkan kebijakan keamanan yang memungkinkan kode untuk melewati verifikasi. Verifikasi memeriksa CIL dan metadata untuk mengetahui apakah kode tersebut aman, yang berarti bahwa kode hanya mengakses lokasi memori yang diizinkan untuk diakses. Keamanan jenis membantu mengisolasi objek satu sama lain dan membantu melindunginya dari kerusakan yang tidak disengaja atau berbahaya. Ini juga memberikan jaminan bahwa pembatasan keamanan pada kode dapat diberlakukan dengan andal.
Runtime bergantung pada fakta bahwa pernyataan berikut benar untuk kode yang diverifikasi sebagai aman tipe:
- Referensi ke jenis sepenuhnya sesuai dengan jenis yang dirujuk.
- Hanya operasi yang ditentukan dengan tepat yang dipanggil pada objek.
- Identitas adalah apa yang mereka klaim.
Selama proses verifikasi, kode CIL diperiksa dalam upaya untuk mengonfirmasi bahwa kode dapat mengakses lokasi memori dan metode panggilan hanya melalui jenis yang ditentukan dengan benar. Misalnya, kode tidak dapat mengizinkan pengaksesan bidang objek dengan cara yang memungkinkan lokasi memori melebihi batas. Selain itu, verifikasi memeriksa kode untuk menentukan apakah CIL telah dibuat dengan benar, karena CIL yang salah dapat menyebabkan pelanggaran aturan keamanan jenis. Proses verifikasi melewati sekumpulan kode jenis aman yang terdefinisi dengan baik, dan hanya melewati kode yang aman. Namun, beberapa kode jenis aman mungkin tidak lolos verifikasi karena beberapa keterbatasan proses verifikasi, dan beberapa bahasa, secara desain, tidak menghasilkan kode jenis aman yang dapat diverifikasi. Jika kode type-safe diperlukan oleh kebijakan keamanan tetapi kode tidak lulus verifikasi, pengecualian akan dilemparkan saat kode dijalankan.
Jalankan kode
Bahasa umum *runtime* menyediakan infrastruktur yang memungkinkan eksekusi terkelola serta layanan yang dapat digunakan selama eksekusi. Sebelum metode dapat dijalankan, metode harus dikompilasi ke kode khusus prosesor. Setiap metode di mana CIL telah dihasilkan dikompilasi JIT ketika dipanggil untuk pertama kalinya, lalu dijalankan. Saat metode dijalankan berikutnya, kode baku yang dikompilasi JIT akan dijalankan. Proses kompilasi JIT lalu menjalankan kode diulang hingga eksekusi selesai.
Selama eksekusi, kode terkelola menerima layanan seperti pengumpulan sampah, keamanan, interoperabilitas dengan kode yang tidak dikelola, dukungan debugging lintas bahasa, dan dukungan penyebaran dan penerapan versi yang ditingkatkan.
Di Microsoft Windows Vista, pemuat sistem operasi memeriksa modul terkelola dengan memeriksa bit di header COFF. Bit yang ditetapkan menunjukkan modul terkelola. Jika loader mendeteksi modul terkelola, memuat mscoree.dll, dan _CorValidateImage serta _CorImageUnloading memberitahu loader saat gambar modul terkelola dimuat dan dibongkar.
_CorValidateImage melakukan tindakan berikut:
- Memastikan bahwa kode tersebut adalah kode terkelola yang valid.
- Mengubah titik entri dalam citra menjadi titik entri dalam runtime.
Pada Windows 64-bit, _CorValidateImage memodifikasi gambar yang ada dalam memori dengan mengubahnya dari format PE32 ke PE32+.