C 프로그램을 개발하는 데 있어서 일반적으로 다음과 같은 도구들이 필요하다.
❶ 텍스트 에디터 (text editor)
❷ 컴파일러 (compiler)
‘컴파일(compile)’은 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해하고 실행할 수 있도록 기계어(machine language)로 번역하는 것을 의미한다.
‘컴파일러’는 이러한 일을 수행하는 실행 프로그램이다.
특별히 C 프로그램 코드를 기계어로 번역해 주는 것을 ‘C 컴파일러’라고 한다.
❸ 디버거 (debugger)
개발 편의성을 높이기 위해서 이 세 가지를 하나로 통합한 도구를 IDE (intergrate development environment)라고 한다.
C 언어로 프로그램을 개발하는 과정은 다음과 같이 요약할 수 있다.
사용자(프로그래머)는 C 언어 문법에 맞추어 프로그램을 작성한다.
이것을 컴파일하여 오브젝트(object)파일을 생성한다.
문법상 오류가 발생하였다면 소스코드를 수정한 후 2단계로 돌아간다.
오브젝트 파일을 링크(link)하여 실행프로그램(exe파일)을 생성한다.
프로그램을 실행하여 오동작이 일어난다면 수정한 후 다시 2단계로 돌아간다.
보통 ❷,❹번 과정은 IDE상에서 빌드(build)명령을 내리면 소스코드에 문법상 오류가 없다면 저절로 진행되어 실행파일이 생성된다. 따라서 오브젝트파일은 자동적으로 생성되어 링크하는 과정이 진행되므로 사용자 입장에서는 이 오브젝트 파일에 신경 쓸 필요가 없다.
[그림 1.4.1] C 프로그램 개발 과정 개념도
프로그램을 작성하다 보면 필연적으로 오류(error)가 발생한다. 오류는 크게 문법적인 오류와 논리적인 오류로 구분할 수 있다.
문법적인 오류(syntex error)는 명령이 문법에 맞지 않다거나 혹은 단순히 타이핑을 실수했다든가 함수명이나 변수명을 잘 못 작성한 경우로서 컴파일러에서 체크하여 메시지를 발생하므로 수정하는 것은 그다지 어렵지 않다.
논리적인 오류(logical error)는 프로그램의 실행이 의도와는 다르게 되는 것으러서 보통 버그(bug)라고 칭한다. 논리적인 오류를 수정하는 과정은 디버깅(debugging)이라고 하며 문법적인 오류를 수정하는 경우보다 그 작업이 복잡하고 어려우므로 디버거(debugger)라는 도구를 사용하게 된다.
여기서 "debug"라는 용어는 문자 그대로 "벌레를 제거한다"는 의미이다. 버그는 곤충을 뜻하는데 프로그램을 "디버깅(debugging) 한다."는 것은 작성된 코드 안에서 잘못된 부분이나 예기치 않게 발생 된 오류의 원인을 찾아 해결해 나가는 일련의 과정을 의미한다. "디버그"라는 용어가 만들어지게 된 유래에 관해서는 다소 논란의 여지가 있긴 하지만 가장 잘 알려진 이야기는 2차 세계대전이 끝난 직후인 1947년 하버드 대학에서 일어났던 마크Ⅱ(MARKⅡ) 컴퓨터와 그레이스 호퍼(Admiral Grace Hopper)의 일화이다.
[그림 1.4.2] 그래이스 호퍼와 ‘bug’ 리포트
1947년 여름, 당시 호퍼는 하버드 대학에서 마크2 컴퓨터를 이용해 연구 중이었는데 컴퓨터가 자주 고장을 일으켰다고 한다. 호퍼와 동료들은 고장의 원인을 찾기 위해 컴퓨터 내부를 들여다보며 조사하던 중, 릴레이(relay)의 접점 사이에 끼어 들러붙어 죽어있는 나방(moth) 한 마리를 발견하게 된다. 실제로 컴퓨터 시스템 안에 벌레가 있었고 이로 인한 누전으로 컴퓨터가 오작동한 것이다. 그녀와 동료들이 문제가 된 나방이 조심스럽게 제거되자(de-bugged) 컴퓨터는 다시 정상적으로 작동하게 되었다. 호퍼는 이때 제거했던 나방을 자신의 일지에 테이프로 붙여두고 "발견된 버그의 첫 실제 사례(first actual case of bug being found.)"라고 기록하였다.
[그림 1.4.3] 그래이스 호퍼의 기록
이 사건 이후 그레이스 호퍼는 컴퓨터 프로그램에서 오류의 원인을 찾고, 추적하고, 발견된 문제들을 제거하거나 수정하면서 해결해 나가는 일련의 과정을 "debugging"이란 용어로 표현하게 된다. 그리고 이후에는 컴퓨터 프로그래머들이 문제를 일으키는 오류나 잘못된 소스 코드를 가리켜 "bug"라고 표현하기 시작했다.