모두의 dream
컴파일 과정과 argc/argv 본문
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가 저장 됨.)
'분야 > Programming' 카테고리의 다른 글
고정 소수점 & 부동 소수점 (0) | 2025.01.13 |
---|---|
C언어 배열·문자열 입력 (1) | 2022.01.28 |