C가 컴파일 / 통역 / JIT되는 것을 막는 것은 무엇입니까?


9

Java는 종종 놀라운 이식성으로 인해 칭찬받습니다. 내 질문은 C가 컴파일 / 해석 / JIT '되는 것을 막는 것입니다. 그렇다면 C를 한 번 작성하여 어떤 장치에서나 사용할 수 있습니다. 그러나 이것은 C 프로그램을 처리하는 데 널리 사용되는 메커니즘이 아닙니다.

이 방법으로 C를 처리하는 것의 단점은 무엇입니까? 또한이 방법으로 Java를 처리하고 머신 코드로 컴파일하지 않는 장점은 무엇입니까?


귀하의 질문은 이미 여기에 아주 좋은 답변이 있습니다 : stackoverflow.com/questions/3925947/…
Doc Brown

2
@delnan 내 요점은 "C가 컴파일 / 해석 / JIT '되는 것을 막는 것은 언어가 JIT가있는 가상 머신을 대상으로 할 때 또는 VM에서 하드웨어에서 누락 된 기능을 식별하고 하드웨어를 다시 컴파일하는 상황을 의미 할 때 실제로 의미를 잃어 버린다는 것입니다 기존 하드웨어와 일치하는 코드 (예 : 다른 그래픽 카드의 경우 OSX의 OpenGL (C로 작성)) 아니요, 한 시스템에서 llvm을 대상으로 컴파일하여 다른 프로세서에서 실행할 수는 없습니다. 그러나 컴파일 / 해석 / JIT 라인은 상당히 흐려질 수 있습니다.

1
Java는 종종 놀라운 이식성을 위해 과장 되어 있습니다. JVM이 컴파일 된 시스템, 즉 JVM (C로 작성)이 컴파일 된 시스템에 이식 가능합니다. 노력을 정당화하기 위해 C 코드를 처리하는 것으로부터 충분한 이익을 보지 못한다는 것을 제외하고는 C 코드를 같은 방식으로 처리하는 것을 막는 것은 없습니다.
피트 베커

2
나는이 비트에 대해 의아해했다 : "C가 컴파일 / [...]되는 것을 막는 것". 어, 아무것도?
Andres F.

1
C 컴파일러는 요즘 꽤 빠르기 때문에 "make myprog.c; myprog"는 아마도 대부분의 인터프리터보다 빠르게 실행될 것입니다.
제임스 앤더슨

답변:


18

C는 내가 중급 언어라고 부르는 것입니다. 그 목적은 "매우 높은 수준의 어셈블러"역할을하는 것입니다. 이것이 컴파일러 대상으로 잘 작동하는 이유와 이식성을 잘 수용하는 이유입니다.

역사적으로 인터프리터는 일반적으로 메서드 호출의 맥락에서 고급 언어 와 함께 사용되었습니다 . 가장 간단한 형식으로, 인터프리터는 소스 언어의 각 키워드를 관련 토큰과 함께 구문 분석하고이를 메소드 호출 및 매개 변수로 변환합니다. 실제로 대부분의 통역사가하는 일은 소스 언어를 중간 표현으로 변환하는 것이며 해석되는 표현입니다.

C가 해석되거나 Jitted되는 것을 막는 것은 무엇입니까? 아무것도. 그러나 그것은 C의 raison d' être가 아닙니다.


6

우선, Sun의 JVM은 C로 작성되었습니다. C는 이식성이 필요할 때 가장 널리 사용되는 언어입니다.

많은 C 프로그램 이 없지만 C 언어 는 이식성 이 있습니다. C는 프로그래머에게 많은 제한을 두지 않거나 많은 가정을하기 때문입니다. C 프로그래머가 자신의 프로그램을 이식 가능하게하려면 이러한 제한을 스스로 적용해야합니다.

실제로, 그것은 당신에게 Java 강제의 제한을 가지고 사는 것보다 훨씬 어렵지 않습니다. 이는 엔디안과 기본 크기를 염두에두고 플랫폼 별 라이브러리 대신 GTK + 와 같은 휴대용 라이브러리를 사용하는 문제입니다 .

