모두의 dream

컴파일 과정과 argc/argv 본문

공부 정리

컴파일 과정과 argc/argv

오리꽥이로 2022. 1. 10. 17:58
Contents 접기

1. 컴파일 과정

소스코드 -> 전처리기(소스파일) -> 컴파일러(어셈블리 언어) -> 어셈블러(오브젝트 코드) -> 링커 -> 합쳐진 오브젝트 코드

 

(1) 전처리 (Precompile)

#include한 내용들이(ex. 헤더파일) 내가 작성한 파일에 포함됨. (전처리기가 역할 수행)

이외에도 주석을 제거하거나, 매크로를 치환한다.

(함수 -> 특정 기능을 하는 소스코드를 묶어놓은 것 -> 그 함수들을 헤더파일에 정의되어 있음 -> 그러므로 헤더파일에 가서 함수를 찾아오는거임)

 

(2) 컴파일 (Compile)

C언어(고급언어) 로 작성한 소스코드를 컴퓨터가 알아볼 수 있는 저급언어 (어셈블리어) 로 바꿔줌.

일반적으로 소스코드에서 합쳐진 오브젝트 코드가 완성되는 과정까지를 통틀어서 컴파일이라고 하지만, 좀 더 자세하게는 전처리한 소스코드를 어셈블리어로 바꿔주는 과정을 컴파일이라고 함.

 

(3) 어셈블 (Assemble)

어셈블리어로 변환된 코드를 오브젝트 코드(목적 코드)로 변환함. 

어셈블리어를 컴퓨터의 CPU가 이해할 수 있는 0과 1로 이루어진 코드(머신코드)로 변환하는 과정임. (어셈블러가 역할 수행)

 

머신 코드와 오브젝트 코드의 정확한 차이점은 아직 잘 모르겠으나 둘다 0과 1로 이루어진 코드이며 최종적으로 0과 1로 이루어진 파일로 변환한다는 것이 결론이다. (순서는 오브젝트(링크) -> 머신)

 

참고:

What is the difference between object code and machine code? - Quora

Assembly code vs Machine code vs Object code? - Stack Overflow

 

(4) 링크 (Link)

만약 프로그램이 여러개의 파일로 이루어져 있는 경우에는 하나의 오브젝트 파일로 만들어야 하므로 링크라는 과정을 거침. (링커가 역할 수행)

ex) 한 프로그램에 있는 헤더파일, 여러개의 c파일 등등

 

참고로 파이썬, 자바스크립트 등의 언어는 컴파일이 필요없다. (인터프리터를 이용한 인터프리팅 과정을 거침)

컴파일러와 인터프리터의 차이는 기회가 되면 따로 작성.

 

 

2. argc/argv

#include<stdio.h>

int main(int argc, char *argv[])
{
	if (argc == 2)
	{
		printf("%s\n", argv[1]);
	}
	else
	{
		printf("인자가 전달되지 않았습니다.\n");
	}
}

argc: main 함수가 받는 입력의 개수

argv: main 함수가 받은 입력이 저장되는 문자열

argv[0]은 프로그램의 이름, 즉 아래 사진에서 "./test.exe" 가 저장되어 있다. 

argv[1]은 프로그램을 실행할 때 같이 전달한 인자, 즉 아래 사진에서 "hello"가 저장된다.

(아래 사진의 경우 argc는 2가 됨. 만약 hello 뒤에 world 까지 붙였다면 argc는 3이 되면서 argv[2]는 world가 저장 됨.)

 

'공부 정리' 카테고리의 다른 글

C언어 배열·문자열 입력  (0) 2022.01.28
VSCode C/C++ 컴파일 + CMAKE  (0) 2022.01.28
github 관련 참고할만한 글들  (0) 2022.01.14
인자와 파라미터  (0) 2022.01.10
푸터 밑에 파일 숨기는 방식에서 찾은 점  (0) 2021.12.28
Comments