C언어의 좀 더 깊은 이해가 필요할 것 같아 새로운 내용도 같이 학습을 시작하고자 합니다.
C 프로그래밍: 현대적 접근이라는 원서를 번역해 놓은 포스팅을 보고 개인적으로 중요하다고 생각되는 포인트만 가져와 반복학습을 진행하고자 합니다. 번역 원문 링크에 대해서는 하단에 달아놓았습니다. 원문 링크를 통해서 내용을 학습하시고 다독하실 때 활용하시는 것도 괜찮을 것 같습니다.
유래
- C는 UNIX 운영체제의 산물이며, 벨 랩에서 일하던 켄 톰슨, 데니스 리치 등이 만들었다.
- 톰슨은 UNIX 개발을 지속하기 위해서 어셈블리어보다는 좀 더 고급 언어, B 언어를 개발했다.
- 리치는 B의 좀 더 발전된 언어를 제작했고, 이것을 New B라는 의미로, NB라고 이름 지었다.
- B에서 더더욱 발전해서 많이 달라진 형태가 되었는데, 이때 리치는 이것을 C라고 이름 지었다.
- C로의 전환은 많은 장점을 낳았는데, 그중 제일 중요한 것이 바로 확장성이다. 다른 컴퓨터에서도 돌아갈 수 있게 다양한 C 컴파일러를 제작하고 나서야 UNIX를 다양한 기기에서 사용할 수 있었다.
표준화
- 80년대가 되자 엄청나게 넓은 범위까지 퍼져나갔다. C 컴파일러는 순식간에 어느 운영체제든, 어느 컴퓨터이든 지원하기 시작했다. 특히 C 언어는 제일 발전 속도가 빨랐던 IBM의 PC 플랫폼 분야에서 엄청난 권위를 갖게 되었다.
- 그러나 표준 설명서가 없으니 C 언어에는 여러 가지 방언이 생겨서 C 언어가 갖고 있었던 확장성이라는 장점을 무색하게 만들었다.
- 여러 차례의 수정을 거쳐 88년에 마침내 표준은 완성되었고, 다음 해 12월 ANSI 규격 X3.159-1989로서 미국규격협회의 승인을 받으면서 공식화되었다. 표준화된 C 언어를 통상적으로 C89, 혹은 C90이라고 부른다.
C 기반 언어들
- C++은 C의 모든 특징을 갖고 있으나, 클래스와 다른 특징들이 추가되어 객체 지향 프로그래밍이 가능하다.
- Java는 C++에 기반하고 있는데, 그렇기에 C의 여러 특징을 공유하고 있다.
- C#은 비교적 최근 언어로, C++과 Java에 영향을 받아 만들어졌다.
- Perl은 본디 비교적 쉬운 프로그래밍 언어였다. 시간이 지나자 C의 많은 특징을 공유하기 시작했다.
장점과 단점
장단점을 이해하려면, 이 언어의 본 용도와 철학을 이해해야 할 것이다. 본 용도란 당연히 운영체제나 시스템 소프트웨어를 제작하는 것이다. C는 저급 언어이다. 운영체제처럼 시스템을 제어하는 언어들은 바이트 단위와 메모리 주소 값 등의 기계 수준의 개념까지 다룰 수 있어야 한다. 이러한 특징은 사실 다른 많은 언어에서는 제공하지 않는다. 대부분 직접 제어하지 않고 밑에서 미리 짜인 알고리즘에 의해 작동하기 때문이다. C는 또한 컴퓨터 자체에 내장된 지시들과 밀접하게 일치하는 연산을 제공한다. 이를 통해 C 언어로 짠 프로그램들은 매우 빨라질 수 있다. 애플리케이션 프로그램은 인풋/아웃풋, 저장공간 관리 등 여러 가지 서비스를 위해 그러한 연산들에 의존하기 때문에 운영체제는 느려서는 안 된다.
C는 작은 언어이다. C는 다른 언어들에 비해 매우 한정된 특징들을 제공한다. C 언어는 최대한 특징을 적게 갖고 있기 때문에 표준 함수들로 이뤄진 "라이브러리"에 매우 크게 의존한다.
C는 관대한 언어이다. C는 당신이 스스로 무엇을 하고 있는지 알고 있다고 가정을 하고 있기 때문에, 다른 언어들에 비해 좀 더 큰 자유를 선사한다. 이는 곧 C 언어는 에러가 발생했을 때 구체적으로 무엇이 일어났는지에 대해 알려주지 않는다.
장점
- 효율성. 효율성은 태초부터 C의 최고 강점 중 하나였다. C는 애초에 어셈블리어를 대체하기 위해 만들어졌기 때문에, C 언어로 짜인 프로그램들은 한정된 메모리가 내에서 최대한 빨라야 했다.
- 확장성. C 언어가 이렇게 확장성이 좋은 이유 중 하나는 C가 초창기에 UNIX와 관련이 있었기 때문이고, 후에 ANSI와 ISO에 의해 규격화되었기에 여러 가지의 방언들로 나뉘지 않았기 때문이다. 또 다른 이유는 C 컴파일러들은 상대적으로 규모가 작았고, 프로그래밍하기도 쉬웠기 때문이다. 또한 C 언어 자체에 확장성을 제공하는 특징들이 있었다.
- 강력함. C의 다양한 자료형들과 연산자들은 C를 강력한 언어로 만들어 주었다. C에선 힘든 작업을 몇 개의 줄만으로도 수행할 수 있다.
- 유연성. C가 본래 시스템 프로그램을 위해 만들어졌지만, 임베디드 시스템이나 상업적인 데이터 처리 등 온갖 애플리케이션을 제작하는 데 사용된다. 또한 C는 자신의 특징을 발현하는데 아주 적은 제한만을 둔다. 다른 언어에선 허용되지 않는 기능이 C 언어에서는 대부분 허용된다. 예를 들자면 C는 한 문자가 정숫값이나 실숫값에 추가될 수 있게 허용하고 있다.
- 표준 라이브러리. 표준 라이브러리는 C의 최고 강점 중 하나다. 표준 라이브러리란 인풋/아웃풋, 문자열 처리, 메모리 할당 등 여러 가지 유용한 함수들 수백 가지를 가진 저장고이다.
- UNIX와의 통합. C는 UNIX, 특히 UNIX의 변종인 Linux와 만났을 때 최고의 호흡을 보인다. 사실 몇 가지 UNIX의 기능들은 사용자가 C를 할 줄 안다는 전제하에 제공되기도 한다.
단점
- 에러가 나기 쉬울 수 있다. C의 유연성에는 그 이면이 있다. 바로 에러가 나기 쉽다는 점이다. 다른 언어에서는 쉽게 잡힐 실수들이 C 컴파일러에선 잡히지 않을 수가 있다.
- 이해하기 어려울 수 있다. C가 상대적으론 작은 언어라고는 하지만, 다른 언어들에는 없는 기능들이 여럿 있고, 이러한 기능들이 특히 자주 잘못 이해하는 경우가 많다. 이러한 특징들에 의해서 원작자는 이해하기 쉽겠지만 타인들은 이해하기 어려울 수 있다. 또 다른 문제는 C 언어의 간결함에 있다. C 언어는 현대보다 컴퓨터를 다루는 것이 제일 지루할 때 만들어졌기 때문에 C 언어는 의도적으로 프로그램을 만들거나 수정할 때 최대한 간결하게 해서 시간을 최대한 아끼려는 의도로 만들어졌다.
- 수정하기 어려울 수 있다. C로 짜인 규모가 큰 프로그램들은 만약 애초에 유지보수를 할 생각으로 만든 것이 아니라면 수정하기 매우 어려울 수 있다. 최근에 나오는 언어들은 주로 클래스나 패키지라고 큰 프로그램을 여러 단위로 나누어 좀 더 관리하기 쉽게 만드는데, C는 그런 기능들이 없다.
C를 효과적으로 사용하는 법
- 실수를 줄이는 방법을 익힌다.
- 소프트웨어 도구를 사용한다. 제일 유명한 C 도구 중 하나는 lint인데, lint는 UNIX 운영체제에서 기본적으로 제공되는 프로그램이다. lint는 대부분의 C 컴파일러들보다 더 광범위한 에러 분석을 제공한다. 다른 유용한 도구는 디버거이다. C 컴파일러는 알다시피 대부분의 버그를 잡아낼 수 없어 실행에 에러가 발생하거나 잘못된 출력을 하게 된다. 결국 좋은 디버거를 사용하는 것은 C 언어로 프로그래밍하는 사람에게 있어 필수라고 할 수 있다.
- 코드 라이브러리들을 활용하여 코드를 안정화한다. C 코드들은 보통 라이브러리라고 함수들의 집합에 저장되어있는데, 이러한 좋은 라이브러리를 가진 것은 에러를 줄이는 데에 도움이 될 뿐만 아니라 시간을 절약해 준다. 보통 자주 사용되는 라이브러리들은 많은 사람이 통상적으로 자주 사용하는 것들인데, 대표적으로 UI 개발, 그래픽, 커뮤니케이션, 데이터베이스 관리와 네트워크 등이 있다.
- 실용적인 코딩 버릇을 들인다. 다른 언어에서도 코딩할 때 일정 스타일을 따르는 것은 중요하겠지만 C에서는 특히나 더 중요하다. 위에서도 말했듯, C 언어가 갖는 유연성은 가독성을 떨어뜨린다고 했다.
- 허세 부리지 말고 코드는 간결하게 하라. 사람들은 주로 가장 간결한 해답을 고르는 경향이 있다. 그렇다고 너무 나가서 허세 부려서는 안 된다. 어쩔 땐 가장 짧은 코드가 가장 이해하기 어려운 코드이다. 이 책에서는 최대한 간결하면서도 가독성 있는 방식으로 코딩을 공부할 것이다.
- 표준을 지켜라. 대부분의 C 컴파일러는 C89나 C99에 속하지 않는 새로운 C 언어의 기능이나 라이브러리를 지원할 것이다. 하지만, 확장성을 위해선 최대한 이러한 새로운 기능은 정말로 필요하지 않은 이상 지양하는 것이 좋다.
- 요약 내용의 번역 원문은 아래 링크 바로가기를 눌러주세요.
- 번역 원문 링크 바로가기 : C 프로그래밍: 현대적 접근 - WikiDocs
댓글