제4화 모모의 변신 공장

코드의 일생 05

뚝딱이와 드디어 3

언제 진짜로 계산할까?

모모가 옮겨 적은 카드는 선반에 그대로 있어.

이번에는 뚝딱이가 프로그램을 실행할 차례야.

화면에는 언제, 무엇이 나올까?

오늘의 이상한 질문

뚝딱이가 제4화의 1 + 2 파일을 그대로 topaz run에 맡기면 어떤 기록이 남을까?

그렇게 생각했구나.

뚝딱이의 작업대에서 기록을 같이 읽어 보자.

만화

장면 1 선반 앞

모모약속대로 뚝딱이랑 같이 봐.

한줄이뚝딱아, 화면에는 뭐가 나와?

뚝딱이모모의 카드는 선반에 두자.나는 네가 적혀 있는 main.tpz 파일을 받아 갈게.

장면 2 검사부터

뚝딱이내 작업대에서는 검사가 먼저야.실행은 그다음이고.

타미이 파일은 검사를 통과했어!

장면 3 빈 화면

한줄이어? 3이 안 나왔어!

뚝딱이화면 창은 비었네.쪽지 받침과 끝 표시에는 무엇이 남았지?

장면 4 드디어 3

뚝딱이같은 덧셈을 새 프로그램에 넣어 보자.이번에는 시작을 알리는 줄과 결과를 쓰는 줄도 있어.

한줄이드디어 3이다!

뚝딱이써 달라고 한 것만, 써 달라고 한 차례대로 나와.

장면 5 쌍둥이

쌍둥이나는 한줄이랑 거의 같아. 2 자리에 "사과"가 있을 뿐이야.그래도 시작은 찍을 수 있겠지?

뚝딱이글쎄. 기록을 같이 읽어 보자.

세 파일은 실제로 어떤 기록을 남겼을까?

뚝딱이의 기록판에서 직접 읽어 보자.

작은 실험

뚝딱이의 기록판

세 프로그램은 어디까지 갔을까?

뚝딱이가 세 파일에 각각 topaz run을 써 보고 기록을 남겼어.

세 주문서의 화면 창과 쪽지 받침, 끝 표시를 읽고 프로그램이 어디까지 갔는지 살펴봐.

끝 표시가 0이면 보통 명령을 성공적으로 마쳤다는 뜻이야.

화면 창과 쪽지 받침에는 미리 모아 둔 원문이 보여.

토파즈 5.21.1 실행 기록

주문서 고르기

가 제4화의 그 파일

모모가 카드로 옮긴 파일과 바이트까지 같아.

프로그램
  1. 1 + 2

명령 topaz run main.tpz

화면 창

비어 있음

쪽지 받침

비어 있음

끝 표시

0

이 프로그램은 실행까지 갔을까?

뚝딱이가 쓴 명령은 topaz run main.tpz야. 이 파일은 검사를 통과하고 실행을 마쳤어. 파일 안에는 글을 쓰라는 줄이 없어서 화면 창은 비어 있어. 쪽지 받침도 비었고 끝 표시는 0이야.

화면은 비었어. 그럼 쪽지 받침에는 무엇이 있고, 끝 표시는 몇이야?

같은 파일을 topaz check로 검사만 한 기록

명령 topaz check main.tpz

화면 창
main.tpz: types-ok (1 module)
main.tpz: resolve-ok (1 module)
쪽지 받침

비어 있음

끝 표시

0

검사만 한 명령도 끝 표시는 0이었어. 화면 창에는 프로그램의 글 대신 검사 결과 두 줄이 남았어.

이 주문서의 실행 원문 보기

'비어 있음'은 기록판의 이름표야. 원본 파일의 크기는 0바이트야.

입력 정보
입력 바이트
6
입력 sha256
cb898749d76e51fdaf6c6636920ccdb4f415fc1cffd1e2497636b38cc2469807
토파즈 판
5.21.1
실행 파일 sha256
8dbc4723d2c243bfde6f13f4e23ccbd33f409d24173d6b99a71d957581183cef

같은 판으로 같은 절차를 두 번 따랐어. 두 번의 표준 출력과 표준 오류는 바이트까지 같았고, 종료 코드도 같았어.

앞 판과도 대조했어. 이 입력에 같은 명령을 썼을 때, 5.21.0 판과 5.21.1 판이 남긴 표준 출력과 표준 오류는 바이트까지 같았어. 종료 코드도 같았어.

나 시작과 결과를 쓰는 프로그램

맨 위 줄은 화면에 쓰는 도구 io를 불러와. "{result}" 자리에는 result에 담긴 값이 글자로 들어가.

