본문 바로가기
Programming/C Programming Modern Approach (K.N.K)

[KNK 정리] 1장: Introducing C

by hygoni 2021. 8. 16.

커널을 보다보니까 C언어를 좀 더 이해하면 좋겠다 싶어서 KNK (C Programming: A Modern Approach)를 읽고 있다. 근데 정리를 안 하니까 자꾸 헷갈려서 요약 + 연습 문제 풀이를 해보려고 한다.

요약/정리

C언어의 역사

C언어는 1970년대 데니스 리치와 켄 톰슨이 당시 벨 연구소에서 진행하던 유닉스 운영체제를 위해 개발된 언어이다. C언어 이전까지만 해도 유닉스는 어셈블리어로 작성되었다. 어셈블리어는 개발도, 디버깅도 번거로울 뿐만 아니라 아키텍처에 의존적이기 때문에 이식성도 좋지 않았다. 그래서 데니스 리치와 켄 톰슨은 좀더 추상적인, 고수준의 언어를 적용하기로 했고, 그렇게 C언어가 탄생하게 되었다.

C언어의 표준

컴퓨터공학을 공부하다보면 표준의 부재로 생기는 문제들이 매우 많다. C언어도 예외는 아니었다. C언어를 처음 소개한 책은 The C Programming Language이다. 보통 K&R이라고 부른다. 당시에는 이 책이 사실상 표준이나 다름없었다. 표준이 없고 K&R에서 설명하던 C언어를 보통 K&R C라고 부른다.

 

하지만 표준 문서가 아닌 책 한권으로 C언어를 설명하다 보니까, 기능의 설명이 애매모호한 부분이 생기기 시작했다. 그래서 컴파일러마다 다르게 작동하는 부분이 생겼다. 이건 큰 문제인데, 같은 코드를 다른 컴파일러로 컴파일러로 작성했다고 해서 다르게 동작하면, 프로그램이 크래시가 나는 등 개발자의 의도와 다르게 작동할 수 있기 때문이다.

 

그래서 ANSI에서 C 표준을 만들었고, C89 표준(C90이라고 부르기도 함)이 탄생했다. 그리고 시간이 지남에 따라서 C언어에 몇몇 변경사항이 생겼고, C99도 탄생했다. 최근에는 C11도 제정되었다.

 

잠깐 여기서 다시 짚고 넘어가자면, 내 생각에 표준이 중요한 이유는 "다른 컴파일러로 컴파일하더라도 예상대로 작동되도록 하기 위함"이며, 비표준을 사용하면 그만큼 어느 정도 리스크를 지고 가는 것이다. 여담이지만 리눅스 커널은 비표준을 매우 많이 사용한다. 그만큼 표준만으로는 구현하지 못하는 부분도 많고, 지원하는 컴파일러가 정해져있어서 그런게 아닌가 싶다.

 

C언어의 특징 및 장단점

은 당연한 얘기가 많아서 생략하겠다.

 

이 챕터는 연습 문제가 없다.

반응형

댓글1