나는 반드시 구별해야한다고 생각하지만 반드시 "컴파일"과 "관리"사이에있는 것은 아닙니다. 이것들은 반대가 아닙니다. 언어는 컴파일 및 관리되지 않거나, 해석 (컴파일되지 않음) 및 관리되거나, 또는 둘 다 또는 둘 다가 될 수 없습니다.
"컴파일 된"언어는 개발자가 작성한 소스 코드를 기계가 실행하는보다 일반적인 "바이트 코드"로 변환하는 단계가있는 언어입니다. "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에서 실행될 수 있습니다. 대신 프로그램에 "가상 콘솔"환경이 제공되며이 "샌드 박스"를 떠나지 않는 경우