프로그램
  1. import std.io
  2. io.writeLine("시작")
  3. let result = 1 + 2
  4. io.writeLine("{result}")

명령 topaz run main.tpz

화면 창
시작
3
쪽지 받침

비어 있음

끝 표시

0

이 프로그램은 실행까지 갔을까?

화면 창에 시작과 3이 차례로 있어. 프로그램이 실행되면서 쓴 글이야.

화면 창에 시작과 3이 있어. 실행하지 않았다면 누가 이 글을 썼을까?

같은 파일을 topaz check로 검사만 한 기록

명령 topaz check main.tpz

화면 창
main.tpz: types-ok (2 modules)
main.tpz: resolve-ok (2 modules)
쪽지 받침

비어 있음

끝 표시

0

검사만 한 명령도 끝 표시는 0이었어. 화면 창에는 프로그램의 글 대신 검사 결과 두 줄이 남았어.

이 주문서의 실행 원문 보기

'비어 있음'은 기록판의 이름표야. 원본 파일의 크기는 0바이트야.

입력 정보
입력 바이트
82
입력 sha256
fa10ebd780428f533e18da2a076ee930a9be18ae0351395d12b8fcf0fd952317
토파즈 판
5.21.1
실행 파일 sha256
8dbc4723d2c243bfde6f13f4e23ccbd33f409d24173d6b99a71d957581183cef

같은 판으로 같은 절차를 두 번 따랐어. 두 번의 표준 출력과 표준 오류는 바이트까지 같았고, 종료 코드도 같았어.

앞 판과도 대조했어. 이 입력에 같은 명령을 썼을 때, 5.21.0 판과 5.21.1 판이 남긴 표준 출력과 표준 오류는 바이트까지 같았어. 종료 코드도 같았어.

다 쌍둥이

나와 넷째 줄 하나만 달라. 2 자리에 "사과"가 있어.

프로그램
  1. import std.io
  2. io.writeLine("시작")
  3. let result = 1 + "사과"
  4. io.writeLine("{result}")

명령 topaz run main.tpz

화면 창

비어 있음

쪽지 받침
error[TPZ5001]: `+` needs matching int, float, string, BigInt, or Decimal operands, found `int` and `string`
 --> main.tpz:4:14
  |
4 | let result = 1 + "사과"
  |              ^^^^^^^^

main.tpz: 1 type diagnostic

쪽지는 넷째 줄의 1 + "사과" 전체를 가리켜. ^ 여덟 개가 1 아래에서 시작해. 사와 과가 기호보다 넓게 보이는 화면에서는 밑줄이 식보다 조금 짧아 보여.

끝 표시

1

이 프로그램은 실행까지 갔을까?

쪽지 끝줄에 type diagnostic, 타입 검사의 진단이라고 적혀 있어. 그래서 셋째 줄의 시작도 화면에 나오지 않았어.

화면이 비었다는 것만으로는 알 수 없어. 쪽지의 첫 줄과 끝줄을 읽어 볼래?

같은 파일을 topaz check로 검사만 한 기록

명령 topaz check main.tpz

화면 창

비어 있음

쪽지 받침
error[TPZ5001]: `+` needs matching int, float, string, BigInt, or Decimal operands, found `int` and `string`
 --> main.tpz:4:14
  |
4 | let result = 1 + "사과"
  |              ^^^^^^^^

main.tpz: 1 type diagnostic
끝 표시

1

같은 파일을 topaz check로 검사만 해 봐도 쪽지 받침에 같은 글이 나왔어.

이 주문서의 실행 원문 보기

'비어 있음'은 기록판의 이름표야. 원본 파일의 크기는 0바이트야.

입력 정보
입력 바이트
89
입력 sha256
6fcf0030d292014580276da228e936c846710308067395a4b7f56a6590632f65
토파즈 판
5.21.1
실행 파일 sha256
8dbc4723d2c243bfde6f13f4e23ccbd33f409d24173d6b99a71d957581183cef

같은 판으로 같은 절차를 두 번 따랐어. 두 번의 표준 출력과 표준 오류는 바이트까지 같았고, 종료 코드도 같았어.

앞 판과도 대조했어. 이 입력에 같은 명령을 썼을 때, 5.21.0 판과 5.21.1 판이 남긴 표준 출력과 표준 오류는 바이트까지 같았어. 종료 코드도 같았어.

세 주문서에 꼬리표를 하나씩 달면 발견 카드가 열려.

빈 화면 둘, 까닭 둘

가와 다는 화면 창이 똑같이 비어 있어.

가는 끝까지 실행했지만 쓰라는 줄이 없었고, 다는 검사에서 막혀 실행을 시작하지 않았어.

화면 창만 보지 말고 쪽지 받침과 끝 표시를 함께 읽자.

