본문 바로가기
모던 C

레벨0 만남 - 01 들어가며

by 왕초보 독학 코딩 2024. 2. 2.

이 포스트는 '모던 C'를 요약한 내용입니다.

 

이 레벨에서는 C 프로그램의 목적과 구조, 사용법 등을 개략적으로 소개한다. 구체적인 설명은 하지 않는다. 지금은 C 프로그래밍에 대한 감을 잡고 궁금증이 일어 주요 개념을 파악하는 단계다. 자세한 내용은 레벨 1부터 소개한다.

 

1.0 이 장에서 다루는 내용

  • 명령형 프로그래밍
  • 코드 컴파일하고 실행하기

이 장에서는 C 언어의 다양한 구문으로 간단히 작성한 프로그램을 소개한다.

C 프로그래밍은 원하는 작업을 컴퓨터로 처리하는 기법을 의미한다. C 언어는 명령을 내리는 방식으로 작업을 표현하는데, 이런 프로그래밍 방식을 명령형 프로그래밍(imperative programming)이라 부른다. 

 

첫 프로그래인 예제 1-1을 통해 구체적으로 살펴보자.

/* 장난스런 문장 같지만 정식 C 표현이다. -*- mode: c -*- */
#include <stdlib.h>
#include <stdio.h>

/* 이 부분이 핵심이다 */
int main(void)
{
    // 선언문
    double A[5] = {
        [0] = 9.0,
        [1] = 2.9,
        [4] = 3.E+25,
        [3] = .00007,
    };

    // 필요한 작업을 수행한다.
    for (size_t i = 0; i < 5; ++i)
    {
        printf("element %zu is %g, \tits square is %g\n",
               i,
               A[i],
               A[i] * A[i]);
    }

    return EXIT_SUCCESS;
}

 

1.1 명령형 프로그래밍

코드는 사람인 프로그래머와 기계인 컴퓨터를 연결해 준다. 즉, 프로그래머가 원하는 작업을 컴퓨터가 수행하도록 명령을 내리는 것이다.

 

예제 1-1을 실행하면 터미널 화면에 텍스트 다섯 줄이 출력된다.

element 0 is 9, 	its square is 81
element 1 is 2.9, 	its square is 8.41
element 2 is 0, 	its square is 0
element 3 is 7e-05, 	its square is 4.9e-09
element 4 is 3e+25, 	its square is 9e+50

이 결과를 보면 printf() 내용이 화면에 출력(print)되는 것을 알 수 있다. printf란 함수(function)를 호출(call)한다.

 

printf 함수는 인자(argument)를 4개 받고 있다.

  • 첫 번째 인자는 따옴표 안에 있는 특이하게 생긴 텍스트를 스트링 리터럴(string literal)이라 부른다. 출력할 텍스트의 포맷(format)을 지정한다. 이 문장 안에서 % 문자로 시작하는 포맷 지정자(format specifier)가 세 개 있는데, 숫자가 들어갈 지점을 표시하고 있다. 또한 \t나 \n처럼 백슬러시로 시작하는 이스케이프 문자(escape character)도 있다.
  • 두 번째 인자인 i는 단어가 가리키는 값을 첫 번째 포맷 지정자인 %zu가 있는 지점에 출력된다.
  • 세 번째 인자인 A[i]는 첫 번째 %g가 있는 지점에 출력된다.
  • 네 번째 인자인 A[i]*A[i]는 두 번째 %g가 있는 지점에 출력된다.

여기서는 이 프로그램의 주목적이 터미널에 텍스트 몇 줄을 출력하는 것이고, 이를 위해 printf 함수로 명령한다는 정도만 이해하고 넘어가자.

 

1.2 컴파일하고 실행하기

프로그램 코드는 컴퓨터로 하고 싶은 일을 표현한 것으로, 하드디스크 어딘가에 저장된 텍스트 문서와 다를 바 없다. 컴퓨터는 작성된 코드를 바로 이해할 수 없다. 그래서 컴파일러(compiler)라 부르는 특별한 프로그램으로 C 코드를 컴퓨터가 이해할 수 있는 형태인 바이너리(binary) 또는 실행 파일(executable)로 번역해야 한다. 따라서 C 언어는 컴파일 방식 프로그래밍 언어라고 한다.

 

