관리되는 언어와 컴파일 된 언어의 차이?


18

사람들이 컴파일 된 언어와 관리되는 언어를 구별하려고 할 때 혼란스러워합니다. 경험상 필자는 컴파일 된 언어를 C, C ++로 간주하고 관리되는 언어는 Java, C #으로 간주합니다 (물론 더 많지만 예제는 거의 없습니다). 그러나 두 언어 유형의 핵심 차이점은 정확히 무엇입니까?

내 이해는 사용하는 언어에 관계없이 모든 프로그램이 본질적으로 저수준 기계 코드로 "컴파일"되어 해석되므로 관리되는 언어를 컴파일 된 언어의 하위 집합으로 만듭니다 (즉, 모든 관리되는 언어는 컴파일 된 언어이지만 다른 방법은 아닙니다)?


2
이 용어는 좁은 의미에서 Java도 관리합니다. - 거의 모든 경우에 우리는 관리 compiles.Also, 이것은, 내가 관련이 믿는 하나의 부분 집합의 같은 언어 생각할 수 programmers.stackexchange.com/questions/72446/...
shabunc

코드를 (정적으로) 컴파일하기 전에 언어보다 런타임에 더 기계적으로 관리 할 수있는 것으로 (Java와 같이) 컴파일하는 언어와 파이썬에서와 같이 런타임에 코드를 처리하는 언어 사이에는 큰 차이가 있습니다. 한 가지 큰 차이점은 런타임 전에이를 정적으로 컴파일하면 컴파일러가 최적화를 수행 할 수있는 기회를 제공하므로 (Java의 JIT, 분기 예측을위한 코드 재 배열 등) 속도가 크게 향상 될 수 있습니다.
Shivan Dragon

6
@ShivanDragon, "언어"는 아무것도 컴파일하지 않습니다. 그 구현은 않습니다. 또한 Python을 정적으로 컴파일 할 수 있습니다 (예 : PyPy 또는 IronPython 참조). OTOH, 동적으로 입력 된 언어로 효율적으로 처리하기 란 정말 어렵습니다 ( "추적 JIT", "추상 해석"등을 참조하십시오)
SK-logic

@ SK-logic : 동의, 나는 baddie를 말했다. 언어가 아닌 플랫폼을 참조하고 싶었습니다.
Shivan Dragon

@shabunc 실제로 Compiled는 Managed의 하위 집합이라고 말하고 싶습니다. 관리되는 언어는 컴파일 된 언어가 수행 할 수있는 모든 작업을 수행 할 수 있으며 (실제로 동일한 속도로) 관리되는 언어를 컴파일 할 수 있으므로 더 많은 작업을 수행 할 수 있습니다. C에 관리되는 언어의 기능을 제공하려면 "VM"을 작성하여 실제로 관리되는 언어로 만들어야합니다.
Bill K

답변:


47

차이점은 "컴파일 된"대 "관리되는"에 있지 않으며, 이들은 두 개의 직교 축입니다. "관리되는"은 일반적으로 가비지 수집 메모리 관리 및 / 또는 가상 머신 인프라의 존재를 의미합니다. 둘 다 컴파일과 전혀 관련이 없으며 사람들이 반대하는 것으로 간주합니다.

관리되는 메모리와 관리되지 않는 메모리를 단일 런타임에 항상 혼합 할 수 있으며 컴파일과 해석의 차이도 매우 모호하기 때문에이 "차이"는 모두 희미하고 인공적이며 관련이 없습니다.


2
이것이 제가 기본적으로 염두에두고 있던 것이지만, 계속해서이 구별을하는 많은 사람들을 만났습니다. 명확한 답변 주셔서 감사합니다.
l46kok

관리 코드는 런타임에 실행중인 실행 환경을 처리하기 위해 중간 언어를 사용하는 것을 의미합니다. 따라서 중간 언어 (예를 들어 바이트 코드)는 컴파일러에 의해 생성되어야합니다. "관리 된"코드와 "컴파일"개념을 결합한 IMO. 그러나 언어가 "컴파일 된"경우 관리 코드 (예 : C ++ vs Java)를 생성하지 않습니다.
zgulser

@zgulser, 아니오, 중간 언어는 직교합니다. 관리는 언어 런타임과 GC가 통합되어 있음을 의미합니다. 예를 들어 OCaml 런타임은 "관리"되지만 직접 네이티브로 컴파일됩니다.
SK-logic

8

위키 백과를 인용하려면 :

관리 코드는 공통 언어 런타임 가상 컴퓨터 (바이트 코드로 생성)의 관리 하에서 만 필요하고 실행되는 컴퓨터 프로그램 소스 코드를 식별하기 위해 Microsoft에서 사용하는 용어입니다.

