Saya bingung ketika orang mencoba membuat perbedaan antara bahasa yang dikompilasi dan bahasa yang dikelola. Dari pengalaman, saya mengerti bahwa sebagian besar menganggap bahasa yang dikompilasi menjadi C, C ++ sementara bahasa yang dikelola adalah Java, C # (Jelas ada lebih banyak, tetapi ini hanya beberapa contoh). Tetapi apa sebenarnya perbedaan inti antara kedua jenis bahasa itu?
Pemahaman saya adalah bahwa program apa pun, terlepas dari bahasa apa yang Anda gunakan pada dasarnya "dikompilasi" menjadi kode mesin tingkat rendah yang kemudian ditafsirkan, jadi apakah itu membuat bahasa yang dikelola menjadi subset dari bahasa yang dikompilasi (Artinya, semua bahasa yang dikelola adalah mengkompilasi bahasa tetapi tidak sebaliknya)?
Jawaban:
Perbedaannya bukan dalam "dikompilasi" vs "dikelola", ini adalah dua sumbu ortogonal. Dengan "dikelola" biasanya berarti kehadiran manajemen memori yang dikumpulkan sampah dan / atau keberadaan infrastruktur mesin virtual. Keduanya sama sekali tidak ada hubungannya dengan kompilasi dan apa pun yang dianggap bertentangan dengan kompilasi.
Semua "perbedaan" ini cukup kabur, tiruan dan tidak relevan, karena selalu mungkin untuk menggabungkan memori yang dikelola dan tidak dikelola dalam satu runtime tunggal, dan perbedaan antara kompilasi dan interpretasi juga sangat kabur.
sumber
Mengutip Wikipedia:
Kode yang dikelola membutuhkan runtime (seperti. NET CLT) untuk dieksekusi.
sumber
Saya pikir ada perbedaan yang harus dibuat, namun tidak harus antara "Dikompilasi" dan "Dikelola". Ini bukan kebalikan; suatu bahasa dapat dikompilasi dan tidak dikelola, atau ditafsirkan (tidak dikompilasi) dan dikelola, atau keduanya, atau bahkan tidak keduanya.
Bahasa "dikompilasi" hanyalah bahasa di mana ada langkah yang mengubah kode sumber yang ditulis oleh pengembang menjadi beberapa "bytecode" yang lebih teratur yang merupakan apa yang dijalankan oleh mesin. "Mesin" dapat berupa prosesor sebenarnya, atau "mesin virtual" yang melakukan operasi tambahan pada bytecode untuk menerjemahkannya ke instruksi mesin "asli". Antonim untuk bahasa "dikompilasi" adalah bahasa "ditafsirkan", di mana kode sumber ditransformasikan menjadi instruksi bytecode pada saat runtime, baris demi baris saat dieksekusi, tanpa langkah kompilasi. Hibrida di antara mereka adalah "jitting", dari "JIT" (Just In Time), yang biasanya ditafsirkan sebagai langkah satu kali oleh mesin pelaksana;
Bahasa "terkelola" adalah bahasa yang dirancang untuk menghasilkan program yang dikonsumsi dalam lingkungan runtime tertentu, yang hampir selalu mencakup penerjemah bytecode; "mesin virtual" yang mengambil kode program dan melakukan beberapa mesin tambahan atau transformasi khusus lingkungan. Lingkungan juga dapat mencakup manajemen memori, seperti "pengumpul sampah" dan fitur "keamanan" lainnya yang dimaksudkan untuk menjaga program tetap beroperasi di dalam "ruang pasir" ruang dan alat-alatnya, namun fitur tersebut bukan satu-satunya domain runtime "terkelola" . Hampir semua bahasa yang ditafsirkan dapat dianggap dikelola, karena mereka membutuhkan penerjemah untuk berjalan di bawah baris kode "pengguna" yang dieksekusi. Selain itu, bahasa JVM dan .NET (Java, Scala, C #, VB, F #, IronApa pun) dikompilasi ke dalam bahasa perantara atau IL, yang bentuk dan fungsinya mirip secara dangkal dengan bahasa rakitan biner, tetapi tidak mematuhi 100% ke set instruksi "asli" apa pun. Instruksi-instruksi ini dijalankan oleh JVM, atau oleh .NET's CLR, yang secara efektif menerjemahkannya ke instruksi biner asli khusus untuk arsitektur CPU dan / atau OS mesin.
Jadi, bahasa umumnya dapat digambarkan sebagai "dikompilasi" atau "ditafsirkan", dan sebagai "tidak dikelola" (atau "asli") dan "dikelola". Ada bahasa yang dapat digambarkan sebagai kombinasi dari semua ini kecuali kemungkinan "asli yang ditafsirkan" (yang hanya berlaku untuk opcodes heksadesimal tulisan tangan, di mana apa yang ditulis oleh pengembang adalah apa yang dieksekusi); jika Anda menganggap lapisan interpretasi sebagai "runtime" (yang mudah diperdebatkan dan sulit diperdebatkan), maka semua bahasa yang ditafsirkan "dikelola".
Jika Anda ingin mendapatkan teknis, hampir semua program yang menargetkan OS multitasking saat ini "dikelola"; OS akan membuat "mesin virtual" untuk setiap program yang sedang berjalan, di mana program berpikir (atau setidaknya tidak harus tahu sebaliknya) bahwa itu adalah satu-satunya hal yang berjalan. Kode dapat membuat panggilan di dalam dirinya sendiri dan ke perpustakaan referensi lainnya seolah-olah program itu adalah satu-satunya yang dimuat dalam memori; sama halnya, panggilan untuk mengalokasikan RAM dan memori lain yang lebih tinggi untuk menyimpan dan memanipulasi data dan perangkat kontrol diberi kode seolah-olah seluruh arsitektur memori tersedia. VM (dan OS di belakangnya) kemudian menerjemahkan berbagai pointer memori ke lokasi sebenarnya dari program, datanya, dan pengait ke driver perangkat, dll. Ini paling sering dilakukan dengan menerapkan offset memori (masing-masing VM mendapat blok 2GB atau apapun ingatannya, mulai dari alamat X yang mana program dapat memperlakukan seolah-olah X itu alamat 0) dan karena itu sangat murah untuk dilakukan, tetapi ada hal-hal lain yang bertanggung jawab atas kernel OS, seperti penjadwalan proses dan komunikasi antar-proses, yang sulit untuk dikelola. Namun, pola dasar ini umumnya tidak dianggap "dikelola", karena program tidak harus tahu bahwa itu dijalankan oleh mesin virtual dan sering masih bertanggung jawab untuk menjaga memori yang dialokasikan "bersih". Program yang dirancang untuk dijalankan pada baris perintah MS-DOS dapat dijalankan pada OS Windows yang lebih baru yang bahkan tidak memiliki lingkungan MS-DOS di bawahnya lagi; program ini malah diberi lingkungan "konsol virtual", dan asalkan tidak mencoba untuk meninggalkan "kotak pasir" ini
sumber
Managed Language dalam istilah sederhana, ini adalah bahasa tingkat tinggi yang tergantung pada layanan yang disediakan oleh lingkungan run-time untuk dieksekusi, seperti layanan pengumpulan sampah, itulah sebabnya disebut dikelola secara umum tetapi itu bukan satu-satunya layanan yang digunakan , dan beberapa layanan ini
security services, exception handling, standard types
digunakanCommon Language Run-time CLR
untuk mengeksekusi, seperti dalam bahasa .Net atau lingkungan virtual seperti Java yang menggunakan `Java Virtual Machine JVM.Unmanaged Language adalah bahasa tingkat rendah yang dapat dieksekusi langsung oleh sistem operasi tanpa memerlukan layanan run-time virtual atau bahasa perantara, bahasa seperti itu
C, C++
, kode yang tidak dikelola yang dihasilkan oleh bahasa tersebut menggunakan rutinitas perpustakaan yang secara dinamis terkait dengan OS untuk mendapatkan kode untuk dieksekusi disebut DLL (Dynamic Link Libraries), kode yang tidak dikelola mengakses memori secara langsung karena itu lebih cepat daripada kode yang dikelola, tetapi kecuali jika Anda membangun driver perangkat keras atau permainan video canggih, Anda tidak benar-benar ingin menggunakan bahasa yang tidak dikelola sebagai itu bisa berbahaya untuk bekerja dengan terutama dengan pengembang yang tidak berpengalaman seperti negara peranwith great power comes great responsibility
, dan itulah sebabnya bahasa yang dikelola ada untuk membantu pengembang menghasilkan kode yang dapat diperluas tanpa masuk ke bagian bawah sistem, tetapi Anda masih dapat membuat kode campuran jika perlu, artikel ini menjelaskan semuanya:Tinjauan Interoperabilitas Kode yang Dikelola / Tidak Dikelola
Contoh: Mencampur kode C ++, C ++ / CLI, dan C # yang tidak dikelola
sumber