Perbedaan antara "terkelola" dan "tidak terkelola"


139

Kadang-kadang saya mendengar / membaca tentang hal itu ketika berbicara tentang .NET, misalnya "kode yang dikelola" dan "kode yang tidak dikelola" tetapi saya tidak tahu apa itu dan apa perbedaannya. Apa perbedaan mereka, menurut definisi? Apa konsekuensi dari menggunakan salah satunya? Apakah perbedaan ini hanya ada di .NET / Windows?


Jawaban:


191

Kode yang Dikelola

Kode yang dikelola adalah apa yang dibuat oleh kompiler Visual Basic .NET dan C #. Ini berjalan pada CLR (Common Language Runtime), yang, antara lain, menawarkan layanan seperti pengumpulan sampah, pemeriksaan jenis waktu proses, dan pemeriksaan referensi. Jadi, anggap saja sebagai, "Kode saya dikelola oleh CLR."

Visual Basic dan C # hanya dapat menghasilkan kode yang dikelola, jadi, jika Anda menulis aplikasi dalam salah satu bahasa tersebut, Anda menulis aplikasi yang dikelola oleh CLR. Jika Anda menulis aplikasi dalam Visual C ++ .NET Anda dapat menghasilkan kode terkelola jika Anda suka, tetapi itu opsional.

Kode Tidak Terkelola

Kode yang tidak dikelola mengkompilasi langsung ke kode mesin. Jadi, dengan definisi itu semua kode yang dikompilasi oleh kompiler C / C ++ tradisional adalah 'kode tidak terkelola'. Juga, karena ia mengkompilasi ke kode mesin dan bukan bahasa perantara, ia tidak portabel.

Tidak ada manajemen memori bebas atau apapun yang disediakan CLR.

Karena Anda tidak dapat membuat kode tidak terkelola dengan Visual Basic atau C #, di Visual Studio semua kode tidak terkelola ditulis dalam C / C ++.

Mencampur keduanya

Karena Visual C ++ dapat dikompilasi ke kode yang dikelola atau tidak, dimungkinkan untuk menggabungkan keduanya dalam aplikasi yang sama. Ini mengaburkan garis antara keduanya dan memperumit definisi, tetapi perlu disebutkan hanya agar Anda tahu bahwa Anda masih dapat mengalami kebocoran memori jika, misalnya, Anda menggunakan pustaka pihak ketiga dengan beberapa kode tidak terkelola yang ditulis dengan buruk.

Berikut contoh yang saya temukan dengan googling :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
"Karena Anda tidak dapat membuat kode tak terkelola dengan Visual Basic atau C #, semua kode tak terkelola ditulis dalam C / C ++."? Anda tahu, ada bahasa lain selain C, C ++, C #, dan VB. Saya menggunakan Delphi untuk menulis kode yang tidak dikelola. Juga, satu perbedaan yang agak terlihat antara kode yang dikelola (.NET) dan tidak dikelola (Win32), adalah bahwa yang pertama dapat menggunakan semua fungsi .NET, sedangkan yang terakhir menggunakan API Windows asli.
Andreas Rejbrand

22
Istilah 'managed' dan 'unmanaged' diciptakan untuk membedakan kode mesin dari IR. Jadi, mereka hanya benar-benar memiliki arti dalam konteks .NET . Kernel linux juga mengkompilasi ke kode yang tidak dikelola, tetapi itu tidak benar-benar relevan dengan diskusi, bukan?
kurige

6
Ini keluar dari topik, tetapi maksud saya adalah Anda tidak memiliki opsi untuk menulis kode yang dikelola di Delphi, jadi menyatakan bahwa Anda menulis kode yang tidak dikelola di Delphi sangat berlebihan. Bagaimanapun, saya telah menambahkan "di studio visual" ke kalimat yang menyinggung. Juga, terima kasih atas perhatiannya pada kesalahan ketik. Entah bagaimana saya melewatkannya bahkan dengan pembacaan kedua.
kurige

Hanya untuk menjadi pedand, dimungkinkan untuk menulis kode yang tidak terkelola di C # ( dikenal sebagai kode "tidak aman" )
Dasar

2
@JacksonTale Java tidak dalam konteks .NET sehingga konsepnya dikelola atau tidak dikelola tidak berlaku. Lihat stackoverflow.com/questions/1326071/… untuk penjelasan tentang cara kompilasi Java.
Evan Frisch

85

Ini lebih umum daripada .NET dan Windows. Dikelola adalah lingkungan tempat Anda memiliki manajemen memori otomatis, pengumpulan sampah, keamanan jenis, ... tidak terkelola adalah segalanya. Jadi misalnya .NET adalah lingkungan yang dikelola dan C / C ++ tidak dikelola.


Dengan definisi ini, JavaScript juga akan menjadi kode yang tidak terkelola, benar?
Hampton Terry

@HamptonTerry Javascript memiliki manajemen memori otomatis, pengumpulan sampah dan keamanan tipe ... Jadi tidak. Javascript dikelola.
Sancarn

13

Kode yang dikelola adalah diferensiasi yang diciptakan oleh Microsoft untuk mengidentifikasi kode program komputer yang memerlukan dan hanya akan dijalankan di bawah "manajemen" mesin virtual Waktu Proses Bahasa Umum (menghasilkan Bytecode).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
Iya. Untuk menambah jawaban ini, kode yang dikelola adalah kode yang Anda tulis secara normal di .NET (dalam C #, misalnya), menggunakan fungsi .NET. Aplikasi Windows asli yang menggunakan API Windows asli (ditulis dalam bahasa apa pun, mungkin C), di sisi lain, "tidak dikelola".
Andreas Rejbrand
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.