리눅스 시스템 프로그래밍 - 표준

김신·2022년 12월 25일
1
post-thumbnail

0. 표준

유닉스 시스템 프로그래밍의 기초는 지난 수십 년간 크게 변하지 않았습니다. 하지만 변하지 않는 것은 없다는 말 처럼 소프트웨어의 동작 방식은 바뀌었으며 새로운 기능도 추가 되었습니다. 그러나 유닉스 시스템 업체들은 각자 자신이 원하는 대로 유닉스 시스템 프로그래밍을 하기 때문에 서로 다른 시스템 프로그래밍 방법을 사용했습니다. 그래서 혼란을 잡기 위해 표준 그룹은 공식적인 시스템 인터페이스를 표준으로 만들었습니다.

표준은 다양하게 존재합니다. 그렇지만 리눅스는 기술적으로 어떤 표준에도 맞지 않습니다. 그 대신 리눅스는 가장 중요한 표준인 POSIXSUS의 호환을 지키려 합니다.

! POSIX: Portable Operating System Interface
! SUS: Single Unix Specification

1. POSIX와 SUS 표준

1980년 중반 IEEE(Institute of Electrical and Electronics Engineers)는 유닉스 시스템 수준의 인터페이스 표준화를 시작했습니다. 자유 소프트웨어 제단의 창립자인 리차드 스톨만은 POSIX를 표준안 이름으로 제안했습니다. 이 후 유닉스 시스템의 표준안은 P7SIX라 불립니다.

1980년대 후반부터 1990년 초반, 유닉스 시스템 업체들은 서로 자신의 유닉스를 표준 유닉스 운영체제로 정의하고자 경쟁했습니다. 몇몇 대형 유닉스 업체는 공개 소프트웨어 파운데이션이라 불리는 OSF(Open Software Foundation)과 X/Open을 합쳐 오픈 그룹이라는 컨소시엄을 구성하고 공식 인증, 백서, 호환성 테스트를 제공했습니다. 1990년대 초반 오픈 그룹은 SUS를 발표했습니다. SUS는 POSIX 표준에 비해 비용이 들지 않았던 이유로 빠르게 인기를 얻었습니다. 오늘날의 SUS는 최신 POSIX를 포함하고 있습니다.

2. C 언어 표준

1978년 출간된 데니스 리치와 브라이언 케니핸의 유명한 저서, 'C 언어 프로그래밍'(휴먼 싸이언스, 2012)은 출간 이후 몇 년 동안 그 자체로 c 언어의 표준 역할을 했는데 이를 K&R C라고 합니다. 당시 C 언어는 이미 BASIC을 제치고 마이크로컴퓨터 프로그래밍에서 표준 언어로 사용되고 있었는데, 큰 인기를 얻고 있는 C 언어의 표준화를 위해 1983년 ANSI에서는 위원회를 구성하고 여러 업체에서 제공한 기능과 개선점, 그리고 새로운 언어인 C++를 포함한 표준을 만들고 있었습니다. 1989년에 표준화 작업은 마무리가 되었는데, 그것이 바로 ANSI C(C89)입니다. 1990년 국제표준기구(ISO)는 ANSI C에 몇 가지 편리한 변경을 추가한 ISO C90을 발표해습니다. 가장 최신의 C표준은 ISO C11이며 내용 중 가장 두드러지는 것은 메모리 모델과 스레드 사용에 대한 내용입니다.

3. 리눅스와 표준

앞서 말했듯이 리눅스는 POSIX와 SUS 호환을 지향합니다. 리눅스는 실시간과 스레드를 포함하여 POSIX 2008과 SUSv4dp 명세된 인터페이스를 제공합니다. 그리고 리눅스는 POSIX와 SUS의 요구사항에 맞게 동작하도록 노력하고 있습니다. 하지만 공식적으로 POSIX와 SUS의 인증을 마친 리눅스 베보판이 없으므로 리눅스가 POSIX와 SUS의 호환이라고 말하기는 힘듭니다.

리눅스는 프로그래밍 언어 표준을 잘 따르고 있는 편입니다. 리눅스 표준 C 컴파일러인 gcc는 ISO C99 호환이며 부분적으로 C11을 지원하고 있습니다. C++ 컴파일러인 g++은 ISO C++11 지원을 위한 개발이 진행 중입니다.

다양한 리눅스 베포판 중에서 LSB(Linux Standard Base)는 리눅스 시스템 대부분을 표준화합니다. LSB는 몇 리눅스 제공 업체가 리눅스 파운데이션의 후원으로 진행하고 있는 프로젝트입니다. LSB는 POSIX와 SUS를 확장해서 독자적인 표준 몇 가지를 추가했습니다. LSB는 바이너리 표준을 제공함으로써 오브젝트 코드가 호환 가능한 시스템에서는 변경 없이 실행할 수 있게 해줍니다. 리눅스 업체 대부분은 일정 수준 이상의 LSB 호환을 제공합니다.

0개의 댓글