programing

"관리되는" 코드란 정확히 무엇입니까?

closeapi 2023. 5. 21. 11:29
반응형

"관리되는" 코드란 정확히 무엇입니까?

저는 거의 20년 동안 C/C++ 코드를 작성해 왔으며 Perl, Python, PHP 및 일부 Java도 알고 있으며 자바스크립트를 독학하고 있습니다.하지만 저는 .NET, VB, C# 같은 것들을 해본 적이 없습니다.관리 코드가 정확히 무엇을 의미합니까?

위키피디아는 간단하게 다음과 같이 설명합니다.

가상 시스템의 관리 하에 실행되는 코드

그리고 그것은 특히 자바가 (일반적으로) 관리되는 코드라고 말한다, 그래서.

  • 이 용어가 C# / .NET에만 적용되는 것처럼 보이는 이유는 무엇입니까?
  • C#을 VM이 포함된 .exe로 컴파일할 수 있습니까? 아니면 이를 패키지화하여 다른 .exe(a la java)에 제공해야 합니까?

비슷한 맥락에서,

  • .NET은 언어 또는 프레임워크이며, 여기서 "프레임워크"는 정확히 무엇을 의미합니까?

좋아요, 그건 한 가지 이상의 질문이지만, 저만큼 오랫동안 이 업계에 몸담아온 사람에게는, 저는 지금 오히려 N00B-ish를 느끼고 있습니다.

C# 코드를 .exe로 컴파일하면 CIL(Common Intermediate Language) 바이트 코드로 컴파일됩니다.CIL 실행 파일을 실행할 때마다 해당 파일은 마이크로소프트 CLR(공용 언어 런타임) 가상 시스템에서 실행됩니다.아니요. .NET 실행 파일에 VM을 포함할 수 없습니다.프로그램이 실행될 모든 클라이언트 컴퓨터에 .NET 런타임이 설치되어 있어야 합니다.

두 번째 질문에 답하자면, .NET은 언어별로 구분되지 않는 라이브러리, 컴파일러 및 VM의 집합이라는 점에서 프레임워크입니다.따라서 C#, VB, C++ 및 .NET 컴파일러가 있는 다른 언어의 .NET 프레임워크에서 코딩할 수 있습니다.

https://bitbucket.org/brianritchie/wiki/wiki/ .NET%20개 언어

위 페이지에는 .NET 버전이 있는 언어 목록과 해당 페이지에 대한 링크가 있습니다.

나는 당신이 무엇에 대해 혼란스러워 하는 유일한 사람이라고 생각하지 않습니다.넷은. 이미 여러분이 다뤄야 할 다른 답들이 있습니다. 하지만 저는 다른 사람들을 위해 이 약간의 정보를 제공할 것입니다.

뭘 보려구요.Net "진짜"는 c:\Windows\Microsoft로 이동합니다.네트워크\프레임워크

여기에는 설치한 버전과 관련된 폴더가 표시됩니다.예를 들어 v2.0.xxxx 폴더를 설치한 경우 이 폴더로 이동합니다.

그 폴더가 프레임워크입니다.기본적으로 많은 .exe 파일과 .dll 파일이 표시됩니다.System.*.dll로 시작하는 모든 DLL 파일은 기본적으로 입니다.넷 프레임워크.

이 폴더에 표시되는 .exe 파일은 개발자와 컴파일러를 위한 유틸리티입니다.C# 말씀하셨잖아요.csc.exe 파일을 찾습니다.그건 당신의 C# 컴파일러입니다.

프로그램을 만드는 것은 정말 간단합니다.다음 코드를 hello.cs 파일에 넣습니다.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

그런 다음 명령줄에 > csc hello.cs 를 입력합니다.

그러면 .exe 파일이 생성됩니다.그것을 실행하면 분명히 '헬로 월드'를 뱉을 것입니다.

콘솔이라고 표시된 줄입니다.WriteLine()이 프레임워크를 호출하고 있습니다.콘솔은 시스템 네임스페이스 내에 있는 개체이고 WriteLine()은 정적 메서드입니다.

이 코드는 해당 콘솔에 대해 분해된 코드입니다.WriteLine() 메서드:

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

사람들이 "PHP나 .Net을 사용해야 할까요?" 또는 "Python이나 .네트" 당신은 그것이 어떻게 논의해야 할 잘못된 것인지를 알기 시작합니다.그들은 분명히 언어를 프레임워크와 비교하고 있습니다.C#은 언어이며 위에 코드를 작성하는 데 사용할 수 있는 여러 언어 중 하나일 뿐입니다.넷 플랫폼.콘솔의 동일한 방법입니다.WriteLine()은 C#, VB에서 호출할 수 있습니다.Net, Pascal, C++, Ruby, Python, F# 및 위에서 작동하도록 만들어진 다른 언어.넷 플랫폼.

