C 언어 이식성


10

C와 같은 언어의 이식성은 정확히 어떻게 결정됩니까? 컴파일러는 ISA에 따라 다릅니다. 이것이 사실이라면 C는 어떻게 휴대 할 수 있습니까? 아니면 C로 작성된 소스 코드는 이식 가능하지만 실행 파일은 아닙니다. x86 용 예제 응용 프로그램에 특정한 ISA 실행 파일이 Apple 용 응용 프로그램과 분리되어 있지 않습니까 (Apple에서 Motorola / PowerPC 마이크로 프로세서를 사용한다고 가정)?

답변:


27

C로 작성된 소스 코드 만 실행 파일이 아닌 이식성입니까?

옳은. 어떤 사람들은 그것을 한 번만 쓰고 모든 곳에서 컴파일이라고 부릅니다.

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere .

다른 대안은 한 번만 쓰고 어디서나 실행할 수 있습니다. Java가 좋은 예입니다.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

부분 크로스 플랫폼 이식성을 달성 할 수 있지만 코드를 수정하지 않고 어디에서나 실행할 수 있습니다.


C 언어 코드는 다른 언어를 사용하지 않는 다른 컴파일러 나 ISA 또는 OS로 이식 할 수 없습니다. 표준 유형의 크기 및 정렬과 같은 단순한 것은 C에서 표준이 아니므로 다른 인스턴스와 데이터를 교환하는 소프트웨어를 이식하는 것은 상당히 어려울 수 있습니다. C 프로그래머가 이식성을 얻기 위해 건너 뛸 수있는 후프의 예제는 GNU Autoconf / Automake를 참조하십시오.
팀 Williscroft

3
@TimWilliscroft : 이식성 문제는 일반적으로 비표준 라이브러리와 잘못된 프로그래밍 방식으로 인해 발생합니다. C 또는 표준 라이브러리로 인해 발생하지 않습니다. 간단한 예는 비표준 GCC 확장을 사용하거나 IO에 대한 데이터를 직렬화 / 직렬화 해제하지 않는 것입니다.
Brendan

6

ISA에만 국한된 것은 아닙니다. 예를 들어 다음과 같이 묻습니다.

x86 용 응용 프로그램은 apple 용 응용 프로그램과 분리되어 있습니까?

그렇습니다. Apple이 x86 하드웨어를 사용하더라도 마찬가지입니다. C 바이너리는 아키텍처 운영 체제에 따라 다릅니다.


1
@ Steven314 : 귀하의 의견은 접선입니다. 그것은 하드웨어가 표준인지 아닌지와 관련이 없으며 OS X가 Linux (일반적으로 ELF)와 다른 이진 형식 (Mach-O)을 가지고 있다는 사실과 관련이 있습니다.
mipadi

@Steve : EFI 대 BIOS는 부팅 및 OS 내부에만 중요합니다. CPU 명령어 세트 인 하드웨어 아키텍처는 동일한 CPU이므로 동일합니다.
vartec

처음에는 Mac을 포함하지 않아야했기 때문에 주석이 삭제되었습니다. ABI (Application Binary Interface) 및 호출 규칙에 대한 언급은 여전히 ​​관련이있을 수 있습니다 ( "아키텍처 및 운영 체제"에 추가 할 세 번째 항목). ABI는 특정 아키텍처 (예 : 사용 가능한 레지스터)를 위해 설계되는 경향이 있지만 이진 이식성과 관련이 있다는 점을 제외하고는 하드웨어와 관련이 없습니다. 이것은 파일 형식 문제가 아닙니다. ELF는 Windows 및 Linux (gcc)에서 사용되지만 객체 파일을 다른 파일로 가져갈 수는 없습니다.
Steve314

@vartec은 C 바이너리가 운영 체제에 따라 다르다고 말했다. O / S 자체가 ISA에 고유하기 때문에 C 바이너리가 O / S에 간접적으로 지정 되었습니까?
KawaiKx

@Saurabh-OS가 파일 형식을 지정하므로 모든 기본 실행 파일은 OS에 따라 다릅니다. 또한 C 표준 라이브러리는 운영 체제를 호출하여 많은 기능을 구현해야하므로 파일 형식이 표준화 된 경우에도 코드 자체를 다른 OS에서 실행할 수 없습니다. JVM (Java Virtual Machine)과 같은 일부 가상 시스템 코드와 달리 기본 코드로 컴파일되는 언어의 표준입니다. 가상 머신을 위해 C를 컴파일하는 것은 가능하지만 내가 아는 것은 결코하지 않습니다. LLVM은 가장 가깝지만 컴파일러 백엔드로 설계되었습니다. 한 번만 실행되는 컴파일 환경이 아닙니다.
Steve314

5

C로 작성된 소스 코드 만 실행 파일이 아닌 이식성입니까?

바로 그거죠. 모든 플랫폼에서 C 프로그램을 다시 컴파일해야합니다. C 컴파일러는 동일한 프로세서 / 메모리 아키텍처와 OS 사이의 머신간에 매우 제한적인 휴대용 머신 코드를 생성합니다. 그렇기 때문에 "리눅스 64 비트 인텔"또는 "Mac OS X 32 비트 PowerPC"와 같은 멀티 플랫폼 앱 (예 : 브라우저)의 이진 배포판이 서로 다른 이유를 볼 수 있습니다 (마지막 그림은 단지 애플입니다. 몇 년 전 인텔에 :-).


