본문 바로가기
IT 공부/C, C++

[C언어] - C언어의 이식성에 대해 정리

by exdus3156 2024. 12. 26.

 

▷ C/C++을 흔히 이식성이 좋다고 이야기 한다. 틀린 말은 아니지만, C/C++을 처음 배울 때 나는 이것을 제대로 이해하지 못했다. 나는 C/C++로 빌드한 결과물이 이식성이 좋다고 착각했던 것이다.

 

생각해보면 C/C++로 빌드한 결과물은 이식성이 좋다고 할 수 없다. 다양한 크로스 플랫폼 기반의 프로그래밍 언어(Java, Python, Node.js, ...)가 개발된 지금 이 시점에서는 C/C++이 이식성이 나쁘다고 말해야 할지도 모르겠다.

 

Java, Javascript, Python은 가상머신과 인터프리터가 있으므로 플랫폼에 종속되지 않는다. 그래서 이식성이 정말 좋다. Java와 같이 중간 언어로 컴파일되는 언어도 마찬가지로 그 오브젝트 코드를 windows에서 linux로 이식해도 java vm이 있으면 일관되게 동작할 수 있다.

 

그러나 C/C++는 다르다. 우선 C/C++로 개발하는 과정 자체가 특정 플랫폼에 종속되어 있다. 크로스 빌드가 불가능한 것은 아니지만 빌드툴을 잘 선정해야 하고, 모듈을 만드는 시점에서 크로스 빌드를 따져 설계해야 한다. 게다가 어느 시점에서는 무조건 플랫폼에 종속된 코드를 짜야 할 때가 온다. 예를 들어, 그래픽 처리를 위해 라이브러리로 DirectX를 선택해 구현하면 그 소스코드는 Windows에 종속된 코드가 되는 것이다.

 

Windows API를 사용하면 그 소스코드는 다양한 플랫폼에서 동작할 여지가 사라진다. 소스코드 자체가 플랫폼 종속적이니 크로스 빌드 도구고 뭐고 상관이 없다. 이건 windows 전용 프로그램이 된다.

 

설령 C/C++ 표준 라이브러리만 활용한 소스코드라고 해도 문제가 사라지진 않는다.. 우선 소스코드 자체는 이식성이 굉장히 높다. 같은 소스코드를 MSVC, GCC, 어디든 활용할 수 있다. 문제는 소스코드를 빌드하면 이식성은 사라진다. 표준 라이브러리의 많은 부분이 런타임 라이브러리로 제공되는데, 정적으로 연결했든 동적으로 런타임에 연결하든, 빌드된 후에는 플랫폼에 종속된다. 인터프리터 언어인 Python, JS와 비교해 이런 점은 단점이다.

 

또한 C/C++의 문자 집합 및 변수 타입도 문제가 된다. C언어에서는 문자열과 char 및 다양한 기본 데이터 타입에 대해 정확한 구현을 지정하지는 않았으므로, 예를 들어 문자열의 경우, windows에서 빌드하면 빌드 환경의 로컬 코드 페이지에 따라 MBCS 기반으로 문자열을 인코딩한다. 리눅스는 char를 UTF-8로 인코딩한다.