Saya melihat gambar yang bagus di sini . Saya belajar bahwa semua kompiler yang mendukung bahasa .net mengkonversi kode sumber ke CIL
format. Sekarang Microsoft tidak pernah mendatangkan .NET
semua sistem operasi dengan menulis CLR untuk semua sistem operasi. Lalu mengapa menyimpan format kode antara dan CLR untuk menjalankan CIL itu. Apakah itu bukan sakit kepala yang harus dihadapi? Mengapa Microsoft memilih menjadi seperti ini?
EDIT Arsitektur ini harganya mahal. Itu akan mengurangi kinerja, bukan? Java melakukan ini untuk menjaga independensi platform, untuk alasan apa. NET melakukannya? Mengapa tidak menyimpan kompiler seperti C biasa. Cara apa pun juga akan memerlukan kompiler untuk mengkonversi kode ke CIL jika saya perlu menambahkan bahasa baru, satu-satunya perbedaan yang akan dibuat adalah bahasa target. Ini semua.
Jawaban:
Karena mereka hanya perlu menulis satu kompiler untuk C # ke CIL - yang merupakan bagian yang sulit. Membuat penerjemah (atau lebih sering, kompiler Just-In-Time) untuk CIL per platform relatif mudah dibandingkan dengan menulis kompiler dari kode eksekusi C # ke (per platform).
Selain itu, runtime dapat menangani apa pun yang dikompilasi ke CIL. Jika Anda menginginkan bahasa baru (seperti F #), Anda hanya perlu menulis satu kompiler untuk itu dan Anda secara ajaib mendapatkan semua dukungan platform untuk hal-hal yang didukung .NET.
Oh, dan saya bisa mengambil .NET dll dan menjalankannya di windows atau di linux via Mono tanpa kompilasi ulang (dengan asumsi semua dependensi saya puas).
Adapun kinerja, itu masih bisa diperdebatkan. Ada "pre-compiler" yang pada dasarnya mengambil CIL dan membuat binari asli. Yang lain berpendapat bahwa kompiler just-in-time dapat membuat optimasi bahwa kompiler statis tidak bisa. Dalam pengalaman saya, itu sangat tergantung pada apa aplikasi Anda lakukan dan pada platform apa Anda menjalankannya (kebanyakan seberapa bagus JITer pada platform itu). Sangat jarang bagi saya untuk mengalami skenario di mana .NET tidak cukup baik .
sumber
readonly
bidang. Kompiler tradisional dapat melakukan beberapa optimasi ini tetapi hanya ketika mereka dapat dideteksi oleh analisis statis. Sebaliknya, jitter dapat mengetahui saat runtime bahwa (misalnya) bagian kode tidak melakukan pekerjaan yang bermanfaat karena objek atau variabel yang dimodifikasi tidak dirujuk di tempat lain. Saya bukan ahli kegugupan tetapi pada dasarnya pertanyaan tentang kekuatan analisis dinamis vs statis..NET memiliki bahasa perantara (CIL / MSIL) dan implementasi spesifik platform dari runtime platform-independent (CLR) karena alasan yang sama dengan Java. Microsoft bermaksud C # untuk bersaing secara langsung dengan Java, dan memang demikian, pada OS yang Microsoft targetkan (miliknya sendiri).
Keuntungannya, meskipun .NET hanya didukung pada platform Windows (atau OS lain yang memiliki .NET seperti Mono / Linux), mirip dengan Java:
Untuk alasan antitrust, MS berhati-hati untuk tidak terlihat "mengganggu" terlalu banyak di platform utama lainnya seperti Android, Mac OSX / iOS dan Linux; namun, memang ada tim yang mengembangkan untuk ketiga platform ini. Ada versi MS-dikembangkan Office untuk OSX, ada banyak aplikasi termasuk aplikasi Office interop untuk iOS dan Android, Skype (sekarang produk Microsoft) berjalan di Linux, dan Microsoft bahkan telah terlihat berkontribusi pada kernel Linux (terutama di pola pikir virtualisasi).
sumber
OS Windows tersedia untuk berbagai jenis CPU, saat ini kebanyakan x64, x86, Intel, ARM.
CIL / CLR independen dari platform perangkat keras - perbedaan-perbedaan ini "diabstraksikan" oleh lingkungan eksekusi IL. Sebagai contoh, perakitan .NET dikompilasi untuk "CPU apa saja" biasanya dapat dieksekusi pada Win64 sebagai proses 64 bit, dan Win32 sebagai proses 32 bit, tanpa perlu menyediakan berbagai executable.
Terlebih lagi, CIL memungkinkan metadata untuk disimpan dalam rakitan yang tidak mudah dilakukan dengan DLL asli (dimungkinkan, tentu saja, MS melakukan ini sebelumnya dengan komponen COM, tetapi teknologi itu tidak pernah semudah menangani komponen .NET). Itu membuat pembuatan komponen perangkat lunak jauh lebih sederhana dan merupakan dasar refleksi / introspeksi dalam semua bahasa .NET.
sumber