제대로 작성된 C 프로그램은 여러 플랫폼에 이식할 수 있다. 이 책에서는 C 프로그램의 이식성을 보장하도록 작성하였지만, 최신 표준과 맞지 않는 플랫폼도 존재한다. 게다가 제대로 작성하지 않은 부분을 그냥 넘기거나, 이식성이 떨어진 확장 기능을 사용하는 플랫폼도 있다. 이렇듯 한 플랫폼에서 실행하고 테스트하는 것만으로는 이식성을 보장할 수 없다.

 

리눅스나 맥OS 같은 시스템은 대부분 c99라는 C 컴파일러가 제공된다. 다음 명령으로 getting-started.c 파일을 컴파일할 수 있다.

c99 -o getting-started getting-started.c -lm

그러면 아무 문제 없이 컴파일되어 getting-started란 이름의 실행파일이 현재 디렉터리에 생성된다. 이 명령의 구성 요소는 다음과 같다.

  • c99 : 컴파일러 프로그램
  • -o getting-started : 컴파일러에서 처리한 결과(컴파일러 출력)를 getting-started라는 파일에 저장한다.
  • getting-started.c : C 코드가 담긴 파일 이름을 지정한다. 파일 이름 끝에 붙은 .c라는 확장자는 이 파일이 C 프로그래밍 언어로 작성된 것임을 나타낸다.
  • -lm : 필요하다면 표준 수학 함수를 추가한다. 뒤에서 이런 함수를 사용할 것이다.

 

이제 생성된 실행 파일은 다음 명령처럼 실행할 수 있다.

./getting-started

 

그러면 앞에서 본 것과 똑같이 출력된다. '이식성이 있다(portable)'는 말이 바로 이런 의미다. 프로그램을 어디서 실행하든 동작이 똑같다. c99 컴파일러가 현재 사용하는 시스템에서 제공하지 않는다면 시스템의 매뉴얼에서 제공하는 다른 컴파일러를 사용하거나 c99 컴파일러를 설치하면 된다. 

 

흔히 쓰는 컴파일러 몇 가지를 소개하면 다음과 같다.

clang -Wall -lm -o getting-started getting-started.c
gcc -std=c99 -Wall -lm -o getting-started getting-started.c
icc -std=c99 -Wall -lm -o getting-started getting-started.c

 

C 프로그램을 컴파일했을 때, 경고 메시지가 하나도 없어야 한다. 만일 문제가 있는 코드를 컴파일하면 진단 정보가 출력된다. 진단 정보에는 문제점을 알려준다. 진단 정보를 잘 읽어 보고 진단 정보가 나오지 않게 만들자.

 

컴파일마다 진단 정보가 다를 수 있다. 예로 들어 clang은 gcc보다 진단 메시지가 더 길게 나온다. 그리고 gcc와 달리 clang은 문제가 심각하다고 판단해서 실행 파일을 생성하지 않는 경우도 있다. 물론 gcc에서도 -Werror 옵션으로 진단 정보가 나오면 무조건 컴파일을 중단하도록 지정할 수도 있다.

 

1.3 요약

  • C는 컴퓨터가 할 일을 명령하도록 설계된 언어다. 따라서 프로그래머와 컴퓨터를 연결해 준다.
  • C 코드를 실행하려면 반드시 컴파일해야 한다. 컴파일러는 사람이 이해할 수 있도록 작성된 C 언어 텍스트를 특정 플랫폼에서 실행할 수 있는 형태로 번역해 준다.
  • C는 이식성을 위해 추상화를 제공한다. 한 번 작성한 C 프로그램을 다양한 아키텍처의 컴퓨터에서 사용할 수 있다.
  • C 컴파일러는 프로그래머를 도와주는 존재다. 컴파일러가 출력한 경고 메시지를 주의 깊게 살펴본다.

 

'모던 C' 카테고리의 다른 글

레벨 1 친숙 - 04 계산 표현하기  (0) 2024.02.23
레벨 1 친숙 - 03 결국은 제어  (0) 2024.02.03
레벨1 친숙 - 들어가며  (0) 2024.02.03
레벨0 만남 - 02 프로그램의 핵심 구조  (0) 2024.02.03
들어가며  (0) 2024.02.02