관리되는 코드를 실행하려면 .NET CLT와 같은 런타임이 필요합니다.


5
관리 코드는 프레임 워크와 관련이 없습니다. 메모리를 관리 하는 런타임 이 필요합니다 .
Oded

어쩌면 내 문구가 약간 벗어 났지만 .NET 프레임 워크가 실제로 "공통 언어 런타임"이 아닙니까?
janvdl

3
In에는 CLR이 포함되어 있지만 기본 클래스 라이브러리, IL 사양 등도 포함되어 있습니다.
오디드

4

나는 반드시 구별해야한다고 생각하지만 반드시 "컴파일"과 "관리"사이에있는 것은 아닙니다. 이것들은 반대가 아닙니다. 언어는 컴파일 및 관리되지 않거나, 해석 (컴파일되지 않음) 및 관리되거나, 또는 둘 다 또는 둘 다가 될 수 없습니다.

"컴파일 된"언어는 개발자가 작성한 소스 코드를 기계가 실행하는보다 일반적인 "바이트 코드"로 변환하는 단계가있는 언어입니다. "machine"은 실제 프로세서이거나 바이트 코드에 대해 추가 작업을 수행하여 "기본"컴퓨터 명령어로 변환하는 "가상 컴퓨터"일 수 있습니다. "컴파일 된"언어의 반의어는 "해석 된"언어이며, 소스 코드는 런타임에 컴파일 단계없이 라인 단위로 바이트 코드 명령어로 변환됩니다. 이들 사이의 하이브리드는 "JIT"(Just In Time)에서 "지팅 (Jitting)"이며, 이는 일반적으로 실행 기계에 의해 일회성 단계로 해석된다;

"관리되는"언어는 거의 항상 바이트 코드 인터프리터를 포함하는 특정 런타임 환경 내에서 사용되는 프로그램을 생성하도록 설계된 언어입니다. "가상 머신"은 프로그램의 코드를 가져 와서 추가 머신 또는 환경 특정 변환을 수행합니다. 환경에는 "가비지 수집기"및 "공간"및 "도구"의 "샌드 박스"내에서 프로그램을 유지하기위한 기타 "보안"기능과 같은 메모리 관리가 포함될 수 있지만 이러한 기능은 "관리 된"런타임의 유일한 도메인이 아닙니다. . 실제로 해석되는 모든 언어는 통역사가 실행중인 "사용자"코드 행 아래에서 실행되어야하기 때문에 관리되는 것으로 간주 될 수 있습니다. 또한 JVM 및 .NET 언어 (Java, Scala, C #, VB, F #, IronWhatever)는 중간 언어 또는 IL로 컴파일되며 형식과 기능면에서 이진 어셈블리 언어와 비슷하지만 "네이티브"명령 집합에는 100 % 적용되지 않습니다. 이러한 명령어는 JVM 또는 .NET의 CLR에 의해 실행되며,이 명령어는 CPU 아키텍처 및 / 또는 시스템의 OS에 고유 한 기본 이진 명령어로 효과적으로 변환됩니다.

따라서 언어는 일반적으로 "컴파일 된"또는 "통역 된"및 "관리되지 않는"(또는 "네이티브") 및 "관리되는"으로 설명 될 수 있습니다. 가능한 "해석 된 네이티브"를 제외하고 이들의 조합으로 설명 할 수있는 언어가 있습니다 (개발자가 작성한 것이 실행되는 수작업 16 진수 opcode에만 해당됨). 해석 계층을 "런타임"(논쟁하기 쉬운 논란의 여지가있는)으로 간주하면 해석되는 모든 언어가 "관리"됩니다.

기술을 원한다면 오늘날 멀티 태스킹 OS를 대상으로하는 거의 모든 프로그램이 "관리"됩니다. OS는 실행중인 각 프로그램에 대해 "가상 머신"을 작성하며, 여기서 프로그램은 실행중인 유일한 프로그램이라고 생각합니다. 코드는 프로그램 자체가 메모리에로드 된 유일한 것처럼 내부 및 다른 참조 라이브러리를 호출 할 수 있습니다. 마찬가지로, 데이터를 저장 및 조작하기 위해 RAM 및 기타 상위 메모리를 할당하기위한 호출은 전체 메모리 아키텍처가 사용 가능한 것처럼 코딩됩니다. 그런 다음 VM (및 그 뒤에있는 OS)은 다양한 메모리 포인터를 프로그램의 실제 위치, 데이터 및 장치 드라이버 등에 연결합니다. 이것은 대부분 메모리 오프셋을 적용하여 수행됩니다 (각 VM은 2GB의 블록을 얻습니다) 또는 어떤 기억이든 프로그램이 X가 주소 0 인 것처럼 처리 할 수있는 주소 X에서 시작)) 매우 저렴하지만, 프로세스 스케줄링 및 프로세스 간 통신과 같은 OS 커널이 담당하는 다른 것들이 있습니다. 까다로운 관리. 그러나이 기본 패턴은 일반적으로 "관리되는"것으로 간주되지 않습니다. 프로그램은 가상 머신에서 실행 중임을 알 필요가 없으며 할당 된 메모리를 "깨끗한"상태로 유지해야하는 경우가 많습니다. MS-DOS 명령 줄에서 실행되도록 설계된 프로그램은 더 이상 MS-DOS 환경이없는 최신 Windows OS에서 실행될 수 있습니다. 대신 프로그램에 "가상 콘솔"환경이 제공되며이 "샌드 박스"를 떠나지 않는 경우


