페미위키:위키독/아름드리/C 언어

최근 편집: 2023년 1월 6일 (금) 19:36

1. 개요

C 언어는 1970년대에 데니스 리치와 켄 톰슨이 만든 컴퓨터 언어이며 컴퓨터 운영체제 중 하나인 UNIX를 개발하기 위해 사용되었다. 고급 언어로 분류하지만 저급 언어인 어셈블리 언어와도 가까워 시스템 프로그래머들이 많이 찾는다. 여기에서 저급 언어에 가깝다는 말은 메모리나 스택, 레지스터 등을 직접 조작할 수도 있을 정도로 처음부터 컴퓨터 시스템과 밀접한 연관이 있도록 언어를 설계했다는 의미다. 심지어는 어셈블리 언어와 혼용해서 사용할 수 있게 문법을 지원한다.

 

고급 언어인 만큼 사람이 읽기 비교적 쉬운 언어이며, C++ 언어 와 라이브러리나 소스코드를 혼용하여 사용할 수도 있기에 컴파일만 할 수 있다면 어떤 컴퓨터용 프로그램이든 다 만들 수 있다. 실제로도 C언어는 저급 언어에 가깝고 다른 고급 언어에 비해 결과물인 바이너리 코드와도 상당히 친화적이어서 라이브러리 개발은 많은 경우 C를 사용한다. 다만 절차 지향 언어인 만큼 현재는 C 언어보다 개발 속도나 유지보수 측면에서 훨씬 유리한 언어가 많고, 큰 장점 중 하나였던 속도마저도 일반적인 PC 환경이나 모바일 환경 기준으로도 프로세싱 파워가 전반적으로 올라가서 굳이 불편함을 감수하면서까지 속도를 추구할 필요가 없어졌고, 개발 추세가 웹 기반이나 스크립트 언어 기반, 또는 가상 머신(C#이나 Java) 기반을 사용하는 쪽으로 변하면서 일반 응용 소프트웨어 개발에서는 거의 사용하지 않는 언어가 되었다. 심지어 짧은 시간에 많은 연산을 수행해야 하는 분야(이를테면 게임)에서도 C++ 언어의 컴파일러 최적화가 아주 극단적으로 발달하여 C를 써서 얻을 수 있는 이점이 거의 없는 상황이다.


그렇지만 거의 컴퓨터 언어의 표준으로 봐도 무방할 정도로 대중적으로 쓰인 언어였으며 현재까지도 지대한 영향력을 끼치고 있는 만큼 현존하는 많은 언어가 C에서 직접 파생되었거나 C와 유사한 문법 체계를 갖고 있으며, 임베디드 시스템, IoT등 고차원적인 지원을 받을 수 없고 최적화가 극단적으로 필요한 분야, 로우레벨을 직접 다룰 수밖에 없는 운영체제나 시스템 프로그래밍 분야에서는 여전히 많이 사용한다.

1-1. 컴퓨터 프로그래밍을 배우는 사람들에게 C언어는...

C언어는 그 입지와 위상 때문에 프로그래밍 입문용 언어로 선택하는 경우가 제법 많다. 특히 컴퓨터학과 등 컴퓨터를 본격적으로 다루는 학과에서는 후에 이어지는 커리큘럼과의 연계성 때문에 C언어를 1학년 필수 교양 과목으로 가르친다. 하지만 C언어가 초보자에게 적절한 언어인지에 관해서는 상당히 많은 논란과 논의를 찾아볼 수 있다.

C언어는 하이레벨 언어와 로우레벨 언어의 특성을 모두 갖추고 있으며, 반면 최근의 여러 고급 언어들은 언어에서 코드를 작성하면서 로우레벨한 부분을 최대한 신경쓰지 않도록 디자인한다. 로우레벨하다는 의미는 코드가 작동하는 장치의 규격, 특성에 의존성이 많이 생긴다는 의미이고, 이는 같은 코드가 최대한 다양한 플랫폼에서 동작하게끔 하려는 요즘 추세와는 맞지 않는다. 이 문제 외에도 사용자가 언어 외적인 사항들은 최대한 신경을 쓰지 않고 프로그램을 구성하는 논리만으로도 충분히 동작하는 결과물을 만들어낼 수 있게 하려는 추세와도 맞지 않는다고 볼 수 있다.

초보자에게는 전자보다는 후자가 훨씬 큰 문제가 된다. C언어로 Hello World!를 출력하는 아주 간단한 예시만 보더라도 당장 초보자에게 똑부러지게 설명할 길이 없는 include나 int main() 함수 정의, return 타입의 의미, 문자열 리터럴의 \n 기호 등등이 등장한다. 이 모든 부분은 C언어와 나아가서 컴퓨터 작동 원리를 이해하고 있다면 당연하게 받아들일 수 있지만, 반대로 그러한 이해가 없으면 아주 간단한 수준의 C코드조차도 피상적으로 이해할 수밖에 없다는 이야기가 된다. 컴퓨터 구조를 모르면서 C언어를 배우는 초보자들이 겪는 가장 어려운 난관인 포인터 역시 메모리 구조를 직관적으로 접근한다는 측면에서는 유용하지만, 되려 포인터를 먼저 배운 사용자들이 다른 언어의 레퍼런스 변수 개념을 잘 이해하지 못하는 상황도 생긴다.

반면 C언어의 로우레벨한 부분이 오히려 학습에 도움이 되는 측면도 있다. 컴퓨터 언어가 아니라 컴퓨터 시스템의 동작 원리를 익히고 이해하는데는 C언어가 더 낫고, 다른 언어는 언어에서 제공하는 환경 바깥에 있는 영역은 추상화하여 제공하므로 그 이면에서 컴퓨터가 어떤 식으로 동작하는지는 배울 기회가 줄어든다. 게다가 최근의 언어는 언어가 동작하는 기반에 인터프리터나 가상머신, JIT 컴파일러 등 학부 고학년 혹은 그 이상의 지식의 있어야만 이해할 수 있는 기술이 사용되므로 초보자가 컴퓨터를 깊게 이해하는데는 전혀 도움이 되지 않을수도 있다.


최근에는 대학에서도 별도의 신입생 커리큘럼을 만들어 C와 별도의 언어(Python)을 가르치거나, 아예 신입생에게는 C를 가르치지 않는 사례가 늘고 있다.


2. C 계열 언어

C 계열 언어는 확장 문법을 제공하는 언어와 비슷한 문법을 차용한 언어로 구분할 수 있다.

2.1. C++ 언어

<a href="/wp-d/57b492a8e8f921dc45dc466c/View">C++ 언어</a>는 C 언어에 객체 지향 문법을 비롯하여 다양한 개념과 기능을 추가한 언어다. 따라서 대부분의 C++ 컴파일러는 C언어 컴파일 역시 지원하고(extern "C"나 stdcall 등의 기능을 사용하면 소스코드 레벨에서 혼용도 가능하다), 이때문에 상당히 많은 사람들이 C++이 C언어의 완전한 상위 호환 (혹은 C가 C++의 부분집합)이라고 생각하는 경우가 많은데, 사실 두 언어는 서로 독자적인 표준 체계를 따르므로 별개의 언어로 보는 것이 타당하다. 하지만 초기의 C++ 언어는 기계어나 어셈블리어로 바로 대응하는 컴파일러가 존재하지 않고 C++언어를 C언어로 변환해주는 컴파일러를 거쳐서 기계어로 컴파일한 역사가 있다. 이때문에 태생적으로 C와 근본적으로 유사한 부분이 많고, 이 부분이 아래의 Objective-C 언어와 다른 점이기도 하다.

C++과 C언어의 가장 중요한 차이점으로 객체 지향을 주로 꼽는데, 객체 지향 문법(class 등)은 C의 구조체 문법의 확장형이며 C++의 무수한 기능 중 한 가지다. C++의 진짜 강점은 C의 매크로 기능과 C++의 Template 기능 등을 통하여 전처리 단계에서 소스 코드 구조를 바꿔버리는 메타 프로그래밍이 가능하다는 점이고, 유명한 C++ 라이브러리인 Boost 를 비롯하여 잘 구성된 라이브러리나 프레임워크 코드를 보면 C++이 아니라 일종의 C++ 확장 언어를 구현해놓은 경우가 많다. 최근의 C++ 표준을 보면 lambda나 anonymous function처럼 다른 언어에서 사용하는 문법을 차용해서 유행을 꾸준히 따라가려는 모습을 볼 수 있다.

2.2. Objective-C 언어

Objective-C 언어는 C 언어에 객체 지향 문법을 추가한 것으로, 독자적인 객체 지향 문법 체계를 가지고 있어 Objective-C 입문자는 이 부분에서 어려움을 겪기도 한다. 주로 Apple의 OS X 및 iOS 개발에 사용되고 있지만 점차 Swift 언어로 넘어가는 추세이다.

2.3. Java 언어

C 언어의 문법을 기반으로 설계된 언어이며, Java라는 언어 이름을 커피 품종에서 따왔다는 일화가 유명하다. 현재 전세계 사용률 1위임을 마케팅 포인트로 삼고 있으며, 실제로 웹서버나 임베디드 환경 등 눈에 띄지 않는 부분에 많이 활용되고 있다. 컴파일 결과물이 타겟 머신의 바이너리 코드가 대신 바이트코드가 되고 이를 해석하는 가상머신에서 코드를 실행하기 때문에 가능한데, 즉 한번 컴파일하여 나온 바이트코드를 각자 다른 환경에 맞춰 개발된 Java 가상 머신에서 이론적으로 전부 동일하게 구동할 수 있기 때문이다. 이 때문에 이식성을 가장 강력한 장점으로 내세우며, 이같은 접근법은 다른 여러 언어에도 영향을 미쳤다. Python같은 인터프리터 언어도 문자열로 구성된 코드를 바이트코드 형태로 미리 해석해둬서 해석 속도를 올리고, .NET 환경에서 작동하는 C# 역시 영향을 받았다고 볼 수 있다. 다만 현재 기준으로 Java는 많이 낡은 언어고 문법에 제약이 많아 최근의 소프트웨어 개발에 어울리지 않는다는 지적도 나오고 있다. 이때문에 자바가 아닌 다른 언어를 자바 가상 머신용 바이트코드로 컴파일해서 사용하는 경우도 많다.

2.4. C# 언어

<a href="/wp-d/57babb3e517b12db2ad74ab8/View">C# 언어</a>는 C 언어의 문법을 차용해온 언어로, JIT (Just-In-Time) 컴파일 언어이며 CIL 어셈블리 코드로 동작한다. 바이트코드를 사용하며 JIT 기술도 사용하는 Java와 유사한 접근법을 사용한다고 볼 수 있다. 각종 언어들의 특색을 C#에 맞게 변경하여 도입하는 경우가 많아 찾는 사람이 늘고 있으며, 특히 Unity 엔진에서 주로 사용되어 사용률이 많이 늘었다. 언어의 태생부터가 마이크로소프트에서 .NET 프레임워크 도입과 더불어 이에 맞춰 만들어낸 언어이기 때문에 예전부터 꾸준히 마이크로소프트의 강력한 지원을 받고 있으며, .NET의 오픈소스 구현체인 mono프레임워크와 이를 기반으로 작동하는 Unity 등을 인수하거나 서로 협업하면서 멀티플랫폼 언어로서의 입지를 다지고 있기 때문에 앞으로의 미래가 밝다. 초기 버전은 Java와 문법이 비슷해 서로 변환해서 사용하는 것도 가능했으나 버전이 올라감에 따라 Java에서 C#으로는 변환이 가능하나 C#에서 Java로는 변환이 어렵게 되었다.