1.2 Strengths and Weaknesses of C

 다른 프로그래밍 언어들처럼, C도 장단점이 있다. 장단점 모두 언어의 초기 사용법과 근본 철학에서 나온다. 다음은 C의 근본 철학이다.

  • C는 low-level언어이다. 시스템 프로그래밍에 최적화하기 위해서, C는 다른 언어들이 숨기려고 하는 기계적 수준의 개념(바이트나 주소값)에 접근하는 것을 제공해야한다. 또한 C는 컴퓨터 내부 부품에 가깝게 소통하는 명령을 제공하여 빠른 속도의 프로그램을 제공해야한다. 애플리케이션 프로그램이 입출력 저장관리에 의존하기 때문에, 수많은 서비스들, OS는 느리게 동작해서는 안된다.

 

  • C는 작은 언어이다. C는 다른 언어들에 비해 제공되는 기능이 제한되어있다. 기능을 줄여, C는 '라이브러리'라는 표준 기능에 크게 의존한다. 

 

  • C는 관대한 언어이다. C는 무엇을 하든 허용해주기에 다른 언어들보다 자유도가 높다. 게다가 C는 다른 언어에서 볼수 있는 디테일한 에러체크를 할 수 있는 권한이 없다.

Strengths

  • 효율성. 효율성은 처음부터 C의 장점중 하나였다. 전통적으로 어셈블리어로 작성해오던 애플리케이션들을 대체했기 때문이다. 이것은 C프로그램이 빠르게 돌아가고, 제한된 양의 메모리를 사용하는 데 중요한 역할을 한다.

 

  • 이식성. C의 첫번째 목표가 프로그램 이식성이 아니긴 했지만, 이 언어의 강점중 하나로 밝혀졌다. 컴퓨터에서 슈퍼컴퓨터까지의 범위에서 작동하는 프로그램은 대부분 C로 쓰여졌다. C프로그램 이식성의 이유중 하나는, UNIX와의 연계와 ANSI/ISO표준 덕분에, 모순되지 않는 야매가 생기지 않았다는 것이다. 또다른 이유는, C 컴파일러가 작고 읽기 쉬워 넓게 사용되게 만드는데 도움을 준 것이다. 결국 C는 이식성이라는 특성을 스스로 가지게 되었다.

 

  • 파워. C의 방대한 데이터 형과 연산자는 이 언어를 강력하게 만들었다. 종종 적은 줄의 코드로도 상당히 많은것을 이뤄낼 수 있게 해주었다.

 

  • 융통성. C가 시스템 프로그래밍을 위해 디자인되기는 했지만, 그 분야에만 제한되지 않았다. C는 이제 모든 종류의 어플리케이션에도 사용된다. 임베디드 시스템부터 상업 데이터 프로세싱, 게다가 C는 다른 언어에서 불가능한 연산이 종종 허용되는 등 기능 사용에 대해 제한이 매우 적다. C를 사용했을 때 문자를 정수값이나 부동 소숫점이 있는 수에 추가할 수 있다. 이러한 융통성은 일부 버그를 통과시킬 수 있지만, 프로그래밍을 쉽게 만들수도 있다.

 

  • 표준 라이브러리. C의 가장 큰 강점중 하나는 입력/출력, 문자열처리, 스토리지 할당 및 기타 유용한 작업에 대해 수백가지 기능을 포함하는 표준 라이브러리이다.

 

  • UNIX 통합 환경. C는 UNIX 혹은 LINUX 와 함께 사용할 때 특히 강력하다. 실제로 일부 UNIX 도구는 사용자가 C를 알고있다고 가정하기도 한다.

 