"언어는 일반적으로"컴파일 된 "또는"통역 된 "으로 설명 될 수 있습니다. – 아닙니다. 컴파일과 해석은 언어가 아닌 컴파일러와 해석기의 특성입니다. "컴파일 언어"라는 용어는 의미가 없습니다. 영어가 입력 언어 인 경우 유형 오류 일 수 있습니다.
Jörg W Mittag

2
컴파일러와 통역사는 보통 컴파일이나 해석을하도록 고안된 언어의 매우 특정한 방언을 컴파일하고 해석하는 것으로 발견됩니다. 아무도 내가 아는 JavaScript 소스 코드를 컴파일하지 않으며 아무도 C #을 해석하지 않습니다. 언어는 어떤 식 으로든 소비 되도록 설계되었습니다 . 따라서, 언어가 사용되는 전체 환경이 두 단계 중 하나를 포함하기 때문에 일반적 으로 언어 자체를 "컴파일 된"또는 "통역 된"이라고 언급하는 것이 허용됩니다.
KeithS


en.wikipedia.org/wiki/Interpreted_language- "이론적으로 모든 언어가 컴파일되거나 해석 될 수 있으므로이 지정은 언어의 일부 필수 속성이 아니라 일반적인 구현 방식으로 인해 순수하게 적용됩니다."
KeithS

@KeithS, Wikipedia는 거의 완벽하지 않습니다. 특정 유효하지 않은 용어에 대해 기사가 존재한다고해서이 용어가 더 이상 유효하지는 않습니다. 그렇습니다. 언어는 항상 특정 실행 모드를 염두에두고 설계되었지만 설계자의 의도에 따라 "컴파일"또는 "통역"으로 브랜드화하는 것은 여전히 ​​비생산적입니다. 그리고 해석에 관해서는, 어떤 방식 으로든 적절한 "통역사"를 찾기가 정말 어렵습니다. Tcl은 아마도 마지막 종류 일 것입니다. 소위 "통역사"라고하는 다른 모든 것은 실제로 컴파일러입니다.
SK-logic

2

관리 언어 는 간단히 말해서 가비지 수집 서비스와 같이 런타임 환경에서 제공하는 서비스에 의존하는 고급 언어이므로 일반적으로 관리라고하지만 이것이 사용하는 유일한 서비스는 아닙니다 그리고 이러한 서비스 중 일부는 security services, exception handling, standard types그것을 사용, Common Language Run-time CLR닷넷 언어 나`자바 가상 머신 JVM을 사용하여 자바와 같은 가상 환경에서처럼 실행.

관리되지 않는 언어 는 가상 런타임 서비스 나 중간 언어없이 운영 체제에서 직접 저수준 언어를 실행할 수있는 언어입니다. 언어와 같은 언어로 C, C++생성 된 관리되지 않는 코드는 OS에 동적으로 연결된 라이브러리 루틴을 사용하여 DLL (Dynamic Link Libraries)이라는 코드를 실행하는 코드, 관리되지 않는 코드는 메모리에 직접 액세스하므로 관리되는 코드보다 속도가 빠릅니다. 그러나 하드웨어 드라이버 나 정교한 비디오 게임을 만들지 않으면 관리되지 않는 언어를 사용하고 싶지 않습니다. 특히 역할 상태와 같은 경험이없는 개발자와 함께 작업하면 위험 할 수 있습니다.with great power comes great responsibility그렇기 때문에 개발자가 시스템 하단으로 뛰어 들지 않고도 확장 가능한 코드를 생성 할 수 있도록 관리되는 언어가 존재하지만 필요한 경우 혼합 코드를 만들 수 있습니다.

관리 형 / 비 관리 형 코드 상호 운용성 개요

샘플 : 관리되지 않는 C ++, C ++ / CLI 및 C # 코드 혼합

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.