상세 컨텐츠

본문 제목

[IT] C언어란? (C언어 정리)

지식

by _BlankSpace 2017. 7. 4. 23:42

본문

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

최근 들어서, 4차 산업 혁명이다 인공지능이다 자율 자동차다 하면서 IT에 대한 관심들이 높아지고 있습니다. 하지만, 이러한 용어들은 결국 심화된 내용들입니다. 따라서 용어를 쉽게 접해서 쉽겠지라고 생각하신다면 정말 큰 코 다칠 수 있습니다. 그래서, 오늘은 이러한 심화된 내용을 가기 위한 도약으로 C언어에 대해서 정리하고자 합니다. 공대를 다니신 분이라면 C언어를 흔히 들어보셨으리라 생각합니다. 컴퓨터학부만 C언어를 하는 게 아니기 때문입니다. 물론, 반대로 컴퓨터학부가 C언어와 같은 SW만 공부하는 것도 아닙니다. 여하튼, 컴퓨터 언어의 기초이자 기본이라고 할 수 있는 것을 꼽자면 C언어라고 할 수 있습니다. 그만큼, C언어를 제대로 배우기만 한다면, 다른 언어도 쉽게 이해할 수 있다고 할만큼, 중요합니다. 하지만, 제대로 아는 것이 힘들겠죠. 여튼, 오늘은 C언어의 문법을 정리하는 것이 아니라 역사에 대해서 정리하겠습니다.

C언어는 1872년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 때, 그 당시 새롭게 개발된 유닉스 운영 체제에서 사용하기 위하여 개발한 프로그래밍 언어라고 합니다. (이 사람들 천재아닌가요.) 켄 톰슨은 BCPL언어를 필요에 따라서 변경하여 B언어를 만들었고, 데니스 리치는 이 B언어를 개선하여 C언어를 만들었다고 합니다. 따라서 유닉스 시스템의 프로그램 모두는 C로 작성되었고, 이것이 수많은 OS의 커널개발에도 사용되었다고 합니다.

C언어는 무엇인가요.

C언어는 모든 컴퓨터 시스템에서 사용할 수 있는 프로그래밍 언어라고 할 수 있습니다. 다양한 플랫폼에서 ANSI C의 정의에 따라 구현이 가능합니다. 모든 C 시스템에는 정규화된 표준 C 라이브러리가 존재합니다. 이러한 이유로 생성된 프로그램들은 높은 성능을 보이는 데, 이러한 점이 아직도 C언어가 사랑받을 수 있었다고 합니다.

하지만, C언어의 오래된 기술이 최근 기술 수준에는 부합하지 않는다는 의견이 있다고 합니다. (요즘은 워낙 쉽고, 엄청난 기능을 쉽게 개발할 수 있는 언어들이 많이들 나오거든요.)

C언어의 역사를 알아봅시다.

C언어의 초기 개발은 1969년부터 1973년까지 4년에 걸쳐서 데니스 리치가 개발하였습니다. 데니스 리치가 C언어라고 이름을 지은 이유는 켄 톰슨이 만든 B언어를 개선하여 만든것이므로 C언어라고 지었다고 합니다.

리치와 톰슨에 의해서 초기에 PDP-7의 어셈블러 언어로 구현되었던 유닉스 운영체제의 개발과 C언어의 기원은 밀접하게 연관되어 있다고 합니다. 그래서 결국 두 사람은 유닉스 운영체제를 PDP-11로 포팅하기로 결정하였다고 하네요.

K&R C라고 불리는 책은 커니핸과 리치의 앞 글자만 따서 C프로그래머들에게 K&R이라고 불린다고 합니다. 이 책은 2판에서부터 ANSI C 표준을 다루게 되었다고 합니다.

