C에 컴파일러가 있지만 실행 성능을 결정하는 것은 무엇입니까?
예를 들어 if else 블록에서 if else 대신 코드에 모든 ifs가 있으면 모든 ifs가 실행될 것이라고 결정하는 것은 무엇입니까? Java에서는 JVM이지만 C에서는 실행 컴파일러가 무엇입니까?
C에 컴파일러가 있지만 실행 성능을 결정하는 것은 무엇입니까?
예를 들어 if else 블록에서 if else 대신 코드에 모든 ifs가 있으면 모든 ifs가 실행될 것이라고 결정하는 것은 무엇입니까? Java에서는 JVM이지만 C에서는 실행 컴파일러가 무엇입니까?
답변:
Java에서는 가상 머신이 코드를 실행하지만 C 컴파일러는 실제 머신이 실행 하는 코드를 생성합니다 . 정확하게 말하면 두 경우 모두 프로그램이 실제 기계 코드로 변환되지만 Java의 경우 JVM 바이트 코드로 컴파일하는 중간 단계가 있습니다.
따라서 Java 프로그램은로드 할 때 JVM에 의해 실제 명령어로 변환되는 반면 C 프로그램은 이미 실행되기 전에 컴파일러에 의해 실제 명령어로 변환됩니다.
머신 코드 외에도 문자 소스 텍스트를 제공 할 수 없다는 의미에서 하드웨어에서 직접 실행되는 프로그래밍 언어가 없습니다. 모든 실제 구현은 소스 프로그램을 "machine"의 언어로 변환 해야합니다 .
일부 구현의 경우 정적으로 번역됩니다. 우리는 일반적으로 이러한 구현을 "컴파일 된"이라고합니다. 다른 경우에는 중간 형식으로 변환 된 다음 프로그램이 실행될 때 동적으로 변환됩니다. 우리는 일반적으로 이러한 구현을 "통역"이라고합니다. 이들 사이에는 연속적인 가능성이 있으며 많은 최신 CPU조차도 실행 코어의 일부로 동적 변환을 수행합니다.
프로그램이 실행되기 오래 전에 정적으로 컴파일 된 경우에도 펌웨어를 작성하지 않는 한 컴파일 된 코드가이를 지원하지 않는 베어 메탈에서 직접 실행되는 경우는 거의 없습니다. 운영 체제는 사용자 공간 프로그램을위한 가상 머신을 제공하며 종종 CPU가 자신에게 있다는 환상과 같은 기능을 제공합니다. 기계에 부착 된 물리적 RAM보다 클 수있는 플랫 메모리 공간의 환상을 "가상 메모리"라고도합니다.
게다가 C로 프로그래밍 할 때에도 C 가상 머신이 있습니다! 일반적으로 "C 런타임"또는 간단히 CRT라고합니다.
C는 대부분 사전에 어셈블리 / 머신 코드로 직접 변환 되기 때문에 (일부 플랫폼에서는 스레드 코드 가있을 수 있으며 가상 머신의 일부로 간주 될 수 있음) 가상 머신은 일반적으로 시작 및 처리 만 처리하면됩니다. 일시 휴업.
시작은 일반적으로 스택과 힙을 설정합니다. 운영 체제는 이러한 기능을 거의 제공하지 않으며이를 프로그래머에게 제공하는 것은 프로그래밍 언어의 역할입니다. 일부 플랫폼에서는 신호 처리 초기화, 다중 스레드 환경에서 "메인"스레드 설정, 프로그램이 C ++ 코드에 링크되었거나 동적으로 링크 된 라이브러리 처리 등의 글로벌 생성자를 실행하는 경우가있을 수 있습니다. argc / argv 및 envp를 설정하는 데 일부 처리가 필요할 수 있습니다. 마지막으로 CRT는 제어를 기본으로 옮깁니다.
종료와 관련하여 많은 운영 체제가 프로세스를 부정하게 종료 할 수 있으므로 종료는 그다지 필요하지 않습니다. 가장 중요한 것은 프로그램이 깨끗하게 종료되는 경우에 대한 atexit () 호출을 처리하는 것입니다.