C 언어가 가장 널리 사용되는 프로그래밍 언어 중 하나인 것은 사실이지만, 프로그래밍 언어는 컴퓨터가 이해할 수 있는 적은 수의 단어들을 몇 개의 규칙으로 조합하여 문장으로 나타낼 수 있을 뿐입니다. 가장 대표적인 예로는 “Hello, World!”를 출력하는 것을 들 수 있습니다. 프로그래밍 언어를 배우려는 목적은 “Hello, World!”를 출력하는 데 있지 않습니다. C 언어는 도구일 뿐입니다. C 언어를 배우는 목적은 인공위성을 움직이거나 프로 바둑 기사와의 대국에서 승리하기 위해서이지, C 언어 자체를 배우는 것이어서는 안 됩니다. 프로그램을 작성하는 것을 단순한 코딩이 아닌 그 이상의 것으로 생각하는 것에서부터 시작한다면, C 언어가 좀 더 흥미로울 수 있을 것입니다.
--- p.3
프로그램은 알고리즘과 프로그래밍 언어로 이루어져 있습니다. 무엇을 먼저 배워야 할까요? 이상적인 학습 방법은 하향식으로 배우는 것입니다. 여기서 하향식이란, 큰 문제를 여러 개의 작은 문제로 나눈 후 작은 문제들을 해결함으로써 결국 큰 문제를 해결하는 방식을 말합니다. 프로그램을 작성하는 과정에서는 문장들을 조합하여 주어진 문제를 해결할 수 있는 알고리즘 작성 방법을 먼저 배우고, 개별 문장을 프로그래밍 언어를 사용하여 나타내는 방법을 나중에 배우는 것이 하향식에 해당합니다. 하지만 프로그래밍 언어를 처음 배우는 사람은 알고리즘을 전혀 알지 못합니다. 알고리즘을 먼저 배우면 될 것이라 생각할 수 있지만, 알고리즘은 컴퓨터가 이해하는 단어와 문장으로 나타내야만 합니다.
--- p.27
알고리즘을 작성할 때 또 한 가지 주의해야 할 점은 좋은 알고리즘은 프로그래밍 언어와 무관하지 않다는 것입니다. 알고리즘은 문제를 푸는 과정을 기술한 것으로, 프로그래밍 언어와 무관하다고 여러 번 이야기했습니다. 하지만 알고리즘은 결국 프로그래밍 언어로 구현해야 합니다. 프로그래밍 언어에서 문제를 푸는 과정에 이용할 수 있는 편리한 기능을 제공한다면, 이를 이용하지 않을 이유가 없습니다. 예를 들어 사인 30°를 계산한다고 가정해 보겠습니다. 사인 값을 계산하는 데에는 여러 가지 방법이 있습니다. 그중 어떤 알고리즘을 사용해야 할지 고민이 되겠지만, 답은 간단합니다. C 언어에는 각도만 입력하면 해당 각도의 사인 값을 알려 주는 함수를 제공합니다. 사인 값을 계산하는 방법 자체를 궁금해하는 사람은 많지 않을 것이고, 대부분의 사람들은 사인 값을 계산하여 삼각형의 높이를 구하는 등 문제를 푸는 데 관심이 있습니다. 알고리즘은 프로그래밍 언어와 무관합니다. 하지만 좋은 프로그램을 만들기 위해서는 프로그래밍 언어가 기본적으로 제공해 주는 기능들을 알고, 이를 충분히 활용할 수 있어야 합니다.
--- p.53
소스 파일을 컴파일하면 기계어 파일인 목적 파일(object file)이 만들어집니다. 만들어진 목적 파일에 자주 사용되는 함수의 집합인 라이브러리를 연결하면 독립적으로 실행할 수 있는 실행파일이 만들어집니다. 이처럼 컴파일 과정은 몇 개의 단계로 이루어지지만, 실제 프로그래밍 과정에서는 한 번의 클릭만으로도 실행 파일이 만들어집니다. 프로그래밍에서 일반적으로 컴파일러라는 이름으로 불리는 프로그램은 실제로는 통합 개발 환경(IDE, Integrated Development Environment)이라는 프로그램입니다. IDE에는 기본적으로 컴파일러와 링커가 포함되어 있습니다. 이 밖에도 코드를 입력하고 편집할 수 있는 편집기, 프로그램에 숨은 벌레를 찾아내는 일을 도와주는 디버거, 소스 코드를 프로젝트 단위로 관리하는 일을 도와주는 프로젝트 매니저 등을 직관적인 사용자 인터페이스(User Interface, UI)를 통해 제공하고 있으므로 프로그래머는 IDE의 뒷면에서 일어나는 일에 신경 쓰지 않고 알고리즘을 구현하는 데 집중할 수 있습니다.
--- p.69
컴퓨터에서는 명령어와 데이터를 구별하기 위해 쉽고도 간단한 방법을 사용합니다. 명령어와 데이터는 메모리 내에서 저장되는 위치가 다릅니다. 즉, 명령어와 데이터는 표현 방법에서 차이가 나는 것이 아니라 메모리에 저장되는 위치에 의해 의미가 결정되며, 메모리에 저장되는 위치를 ‘세그먼트(segment)’라고 합니다. 명령어가 위치하는 곳은 코드 세그먼트(code segment), 데이터가 위치하는 곳은 데이터 세그먼트(data segment)라고 합니다. 컴퓨터는 코드 세그먼트에 있는 명령어들을 하나씩 CPU로 옮겨 실행하고, 필요한 경우 데이터 세그먼트에서 데이터를 가져와 사용합니다. 데이터 세그먼트에 저장되는 데이터는 프로그램이 종료될 때까지 메모리에 저장되는 반면, C 언어에서 변수 값은 잠깐 동안만 사용되다가 더 이상 사용되지 않는 경우에 자동으로 사라지며, 이러한 값들은 스택 세그먼트(stack segment)라는 또 다른 메모리 영역에 저장됩니다.
--- p.94