3

대부분의 질문에 대한 답변이 있지만 내구성보다 추가하고 싶습니다. 내가 고려해야 할 또 다른 것입니다.

예를 들어, JAVA는 한 번 작성되어 VM이있는 플랫폼 (현재 "런타임 환경")에서 실행될 수 있습니다. 그러나 또 다른 장점은 2011 년 시스템에서 1995 년부터 Java 1.1 코드를 실행할 수 있다는 것입니다. 코드가 i386에서 컴파일되어 AMD64 아키텍처에서 실행하려고하면 불가능합니다.

가상 머신 자체도 개선되었습니다.

그런 다음 일반적으로 가장 이식성이 낮은 언어에서 더 이식성이 높은 언어로 이동합니다. 어셈블러, C와 같은 저수준 컴파일 언어, C ++, 해석 된 언어 또는 가상 컴퓨터 내에서 실행되는 언어.

나는 실제로 언어 나 커뮤니티와 같은 자바 방어자가 아니지만 C와 비교할 때 이식성과 최소한의 성능 손실을 찾고 있다면 갈 길입니다.


3

한 번 쓰기에 대한 좋은 답변은 어디에서나 컴파일합니다.

사람들은 C의 인기와 향후 대상 플랫폼에서 C 컴파일러를 사용할 가능성이 높기 때문에 C를 휴대용 언어로 생각하고 싶어합니다. 또 다른 요소는 플랫폼 독립적 인 방식으로 일반적인 프로그래밍 작업을 돕는 표준 라이브러리입니다.

따라서 언어의 이식성은 다음에 의해 결정됩니다.

  1. 표준화 수준.
  2. 다른 플랫폼 / 아키텍처에 대한 컴파일러 가용성.
  3. 휴대용 라이브러리의 깊이와 폭.

현실적으로 거의 모든 복잡한 C 응용 프로그램은 하드웨어 또는 운영 체제 종속성으로 인해 새로운 플랫폼으로 이동하기 위해 약간의 작업이 필요합니다. 이 프로세스를 포팅이라고합니다.


3

"이동성"에는 여러 가지 의미가 있습니다. C와 관련하여 다음을 의미합니다.

  • 컴파일러는 다양한 하드웨어 및 운영 체제 플랫폼에 대해 C 용으로 구현되었으며, 70 년대 초반 큰 거래였습니다.

  • 언어의 약간 다른 변형을 인식하는 각 컴파일러 구현과 달리, 언어 자체에 대해 보편적으로 합의 된 표준이 있습니다 (Pascal 및 BASIC과 같은 여러 변형이 있었으므로 C가 처음 설계되었을 때의 큰 거래) 그것은 보편적으로 인정되지 않았다);

  • 이 표준으로 인해 적합한 코드는 다른 플랫폼에서 컴파일 될 때 동일한 동작을 생성합니다.

소스 코드를 휴대용이지만, 새로운 바이너리 각 대상에 대해 생성되어야한다.

그러나 C 소스는 "사소한"이식성이 거의 없습니다. 대부분의 응용 프로그램에서는 특정 플랫폼에 고유 한 확장을 사용하여 언어 표준에 정의 된 것 이상을 수행해야하므로 실제로 소스 코드는 100 % 이식성이 없습니다.

그러나 C는 구현에 많은 영향을 미칩니다. 다양한 데이터 유형의 정확한 크기, 오버플로 동작 등은 모두 구현에 달려 있습니다. 표준은 구현이 준수해야하는 최소 요구 사항을 제공 하지만 구현은 이러한 제한을 초과하지 않습니다.


0

ISA가 무엇이든 C는 ISA에 한정되지 않습니다. 나는 당신이 PC 확장 카드를 위해 지금 쓸모없는 슬롯을 언급하고 있지 않다고 가정합니다.

매우 많은 플랫폼을위한 표준 호환 C 컴파일러가 있으며 소스 코드에서 완전히 표준 정의 된 언어 기능을 사용하는 경우 모든 플랫폼의 C 컴파일러에서 컴파일 할 수 있어야합니다.

그러나 C 표준은 구현 정의 또는 정의되지 않은 동작으로 기능의 많은 동작을 남깁니다. 이는 정확하게 정의 된 동작이 일부 플랫폼에서 하드웨어가 지원하는 것과 일치하지 않는 경우를 피하면서 C 언어를 일반적으로 저수준 프로그래밍에 더 유용하게 만들기 위해 수행됩니다. 그러나 휴대용 프로그램을 작성하기가 조금 더 어려워집니다.

또한 일부 언어와 달리 C에는 Java 또는 C #이 제공하는 거대한 라이브러리가 제공되지 않습니다. 이식성이 뛰어난 라이브러리는 무엇이든 할 수 있지만 라이브러리를 빌드하고 함께 작동 시키려면 약간의 작업을 수행해야합니다.

C에는 물론 표준 라이브러리가 있지만 범위는 Java, C #, Python 등과 비교할 때 상대적으로 제한적입니다.


4
ISA = 명령어 세트 아키텍처 일명 하드웨어 아키텍처
vartec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.