그게 도움이 되길 바랍니다.

-키스

대부분은 모든 메모리 할당이 사용자를 위해 "관리"된다는 사실을 나타냅니다.관리 코드를 사용하는 경우 개체를 모두 사용한 후 개체를 해제할 걱정이 없습니다.단순히 범위를 벗어나도록 허용하는 것은 VM이 해당 항목에 대한 참조가 더 이상 없음을 인식하고 Garbage가 해당 항목을 수집하여 시스템에 메모리를 반환한다는 것을 의미합니다.

반면에 참조를 삭제하기 전에 명시적으로 포인터를 해제하지 않는 한 관리되지 않는 코드는 단순히 "누출"됩니다.

Microsoft가 C/C++ 및 기타 이전 언어와 .NET을 구별하기 위해 선택한 용어이기 때문에 주로 .NET을 설명하는 데 사용됩니다.마이크로소프트는 C#/.NET과 자바의 유사성을 강조하고 싶지 않았기 때문에 이 용어를 선택했습니다.기본적으로 "관리 코드"의 사용은 기술적으로 주도되는 용어가 아니라 마케팅 중심의 용어입니다.

특히 .NET 및 Visual C++에서 관리되지 않는 코드와 관리되는 코드를 모두 가질 수 있습니다.이 용어는 메모리를 할당하고 '관리'하는 방식을 나타냅니다.

관리되지 않는 코드는 당신이 익숙한 C++일 것입니다.동적 메모리 할당 및 명시적 메모리 해방.NET 런타임은 메모리를 관리하지 않으므로 '관리되지 않음'입니다.

반면에 관리 코드는 런타임에 의해 관리됩니다.필요한 위치에 메모리를 할당하면(메모리 공간이 아니라 변수를 선언하여) 런타임 가비지 수집기가 더 이상 필요하지 않은 시점을 결정하고 모두 정리합니다.가비지 수집기는 또한 효율성을 향상시키기 위해 메모리를 이동시킬 것입니다.런타임이 모든 것을 '관리'합니다.

위에서 언급했듯이, 관리되는 코드와 관리되지 않는 코드를 작성하는 것이 가능합니다.

관리되지 않음:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

관리:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

심판 봤어요?관리되는 클래스를 지정합니다.하지만 두 종류의 코드를 섞으면 매우 혼란스러워집니다.예를 들어 관리되는 포인터와 동등한 참조 포인터(^)를 관리되지 않는 클래스 내의 Picture Box 컨트롤에 저장하려고 합니다.가비지 수집기는 메모리를 이동할 수 있으므로 다음에 그림 상자의 참조를 취소하려고 하면 찾을 수 없습니다.런타임은 관리되지 않는 코드에 메모리 변경 사항을 알려주지 않습니다.

따라서 관리되지 않는 코드가 해당 개체를 추적할 수 있도록 메모리에 관리 개체를 고정해야 합니다.그 다음에는 포장을 풀고 다른 모든 종류의 특이한 점들이 있습니다. 이 두 가지를 혼합할 수 있게 해줍니다.코드 복잡성은 엄청납니다!

공식적으로 관리/비관리는 .NET 스택에서 코드가 실행되는 방식으로 귀결될 수 있습니다.하지만, 만약 당신이 c++ 배경을 가진 사람이라면, 저는 이것이 당신과 조금 더 관련이 있기를 바랍니다.

관리됨은 코드가 네이티브 코드로 컴파일되지 않으므로 가상 시스템의 지원 하에 실행됨을 의미합니다.Java는 바이트코드라는 중간 형식으로 컴파일되며, Java VM은 이를 해석하고 실행하는 방법을 알고 있습니다.모든 .NET 언어는 .NET 런타임이 해석하는 IL(중간 언어)로 컴파일하여 비슷한 작업을 수행합니다..NETIL은 .dll과 .exe 파일의 끝 부분이 있기 때문에 조금 혼란스럽습니다.

관리되는 용어는 일반적으로 마이크로소프트에서 사용하기 때문에 .NET에만 적용됩니다.Microsoft는 일반적으로 .NET 관리 실행 환경과 관련하여 "가상 시스템"이라는 용어를 사용하지 않습니다.

.NET의 "바이트코드"(IL)는 관리 환경에서 실행되기 전에 네이티브 코드로 컴파일되도록 명시적으로 설계된 반면, Java는 해석되도록 설계되었지만 플랫폼 독립 코드의 개념은 유사합니다.

.NET Framework는 기본적으로 마이크로소프트에서 제공하는 거대한 라이브러리 집합으로, 응용 프로그램을 개발하는 데 사용할 수 있는 수천 개의 클래스를 포함합니다.

