본문 바로가기

BackEnd/C

1. C 프로그래밍의 이해

반응형
1. CPU와 어셈블리 언어

1) CPU : 
- 1과 0밖에 모름

2) 바이너리 코드:
CPU가 인식할 수 있는 1,0으로 이루어진 명령어, 기계어
- 실행파일을 만들기위한 재료

2) 실행파일:
- 확장자가 exe인 파일로 프로그래머가 최종적으로 만들려는것, 
- CPU에게 일을 시키기 위한 바이너리 코드로 이루어짐
- 최종적으로 CPU에게 일을 시키기 위한 바이너리 형태의 명령어를, 운영체제에서 요구하는 포맷에 맞춰서 구성한 파일

 
3) 어셈블리 언어: 
- CPU에게 일을 시키기 위한 바이너리코드로 이루어진 명령어들을 사람들이 이해하기 쉬운 형태로 조금 발전시킨 언어, 

- 하지만 사람보다 하드웨어(CPU)에 훨씬 더 가까운 언어라서 어셈블리 언어를 잘 알려면 CPU구조를 잘 이해 해야한다.

4) CPU와 어셈블리 언어의 관계
- CPU가 만들어지면 그에 맞는 어셈블리 언어문법체계도 각각 만들어진다.
- 즉 CPU에 따라서 어셈블리 언어가 결정되어진다.
- 결국, 어셈블리 언어는 CPU별로 독립적이다.

5) 어셈블러
- 어셈블리 언어로 만들어진 프로그램은 어셈블러를 통해 CPU가 이해할 수 있는 바이너리 코드(0,1)로 변환될 수 있다.
- 이 어셈블러 역시 CPU마다 다르다. 왜냐하면 어셈블리 언어가 CPU마다 다르기 때문에 , 어셈블리 코드를 바이너리코드로 변환하는 어셈블러 역시 다를 수 밖에 없다.




2. C언어의 특징과 컴파일러

어셈블리 언어는 CPU의 내부구조도 잘 알아야 할 뿐만 아니라 배우는데도 오래걸리고, 인


간적인 사고로 복잡한걸 표현하는데도 제한이 있음.


그래서 탄생한게  프로그래밍 언어고 대표적인게 사람이 이해하기 쉬운 C언어와 같은것인데


     C언어로 프로그램을 만들면 컴파일러가 알아서 어셈블리 코드로 바꿔준다.


그리고 다시 어셈블리 코드를 어셈블러가 바이너리코드로 바꿔주는 것이다.




3. 바이너리 코드는 어떻게 실행파일이 되는가?




바이너리코드가 자체가 실행파일은 아니다. 


프로그램의 실행파일은 운영체제에 매우 의존적이다.


왜냐하면 프로그램들은 운영체제 위에서 동작하도록 되어있다.


그렇기 때문에 실제 프로그램을 실행시키는것은 CPU위에서 동작하는 운영체제이다.


그래서 실행 파일은 운영체제가 이해 할 수 있도록 만들어야하고 운영체제에 의존적이다.


그래서 실행파일은 다른 운영체제에서는 실행이 불가하다.


즉 바이너리 코드를 각 운영체제의 실행파일 포맷(구성형태)에 맞춰서 구성해야 한다.


그것을 바로 링커(Linker)라는 프로그램이 해준다.  


1 단계) C언어로 프로그램을 작성(소스 파일)


2 단계) 이 프로그램을 컴파일러가 컴파일하여 어셈블리 코드로 만들고 


3 단계) 어셈블러가 어셈블리 코드를 오브젝트파일(바이너리파일)로 생성을 한다.

 -오브젝트파일 = 바이너리코드의 모음


4 단계) 링커가 오브젝트파일을 리눅스나,윈도우가 이해할수 있는 포맷으로 구성하여 실행파일을 만든다.



그래서 실행 파일이란 최종적으로 CPU에게 일을 시키기 위한 바이너리 형태의 명령어를, 운영체제에서 요구하는 포맷에 맞춰서 구성한 파일이다.

반응형