가상 머신, 심지어 JVM을 지원하는 GTK + 대상 및 C 컴파일러를 작성하고 기존 코드를 거의 변경하지 않고 작업 할 수 있습니다. 실제로 가비지 콜렉션이 없으면 C 가상 머신이 훨씬 단순 할 것입니다. 그래도 왜 하시겠습니까?

Java를 원시 코드로 컴파일하는 반대의 경우도 마찬가지입니다. 기본적으로 JIT가하는 일입니다. 그래도 왜 하시겠습니까? 나는 "그냥"그렇게하는 애완 동물 프로젝트가 있다고 확신하지만, 심각하게 사용되지는 않습니다.


5

당신은 말했다 :

Java는 종종 놀라운 이식성으로 인해 칭찬받습니다.

그리고 첫 문장에서 당신은 틀 렸습니다. JVM으로 인해 Java를 이식 할 수 없습니다. Java는 이식성이 뛰어납니다. Java 언어는 구현자가 프로그램의 작동 방식에 영향을주지 않는 방식으로 정의되기 때문입니다.

예를 들어, Java에는 "int"(부호 32 비트 정수)와 "long"(부호 64 비트 정수)의 두 가지 유형이 있습니다. C 및 C ++에는 "int"(최소 16 비트 부호), "long"(최소 32 비트 부호) 및 "long long"(최소 64 비트 부호)이 있습니다. C는 많은 다른 프로세서에서 실행되어야하고 다르게 동작 할 수 있기 때문입니다.

C는 이러한 유형에 대해 고정 크기를 정의 할 수 있습니다. 만약 그렇다면, 36 비트 프로세서는 C 언어를 구현할 수 없었습니다. 그리고 실제로 Java를 구현할 수 없습니다! C는 언어가 다양한 컴퓨터에서 작동 할 수 있도록했습니다. 이식성이없는 코드를 생성 할 수는 없습니다. 언어의 문제입니다.


36 비트 시스템에서 32 비트 산술을 에뮬레이션하고 0xFFFFFFFF를 사용하여 모든 연산의 결과를 32 비트로자를 수 있습니다. 따라서 이러한 시스템 Java를 구현할 있으며 Java가 nonet 기반 유형을 허용하는 것보다 느립니다.
dan04

4

Java는 이름에서 알 수 있듯이 실제 시스템아닌 Java Virtual Machine을 대상으로하기 때문에 이식성이 뛰어납니다 . 다양한 유형의 실제 머신 아키텍처에서 가상 머신을 구현할 수 있으므로 JVM 기반 프로그램은 이식성이 뛰어납니다.

반면에 C는 전체 하드웨어 액세스가 필요한 운영 체제 구현의 특정 목적으로 만들어 졌기 때문에 실제 하드웨어에 대해 실행되도록 특별히 설계되었습니다. 즉, C 코드는 설계 상 특히 이식성이 없으며 C 프로그램을 한 플랫폼에서 다른 플랫폼으로 포팅 할 때 대상 아키텍처에 특정한 다양한 부분을 어느 정도 다시 작성해야합니다.


7
C는 휴대 성이 뛰어납니다. 대상 플랫폼에서 다시 컴파일해야하며 구체적으로 의도적으로 이식 할 수없는 몇 비트를 피하십시오.
Robert Harvey

5
@RobertHarvey : ... 다양한 프리미티브의 크기와 같은 기본적인 것들 ? ;)
메이슨 휠러

2
그렇습니다. 불행히도 문제가 존재하지만 언어는 다른 모든 방식으로 완전히 이식 가능하며 기본 크기가 모든 플랫폼에서 작동하도록하는 방법이 있습니다.
Robert Harvey

3
@RobertHarvey : C는 이식 가능한 프로그램을 작성할 수는 있지만 본질적으로 쉽지는 않다고 말합니다.
Doc Brown

2
@RobertHarvey : 종교 전쟁을 시작 하시겠습니까? ;-) 내가 가장 좋아하는 휴대용 언어는 Python입니다.
Doc Brown

3

실제로 해석 된 버전의 C 가 있지만 프로덕션 시스템이 아닌 빠른 실험에 주로 사용됩니다.

작고 빠르며 정적 인 실행 파일을 얻지 못하면 왜 모든 Cidiosyncrasies를 겪을 것입니까?


3