Weaknesses

  • C프로그램은 오류가 잘 생긴다. C의 융통성은 오히려 오류가 발생하기 쉽다는 단점이 있다. 다른 많은 언어에서 감지해주는 프로그래밍 실수는 C컴파일러에 의해서는 감지되지 않는다. 이런점에서, 대부분의 오류가 프로그램이 실행될 때까지 감지되지 않는 어셈블리언어와 유사하다. 게다가, C는 조심하지 않는다면 걸릴 수 있는 함정이 많다. 뒤에서 다루겠지만, 추가 세미콜론이 무한 루프 또는 &기호를 누락시키는 경우가 있다.

 

  • C프로그램은 이해하기 어려울 수 있다. C는 대부분 작은 언어지만, 다른 프로그래밍 언어들에서 찾을 수 없는 여러 기능을 갖고 있다. 이러한 기능들은 다양하게 결합할 수 있는데, 프로그램의 작성자만 알아보기 쉬운 코드가 나올 수 있다. 또, C프로그램이 간결한 특성도 단점이 될 수 있다. C는 컴퓨터와 상호작용이 힘든 경우에 최적화되어 설계되었다. 그 결과, C는 프로그램 입력 및 편집에 필요한 시간을 최소화하기 위해 의도적으로 간결하게 유지되었다. C의 유연성 또한 단점이 될 수 있는데, 자신이 만들고도 이해하기 어려워하는 프로그래머들이 생긴다.

 

  • C프로그램은 수정이 어려울 수 있다. C로 작성된 대형 프로그램은 유지보수를 염두에 두고 설계되지 않은 경우 변경하기 어려울 수 있다. 현대의 프로그래밍 언어는 일반적으로 큰 프로그램을 보다 관리하기 쉬운 부분으로 나누는 것을 지원하는 클래스나 패키지 같은 기능을 제공하지만, C는 그런 기능들이 없다.

 

Effective Use of C

C를 효과적으로 사용하기 위해서 C의 장점만 활용하고, 단점을 피한다.

  • C pitfalls(함정)을 피하는 방법을 배운다. 이 책에서 함정 표시가 있는데, 그것에 주의하여 읽는다. 

 

  • 소프트웨어 도구를 사용하여 프로그램의 안정성을 높인다. C프로그래머는 툴 빌더/유저이다. LINT라는 이름의 C도구가 있는데, 전통적으로 UNIX와 함꼐 제공되며 대부분의 C 컴파일러보다 더 광범위한 오류 분석을 프로그램에 적용할 수 있다. LINT나 유사 프로그램을 사용할 수 있다면 사용하는 것이 좋다. 또한 디버그라는 유용한 도구도 있다. C의 특성상 C컴파일러에 의해 많은 버그를 잡기 힘들다. 대신 런타임오류 혹은 잘못된 출력으로 나온다. 그래서 좋은 디버거를 사용하는 것이 C프로그래머들에게 사실상 필수이다.

 

  • 기존 코드 라이브러리를 활용한다. 많은 사람들이 C를 사용하기에 가질 수 있는 이점중 하나이다. C코드는 종종 라이브러리(기능을 모아둔 것)이 번들로 제공된다. 적합한 라이브러리를 구하는 것은 오류를 줄이고 프로그래밍 노력을 상당히 절약할 수 있는 좋은 방법이다. 공통 업무, 사용자 인터페이스 개발, 그래픽, 통신, 데이터베이스 관리 및 네트워킹을 포함한 라이브러리를 쉽게 이용할 수 있다. 어떤 라이브러리들은 퍼블릭 도메인에 존재하고, 오픈소스에도 있으며, 유료로 팔기도 한다.

 

  • 합리적인 일련의 코딩 규약을 채택한다. 코딩 규칙은 언어에 의해 시행되지 않더라도 프로그래머가 채택하기로 결정한 스타일 규칙이다. 잘 선택된 규칙은 프로그램을 보다 균일하고 읽기 쉽고 수정하기 쉽게 한다. 규칙은 프로그래밍 언어를 사용할 때 중요하지만, 특히 C를 사용할 때는 더욱 중요하다. 위에서 언급한 바와 같이, C의 유연성이 뛰어나서 프로그래머들은 거의 읽을 수 없는 코드를 작성하기도 한다. 

 

  • '트릭'을 피하고, 과도하게 복잡한 코드는 피해라. C는 트릭을 지원한다. C로 주어진 작업을 수행하는 방법이 여러가지가 있는데, 프로그래머들은 종종 가장 간단하고 간결한 코드를 선택하려고 한다. 그러나, 종종 가장 짧은 해결책은 이해하기 어려운 코드를 낳는다. 

 

  • 표준을 준수한다. 대부분의 C컴파일러는 C89 C99표준의 일부가 아닌 언어기능과 라이브러리 기능을 제공한다. 이식성을 위해서 반드시 필요하지 않은 경우, 비표준 기능, 비표준 라이브러리를 사용하지 않는 것이 가장 좋다.

 

+ Recent posts