C 언어 표준이 상대적으로 정적으로 남아 있었던 동안에 C++은 표준화를 위해서 계속 변화하고 있었다고 합니다. 1995년에 1990년에 C표준에 대한 규약 수정안 1이 출판되었는 데, 약간의 세부 사항을 교정하고 국제적인 문자 세트에 대한 확장된 지원을 위한 것이었다고 합니다. C 언어 표준은 1990년대 후반에 개정되었고, 1999년에 ISO/IEC 9899:1999가 출간되고, 여기서 명시한 규범이 C99라고 부른다고 합니다. 그리고, 2011년에 ISO/IEC 9899:2011이 출간되고, 이것을 C11라고 부른다고 합니다.

C언어의 문법은 크게 연산자, 변수형, 포인터, 분기문으로 나뉩니다. 이 문법은 http://blankspace-dev.tistory.com/231 링크를 참고하시기 바랍니다.

C언어에서 가장 중요한 것은 메모리 관리라고 할 수 있습니다.

메모리 관리란 OS에서 응용 프로그램을 실행하거나, CPU의 프로그램을 실행하기 위해서 여러가지 영역으로 나누어 메모리를 할당하고, 이를 메모리에 올려 실행할때의 메모리를 관리하는 것을 말합니다. OS는 주로 저장장치에서 실행 파일을 메모리에 올려서 실행 합니다. 따라서 프로그램에 필요한 메모리는 거의 RAM에서 할당하고, 실행합니다. CPU를 사용하는 장치는 OS가 없이 개발자가 설정한 메모리 배치에 따라서 코드를 ROM/FLASH에 생산할 때 쓰고, 전원 공급시 실행 합니다.

C언어로 프로그램을 개발할 때는 메모리를 크게 세가지 영역으로 나누어 생각할 수 있습니다. 첫째는 정적 변수입니다. static을 이용하여 정적 변수임을 명시하고, 한 번만 초기화되며, 프로그램이 시작할 때 생성되어 종료될 때까지 유지됩니다. 둘째로는 동적 변수입니다. 힙 영역을 이용하여, 할당 함수를 호출하여 변수 영역을 할당 받아서 사용하고, 해제 함수에 의해서 반납됩니다. 셋째로는 자동 변수입니다. 함수나 블록안에서 선언하는 지역변수를 사용하면, 스택영역에서 자동 할당을 받습니다.

CPU를 이용하여 개발할때, 장치에 넣어 코드를 실행하면 힙 영역을 많이 상요하지는 않는다고 합니다. 따라서 필요가 없다면 메모리 공간을 할당할 필요도 없고, 힙을 관리할 프로그램 코듣 필요하지 않습니다. 만약, malloc 등의 함수를 사용한다면, 힙 영역을 사용하겠다는 의미이므로 힙 영역을 개발자가 선언하여 관리해야 합니다.

C언어에는 라이브러리가 있습니다. C언어 함수는 표준함수가 있고, 개발 툴에서 제공하는 함수가 있습니다. 여러가지 부류가 있고, 특성 별로 나누고 lib 파일로 코드를 제공하면서 헤더파일로 선언을 알 수 있습니다. 이런 것을 모아서 라이브러리라고 합니다.

C언어를 개발하기 위한 도구로는 다음의 것들이 있습니다. 먼저, GCC입니다. GCC는 유닉스 계열의 시스템에서 주로 사용하는 C/C++  언어 개발 도구입니다. 리눅스의 운영체제를 컴파일하거나, 응용 프로그램 개발을 할 때 사용합니다. 임베디드 OS 포팅을 할때에도 리눅스 커널이나 리눅스 커널 기반으로 하는 OS 커널 자체를 개발하는 도구로 사용되기도 합니다. 다음으로는 gcc입니다. 여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로서, 프로그램을 컴파일할 수 있고 최종 프로그램을 만들 수 있는 과정을 서술하는 표준적인 문법도 가지고 있습니다. 또한, 구조로 기술된 파일을 해석하면서 프로그램 빌드로 수행할 수도 있습니다. 이러한 make 파일 서술을 위한 문법도 엄청난 분량으로 인터넷상에 있으니, 궁금하신 분들은 찾아보시기 바랍니다. 다름으로는 Cygwin입니다. 이것은 윈도우용 gcc라고 생각하시면 되겠습니다. 보통, 윈도우에서는 리눅스 개발이 불가능할 것이라고 생각할 수 있는데, cygwin을 이용하여 어느정도 맛보기 개발정도는 가능합니다.

