cs50 3강 1-3세션
들어가기에 앞서
3강의 경우 주요 정리 사항들이 많을 것 같아서 논리 순서대로 몇몇 세션을 나누었습니다.
첫번째 게시글에서는 session1-3을 통해 c언어의 코드가 어떻게 실행파일이 되는지와 코드의 디자인에 대해 다룰 예정입니다.
두번째 게시글에는 세션 4-5인 배열이 담기고, 세번째 게시글에는 문자열에 대한 내용이 담길 예정입니다.
세번쨰 게시글에는 명령행 인자에 대한 내용이 담길 예정이니 참고해주시면 좋을 것 같습니다.
컴파일링
컴파일링은 간단하게 설명하자면, 우리가 작성한 코드를 컴퓨터가 실행가능한 코드로 변환하는 변환작업의 일종이다.
이 단계는 전처리
,컴파일
,어셈블
,링크
라는 네 개의 단계로 나뉘며 위 네개의 단계를 통해 컴퓨터는 우리가 작성한 코드를 컴퓨터가 이해할 수 있는 이진법으로 변환하는 과정들을 거치게 된다.
전처리
전처리 단계는 실질적인 컴파일이 이루어지기 이전에 컴퓨터에게 해야할 일을 알려주는 단계이다.
에를 들어 # incldue
가 오면 뒤에 나올 헤더파일의 내용을 포함하라거나 #define
이 오면 뒤에서는 매크로 함수가 정의될 것을 컴퓨터에게 전해주는 단계이다.
컴파일
어셈블리어로 우리가 작성한 c언어 코드를 변환하는 일이다.
어셈블리어는 레지스터 방식 숫자로 직접 표기하는 방식 등이 있으며 간단하게 설명하면, 0과1로 이루어진 이진법은 아니나 기계어와 일대일 대응이 가능한 저급 언어라고 이해하면 된다.
어셈블
어셈블러가 주체가 되는 단계로, 어셈블리 코드를 0과 1로 이루어진 온전히 컴퓨터가 이해할 수 있는 코드로 변환된다.
이 코드를 통해 cpu는 자신이 어떤 것을 어떻게 실행하여야 할지를 알 수 있다.
링크
만약 여러 개의 라이브러리(헤더파일) 사용시 컴퓨터는 각각 해석한 것을 합체하는 과정이 필요하다.
예를 들어 cmath의 ceil함수를 어떻게 실행할 것인가 즉 컴퓨터가 어떤 일을 해야할 것인가를 알기 위해서는 링크의 단계를 거쳐야만 한다.
버그와 디버깅
우선 버그는 프로그램 내에 있는 오류
를 의미한다.
디버깅이란 오류
를 정확히 어떤 구간에서 왜 일어났는가를 식별한 뒤 고치는 과정을 의미한다.
이때 사용하는 도구(프로그램)을 디버거라고 부른다.
중단점
디버깅을 할 때 유용하게 사용하는 기능이 바로 중단점 기능이다.
중단점이란 이름 그대로 일부로 프로그램을 멈추게 하여 논리적 오류가 생기는 시점을 찾아낼 때에 유용하다.
출력 기능 사용하기
console
또는 print
를 사용하여 문제가 되는 지점을 찾는 방법이다.
예를 들어 반복문이 생각과 다르게 돌아가는 것 같다면 내가 실행하는 지점 위에 print로 반복문의 변수를 출력해보면, 반복이 제대로 이루어지고 있는가를 확인할 수 있다.
종료코드 활용하기
c언어에서는 특정 함수가 종료되는 시점에 return
을 사용하여 종료코드를 반환시키는 것도 가능하다.
보통의 main함수는 0
을 리턴하기 때문에 0
이 아닌 다른 숫자를 종료코드로 사용하면 프로그램이 비정상적으로 종료가 된 것을 확인할 수 있다.
check 50
참고로 위 프로그램은 cs50만을 위해 제작되었기 때문에, 다른 현장에서는 쓰기 어렵다.
여러 사람이 작업하는 환경이라면 자동 검사 프로그램을 사용하는 것이 상당히 유용하다.
만약 상황이 여의치 않다면 각자 수정한 코드가 전체 프로그램의 정확성에 문제를 끼치지는 않는지를 확인하기 위해, 함수 단위의 테스트 뿐만 아니라 전체 단위의 테스트를 진행해보아야 한다.
스타일 50
코드의 심미성에 대해 검사하는 프로그램이다.
들여쓰기에 대한 컨벤션과 같은 부분을 검사해준다.
물론 직접적으로 프로그램의 실행에는 영향이 없지만, 여러 사람이 작업을 할 때에는 가독성도 중요하기 때문에 회사나 프로젝트 내의 특별한 스타일이 있다면 따르는 것이 좋다.
특별한 규약이 없다면 각 언어별로 정해진 컨벤션을 지키는 것이 좋다.
비주얼 스튜디오에서는 컨트롤 + a
를 눌러 코드 전체 선택 이후 컨트롤+k+f
를 누르면 자동으로 언어에 맞는 들여쓰기를 해준다.
고무 오리
위 방법은 대상이 되는 물체를 앞에 두고 코드를 한줄 한줄 누군가에게 가르쳐주듯 설명하는 과정이다.
이를 통해 자신이 생각하지 못했던 코드의 구멍(논리적 오류)를 발견할 수도 있다.
테스트 코드 짜기
테스트 코드를 미리 작성한 뒤 그에 따른 답이 제대로 실행되는지를 확인해보는 방법도 논리적 오류를 발견하기 좋은 방법이다.
특히 위 방법은 경계값이 되는 예외상황을 타켓으로 선정한 뒤 제대로 오류나 정답을 뱉어내는지 확인을 할 때 간편하고 용이하다.
댓글남기기