컴파일된 C#.exe에는 모든 에서 실행할 수 있는 플랫폼 독립 코드가 포함되어 있습니다.모노를 포함한 NET 호환 환경.그러나 런타임은 일반적으로 이를 사용하는 응용 프로그램과 별도로 배포됩니다.

일부 사람들의 기분을 상하게 하는 위험을 무릅쓰고, 저는 그들이 컴파일된 단어 대신 관리되지 않는 단어를 사용할 수 있도록 관리되는 단어가 사용되었다고 의심합니다.관리가 더 많은 것을 의미할 수도 있지만, 현실은 시간에 맞춰 컴파일하는 것(한 때 해석되거나 pcode로 대체된 것)과 네이티브 컴파일된 코드를 대부분 구별하는 데 사용되는 것으로 보입니다.

또는 다음과 같은 방법을 사용할 수 있습니다.

시스템에 제어할 수 없는 작업을 수행할 수 있는 관리되지 않는 코드입니다.

빠르고 견고하며 OS에 가까운 네이티브 컴파일 코드입니다.

물론, 그들은 실제로 같은 것입니다.

비슷한 맥락에서 .NET은 언어 또는 프레임워크이며, 여기서 "프레임워크"는 정확히 무엇을 의미합니까?<<

.NET은 마이크로소프트의 현재 엔터프라이즈 소프트웨어 플랫폼입니다.구성 요소:

Windows 기능에 액세스하기 위한 단일 범용 인터페이스:

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

.NET 응용 프로그램 실행을 위한 단일 범용 언어 및 런타임:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

.NET 응용프로그램 개발을 위한 여러 언어 선택:

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.

.NET은 프레임워크입니다.CLR(공용 언어 런타임)은 솔루션이 컴파일될 때 생성되는 MSIL(Microsoft Intermediate Language) 코드를 실행합니다(즉, 시스템 코드로 컴파일되지 않음).API는 exe 내에 포함할 수 없으며 크기가 매우 크기 때문에 포함할 수도 없습니다.여기서의 주요 이점은 메모리 관리입니다(다른 보안 이점과 제가 모르는 다른 이점 중에서).

프레임워크 질문에 답할 수 있습니다. .NET은 프레임워크, C#, VB.NET 등은 언어입니다.기본적으로 .NET은 .NET을 사용하는 모든 언어가 호출할 수 있는 호출(All the System...dll)할 공통 라이브러리 플랫폼을 제공합니다.모든 .NET 언어는 MSIL(Microsoft Intermediate Language, IL로만 더 잘 알려져 있음)로 컴파일되어 적절한 .NET 프레임워크가 설치된 모든 PC에서 실행될 수 있습니다.

.NET은 프레임워크입니다.다양한 언어(VB.NET, C#, IronPython, boo 등)에서 사용할 수 있습니다.

.NET은 항상 해석된 대로 실행되며 아니요, .exe에 'VM'을 포함할 수 없습니다..NET 앱을 실행하려는 모든 사용자는 프레임워크를 설치해야 합니다.

CPU가 직접 실행하는 것이 아니라 가상 시스템에서 실행하는 모든 코드를 나타낼 수 있습니다.

이를 통해 가비지 수집 및 배열 경계 확인과 같은 작업이 가능하다고 생각합니다.

개인적으로, 저는 "프레임워크"라는 단어가 약간 잘못된 이름이라고 생각합니다.

.NET은 실행 환경(CLR 가상 시스템)과 라이브러리 집합으로 구성된 "플랫폼"입니다.이는 Java, Perl 또는 Python과 정확히 유사합니다(그 중 "프레임워크"라고 불리는 것은 없습니다).

대부분의 경우 "framework"라는 단어는 Spring이나 Struts 또는 QT와 같은 프로젝트에 사용됩니다. 이 프로젝트는 라이브러리와 같은 플랫폼(즉, 자체 실행 환경을 제공하지 않음) 위에 있습니다.

그러나 "라이브러리"와 달리 프레임워크는 기본 플랫폼의 기본 작업을 재정의하려고 합니다. (Spring의 종속성 주입은 일반 자바 코드의 생성자 호출 논리를 무시합니다.)QT의 신호 및 슬롯 구현은 일반적인 C++ 코드를 무시합니다.)

저는 제가 현학적인 개자식이라는 것을 알지만, 저에게 닷넷은 프레임워크가 아닙니다.플랫폼입니다.

관리 코드--MSIL 및 IL과 관리 코드가 동일합니다.애플리케이션을 빌드할 때 .dll 또는 .exe 파일이 Bin 폴더에 생성됩니다.이러한 파일을 관리 코드라고 합니다.나중에 이러한 파일은 CLR에 제공되어 OS에서 이해할 수 있는 네이티브 코드를 생성합니다.

언급URL : https://stackoverflow.com/questions/57923/what-exactly-is-managed-code

반응형