-
01. Introducing C프로그래밍 언어/C 2020. 3. 11. 20:25
01. Introducing C
When someone says "I want a programming language in which I need only say what I wish done", give him a lollipop.
C에 빠지기 전에 간단히 C에 대해 살펴보고 가려한다.
Section 1.1 에서는 C가 어디서 왔고 왜 만들어졌는지, 그리고 수년간 어떤 모습으로 변해왔는지 알아본다.
Section 1.2 에서는 C의 강점과 약점 그리고 C언어를 최대한 활용할 수 있는 방법에 대해 알아본다.
01. History of C
Origins
C는 Bell 연구소에서 개발하는 UNIX 운영체제를 만들기 위해 Ken Thompson, Dennis Ritchie 외 다수에 의해 작성됐다.
Bell 연구소에서 작성하는 C 컴파일러로 모든 기기에서 UNIX를 동작시킬 수 있었다.
Standardization
C는 1970년대에 계속 발전했고 특히 1977년도와 1979년도에 많은 발전을 이뤘다. 1978년도에 Brain Kernighan과 *Dennis Ritchie가 The C Programming Language라는 C언어에 대한 첫 책을 출간했고 곧 C 프로그래머들의 교과서가 되었다. 공식 표준의 부재로 *K&R 또는 하얀 책으로 불리는 이 책이 곧 표준이 되었다.
1970년대에는 상대적으로 C 프로그래머가 적었고 대부분이 UNIX를 사용했지만, 1980년대에는 점점 다양한 기기들로 컴파일러가 확장됐고 IBM PC 플랫폼으로도 C와 컴파일러가 확장되었다.
C는 폭발적인 인기와 함께 다양한 문제를 직면했는데, 프로그래머들이 교과서로 불린 K&R에 의존해 컴파일러를 작성한 것이다. 안타깝게도 K&R은 완벽하지 않았고 컴파일러들은 종종 다른 동작을 했다. 심지어 K&R은 C와 UNIX를 정확하게 구분해 설명하고 있지도 않고 출간된 후 계속 변화해왔다. 점점 표준의 필요성이 대두되고 표준이 없었다면 C의 장점인 Portability는 무용지물이 되었을 것이다.
1983년 ANSI의 도움으로 미국에서 표준을 만들기 시작했고 수많은 개정 끝에 1988년도에 완성하고 1989년 ANSI의 승인으로 배포되었다. 이 버전을 K&R C*와 구분하기 위해 *C89 또는 C90이라고 불렀다.
1995년도에 C는 수정된 부분이 있었고 새로운 표준을 1999년도에 발표했다. 이것이 지금의 표준으로 불리는 C99이다.
C-Based Languages
C는 현대의 프로그래밍 언어에 거대한 영향을 줬고 많은 부분이 닮았다. 많은 언어들 중 다음 언어들은 상당히 두드러진다.
- C++ 은 C의 모든 특징을 가졌지만 객체지향 언어라는 특징이 C와 다르다.
- Java 는 C++을 기반으로 C의 많은 특징을 갖고 있다.
- C# 은 C++과 Java에서 온 최신 언어다.
- Perl 은 간단한 스크립트 언어였지만 C의 많은 특징을 채택하며 발전했다.
이런 언어들의 인기를 생각하면 C보다 인기 있는 언어를 배우는 것이 더 좋을 것이라는 생각이 든다. 하지만 C언어를 가장 먼저 배워야 하는 세 가지 이유가 있다.
- C를 배우면 다른 C-Based 언어들에 대한 통찰력이 상당히 늘어난다. C-Based 언어를 먼저 학습한 프로그래머는 C에서 온 개념에서 낙담하기 쉽다.
- 주변에 C로 만든 프로그램이 많다. 그리고 그런 프로그램을 읽고 유지보수해야 한다.
- 메모리나 처리 속도에 한계가 있는 환경에서 C는 여전히 많이 쓰인다.
02. Strengths and Weaknesses of C
C는 운영체제와 시스템 소프트웨어를 작성하기 위해 고안된 언어로 여러 특징들이 있다.
- C is a low-level language
- C는 machine-level 개념을 제어하기 위한 권한을 제공한다.
- C는 컴퓨터의 내장 인스트럭션과 밀접하게 교신할 수 있는 기능을 제공한다.
- C is a small language
- C는 다른 언어들에 비해 제한적인 기능을 제공한다.
- 기능의 수를 적게 유지하기 위해 C는 표준 함수 라이브러리에 많이 의존한다.
이러한 특징들로부터 C언어의 다양한 강점과 약점들이 생긴다.
Strengths
-
Efficiency
효율성은 C의 대표적인 장점 중 하나다. C는 어셈블리 언어가 쓰이던 운영체제와 시스템 소프트웨어를 작성하는 분야를 위해 고안되었고 그 분야는 제한된 메모리와 빠른 동작이 중요한 분야기 때문에 자연스럽게 C는 높은 효율성을 갖게 되었다.
-
Portability
C의 컴파일러는 작고 만들기 쉬워서 널리 사용될 수 있었기 때문에 개인용 컴퓨터부터 슈퍼컴퓨터까지 거의 모든 컴퓨터가 C로 만들어진 프로그램을 사용했다.
-
Power
C의 거대한 자료구조와 연산자들은 C를 강력하게 만들었다.
-
Flexibility
C는 시스템 프로그래밍을 위해 고안됐음에도 상당히 유연한 문법을 갖고 있다. 대부분의 언어에서 제한하는 연산자 사용을 C에서는 허용하는데, 이런 유연성은 프로그래밍을 더 쉽게 해주기도 하지만 버그를 만들어 내기도 한다.
-
Standard library
C의 장점 중 하나는 방대한 양의 표준 라이브러리이다. 수백 가지의 입출력, 문자열 처리, 저장소 접근, 그리고 다양한 연산 함수들이 있다.
-
Integration with UNIX
C는 UNIX나 Linux에서 사용할 때 강력하다. 사실 몇몇 UNIX 툴은 유저가 C를 안다고 가정하기도 한다.
Weaknesses
C의 기계 친화적인 특징은 종종 단점이 되기도 한다.
-
C programs can be error-prone.
C의 유연성은 C를 오류에 취약하게 만든다. 다른 언어들에서 보통 잡아주는 프로그래밍 실수들을 C 컴파일러는 잡아주지 않는다. 실행 전까지 에러를 찾지 못하는 측면에서 C는 어셈블리 언어랑 많이 닮았다. 게다가 C는 프로그래머의 방심을 노린 함정이 몇 가지 있다. 나중에 세미콜론 하나가 무한루프를 발생시키고
&
하나가 런타임 에러를 발생시키는 현상을 보게 될 것이다. -
C programs can be difficult to understand.
C는 작은 언어(small language)라 다른 언어에는 없는 많은 기능들이 있다. 이런 기능들은 다양한 방법으로 묶일 수 있고, 그 결과 이해하기 힘든 프로그램을 작성하기도 한다.
다른 문제는 너무 간단한 C 프로그램이다. C는 컴퓨터 통신이 많은 발달을 이루지 못했을 때 만들어졌다. 그 결과 C는 입력과 편집이 쉬운 간결한 소스를 유지해야 했고 짧게 압축된 코드는 이해할 수 없게 작성할 수도 있다.
-
C 프로그램은 수정하기 어려울 수 있다.
C로 짜인 거대한 프로그램은 유지보수를 생각하고 만들지 않았다면 고치기 어렵다. 다른 언어들에서는 큰 프로그램을 작은 개념으로 나눌 수 있는 클래스나 패키지 같은 방법을 제공하지만 아쉽게도 C는 그런 기능들을 제공하지 않는다.
Effective Use of C
C를 효과적으로 사용하려면 장점을 정확하게 파악하고 단점을 피할 수 있어야 한다.
-
Learn how to avoid C pitfalls
최근의 컴파일러들은 일반적인 함정을 탐지하고 warning issue를 발생시키지만 컴파일러가 모든 함정들을 찾는 건 아니다. 함정을 피하는데 이 책을 뒤적이면서 느낌표 표시를 찾는 것이 도움이 될 것이다. 더 많은 함정들은 Andrew Koenig의 <C Traps and Pitfalls>에 소개되어 있다.
-
Use software tools to make programs more reliable
C 프로그래머들은 많은 도구들을 만들었다. C 도구 중 가장 유명한 것 중 하나는
lint
이다.lint
는 예전부터 UNIX의 기본 툴로 제공되었는데 대부분의 컴파일러보다 더 많은 에러를 찾아낼 수 있다. 만약lint
나 그와 비슷한 도구를 사용할 수 있다면 사용하는 것이 좋을 것이다.다른 유용한 툴은 디버거(debugger)이다. 보통 C의 많은 버그들은 컴파일러로 찾을 수 없고 작동 중 오류가 발생하거나 이상한 결과로 오류가 있음을 알게 된다. 따라서 C 프로그래머들은 디버거를 사용하는 것이 거의 의무화되어있다.
-
Take advantage of existing code libraries
C를 사용하는 장점 중 하나는 많은 C 프로그래머들이 있어왔다는 것이다. 그리고 그들은 많은 라이브러리를 만들어놨고 그 라이브러리를 너의 프로그램에 적용하는 것은 좋은 선택일 것이다. 좋은 라이브러리 코드를 얻는 것은 에러를 줄이는데 많은 도움을 주고 프로그래밍 노동 시간을 획기적으로 줄여준다.
-
Adopt a sensible set of coding convertions
코딩 규칙은 언어에 상관없이 프로그래머가 결정하게 되는 스타일이다. 모든 언어에서 좋은 코딩 규칙은 프로그램을 깔끔하고 읽기 쉽고 수정하기 쉽게 만들지만 특히 C에서는 아주 유연한 문법 덕분에 코드를 어떻게 짤 수 있는지는 무궁무진하다. 한눈에 이해할 수 있게 작성할 수 있고 아무도 읽을 수 없게 만들 수 있다.
-
Avoid "tricks" and overly complex code
C는 특유의 유연한 문법으로 프로그래밍 묘기를 장려한다. C에서는 작업을 처리할 수 있는 다양한 방법이 있고 프로그래머들은 종종 가장 간결한 방법을 선택한다. 하지만 너무 짧은 코드는 종종 이해하기 어렵기도 하다. 이 책에서, 나는 이해하기 쉽고 간결한 코드들을 소개해 줄 것이다.
-
Stick to the standard
대부분의 C 컴파일러는 표준에 맞지 않는 별도의 라이브러리를 제공한다. 다양한 환경에서 컴파일이 가능하도록 표준이 아닌 라이브러리는 정말 필요한 상황이 아니면 사용하지 않는 것이 좋다.
'프로그래밍 언어 > C' 카테고리의 다른 글
06. Loops (0) 2020.03.30 05. Selection Statements (0) 2020.03.21 03. Formatted Input/Output (0) 2020.03.19 02. C Fundamentals (0) 2020.03.12 기초의 중요성 (0) 2020.03.05