c, cpp

C언어의 이해

blackbearwow 2024. 5. 27. 15:20

개요

대학교를 막 들어가서 1학년 1학기에 C언어를 막 배우거나, C언어 문법 책을 사서 의미없이 무작정 문법을 익혔을 때가 있었다. 그때는 컴퓨터에 대해 아무것도 몰라서 그럴수밖에 없었지만, 지금은 여러 cs지식이 쌓여서 의미있게 문법을 익힐 수 있다.

초심으로 돌아가 C언어의 기본 문법을 다시 살펴보며 여러가지 의미를 살펴보려고 한다. 아직 C언어를 완벽하게 이해하기에는 많은 부분이 부족하지만 완벽하게 이해할 수 있다고 생각하지도 않는다. 처음 C언어 문법을 공부한지도 10년이 되어간다. 또 미래에는 다른 의미를 찾을 수 있겠지 생각하고 중간 정리를 한다.

역사

B언어가 성공함에 따라 C언어가 Unix에서 사용되기 위해 개발되었다. 그 이후 C언어가 가장 많이 사용되는 언어중 하나로 성장하게 되면서, C컴파일러와 함께 거의 모든 현대 아키텍처와 운영체제에서 가능하다. 

특징

운영체제, 드라이버, 네트워크 프로토콜 스택에서는 C언어가 많이 사용된다. 반면 앱에서는 C언어의 사용이 줄어들고 있다. 

C언어는 저레벨 메모리 접근을 제공하기위해, 컴파일되기 위해 디자인되었다. 

C언어는 모든 실행가능한 코드가 서브루틴(함수라고도 함)에 포함되어있다. 함수의 매개변수는 값을 복사하여 전달한다(값은 복사하고 포인터나 배열은 주소를 전달한다).

C는 다른 언어가 가지고있는 확실한 기능(객체 지향 또는 가비지 콜렉터)은 없지만, 종종 외부 라이브러리를 사용해 구현하거나 에뮬레이트할 수 있다.

객체지향 프로그래밍이 유명해지면서, C++이 C에서 객체지향을 지원하는 확장으로 나왔다. C++ 소스는 C 소스로 번역되고, C컴파일러가 컴파일한다.

사용

시스템 프로그래밍에 사용되는 근거

C는 운영체제와 임베디드 시스템 앱을 구현하는 시스템 프로그래밍에 사용된다. 그 이유는 다음과 같다:

  • C는 포인터로 메모리 접근이 가능해 시스템의 명확한 기능을 설정할 수 있다. - 실행중인 플랫폼을 완벽하게 제어할 수 있다.
  • 컴파일 후에는 많은 시스템 기능을 요구하지 않는다.
  • C언어의 상태와 표션식은 보통 목표 프로세서의 명령어의 순서에 잘 매핑되어있고, 결과적으로 시스템 자원에 대한 런타임 요구가 적다 - 실행하는데 빠르다.
  • C언어는 직접적인 메모리 할당과 해제를 컨트롤 할 수 있어서 효율적이고 예측 가능한 메모리 핸들링 명령이 있다.

한계

C언어가 유명하고 영향력 있어지고 크게 성공한 반면에, 문제가 있다.

  • malloc과 free같은 표준 동적 메모리 핸들링은 오류를 일으키기 쉽다 : 메모리가 할당되고 해제되지 않았을 때 메모리 누수가 일어나고 해제된 메모리의 접근도 있다.
  • 포인터와 메모리의 직접접근은 메모리 오염의 가능성을 의미한다.
  • 컴파일러로 만들어지는 프로그램은 적은 체크사항만 체크하므로, 프로그래머가 체크할게 많다. 버퍼 초과, 배열 경계 체크, 스택 오버플로우, 메모리 고갈, 경쟁 상태, 쓰레드 고립 등
  • scanf나 strncat같은 일부 표준 라이브러리 함수는 버퍼 초과를 야기할 수 있다.
  • 표준 라이브러리를 이용한 문자열 핸들링은 코드 집약적이고, 분명한 메모리 관리가 필요하다.
  • 언어가 객체지향을 직접적으로 지원하지 않는다.
  • C는 에러 핸들링을 위한 표준 지원이 부족하고, 에러 체크를 위해 리턴 코드만을 제공한다.

 

 

 

참고: https://en.wikipedia.org/wiki/C_(programming_language)

-