C언어를 프로그래밍하면서, 프로그램의 덩치가 커지게 될 때, 오류가 발생했다면 오류를 어떻게 찾으실 건가요? 일일히, 한 줄씩 출력하면서 찾아가실 건가요? 그건, 엄청난 시간이 소요될 것입니다. 특히, 임베디드 시스템에선 말입니다. 이때, 디버깅이라는 것을 사용해야합니다. 보통 소프트웨어 개발에서 디버깅의 일반적인 방법은 두 가지가 있습니다. 첫째는 IDE를 통해서 소스 수준에서 디버깅을 진행하는 것입니다. Break Point를 설정하게 되면, 해당 위치에서 멈추고 해당 사황을 파악할 수 있습니다. 가장 중요한 파악 대상이 변수의 값으로 표시 화면에 해당 변수의 형과 맞게 변수의 값이 표시됩니다. 또한, 줄 단위로 실행하기, 함수로 들어가기와 나오기 등 IDE에 따라서 구성이 다양합니다. 둘째로는 내부 변수나 기타 상황을 print 형태의 함수를 네트워크나 USB 등과 연결하여 출력하면서 프로그램의 상황을 표시하는 방법입니다. 보통 IDE 처럼 다양한 구성이 불가능 할 때, 많이 사용한다고 하네요. 그리고 이러한 디버깅을 위한 툴도 있습니다. 리눅스를 사용해보신 분이라면 들어보셨을 법한 GDB입니다. GDB는 최강 기능을 자랑하는 디버깅 툴이라고 할 수 있습니다. 이것은 유닉스 계열에서 일반적으로 사용됩니다. 먼저, 응용 프로그램을 디버깅할 때입니다. GCC 옵션을 디버깅이 되도록 설정하면 디버깅 테이블을 만듭니다. gdb 실행 중에 사용하고, gdb를 실행하여 응용 프로그램을 실행하면서 break, 변수, 함수 등을 디버깅할 수 있습니다. 둘째로는 원격 디버깅입니다. GCC에서 gdb는 서버 구조에서도 사용할 수 있습니다. gdb-server를 설치하면 네트워크를 통해서 디버깅 환경을 구성할 수도 있습니다. 예를 들면, 임베디드 개발을 할때, 리눅스 커널을 포팅하고, 해당 리눅스 시스템에 gdb-server 를 설치하면 다른 환경에서도 이를 통해서 응용 프로그램을 디버깅 할 수 있습니다. 보통, nfs 환경이라고 하죠. 이것을 이용해서 원격으로 디버깅하게되면 임베디드 개발 시 굉장히 편함을 느낄 수 있을거에요. 다음으로는 커널 디버깅입니다. 원격 디버깅 모드는 리눅스 커널에 사용되는 소스 수준의 디버거인 KGDB에서도 사용됩니다. 마지막으로는 IDE 디버깅입니다. 보통, 비주얼 스튜디오나 이클립스 등의 도구들은 기본적으로 디버깅 방법을 따로 제시합니다. 이것도 굉장히 편하고, GUI이므로 입문자들이 사용하는 데 편리할 것입니다.

이상 C언어에 대해서 정리해보았습니다. 많이 도움이 되었는 지 모르겠습니다. 4차 산업혁명이 대두되면서, C언어에 대해서 관심이 많이 쏠리고 있는데, 그 기본이 되는 C언어에 대해서 잘 이해하신다면, 좋지 않을까 싶습니다. 이상 글을 마치겠습니다. 읽어주셔서 감사합니다.

관련글 더보기

댓글 영역