For Study/C

01.프로그래밍 기초

sahak 2019. 7. 19. 21:12

프로그램이란?

"어떤 목적을 이룰 수 있도록 프로그래밍 언어로 진행 순서를 기술한 것"

 

exe 같은 실행파일로 컴퓨터가 작업할 내용을 컴퓨터가 이해할 수 있는 언어(기계어)로 만들어진 것

 

고급언어/저급언어란?

 

좋고 나쁨을 의미하는 것이 아닌,

언어가 자연어(사람이 사용하는 언어)에 가까울 수록 High Level 언어라고 하며(Jave, C# 등)

컴퓨터의 기계어에 가까울 수록 Low Level 언어라고 합니다.(기계어, 어셈블리어 등)

 

 

프로그램 생성 과정

                                -> 컴파일                                 ->링크

소스 파일( *.c) 목적파일( *.obj) 실행파일( *.exe)

통상 빌드라는 과정은 위의 컴파일+링크 과정을 포함하여 각 과정을 순차적으로 실행하는 것을 의미합니다.

??? : 아 빌드 너무 오래걸린다! 이런 말을 하는 개발자들이 많은데 보통은 컴파일이 오래 걸리는 것 보다 실행파일로 만드는 것이 오래 걸린다고 합니다.

 

소스파일(*.c)

소스파일은 프로그래머가 특정 문법을 이용하여 만든 파일입니다. text 형식으로 구성되어 있습니다. 이거 자체로는 프로그램이라고 할 수 없고, 그냥 메모장에 무언가 끄적여 놓은 것과 다르지 않습니다.

 

목적파일(*.obj)

목적파일은 컴파일러가 개발자가 끄적여 놓은 소스 파일을 기계어로 번역하는 일련의 과정으로 실행파일을 만드는 시간을 단축하기 위한 파일입니다.

 바로 실행파일로 만들면 되는데 왜 이런 과정을 만들었을까요?

 

만일 여러가지 기능을 하는 계산기를 만들었다고 가정합시다.

더하기/빼기/곱하기/나누기 이 4 가지 기능을 하나의 파일에 모두 구현하여 만들었는데 갑자기 곱하기 기능을 하는 곳의 수정이 필요합니다(!) 

수정하는 곳은 곱하기 하나인데, 불필요하게 더하기 빼기 나누기도 다시 컴파일해야하네요?  물론  이 경우는 코드가 짧아 그냥 수정하여 4 가지 기능이 구현된 파일 하나를 다시 실행파일로 만들면 됩니다.

 

하지만 파일 크기가 거대한 프로젝트 같은 경우 하나의 소스파일을 만든 경우 한 줄만 바꿔도 전체를 다시 컴파일해야하는 매우 불필요한 시간이 소비됩니다. 

 

그렇기에 이를 조각조각내어 소스파일 여러개로 만든다면? -> 수정하는 곳만 다시 목적파일을 만들면 되고 실행파일을 조합할 때 나머지 부분들은 기존에 생성되어 있는 목적파일들을 이용하면 되겠네요!

 

저도 Verilog를 하면서 치가 떨리도록 겪어본 부분이라... 조각조각 제대로 안내주면 한두곳만 손대도 실행파일 만드는데 시간이 굉장히 오래걸렸던 기억이 납니다. 한번 크게 대이고 나서는 나눌 수 있다고 판단되면 항상 나눠주는 습관을 가지고 있습니다.

 

 

실행파일( *.exe)

실행파일은 컴퓨터에서 실행할 수 있는 파일을 말합니다. 하나 혹은 그 이상의 갯수의 목적파일(*.obj)을 Linker가 Link과정을 거쳐 실행파일을 만듭니다. 이렇게 만들어진 실행파일은 컴파일 작업 없이 컴퓨터에서 바로 실행시킬 수 있습니다.

 

 

 

#include < *.h> ??

C언어에서는 #으로 시작되는 문장을 전처리기라고 부릅니다. 전처리기는 '사전'에 처리한다는 뜻으로 

컴파일러에게 "이 소스파일을 해석하기 전에 여기를 보렴" 이라고 개발자가 말해주는 것입니다.

그리고 개발자는 헤더파일에 있는 기능들을 따로 정의하지 않고 함수만 선언하여 사용할 수 있습니다.

 

main

 

C언어의 명령 시작점을 나타냅니다. C는 개발자가 만든 여러가지 함수들의 집합으로 구성되는데 함수들만 구성되어 있으면 뭘 어떻게 하라는 건지 판단할 수 없을 겁니다. main 함수를 통해 개발자가 만든 여러 함수들을 여기서 부터 읽어가면서 실행하면 돼 라고 컴파일러에게 말해줄 수 있겠습니다.