본문 바로가기
Topos Uranos

요약

이 수업은 C++ 프로그래밍의 첫걸음을 다룬 강좌의 첫 단원을 마무리한다. 명세가 정해진 문제에서 출발하여 알고리즘, 소스 코드, 컴파일과 링크, 실행 파일, 프로그램과 바깥 세계의 소통을 거쳐, 나타나는 시점에 따라 분류된 오류에 이르는 개념의 사슬을 다시 세운다. 그 가운데 어느 언어에서나 통하는 것과 C++에 고유한 것을 구별한다. 단원이 보여 준 정의되지 않은 동작과 거기서 나오는 강좌의 규칙, 곧 언제나 경고를 켜고 컴파일하고 개발하는 동안에는 새니타이저도 켜고 컴파일한다는 규칙을 모은다. 마무리 평가에서 입문 평가의 기능을 되풀이한다. 그리고 단원 전체를 엮는 여섯 도전 과제로 끝난다. 가장 적은 동전으로 거스름돈 주기, 반복문 없이 맞춘 표, 다섯 종류의 결함 다섯 개가 든 프로그램, 출력 버퍼에 관한 실험, 고정된 형식의 날짜, 그리고 인터프리터 언어만 아는 사람에게 컴파일러 설명하기이다.

학습 목표

  1. 문제의 진술에서 실행된 프로그램까지의 길을 도움 없이 끝까지 간다. 명세하고, 알고리즘을 쓰고, 손으로 따라가고, C++로 쓰고, 강좌의 옵션으로 컴파일하고, 실행하고, 결과를 확인한다.
  2. 그 길의 각 단계에서 어떤 도구(편집기, 전처리기, 컴파일러, 링커, 새니타이저)가 작동하는지, 각 도구가 무엇을 받아 무엇을 넘기는지 설명한다.
  3. 오류의 종류(컴파일 오류, 링크 오류, 실행 오류, 논리 오류)를 그것이 드러나는 방식으로 알아보고, 여러 오류를 드러나는 순서대로 고친다.
  4. 정의되지 않은 동작이 무엇인지, 그리고 강좌가 왜 경고와 새니타이저를 켜고 컴파일하는지 예를 들어 설명한다.
  5. 단원에서 배운 것 가운데 어느 언어에서나 통하는 것과 C++에 고유한 것을 구별한다.

단원에서 이룬 것

이 단원은 프로그램을 짜 본 적이 없는 사람을, 일상 언어로 진술된 문제에서 출발하여 컴파일되고 실행되며 데이터를 읽고 결과를 쓰는 프로그램까지 이끌되, 그 길에서 각 도구가 무엇을 했는지 알게 하는 것을 목표로 삼았다. 그리고 그것을 도입 수업이 이미 안다고 밝힌 것, 곧 학교 산수, 글로 된 지시를 따르는 습관, 파일과 폴더를 다루는 법에만 기대어 이루었다.

문제에서 알고리즘으로

문제에서 알고리즘으로 수업은 문제가 그 명세로 정해진다는 것을 확립했다. 명세는 사전 조건을 만족하는 모든 입력에 사후 조건을 약속하고 그 밖에서는 아무것도 약속하지 않는 계약이다. 알고리즘은 유한하고 명확하며 일반적인 절차로서, 번호 매긴 단계로 쓰이고, 추적표로 손으로 따라가며, 순차, 선택, 반복으로 이루어진다. 모든 반복에는 변량이 따르는데, 변량은 회차마다 줄어들어 반복이 끝남을 보장하는 자연수 양이다.

프로그램, 컴파일러, C++

프로그램, 컴파일러, C++ 수업은 C++ 프로그램의 텍스트가 그대로 실행되지 않는다는 것, 곧 전처리기, 컴파일러, 링커가 그것을 실행 파일로 바꾼다는 것을 보였다. 여기서 단원 전체를 관통하는 구별이 나왔다. 텍스트에만 달린 것은 컴파일이나 링크 때 발견되고, 데이터에 달린 것은 실행 때에만 발견된다. 이 수업은 컴파일 방식과 인터프리터 방식을 비교하고, 강좌가 C++23을 쓰며 -std=c++23 옵션으로 그것을 요청하는 이유를 밝혔다.

환경 설치하기

Windows, macOS, Linux에 환경 설치하기 수업은 C++23을 지원하는 컴파일러와, C++ 확장을 갖춘 Visual Studio Code를 설치했다. 그 수업이 주는 방법상의 교훈은, 편집기는 컴파일하지 않고 터미널이 찾을 수 있어야 하는 컴파일러를 호출한다는 것, 그리고 메시지의 정확한 문구가 설치 문제와 호출 문제를 구별해 준다는 것이다.

컴파일, 실행, 설정

컴파일, 실행, 설정 수업은 편집, 저장, 컴파일, 실행, 읽기의 작업 순환과 강좌의 명령을 정했다. 실행 파일을 만들지 못하게 하는 오류와, 실행 파일을 허용하되 의심스러운 코드를 가리키는 경고를 구별했다. 실행을 감시하는 새니타이저(메모리 오류 새니타이저인 AddressSanitizer와 정의되지 않은 동작 새니타이저인 UndefinedBehaviorSanitizer)를 켜고 그 한계를 보였다. 그리고 파일, 컴파일러, 콘솔이 UTF-8로 일치해야 한다는 것을 설명했다.

프로그램의 해부

프로그램의 해부 수업은 최소 프로그램을 해부했다. 각 의존성을 선언하는 헤더, 진입점이며 그 값이 종료 코드가 되는 main 함수, std 네임스페이스, 문, 블록, 주석이다. 메시지를 첫 번째 것부터 읽도록 가르쳤고, 강좌의 스타일 가이드를 정했다.

입력, 출력, 오류

입력, 출력, 오류 수업은 프로그램을 바깥 세계와 접촉하게 했다. std::println 함수는 형식 지정을 써서 요청받은 것을 정확히 쓰고, std::cin 스트림은 읽다가 쓸모없는 첫 문자에서 멈춘다. 수를 이룰 수 없는 문자에 걸린 읽기는 변수를 0으로 만들고 스트림을 오류 상태에 둔다. 그것도 조용히 그렇게 한다(자료형에 들어가지 않는 수나 바닥난 입력은 변수에 다른 값을 남기며, 수업은 그 경우들을 열거한다). 그래서 읽기는 확인한다. 이 수업은 오류를 나타나는 시점에 따라 분류하여 단원을 마무리했다. 컴파일 오류, 링크 오류, 실행 오류, 논리 오류이다.