Ssssong += Dev

[C] 위키백과 읽기 - 1. C언어의 개발 배경과 특징 본문

개발/공부

[C] 위키백과 읽기 - 1. C언어의 개발 배경과 특징

ssong_dev 2022. 9. 13. 16:05

1. C언어

C언어

 

C (프로그래밍 언어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. C패러다임명령형 프로그래밍 (절차적 프로그래밍), 구조적 프로그래밍설계자데니스 리치개발자데니스 리치, 벨 연구소발표일1972년최근 버전C17최근 버전 출시

ko.wikipedia.org

개발 배경 :

리치와 톰슨에 의해 개발되던 유닉스 운영체제를 PDP-11로 포팅할 때 B 언어에서 부족한 바이트 접근기능을 보완하기 위해 C언어의 초기 버전이 개발되었다. 1973년 struct 자료형이 추가된 것으로 C언어는 유닉스의 대부분을 C로 쓸 수 있을 정도로 강력해졌다. 유닉스는 어셈블리가 아닌 언어로 구현된 최초의 운영체제 커널 중의 하나였다.

1977년 경, 리치와 존슨이 유닉스 운영체제의 이식성을 향상시키기 위해 C언어를 추가적으로 변경하였고 존슨의 Portable C Compiler는 새로운 플랫폼에서의 C 구현의 기초가 되었다.

 

C에서의 메모리 관리 : 

C언어로 개발된 프로그램은 메모리 입장에서 다음과 같은 할당 영역으로 나누어 생각한다.

  • 정적 변수: static을 이용하여 정적 변수임을 명시하고, 단 한 번만 초기화되며 프로그램이 시작할 때 생성되어 종료될 때까지 유지된다.
  • 동적 변수: (HEAP)영역을 이용하여 할당 함수를 호출하여 변수 영역을 할당 받아 사용하고, 해제 함수에 의해 반납한다.
  • 자동변수: 함수나 블록({ } 이용) 안에서 선언하는 지역변수를 사용하면 스택(STACK) 영역에서 자동 할당을 받는다.

 

CPU를 사용하여 개발하여 장치에 넣어 코드를 실행할 때, 힙 영역을 많이 사용하지는 않는다.

따라서 필요 없다면 메모리 공간을 할당할 필요도 없고 힙관리 프로그램 코드(함수를 개발툴에서 라이브러리 형태로 제공)도 필요하지 않는다.

만약 malloc 등의 함수를 사용하면, 힙 영역을 사용하겠다는 의미 이기 때문에 힙 영역을 개발자가 선언하여 관리 해야 한다.

이 때 힙관리 프로그램 코드는 자동으로 링크 된다. 물론 저 사양의 CPU 경우, 이 함수를 제공하지 않을 수 있는 컴파일러도 있을 수 있다.

 

* 지역 변수는 스택 또는 레지스터에 잡히는데 레지스터는 메모리가 아니다. 스택 또는 레지스터에 잡히는 여부는 프로그램의 복잡도와 최적화에 따라 달라진다. 함수의 기능이 간단하고 변수의 숫자가 적을 경우 레지스터로 자동 배치될 가능성이 높아진다.

 

 

각 특성별로 나누어 그룹을 지어 메모리에 배치 하는데, 이것을 링커가 한다. 이렇게 그룹은 나누는 것을 세그먼트(SEGMENT) 또는 섹션(SECTION)이라는 단어를 사용한다.

위의 그룹은 가장 기본적인 내용만을 표시 한 것이다. CPU와 컴파일 마다 다르다. 어떤 컴파일러는 더욱 세밀히 하기도 한다. 그리고 각 세그먼트 이름도 다르다.

 

Visual Studio의 맵 이름 예

변수형태SEGMENT

초기치 변수 DATA
초기치 없는 변수 BSS
프로그램 코드 TEXT
상수 CONST
HEAP
스택 STACK

 

 

 

라이브러리 : 

C언어 함수는 표준함수가 있고 개발 툴에서 제공하는 함수가 있다.

C 표준 라이브러리는 함수 형태와 기능이 정해져 있기 때문에 개발툴 별 같다는 특징이 있다.

 

<stdio.h>, <string.h>, <time.h> 등 여러 헤더를 제공한다.

 

C 표준 라이브러리 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. C 표준 라이브러리(C standard library)는 C 언어를 위한 표준 라이브러리로서, ANSI C 표준에 의해 명시되었다.[1] 이것은 상위 집합인 C POSIX 라이브러리와 동시에 개

ko.wikipedia.org

 

 

 

개발 도구 : 

 

GCC

유닉스 계열(리눅스)의 시스템에서 주로 사용하는 C/C++ 언어 개발 도구이다. (맥 또한 유닉스 계열이라서 사용해봤었다!)

X-Windows의 개발 도구로도 사용할 수 있다.

전자 장치의 개발 시 임베디드 OS 포팅에서, 리눅스 커널이나 리눅스 커널 기반으로 하는 OS 커널 자체를 개발하는 도구로 사용된다. 리눅스 커널 기반 임베디드에서 실행되는 응용 프로그램 역시 gcc를 많이 사용한다.

 

* 임베디드 시스템 : 기계나 기타 제어가 필요한 시스템에 대해 제어를 위한 특정 기능을 수행하는 컴퓨터 시스템

* 포팅 : 어느 한 플랫폼에서 작동하는 프로그램을 다른 운영체제에서 작동하도록 프로그램을 변경하는 것

* 운영 체제 커널 : 컴퓨터 운영 체제의 핵심이 되는 프로그램, 시스템의 모든 것을 완전히 통제한다. 운영 채제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다. 보완, 자원 관리, 추상화를 담당한다.

 

커널 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 커널이 응용 소프트웨어를 컴퓨터 하드웨어에 연결하고 있다. 컴퓨터 과학에서 커널(kernel)은 컴퓨터 운영 체제의 핵심이 되는 컴퓨터 프로그램으로, 시스템의

ko.wikipedia.org

 

 

Eclipse IDE for C/C++ Developers

C/C++ 언어를 제공하는 IDE(Integrated Development Environment, 통합 개발 환경)

 

* IDE : 공통된 개발자 툴을 하나의 그래픽 사용자 인터페이스(GUI)로 결합하는 애플리케이션을 구축하기 위한 소프트웨어

소스코드 편집기, 로컬 빌드 자동화, 디버거로 구성된다. Visual Studio, Eclipse, XCode 등이 있다.

 

IDE(통합 개발 환경)란? 개념, 기능, 필요성

통합 개발 환경(Integrated Development Environment, IDE)은 공통된 개발자 툴을 GUI(그래픽 사용자 인터페이스)로 결합하는 애플리케이션을 구축하는 소프트웨어입니다.

www.redhat.com

 

 

마이크로소프트 비주얼 스튜디오

마이크로소프트에서 개발, 판매하는 마이크로소프트 윈도우 환경에서 작동하는 개발도구이다. 현재는 C 뿐만 아니라 C++C# 등 다양한 언어를 지원하고 있지만 초기의 마이크로소프트 개발 도구는 C 언어로부터 출발하였다.

비주얼 스튜디오로는 윈도우 API를 이용한 GUI 프로그램, 명령 줄 인터페이스 환경으로 실행되는 Windows Console Application, 윈도우 서비스, 동적 링크 라이브러리 등의 형태로 소프트웨어를 개발할 수 있고, 최근 버전에서는 모바일 응용 소프트웨어 개발도 지원한다.

 

 

- 비주얼 스튜디오에서 사용 가능한 소프트웨어 개발 키트 및 라이브러리

* C 표준 라이브러리 : 표준 C에서 정의하는 라이브러리 함수를 거의 대부분 그대로 사용할 수 있다.

* Windows SDK : 윈도우 운영체제의 API를 사용할 수 있게 해주는 툴킷. 

* MFC : 윈도우 개발에 필요한 Windows API를 클래스로 래핑한 C++ 라이브러리

* DirectX : 윈도우에서 주로 게임 등을 개발할 때 사용하는 툴킷. 고속의 화면 제어, 음성지원, 3D 등을 지원한다.

 

 

 

디버깅 : 

보통 소프트웨어 개발에서 디버깅의 가장 일반적인 방법은 두가지이다.

 

1. IDE를 통해 소스 수준에서 디버깅한다.

일명 'BREAK POINT'를 설정하면 그 위치에서 멈추고 해당 상황을 파악할 수 있다.

변수의 형과 맞게 변수의 값을 표시한다.

 

2. 내부 변수나 기타 상황을 printf 함수로 출력하여 프로그램 상황을 표시한다.

printf 형태의 함수를 UART, 네트워크, USB 등과 연결하여 출력함으로써 프로그램 상황을 표시할 수 있다.

줄단위로 실행하기, 함수로 들어가기와 나오기 등 IDE에 따라 구성이 다양하다.

보통 IDE처럼 다양한 구성이 불가능할 때 많이 사용된다. 

 

* 리눅스 커널의 경우 printfk 함수로 출력하면 정해진 출력 메시지 파일태로 표시할 수 있다.

* MCU와 같은 전자장치의 개발에서 개인용 컴퓨터처럼 성능이 좋은 IDE을 만들기 쉽지 않다. 따라서 저 성능의 IDE을 사용하거나 UART등으로 상황을 출력해서 디버깅 하는 방법을 사용할 수 있다. 구성이 간단해서 개발 소스에 printf 형의 메시지 출력을 추가하면 된다. 개발자가 직접 해야하는 것이 번거롭다.

 

 

GDB

GCC를 기반으로 하는 디버깅 도구이다. 따라서 유닉스 계열에서 가장 일반적으로 실행된다.

 

- 응용 프로그램 디버깅

GCC 옵션을 디버깅이 되도록 설정하면 디버깅 테이블을 만든다. gdb 실행 중에 이것을 사용한다.

GDB를 실행하여 응용 프로그램을 실행하면서 break, 변수, 함수 등의 디버깅을 할 수 있다.

 

- 원격 디버깅

GCC에서 gdb는 서버 구조를 사용할 수 있다. gdb-server를 설치하면 네트워크를 통해 디버깅 환경을 구성할 수 있다.

 

- 커널 디버깅

원격 디버깅 모드는 리눅스 커널에 사용되는 소스 수준의 디버거인 KGDB에서도 사용된다.

KGDB를 사용하면 커널 개발자는 일반 응용 프로그램과 마찬가지로 커널을 디버깅할 수 있다. 

 

 

IDE 디버깅

비주얼 스튜디오나 이클립스 등의 도구들은 기본적으로 디버깅 방법을 제시한다. 이클립스 디버깅은 GDB와 연동해서 구성할 수 있다.