작은항해자의 항해

프로그램의 이식성 본문

Programming/프로그래밍공부중

프로그램의 이식성

작은항해자 2014. 10. 1. 17:03

Portability

OS에 의한 차이
플랫폼이 달라지면 시스템의 구조가 달라진다. 라이브러리 형식도 윈도우에서는 DLL이라는 구조를 사용하지만 유닉스 계열에서는 *.so 확장자를 가진 공유 라이브러리 형식을 사용한다.


환경설정에 의한 차이

OS가 같거나 OS의 버전이나 배포판의 구성이 같더라도 시스템의 동작이 반드시 일률적인 것은 아니다. 미들웨어와 라이브러리가 특정한 버전이 지정되어 있어, 새로운 버전에서 문제가 생기거나 혹은 반대로 최신 버전 라이브러리를 사용해야만 동작하는 등 환경구축 자체가 어려울 때도 있다.


차이 극복 방법

- 소스 코드에서 대처할 문제

1. CPU 아키텍처 차이 : big endian 인지 little endian인지, 64bit or 32bit 인지, 그 이하의 bit인지 등 비트를 직접 조작하는 코드를 작성할 때 주의해야 한다.

2. 라이브러리의 존재 : 애초에 활용할 라이브러리가 준비됐는지, 라이브러리의 버전은 적절하고 호출하는 함수의 시그니처가 맞는지, 구조체의 멤버 구성이 바뀌지 않았는지 등에 주의해야한다.

3. C 컴파일러 고유의 기능 : gcc 자체가 다양한 플랫폼을 지원하고 크로스 컴파일러 환경도 갖추고 있으므로 '컴파일러 gcc를 사용하자'라는 규칙만으로 해결되는 때도 있다. 하지만 gcc 이외의 컴파일러를 사용 할 때는 각각 고유의 기능을 사용하고 있는지 이식할 수 있는지 주의해야 한다.


차이를 모두 흡수하는 소스 코드를 작성하기는 어렵고, 알고리즘상 어떤 비트 조작이 필요할 때 엔디언의 차이를 코드 수준에서 대처하기는 불가능하다.

사용하고 싶은 라이브러리가 없을 때나 특정 함수가 그 시스템에 없을 때는 그 플랫폼만을 대상으로 라이브러리의 기능을 보완하는 코드를 소스 코드 패키지 안에 준비해야 한다.

이런 개별적인 사항에 대응할 때 이용되는 방법이 매크로이다. 플랫폼에 고유하게 정의되는 매크로를 이용해 컴파일할 코드를 전화하는 방법을 활용한다. 조건부 컴파일 기능을 이용하는 것이다.


gcc 매뉴얼에 따르면 사전 정의된 매크로(predefined macros) 목록을 보려면 '존재하지 않는 파일 foo.h를 만들어 touch foo.h; cpp -dM foo.h라고 하라'고 되어 있다. 실제에서는 echo | cpp -dM 처럼 표준입력 더미로 사용하면 문제 없이 동작한다.



'Programming > 프로그래밍공부중' 카테고리의 다른 글

MQTT  (0) 2019.01.16
C 프로그래밍1  (0) 2014.10.01