이론적으로 C와 Java는 모두 원시 코드로 컴파일되거나 해석되거나 가상 머신으로 컴파일 될 수 있습니다.

C가 가상 머신으로 컴파일되지 않은 기술적 이유는 단순히 표준 가상 C 머신이 없기 때문 입니다.

그리고 아무도 가상 C 머신을 정의하거나 Java 가상 머신으로 컴파일하기를 원하지 않는 것 같습니다 (완벽히 가능합니다). 아마도 C를 사용하는 사람은 그 누구도 타의 추종을 불허하는 속도를 잃고 싶지 않기 때문일 것입니다. 아마도 C는 오픈 소스 커뮤니티에서 가장 강력하기 때문에 컴파일 (소스 배포 및 재 컴파일 및 실행)을 통해 이식성을 쉽게 수행 할 수 있기 때문에 폐쇄 형으로 실행 (이진 배포 및 실행)의 이식성에 대한 필요성을 느끼지 못합니다. 소스 개발자.


1

실제로이 작업이 완료되었습니다. LLVM으로의 컴파일을 지원하는 주요 컴파일러가 있습니다 (clang은 알고 있으며 gcc도 마찬가지라고 생각합니다). Java 코드가 JIT 된 바이트 코드로 컴파일 된 것처럼 LLVM을 JIT 할 수 있습니다.

그러나 C와 비교하여 Java를 "크로스 플랫폼"으로 만드는 것은 Java에 많은 런타임 라이브러리가있는 큰 런타임 라이브러리가 있다는 것입니다. C는 명시 적으로이 패러다임을 따르지 않습니다.


POSIX를 사용하는 C는주의해서 코딩하면 모든 POSIX 시스템에 이식성이 뛰어납니다.
Basile Starynkevitch 2016

0

Java와 C 사이에는 몇 가지 주요 차이점이 있습니다. Java는 JVM (Java Virtual Machine)을 통해 운영 체제와 분리되어 있습니다. JVM은 운영 체제를 프로그램에서 추상화합니다. Java 응용 프로그램은 JVM에 메모리 청크를 요청하고 JVM은 OS에 해당 메모리를 요청합니다. 플랫폼 / 운영 체제에 따라 많은 JVM이 있습니다. JVM은 동일한 Java 프로그램이 다른 플랫폼에서 실행될 수있게합니다.

C를 사용하면 OS 격리가 없습니다. C 프로그램은 (일반적으로) OS 위에서 직접 실행되어 직접 OS를 호출합니다. 이 C 프로그램을 특정 운영 체제 / 플랫폼에 연결합니다. 사소하지 않은 프로그램은 운영 체제를 호출합니다. 또한 C 프로그램은 하드웨어에 따라 기계 코드로 컴파일됩니다. x86 용 컴파일 된 C 프로그램은 ARM 프로세서에서 직접 실행할 수 없습니다.


1
Java 는 플랫폼에 구애받지 않는 바이트 코드 로 컴파일되며, 플랫폼 에 상관없이 모든 JVM에서 (이론적으로는) 실행할 수 있습니다. C는 대상 CPU에 따라 어셈블리 언어로 컴파일됩니다 (따라서 x86 아키텍처를 대상으로하는 경우 C 컴파일러는 x86 어셈블러 또는 해당 아키텍처 또는 ARM 어셈블러 등을 대상으로하는 경우 amd64 어셈블러를 만듭니다). 그런 다음 어셈블리 언어는 객체 파일 (실제로 이진 어셈블러)로 바뀌며 실행 파일 (대상 컴퓨터에 따라 여러 가지 다른 형식)에 연결됩니다.
Craig

1
Java 언어 사양에는 JVM에 대한 내용이 없으며 실제로 JVM이없는 Java 구현이 있습니다. Android에서 Java 프로그램은 Dalvik VM (현재 사용되지 않음) 또는 Android Runtime에서 실행되며 CLI 용 Java 구현, ECMAScript로 컴파일 된 구현 및 기본 코드로 컴파일 된 구현이 있습니다. JVM으로 컴파일하는 C 컴파일러가 있습니다. ECMAScript로 컴파일하는 C 컴파일러가 있습니다. C 통역사가 있습니다.
Jörg W Mittag 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.