CS50_배열_(1)[컴파일링과 디버깅,코드의 디자인]

김두미·2022년 6월 21일
0
post-thumbnail

1. 컴파일링

(1) # include <stdio.h>

#include <stdio.h>

이 코드는 stdio라는 c언어로 작성된 헤더파일을 내가 사용하겠다는 의미이다.
다른 사람들이 이미 작성해둔 코드를 사용할 수 있게 해주는 것으로 라이브러리라고 한다.

stdio.h에 printf 함수의 프로토타입이 있어서,
clang 컴파일러가 프로그램을 컴파일할 때 printf가 무엇인지 알려준다.

함수의 프로토타입을 모르면 ?
https://velog.io/@dumi33/CS50c%EC%96%B8%EC%96%B43%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%ED%95%A8%EC%88%98%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4%EC%9D%98-%ED%95%9C%EA%B3%84
여기 1번을 보면 나온다.



(2) clang

1) clang -o hello hello.c

-o는 실행 옵션으로 생성되는 파일명을 지정하도록 해준다.

2) clang -o hello hello.c -lcs50

clang에게 cs50라이브러리에 있는 모든 0과 1을 여기에 연결하라는 의미이다.
l이 link의 약자인것이다.

2)는 make hello로 간단하게 줄일 수 있다.



(3) 컴파일링의 과정 (feat.4단계)

지금까지 간단하게 소스코드에서 머신코드로 변경하는 것을 컴파일링이 이루어진다고 했다. 사실 컴파일링은 4단계로 구성된다.

< 전처리, compiling, assembling, linking >

1) preprocessing (전처리)
"#"으로 시작한 코드를 해당 파일의 실제 코드로 대체한다.
예를 들어 # include <stdio.h>가 printf의 프로토타입 으로 대체되는 것이다.
#include <stdio.h> -> int printf(string format,....);


_**2) compiling **_ c로 작성한 소스코드는 어셈블리코드로 바뀐다.
_**3) assembling**_ 어셈블리코드를 머신코드로 바꿔준다.
_**4) linking **_ 모든 0과 1을 하나의 큰 파일로 합친다. ( cs50.h, stdio.h)를 include한다면 그 코드들을 머신코드로 바꾸어 나온 0과 1들과 내 코드를 0과 1로 바꾼 것들을 하나의 파일로 합치는 과정을 말한다.

이것들을 합해서 컴파일링이라고 한다.



2. 디버깅

  • help50 make <이름> 은 왜 틀렸는지 어디서 틀렸는지 알려준다.

대부분의 IDE(통합 개발 환경)에서 빨간색 점(중지점)을 제공한다.
이는 프로그램을 실행할 때 여기서 멈춘 뒤 사용자가 한단계씩 진행할 수 있도록 만든다.

해당 수업을 위해 만든 IDE에서 debug50 ./buggy2 와 같이 debug50을 앞에 붙여주면 한단계씩 진행하여 과정을 시각적으로 볼 수 있게 도와준다.



3. 코드의 디자인

#include<stdio.h>
int main(void) {printf("hello,world\n");}

코드를 이렇게 만든다면 가독성이 떨어진다.
코드를 작성할 때는 나와 다른 사람이 읽기 쉽도록, 그리고 유지보수가 쉽도록 만들어야한다.

좋은 코드 작성 스타일을 갖는건 프로그래밍에서 필수적이다.

러버덕 디버깅

고무 오리 한마리를 구해다가
방문을 닫고 오리에게 설명하세요.

마치 조교에게 설명하듯 코드가 무슨일을 하는지 설명하세요.

한줄 한줄 설명하다보면 스스로 깨닫는 순간이 옵니다.

나도 오리 친구 갖고싶다.

profile
개발자를 꿈꾸는 대학생

0개의 댓글