본문 바로가기
프로그래밍/그래픽스

[C] C언어의 장점과 단점

by moo-ti 2023. 8. 15.
반응형

C언어

C언어 이전에도 고수준의 언어들은 많이 존재했지만 대부분 특정 애플리케이션 영역을 대상으로 하고, 혹은 컴퓨터 과학 이론을 입증하기 위해 만들어진 실험실 언어들이었다. 운영체제를 어셈블리어가 아닌 언어로 작성하는 것은 당시에 금기였으나 유닉스의 전신인 MULTICS(멀틱스는 MIT 대학의 주도하에 AT&T의 벨 연구소와 제너럴 일렉트릭이 참여해 1969년도에 출시한 시분할 운영체제 및 개발 프로젝트이다. 개발은 1964년도부터 시작했으며 제너럴 일렉트릭의 메인 프레임과 하니웰의 컴퓨터에서 제한적으로 사용되었다.)는 그 금기를 어기고 PL/1이라는 고수준 언어로 작성하려고 시도했지만 성공하지 못했다. 유닉스는 멀틱스에 대한 반성에서 단순하게 만드는 방향을 추후해 이름부터 UNI-로 시작하게 지은 것이다. C언어가 등장하던 당시에는 코볼(COBOL-COmmon Business-Oriented Language), 포트란(Fortran)이 고수준 언어로써 주로 쓰였는데, 이들은 문법이 매우 불친절하다. 천공 카드가 쓰이던 시절 만들어졌기 때문이다. 천공 카드는 지폐 용지 크기의 카드에 구멍을 뚫어 디지털 자료를 기록하는 저장매체로, 펀치카드 또는 상용화한 인물의 이름을 딴 홀러리스 카드로도 불린다. 

이에 따라 C언어의 장점은 속도가 빠르고 바이너리 크기도 작아 속도가 어떤 것 보다도 중요한 임베디드 혹은 모바일 계열, 또는 시스템 프로그래밍에서 주로 쓰인다. 파이썬(Python) 등의 다른 언어들에 비해 크기도 작고, 알고리즘으로 짜도 결과물의 크기가 더 작은 경향이 있다. 화성 탐사선도 이런 점을 반영해 C언어로 만든 프로그램을 사용했다. 안정성보다는 퍼포먼스를 극한으로 뽑아내야 하는 게임 프로그래밍 분야는 C/C++이 대세이다. 게임 프로그래머들이 C언어에서 C++로 넘어가는 것을 싫어했던 이유는 C언어(지금은 C++)가 다른 언어보다 속도를 빠르게 최적화할 수 있다는 생각 때문이며, 다른 분야보다 보수적이라는 소리를 듣는 편이다. 그러나 모바일 게임 시장이 급속하게 커지며 코어 부분만 C언어/C++로 만들고 그 외 부분은 파이썬, 자바, C# 등의 고생산성 언어로 대체하는 경우가 늘어나고 있다. 게임 엔진인 Unity의 경우 기본언어는 Java와 C# 둘 중에 한 가지를 사용한다. 유니티는 3D 및 2D 비디오 게임의 개발 환경을 제공하는 게임 엔진이자 3D 애니메이션과 건축 시각화, 가상 현실 등 콘텐츠 제작을 위한 통합 제작 도구이다. 현시점에서 가장 중요한 장점은 사실 모든 아키텍처와 운영체제에서 가상 머신 등의 추가적인 단계 없이 네이티브로 지원하는 언어라는 것이다. 아키텍처란 목표하는 대상에 대하여 그 구성과 동작 원리, 구성 요소 간의 관계 및 시스템 외부 환경과의 관계 등을 설명하는 설계도(청사진)를 말한다. 이미 한물간 언어처럼 보이지만, 여전히 프로그래밍 입문으로 C언어를 추천하는 사람이 많다. 왜냐하면 C언어는 아주 심플하면서 배우는 과정에서 소프트웨어 구성의 최소 단위인 비트부터 메모리관리, 그리고 고급 개념인 OOP(객체지향 프로그래밍) 비슷한 것까지 흉내 내며 소프트웨어 전반을 훑게 되고 C언어를 배우면서 나오는 과제들은 cmd 라인에서 이미 쓰이고 있는 기본적인 툴을 하는 식의 과제들이 많기 때문에 A-Z까지 훑어 공부하며 견문을 넓히는데 아주 좋다. 단점으로는 성능이라는 대명제에 충실해서 작게는 배열 범위 점검, 변수 초기화, null pointer 문제에서부터 크게는 가비지컬렉션(Garbage Collection; GC), 예외 처리 같은 것까지 조금이라도 하드웨어 오버헤드에 걸릴 것 같은 기능은 다 무시하므로 메모리 관리까지 전부 신경 써야 해서 주니어 프로그래머에게는 어려울 수 있다. 현재 쓰이고 있는 고수준 개념들 자체는 오래된 경우가 많은데 예를 들어 GC는 1959년에 최초로 구상됐으며, 타입 에러를 컴파일 타임에 모두 잡아낼 수 있는 인터페이스가 1970년대 후반에 나와서 Haskell 등지에서 쓰이고 있다. Haskell은 순수 함수영 프로그래밍언어이다. I/O(입출력)와 같이 필요한 경우가 아니면 Side Effect가 없는 순수 함수로만 만들어졌다. 어셈블리어보다 이식성이 좋다고는 하지만, 하드웨어마다 달라지는 부분들을 언어 내에서 컨트롤해서 일관성을 유지하는 것이 아닌, 성능을 위해 전혀 후처리하지 않고 그대로 프로그램에 반영해버리므로 C언어의 이식성도 미신이라는 사람들이 많다. C언어 사용 시 어려움을 느끼기 쉬운 부분들은 다음과 같다. 느슨한 타입 검사, 범위를 벗어난 배열 접근, 배열과 포인터의 혼동, 문자와 문자열에 대한 추상화 부재, 문자열 처리 방식의 취약점, 네임 스페이스 미지원, bool 타입의 부재, 예상하기 어려운 최적화, Side Effect : C언어는 불필요하다고 판단되는 수식을 평가하지 않을 수 있다. 만약 프로그래머가 코드를 올바르게 작성하지 않는다면 컴파일러는 이를 잘못 판단하여 최적화 과정에서 예상하기 어려운 오동작을 만들어낼 수 있다.

결국 C언어는 초창기에 사용하기 편리한 고수준 언어로 분류됐기 때문에 큰 인기를 끌었지만 오늘날의 C언어는 오히려 불편한 언어에 속한다. 그런데도 많이 사용되는 이유 중 하나는 투명성이다. 기능 자체가 적고 하드웨어 맞춤 형태로 최소한의 추상화만 시킨 수준이기 때문에, 코딩과 동시에 실제 어떤 식으로 하드웨어가 움직일지 예상이 비교적 쉽고, 어셈블리어와 호환성이 좋다.

반응형