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