작업대와 손잡이, 표시등은 이야기 속 그림이야. 화면 창과 쪽지 받침의 글은 미리 돌린 실제 기록에서 왔어.

진짜 속사정

화면에 쓰는 건 실행할 때야

화면 창에 나온 글은 표준 출력, 쪽지 받침에 나온 글은 표준 오류라고 불러.

프로그램과 도구가 글을 내보낼 수 있는 두 통로야. 보통 결과는 표준 출력에, 진단이나 안내는 표준 오류에 써. 두 통로의 글은 따로 모을 수 있어.

끝 표시의 수는 topaz run 명령의 종료 코드야. 보통 0은 명령을 성공적으로 마쳤다는 뜻이고, 0이 아닌 수는 성공적으로 마치지 못했다는 뜻이야. 이번 기록에서 가와 나는 0, 다는 검사에서 멈춰 1로 끝났어.

인터프리터는 프로그램의 지시를 읽고 그 지시가 정한 동작을 수행하는 프로그램이야. 안에서 실행하기 좋은 다른 표현으로 옮겨 쓰기도 해.

토파즈 5.21.1의 topaz run은 소스를 검사하고, 통과한 프로그램을 인터프리터로 실행해. 이번 명령이 끝난 뒤 작업 폴더에는 main.tpz 하나가 남았어.

이 판의 topaz run은 실행 전에 소스를 검사해. 다처럼 타입 오류가 나오면 그 오류를 알리고 끝나. 그래서 셋째 줄의 시작도 찍히지 않았어.

언제 진짜로 계산할까?

이번 기록에서는 프로그램을 실행할 때 화면에 3이 나왔어.

let result = 1 + 2에서 더한 값이 result에 담겨. 마지막 줄은 그 값을 글자로 바꿔 표준 출력에 3을 써.

우리는 어느 줄이 3을 썼는지 알 수 있어. 어떤 컴파일러는 이처럼 미리 알 수 있는 값을 실행 전에 구해 두기도 해. 이번 실행 기록에는 덧셈의 값을 처음 구한 순간까지 찍혀 있지는 않아.

모모의 카드는 어디 갔을까?

둘째 주문서의 프로그램도 따로 관측했어. 작업 기록 44줄 가운데 세 작업을 골라 보면, 더하기 카드가 첫 번째로 가리키는 값은 1이고 두 번째 값은 2야. 이번에는 더하기 작업이 그 값에 result라는 이름을 붙이는 let 문장 안에 있어.

작업 기록에서 고른 세 작업 · 토파즈 컴파일러 5.21.1 기록
하는 일기록의 낱말표현들어 있는 곳
두 값 셈binaryaddi64이름을 붙이는 문장
정수integer1i64두 값 셈
정수integer2i64두 값 셈

둘째 주문서의 작업 기록 44줄 보기, 새 창

topaz run에도 같은 소스 파일을 건넸어. 실행 기록에는 명령이 남긴 글과 종료 코드가 있어. 실행하는 동안 안에서 어떤 표현을 거쳤는지는 이 기록으로 알 수 없어.

모든 언어가 이렇게 할까?

아니. 언어 구경에서 본 파이썬 프로그램은 첫 줄에서 시작을 찍었어. 그다음 줄의 "3" + 4를 실행할 때 TypeError가 나서 멈췄어.

언제 검사하고 언제 실행하는지는 도구마다 달라.

한 줄 정리

오늘 알게 된 것

프로그램이 화면에 쓰는 글자는 그 프로그램을 실행할 때 나와.

topaz run은 먼저 프로그램 전체를 검사하고, 통과해야 실행을 시작해.

화면 창이 비어 있으면 프로그램은 실행되지 않은 걸까? 가와 다에서 단서를 하나씩 찾아봐.

답 펼쳐 보기

꼭 그렇지는 않아.

가는 쪽지 받침이 비어 있고 끝 표시가 0이야. 검사를 통과하고 실행을 마쳤지만 화면에 쓰라는 줄이 없었어.

다는 쪽지 받침 끝줄에 type diagnostic이 있고 끝 표시가 1이야. 검사에서 멈춰서 실행을 시작하지 않았어.

이제 빈 화면 앞에서 무엇을 더 읽어야 하는지 알겠네.

속사정 도감낱말 다시 보기인터프리터표준 출력과 표준 오류

다음 이야기

제6화컴파일러는 누가 만들었을까?

한줄이그런데 나를 검사해 준 도구는 누가 만들었어?

길 끝 화분에서 작은 싹이 고개를 내밀었어.

컴파일러도 누군가 쓴 프로그램일까?

다음에는 컴파일러가 어디서 왔는지 따라가 보자.