Bahasa yang Dikelola vs Perbedaan Bahasa yang Dikompilasi?

18

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)?

lk
sumber
2
istilah ini diciptakan oleh Microsoft, dalam arti sempit Java juga dikelola. Hampir dalam semua kasus kita dapat memikirkan bahasa yang dikelola seperti subset dari yang dikompilasi. Juga, ini, saya percaya terkait - programer.stackexchange.com/questions/72446/…
shabunc
Perhatikan bahwa ada perbedaan besar antara bahasa yang mengkompilasi (secara statis) kode ke sesuatu yang lebih dapat dikelola mesin sebelum runtime (seperti Java) dan yang melakukannya saat runtime (seperti Python). Satu perbedaan utama adalah bahwa kompilasi secara statis sebelum runtime memberi comiler kesempatan untuk melakukan beberapa optimasi yang dapat menghasilkan peningkatan kecepatan yang besar (seperti Java JIT, mengatur ulang kode untuk prediksi cabang dll).
Shivan Dragon
6
@ShivanDragon, "bahasa" tidak mengkompilasi apa pun. Implementasinya tidak. Dan Anda dapat mengkompilasi Python secara statis (lihat PyPy atau IronPython misalnya). OTOH, sangat sulit untuk melakukannya secara efisien dengan bahasa yang diketik secara dinamis (lihat "tracing JIT", "interpretasi abstrak", dll.)
SK-logic
@ SK-logic: setuju, saya sudah mengatakan baddie. Saya ingin merujuk ke platform, bukan bahasa.
Shivan Dragon
@shabunc Sebenarnya saya akan mengatakan Compiled adalah bagian dari Managed. Bahasa yang Dikelola dapat melakukan apa saja yang dapat dilakukan oleh bahasa yang dikompilasi (dengan kecepatan yang hampir sama), dan lebih dari itu karena bahasa yang Dikelola dapat dikompilasi. Untuk memberikan C fitur bahasa yang dikelola, Anda harus membangun "VM" dan benar-benar membuatnya menjadi bahasa yang dikelola.
Bill K

Jawaban:

47

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.

Logika SK
sumber
2
Inilah yang pada dasarnya ada dalam pikiran saya, tetapi saya telah bertemu banyak orang yang terus membuat perbedaan ini. Terima kasih atas jawaban yang jelas.
l46kok
Kode terkelola berarti memiliki bahasa perantara untuk dijaga apa pun lingkungan eksekusi yang Anda jalankan saat runtime, kan? Jadi bahasa perantara (katakanlah bytecode) harus diproduksi oleh kompiler. IMO, bahwa pasangan "berhasil" kode dan konsep "kompilasi" sedikit. Namun, jika bahasa tersebut "dikompilasi", itu tidak menunjukkan itu menghasilkan kode yang dikelola (mis. C ++ vs Java)
zgulser
@zgulser, tidak, bahasa perantara bersifat orthogonal. Dikelola berarti memiliki GC yang terintegrasi dengan runtime bahasa. Misalnya, runtime OCaml "dikelola", meskipun langsung dikompilasi ke asli.
SK-logic
8

Mengutip Wikipedia:

Managed code adalah istilah yang dibuat oleh Microsoft untuk mengidentifikasi kode sumber program komputer yang memerlukan dan hanya akan dijalankan di bawah pengelolaan mesin virtual Common Language Runtime (menghasilkan bytecode).

Kode yang dikelola membutuhkan runtime (seperti. NET CLT) untuk dieksekusi.

janvdl
sumber
5
Kode yang dikelola tidak ada hubungannya dengan suatu kerangka kerja. Perlu runtime yang mengelola memori.
Oded
Mungkin kata-kata saya sedikit salah, tetapi bukankah kerangka NET. Sebenarnya "runtime bahasa umum"?
janvdl
3
Tidak. Di dalamnya termasuk CLR, tetapi juga termasuk Perpustakaan Kelas Dasar, spesifikasi IL dan banyak lagi.
Oded
4

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

KeithS
sumber
"Bahasa secara umum dapat digambarkan sebagai" dikompilasi "atau" ditafsirkan "" - Tidak, mereka tidak bisa. Kompilasi dan interpretasi adalah sifat, yah, kompiler dan interpreter bukan bahasa. Istilah "bahasa yang dikompilasi" bahkan tidak masuk akal. Jika bahasa Inggris adalah bahasa yang diketik, itu akan menjadi kesalahan ketik.
Jörg W Mittag
2
Kompiler dan interpreter biasanya ditemukan mengkompilasi dan menafsirkan dialek bahasa yang sangat spesifik yang dirancang untuk menjalani kompilasi atau interpretasi. Tidak ada yang mengkompilasi kode sumber JavaScript yang saya tahu, dan tidak ada yang menafsirkan C #. Bahasa dirancang untuk dikonsumsi dengan satu atau lain cara. Dengan demikian, biasanya dapat diterima untuk menyebut bahasa itu sendiri sebagai "dikompilasi" atau "ditafsirkan" karena lingkungan penuh di mana bahasa digunakan melibatkan salah satu dari dua langkah itu.
KeithS
en.wikipedia.org/wiki/Interpreted_language - "Secara teoritis, bahasa apa pun dapat dikompilasi atau diinterpretasikan, jadi sebutan ini diterapkan murni karena praktik implementasi bersama dan bukan properti hakiki suatu bahasa."
KeithS
@KeithS, wikipedia hampir tidak sempurna. Fakta bahwa sebuah artikel ada untuk istilah yang tidak valid tertentu tidak menjadikan istilah ini lebih valid. Ya, bahasa selalu dirancang dengan mode eksekusi tertentu, tetapi masih kontraproduktif dengan merek yang "dikompilasi" atau "ditafsirkan" semata-mata atas dasar niat perancang mereka. Dan, untuk interpretasi, sangat sulit untuk menemukan "penerjemah" yang tepat. Tcl mungkin yang terakhir dari jenisnya. Semua yang disebut "juru bahasa" sebenarnya adalah penyusun.
SK-logic
2

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 typesdigunakan Common Language Run-time CLRuntuk 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

Ashraf Abusada
sumber