Java에는 JVM이 있습니다. C에는 무엇이 있습니까?


15

C에 컴파일러가 있지만 실행 성능을 결정하는 것은 무엇입니까?

예를 들어 if else 블록에서 if else 대신 코드에 모든 ifs가 있으면 모든 ifs가 실행될 것이라고 결정하는 것은 무엇입니까? Java에서는 JVM이지만 C에서는 실행 컴파일러가 무엇입니까?


16
배울 수있는 뉘앙스는 언어는 단지 언어라는 것입니다. 예를 들어 C 코드를 사용하여 JVM에서 실행되도록하는 컴파일러를 만들 수 있습니다.
Telastyn

10
+1. 이것은 매우 좋은 질문입니다. 나는 무지로 그것을 무시하지 않을 것입니다-더 많은 Java 학생들 이 이것을 묻지 않는 것은 놀라운 입니다.
djechlin

기계 코드로 Java를 컴파일하고 JVM을 피할 수도 있습니다.
AK_

2
또한 : 프로그래밍 언어! = 프레임 워크! = 런타임 라이브러리! = 컴파일러! = Just Time Time 컴파일러! = Interperter
AK_

답변:


17

Java에서는 가상 머신이 코드를 실행하지만 C 컴파일러는 실제 머신이 실행 하는 코드를 생성합니다 . 정확하게 말하면 두 경우 모두 프로그램이 실제 기계 코드로 변환되지만 Java의 경우 JVM 바이트 코드로 컴파일하는 중간 단계가 있습니다.

따라서 Java 프로그램은로드 할 때 JVM에 의해 실제 명령어로 변환되는 반면 C 프로그램은 이미 실행되기 전에 컴파일러에 의해 실제 명령어로 변환됩니다.


20
Java를 사용하고 기계 코드를 생성하는 컴파일러가 있습니다. 예를 들어 Excelsior Jet 입니다. 실제 기계가 실행하는 코드를 절대 생성하지 않는 C ( picoc )에 대한 질문도 있습니다 . 언어는 언어입니다. 구현은 구현입니다. 이 두 가지를 혼동하는 것은 사람들에게 혼동을 줄 수 있습니다.

6

머신 코드 외에도 문자 소스 텍스트를 제공 할 수 없다는 의미에서 하드웨어에서 직접 실행되는 프로그래밍 언어가 없습니다. 모든 실제 구현은 소스 프로그램을 "machine"의 언어로 변환 해야합니다 .

일부 구현의 경우 정적으로 번역됩니다. 우리는 일반적으로 이러한 구현을 "컴파일 된"이라고합니다. 다른 경우에는 중간 형식으로 변환 된 다음 프로그램이 실행될 때 동적으로 변환됩니다. 우리는 일반적으로 이러한 구현을 "통역"이라고합니다. 이들 사이에는 연속적인 가능성이 있으며 많은 최신 CPU조차도 실행 코어의 일부로 동적 변환을 수행합니다.

프로그램이 실행되기 오래 전에 정적으로 컴파일 된 경우에도 펌웨어를 작성하지 않는 한 컴파일 된 코드가이를 지원하지 않는 베어 메탈에서 직접 실행되는 경우는 거의 없습니다. 운영 체제는 사용자 공간 프로그램을위한 가상 머신을 제공하며 종종 CPU가 자신에게 있다는 환상과 같은 기능을 제공합니다. 기계에 부착 된 물리적 RAM보다 클 수있는 플랫 메모리 공간의 환상을 "가상 메모리"라고도합니다.

게다가 C로 프로그래밍 할 때에도 C 가상 머신이 있습니다! 일반적으로 "C 런타임"또는 간단히 CRT라고합니다.

C는 대부분 사전에 어셈블리 / 머신 코드로 직접 변환 되기 때문에 (일부 플랫폼에서는 스레드 코드 가있을 수 있으며 가상 머신의 일부로 간주 될 수 있음) 가상 머신은 일반적으로 시작 및 처리 만 처리하면됩니다. 일시 휴업.

시작은 일반적으로 스택과 힙을 설정합니다. 운영 체제는 이러한 기능을 거의 제공하지 않으며이를 프로그래머에게 제공하는 것은 프로그래밍 언어의 역할입니다. 일부 플랫폼에서는 신호 처리 초기화, 다중 스레드 환경에서 "메인"스레드 설정, 프로그램이 C ++ 코드에 링크되었거나 동적으로 링크 된 라이브러리 처리 등의 글로벌 생성자를 실행하는 경우가있을 수 있습니다. argc / argv 및 envp를 설정하는 데 일부 처리가 필요할 수 있습니다. 마지막으로 CRT는 제어를 기본으로 옮깁니다.

종료와 관련하여 많은 운영 체제가 프로세스를 부정하게 종료 할 수 있으므로 종료는 그다지 필요하지 않습니다. 가장 중요한 것은 프로그램이 깨끗하게 종료되는 경우에 대한 atexit () 호출을 처리하는 것입니다.


2
C 런타임과 JVM은 완전히 다른 짐승입니다. CRT는 단지 도서관입니다.
DeadMG

좀 더 명확하게하기 위해 답을 편집했습니다. 또한 JVM과 VirtualBox도 완전히 다른 짐승입니다.
가명

@ 가명 : 실제로는 아닙니다. 글쎄, VirtualBox는 가상화 기이지만 일반적인 JVM은 에뮬레이터이지만, 예를 들어 VirtualBox를 QEmu로 바꾸면 두 가지가 실제로 동일합니다.
Jörg W Mittag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.