내가 생각하는 컴공에서 C를 배우는 이유 / C 표준에 대하여
1. 컴공에서 C를 배우는 이유
대부분의 컴공 신입생은 1학년 때 C를 배우게 된다.
나 또한 이유는 몰랐지만 학교 커리큘럼 상 C를 처음 프로그래밍 언어로 배웠다.
심지어 우리학교는 단과대학 전체가 수능 처럼 2번 프로그래밍 시험을 봐서 일정 점수에 도달하지 못하면 재수강 해야 했다.
왜 C를 배워야 하는 걸까 ?
다른 좀 더 트랜디(?)한 언어들 ( javascript , python , kotlin ) 로 시작하면 안될까 ?
이를 위해 첫째 , C가 어떻게 개발 되었는 지 / 그에 따라 어떤 특징이 있는지 알아보자.
1960년대 후반 Ken Thompson 이라는 사람은 벨 연구소에서 UNIX 라는 운영체제를 어셈블리어로 개발하고 있었다.
어셈블리어는 기계어(CPU가 해독할 수 있는 언어)와 일대일 대응되는 언어다.
어셈블러어로 하는 프로그램 개발은 낮은 생산성 , 디버깅의 어려움 때문에 고통스러웠다.
그래서 Thompson 은 당시 BCPL 이라는 언어를 바탕으로 좀 더 인간이 프로그램 개발 하기 편한 언어인 B를 개발했다.
얼마후 Dennis Ritchie 라는 사람이 벨 연구소에 합류하여 Thompson 이 개발한 B를 이용해 UNIX 를 작성했다.
그런데 자료형이 없는 B는 그당시 현대적인 컴퓨터가 지원하는 문자 자료형을 적절히 처리하지 못했다.
이 문제를 해결하기 위해 , Ritchie는 B를 확장했다.
이를 , 처음에는 NB(New B) 라고 불렀는데 점점 B로 부터 분기 되었다고 생각하여 이름을 C로 바꾸었다.
이후 , C가 충분히 안정적이라고 판단하여 UNIX 는 C로 재작성 되었다.
이렇듯 C는 UNIX 운영체제를 작성하는 과정에서 개발된 언어이다.
그렇기 때문에 C를 사용할 경우 다른 언어는 숨기는 컴퓨터의 직접적인 자원들을 다룰 수 있다.
이러한 특징 때문에 컴퓨터 하부를 다룰 때 매우 많이 등장한다.
둘째 , 그렇다면 컴공에서는 무엇을 배울까 ?
다음은 어느 한 미국의 대학교 홈페이지에 쓰인 computer engineering 에 대한 소개이다.
Computer engineering refers to the integration of computer science with electronic engineering.
By combining these disciplines, computer engineers design and develop many of the software programs and technological devices that we use every day at work, school, and in our personal lives.
컴퓨터 공학은 컴퓨터 과학과 전자 공학의 통합을 의미한다.
이 학문들을 결합하므로써 , 컴퓨터 공학자는 많은 소프트웨어 프로그램들과 우리가 사용하는 기술적인 장치들을 설계하고 개발한다.
즉 , software 을 의미하는 순수과학에 가까운 과목들 ( 이산수학 , 자료구조 , 알고리즘 ) 과
hardware 와 관련 있는 과목들 ( 논리회로 , 컴퓨터구조 ) 을 학습하고 결합하여
컴퓨터를 구현하기 위한 프로그램과 기술적인 장치들의 설계와 개발을 배운다.
( 운영체제 , 네트워크 , 컴퓨터 시스템 )
다시 처음으로 돌아가 컴공에서 C를 배우는 이유를 생각해보면 ,
컴공에서는 software와 hardware의 기초를 다진 후 나중에 컴퓨터 하부가 어떻게 구현되는 지에 대해 배우는데 이때 , C는 계속 등장할 수 밖에 없는 단골 손님이기 때문이다.
2. C 표준에 대하여
C는 명확한 표준이 존재 해온 언어이다.
제일 처음 표준은 C를 만든 사람들이 출판한 책이었다.
C의 장점이 알려지자 많은 곳에서 책을 참고하여 C 컴파일러를 만들고 C를 사용했다.
그런데 이 책은 특정 부분을 모호하게 설명해서 많은 방언 C가 생겨나게 되었다.
또한 C가 발전하여 많은 기능들이 추가 되었다.
새로운 C 표준을 개정할 필요성이 생긴 것이다.
이에 ANSI 에서 1989년 , ISO 에서 1990년 표준 C를 발표했다. ( 둘의 차이는 거의 없다. )
위의 C를 우리는 C89 or C90 라고 부른다.
이후에도 C 표준은 계속 발표 되었다.
가장 최근에 발표된 C는 2018년에 발표된 C18 이다.
그렇다면 처음 C를 배울 때 가장 많이 쓰는 visual studio 의 컴파일러는 C 표준을 준수하는 컴파일러 일까 ?
그렇지 않다.
ANSI C89 을 기본적으로 구현하지만 몇 가지 Microsoft 확장이 적용되고 컴파일러는 C99 의 몇 가지 필수 기능을 구현하지 않는다고 한다.
이는 학습자에게 혼란을 줄 수 있다.
visual studio 에서는 microsoft 확장 기능 때문에 문제 없이 컴파일 되었지만 C89 표준에 맞지 않은 코드 일 수 있고
C99 표준에 맞는 문법을 사용했지만 visual studio 에서는 컴파일 안될 수 있다.
C 표준을 제대로 배우지 못하는 것이다.
표준에 맞는 C를 배우지 못하면 이식성 없는 방언 코드를 작성할 위험이 있다.
내가 짠 소스코드가 컴파일러에 따라 다르게 동작할 수 있는 것이다.
때문에 C를 배울 때는 , gcc 에서 C 버전을 명령하여 컴파일 하는게 좋다.
방법은 다음에...