IPL2017-02 Compilation Pipeline Lab

From Innovation
Jump to: navigation, search

Lab Exercises

전반부에서 다룬 파이썬과 다르게 C는 컴파일이라는 과정이 필요하다. 파이썬은 스크립트 언어이기 때문에 사용자가 작성한 코드를 인터프리터가 즉시 해석해서 머신코드로 변경하여 동작된다. C는 머신코드를 생성하기 위해 컴파일이라는 작업을 수행해야 한다.

간단한 예제를 통해서 C 컴파일러와 친숙해져보자.

Exercise

  참고: 리눅스에서 터미널을 이용하여 작업하기를 권함

이 예제에서 다룰 파일들을 이 링크에서 다운 받는다. 압축을 해제하면 두 개의 디렉터리에 소스코드들이 생긴다.

디렉터리의 구성

  • hello1
    • 파일 구성: hello.c
  • hello2
    • 파일 구성: hello.c hello.h main.c



할 일 1

첫 번째 디렉터리로 이동하여 hello.c 파일을 컴파일 한다. 컴파일 전에 내용을 살펴보려면 다음과 같은 명령으로 확인해볼 수 있다. cat -n hello.c

컴파일하는 방법은 다음과 같다. gcc hello.c -o hello1

컴파일이 성공적으로 되었다면, 명령어와 옵션의 기능과 역할에 대해 다시 한 번 생각해 본다.

할 일 2

두 번째 디렉터리로 이동하여 파일들을 컴파일 한다. 각 파일의 내용을 살펴보려면 앞서 사용한 cat -n 파일이름 명령을 사용하여 하나씩 확인 할 수 있다. 똑같은 명령을 반복해서 사용하기 싫다면 다음과 같이 한 번에 수행할 수 있다.

for file in `ls`; do
    echo $file
    cat -n $file
    echo 
done

이 코드는 ls의 결과로 나온 파일들을 하나씩 순회 하면서, 그 파일의 이름과 내용을 출력하는 쉘 스크립트이다. 여러 개의 짧은 코드의 내용을 확인할 때 유용하다.

3 개로 나뉜 이 코드가 하는 일은 앞서 본 예제와 동일하다. 파일이 여러 개로 나뉜 경우 컴파일하는 방법을 학습해보자.

컴파일 하는 방법은 다음과 같다. 다음 명령 줄을 이해해보자. gcc main.c hello.c -o hello2


과제

과제를 통해 배운 내용을 복습해보자. 필요한 파일들은 이 링크에서 다운 받는다.

압축을 해제하면 3개의 c파일과 2개의 헤더 파일이 생긴다.

  • fibeverse.c
  • fibonacci.c
  • fibonacci.h
  • reverse.c
  • reverse.h



컴파일 방법과 문제 1

컴파일을 하는 방법은 다음과 같다.

gcc -Wall -std=c99 fibeverse.c reverse.c fibonacci.c -o fibeverse

하지만 코드에 오류가 있어 컴파일이 안된다. 원인을 분석하여 컴파일이 되도록 만들자.



문제 2

현재 이 프로그램은 두 개의 동작을 동시에 수행하고 있다. 피보나치 수열도 만들어 내고 문자열을 역순으로 출력한다. 전처리 마크로를 사용해서 이 프로그램을 수정하여 둘 중에 하나 또는 둘 다 실행되도록 컴파일 시간에 정할 수 있도록 해보자.

다음의 명령으로 컴파일하면 피보나치 수열만 동작하도록 만들자 gcc -Wall -std=c99 -DFIBONACCI fibeverse.c reverse.c fibonacci.c -o fibonacci

다음과 같은 명령으로 실행하여 정상 동작 여부를 확인하자. ./fibonacci 8

다음의 명령으로 컴파일하면 문자열을 역순으로 출력하도록 만들자 gcc -Wall -std=c99 -DREVERSE fibeverse.c reverse.c fibonacci.c -o reverse

다음의 명령으로 실행하여 동작을 검증해보자. ./reverse 'a brave new world'

처음 컴파일 했던 것처럼 두 개의 동작을 동시에 수행하려면 다음과 같이 컴파일하자. gcc -Wall -std=c99 -DFIBONACCI -DREVERSE fibeverse.c reverse.c fibonacci.c -o fibeverse



제출

수정한 부분과 결과를 요약정리하여 한페이지(template 사용 )로 제출