PART I · 01–05
정상 순서와 점프의 갈림길
왜 보통 상태변환만으로 goto를 설명하기 어렵나요?
명령의 뜻을 상태에서 상태로 가는 단순 함수로 놓으면 두 명령을 차례로 합성하기 쉽습니다. 문제는 첫 명령 안에서 바깥 레이블로 뛰어 둘째 명령을 생략할 때입니다. 정상적으로 끝난 뒤 이어갈 일을 인수에 넣어 두면, 점프는 그 인수와 다른 경로를 선택할 수 있습니다.
사회자 사례를 보겠습니다. 접수 A, 저장 B, 안내 C의 세 줄 중 B를 실행했는지는 어떻게 알까요?
답변 마지막 화면은 어느 쪽에서나 안내 C입니다. A에서 곧바로 C로 건너간 기록은 [A,C]이고, 저장을 거친 기록은 [A,B,C]입니다. 화면 제목이 같다는 사실만으로 저장이 끝났다고 판단하면 첫 경로를 놓칩니다. 줄 순서밖에 모르는 설명에는 이 둘을 가를 자리가 없습니다. 첫 줄을 읽을 때도 정상적으로 이어갈 B와 점프 대상 C를 함께 표현할 수 있어야 합니다.
원문·범위 · §1, 인쇄본 3–4쪽
마지막 안내가 떴다면 저장이 끝났다는 결론을 낼 수 있을까요?
실행 로그에서 B를 확인해야 합니다. 점프해도 안내 C는 보입니다.
continuation은 무엇인가요?
계속해서 할 일을 나타내는 함수입니다. 이 원문의 명령 후속 계산은 어떤 저장 상태를 받아 프로그램이 끝날 때의 상태를 돌려줍니다. “다음 줄 번호”보다 많은 것이 들어갑니다. 그 줄에서 시작해 마지막까지 수행할 일이 담깁니다.
사회자 그렇다면 빈 로그를 받아 안내 C를 적는 것만으로도 ‘남은 계산’이 되나요?
답변 그렇습니다. k(σ)=σ 뒤에 C 추가라고 정하면 빈 로그에는 [C]가, 이미 A가 적힌 로그에는 [A,C]가 남습니다. 같은 k를 두 상태에 적용해도 결과는 달라집니다. 맨 끝에서 더 할 일이 없을 때는 상태를 그대로 돌려주는 항등 함수를 씁니다. 그 함수도 하나의 후속 계산입니다.
원문·범위 · §3, 7–9쪽
맨 끝의 k가 항등 함수라면 [A,B]에 적용한 결과는 무엇인가요?
[A,B]입니다. 끝났다는 표시 때문에 B를 지우거나 빈 상태로 되돌아가지 않습니다.
순차명령 C1;C2는 continuation으로 어떻게 읽나요?
바깥 continuation k 앞에 C2의 의미를 붙여 새 continuation을 만들고, 그것을 C1에 전달합니다. 따라서 C1이 정상 종료하면 C2와 k가 이어지고, C1이 jump하면 이 정상 경로를 버릴 수 있습니다.
사회자 뒤에 있는 명령부터 묶으면 실행도 거꾸로 되는 것 아닌가요?
답변 종료 카드 k를 탁자에 놓고, 그 앞에 안내, 저장, 접수를 차례로 끼워 넣어 보세요. 완성된 묶음은 접수(저장(안내(k)))입니다. 실제 장부에는 접수부터 적힙니다. 뒤에서부터 만든 것은 나중에 할 일을 가리키는 연결이지 실행 로그가 아닙니다. 실험 1에서 저장과 안내의 자리를 바꾸면 연결 모양과 로그가 나란히 달라집니다.
원문·범위 · §3, 9–10쪽
A 뒤에 C, 그 뒤에 B를 실행하려면 A에 어떤 카드를 건넬까요?
C 뒤에 B와 끝을 붙인 C(B(k))를 건넵니다. 실제 기록은 A,C,B입니다.
jump는 continuation을 어떻게 바꾸나요?
goto L은 레이블 환경에서 L의 후속 계산을 찾아 현재 상태에 적용합니다. 소스에서 바로 뒤에 적힌 명령은 점프 순간의 정상 경로에서 빠집니다. 뒤의 다른 지점에서 그 줄로 다시 돌아오는 프로그램이라면 나중에 방문할 수 있습니다.
사회자 goto가 B를 건너뛰면, 이미 적힌 A도 지워지나요?
답변 점프는 지금 가진 장부를 들고 L로 갑니다. 없애는 것은 앞으로 B를 실행하라는 연결입니다. 앞에서 A를 적었다면 L의 안내 C가 받은 장부에도 A가 있습니다. 따라서 결과는 [C]가 아니라 [A,C]입니다. 점프를 과거 상태로 되돌리는 동작과 혼동하면 이 한 글자가 달라집니다.
원문·범위 · §4, 13–14쪽
A; goto L; B; L:C에서 한 번도 방문하지 않은 명령을 고르세요.
B를 적는 세 번째 줄입니다. 이동 전의 A와 이동 후의 C가 남습니다.
레이블의 뜻은 주소인가요?
원전은 레이블의 뜻을 그 지점부터 끝까지 수행할 상태변환으로 줍니다. 구현은 이 동작을 코드 주소나 실행 기록으로 실현할 수 있습니다.
사회자 실행 파일에서 L이 120번 주소에 있었다가 다음 번에는 180번에 놓이면 의미도 달라질까요?
답변 두 배치 모두 L에서 안내 C를 실행하고 끝난다면, 여기서 비교하는 로그의 함수는 같습니다. 어느 주소에서 몇 바이트를 읽는지는 구현에 속합니다. 거꾸로 같은 숫자 주소도 다른 코드가 놓이면 다른 일을 합니다. 레이블 환경 ρ에서 L을 찾아 현재 상태에 적용하는 표현은 배치 주소에 기대지 않고 도착 이후의 일을 드러냅니다.
원문·범위 · §3–4, 10쪽 및 13쪽
최종 로그만 관찰하는 이 모형에서 코드 배치가 달라졌음을 로그만으로 알아낼 수 있나요?
두 배치가 같은 입력에서 같은 기록을 남기면 그 로그 관찰로는 구별할 수 없습니다.
PART II · 06–10
값과 상태를 건네는 방법
식의 continuation은 명령의 것과 왜 다른가요?
식은 상태뿐 아니라 계산한 값도 다음 단계에 전달해야 합니다. 식 continuation은 값과 상태를 받아 남은 계산을 수행합니다. 부분 결과가 있는 식 안에서 jump가 일어나는 경우를 설명하는 데 필요합니다.
사회자 책 두 권의 합계가 7이라는 값만 가져가면 바깥 계산을 마칠 수 있을까요?
답변 계산을 하는 동안 대출 장부의 수정 횟수도 하나 늘었다고 해 보겠습니다. 바깥 규칙이 ‘합계에 수정 횟수를 더한다’라면 값 7 하나만으로는 부족합니다. 똑같이 7을 얻어도 횟수가 1이면 다음 결과는 8, 2이면 9입니다. 그래서 식의 후속 계산에는 계산한 값과 그때의 상태를 함께 건넵니다.
원문·범위 · §3, 10–12쪽
값 7을 그대로 두고 수정 횟수를 1에서 2로 바꾸면 바깥 식의 값은 얼마만큼 바뀌나요?
7+1=8에서 7+2=9로 1 늘어납니다. 값 하나가 같아도 상태가 다른 두 실행을 구별합니다.
valof와 resultis 사례는 무엇을 보여 주나요?
resultis는 값을 계산한 뒤, 자기를 가장 안쪽에서 감싸는 valof가 저장해 둔 식의 후속 계산에 그 값과 현재 상태를 건넵니다. 이 valof 안에서 해당 명령 뒤에 남아 있는 정상 경로는 여기서 끝납니다. valof가 겹쳐 있어도 더 바깥의 valof까지 한꺼번에 빠져나가지는 않습니다.
사회자 resultis를 만난 자리 뒤에 ‘장부 한 번 더 수정’이 있으면 몇 번을 셀까요?
답변 입력 3에서 첫 수정을 하고 곧바로 3을 넘기면 횟수는 1이고 바깥 값은 4입니다. 두 번째 수정까지 진행한 뒤 3+3을 넘기는 경로에서는 횟수 2와 값 6이 건너가므로 바깥 값은 8입니다. 두 호출 모두 바깥 계산은 계속됩니다. 끝나는 것은 그 valof 내부에서 아직 남았던 일입니다.
원문·범위 · §4, 17–18쪽
늦게 빠져나가는 경로에서 두 번째 수정만 놓치면 어떤 오답이 생길까요?
값 6에 횟수 1을 더해 7이라고 답하게 됩니다. 정확한 값 8에는 두 수정이 모두 반영됩니다.
continuation은 실행 스택과 같은가요?
후속 계산은 남은 계산의 기능을 나타냅니다. 실행 스택은 그 기능을 실현하는 방법 가운데 하나입니다. 읽고 있는 것이 수학적 정의인지, 정의를 실행하는 장치인지 구별하면 비교 기준이 분명해집니다.
사회자 종이에 남은 일을 적어 실행해도 스택이 꼭 있어야 하나요?
답변 교사는 ‘저장하고 안내’라고 적은 쪽지를 들고, 다른 교사는 두 개의 상자에 같은 순서를 쌓을 수 있습니다. 두 구현을 비교할 때는 쪽지의 모양이 아니라 어떤 입력에 어떤 순서의 로그를 남기는지 봅니다. 중간에 L로 가면 쪽지와 스택 모두 정상 후속 일을 버리고 L에서 이어야 합니다. 이를 확인하는 테스트 한 건으로 모든 입력이 같다고 결론짓지는 않습니다.
원문·범위 · §5, 19–21쪽 및 편집부 비교
스택 높이가 같다는 사실만으로 두 구현의 동작이 같을까요?
같은 높이의 스택에도 서로 다른 후속 일이 담길 수 있습니다. 남은 연산과 상태에 따른 결과를 비교해야 합니다.
while 반복도 continuation으로 설명되나요?
반복 몸체가 끝나면 조건 검사로 돌아가는 continuation을 만들 수 있습니다. 의미 방정식은 자기 자신을 참조하므로 최소 고정점 조건이 함께 필요합니다.
사회자 반복 조건을 “남은 책 수가 0보다 크다”로 두면 몸체 뒤에는 무엇을 붙일까요?
답변 책이 두 권이면 한 권을 처리하고 조건을 다시 봅니다. 2→1→0을 지나 조건이 거짓이 되면 비로소 반복문 바깥의 k로 갑니다. 반복 몸체에 k만 직접 붙이면 한 번만 처리하고 끝나 버립니다. 반대로 참·거짓을 확인하지 않고 늘 몸체로 가면 0이 되어도 멈추지 못합니다.
원문·범위 · §4, 15–16쪽
처음부터 0권이라면 본문과 바깥 k 중 어디로 먼저 갈까요?
조건이 거짓이므로 본문을 한 번도 실행하지 않고 k로 갑니다.
jump 뒤의 명령이 정말 무시되는지 어떻게 검사하나요?
상태에 추적 표식을 하나 추가합니다. jump 다음 명령이 표식을 바꾸도록 한 뒤 실행 결과에서 표식이 그대로면 정상 continuation이 버려졌음을 작은 모형 안에서 확인할 수 있습니다.
사회자 화면이 너무 빨라 B를 못 본 것과 B를 아예 건너뛴 것은 어떻게 가르나요?
답변 B의 줄에서만 장부에 고유 표식을 넣게 합니다. 점프가 없는 경로는 1,2,3,4를 방문해 로그 [A,B,C]를 남깁니다. L로 가는 경로는 1,2,4만 방문해 [A,C]를 남깁니다. 만약 B와 C가 같은 글자를 출력하게 만들었다면 글자만 보고는 구별이 덜 분명합니다. 줄 번호와 기록을 함께 남겨 놓는 까닭입니다.
원문·범위 · §4, 13–14쪽에 기댄 편집부 추적
두 실행 모두 안내 C가 출력됐을 때, 어떤 추가 자료가 점프를 보여 줄까요?
세 번째 줄의 방문 여부와 B 표식의 유무를 봅니다. 실험 2에서는 같은 입력에서 두 자료를 함께 비교할 수 있습니다.
PART III · 11–15
레이블의 순환과 모형의 한계
여러 레이블이 서로 점프하면 의미가 순환하지 않나요?
각 레이블 continuation이 서로를 참조하는 연립 재귀 방정식이 됩니다. 원전은 의미 영역과 최소 고정점 이론으로 해를 설명합니다. 유한 시뮬레이션에서 반복을 제한했다고 일반 해의 존재가 증명되는 것은 아닙니다.
사회자 L에서 M, M에서 다시 L로 간다면 다음을 미리 계산해 둘 수 있나요?
답변 두 레이블의 후속 일은 서로를 가리킵니다. 단순히 마지막 줄부터 한 번씩 값을 채우는 설명으로는 이 원을 풀기 어렵습니다. 원전의 고정점 해석과 별도로, 실험에서는 여덟 번만 실행해 보고 관찰을 멈추도록 했습니다. 여덟 번 만에 끝나지 않았다는 결과만으로 임의의 프로그램이 영원히 돈다는 정리를 얻지는 못합니다. 다만 ‘현재 상태에서 L과 M이 무조건 서로로만 간다’ 같은 추가 구조가 확인된 이 사례에 대해서는 별도 논증을 할 수 있습니다.
원문·범위 · §3–4, 레이블 환경과 재귀적 정의
100번까지 못 끝난 프로그램이 101번째에 끝날 가능성도 있을까요?
한도 결과만 가지고는 남아 있습니다. 특정 모형이 영원히 도는지 보이려면 되풀이되는 상태와 가능한 전이를 별도로 확인해야 합니다.
후속 계산 전달 방식(CPS)은 이 논문과 어떤 관계인가요?
남은 계산을 명시적으로 인수에 넣는 발상을 공유합니다. 이 논문의 대상은 점프가 있는 작은 언어의 의미 방정식입니다. 현대 언어 전체를 CPS로 변환하는 규칙과 보존 증명은 따로 정해야 합니다.
사회자 명령에 k를 붙이면 그 자체가 현대 언어의 CPS 변환 전체인가요?
답변 원전은 jump가 있는 작은 언어의 뜻을 수학적으로 정의합니다. 현대 변환을 설명하려면 원래 언어와 결과 언어, 호출 순서, 어떤 결과를 보존할지를 정해야 합니다. 예를 들어 A와 B가 순서대로 장부에 글자를 적는다면 변환 뒤에도 [A,B]가 남아야 합니다. 같은 k 표기를 쓴 사실 하나만으로 이 보존 성질이 증명되지는 않습니다.
원문·범위 · 원전 §0·§5와 편집부의 비교
두 프로그램이 같은 최종 숫자를 냈는데 로그는 [A,B]와 [B,A]라면 변환 성공일까요?
관찰 기준에 로그가 포함된다면 실패입니다. 숫자만 같은지, 상태 변화와 종료까지 같은지를 미리 정해야 합니다.
예외 처리와도 연결되나요?
오류가 났을 때 정상 continuation 대신 오류 처리 continuation으로 이동하는 구조로 설명할 수 있습니다. 다만 현대 언어의 형식적 예외 체계 전체는 별도 정의가 필요합니다.
사회자 신청 오류뿐 아니라 이미 빌린 장비의 반납까지 자동으로 처리될까요?
답변 오류 처리 카드에 무엇을 적었는지에 달렸습니다. ‘안내 C로 이동’이면 안내만 하고, ‘장비 반환 뒤 안내’이면 둘 다 합니다. 정상 후속 일 대신 오류 후속 일을 선택한다는 설명만으로 반환이 실행되지는 않습니다. 두 경로의 장부를 나란히 읽으면 제어 이동과 정리 정책이 별도라는 점이 분명해집니다.
원문·범위 · §1의 오류 탈출 및 편집부의 적용
오류 경로의 마지막에 안내가 있으면 반드시 장비가 반환됐을까요?
반환 연산이 그 경로에 들어 있는지 봐야 합니다. 안내만 실행한 경로도 있을 수 있습니다.
continuation을 쓰면 모든 제어 문제가 해결되나요?
원전은 매우 일반적인 jump를 다룰 힘을 보여 주지만, 동시성·비동기 입출력·자원 해제 정책은 각각 추가 의미가 필요합니다. 강력한 표현 도구라는 결론과 모든 문제의 완성 해법이라는 주장을 구별합니다.
사회자 버튼을 눌러 안내로 이동하는 것과 네트워크 응답을 기다리는 것은 무엇이 다를까요?
답변 현재 실습은 매 단계 다음 명령 하나를 고릅니다. 서로 다른 작업이 언제 실행될지, 외부 응답이 어느 순서로 도착할지는 모형에 들어 있지 않습니다. 그런 문제에는 사건 순서나 자원 소유권을 표현하는 규칙을 더해야 합니다. 점프를 정확히 설명할 수 있다는 사실 그대로가 동시성까지 풀었다는 근거가 되지는 않습니다.
원문·범위 · §0의 소형 언어 범위, §5의 논의
응답 두 개의 도착 순서를 바꾸는 실험을 이 도구로 할 수 있을까요?
이 도구에는 외부 응답과 스케줄러가 없습니다. 두 사건의 가능한 순서를 검사하려면 상태와 전이 규칙을 추가해야 합니다.
이번 글에서 확인한 결론은 무엇인가요?
명령의 뜻에 ‘다음에 할 일’을 포함하면 정상 순서와 jump를 한 합성적 의미 체계에서 구별할 수 있습니다. 교육용 모형은 이 제어 흐름을 보여 주며, 1974 원문의 일반 방정식과 증명 범위를 대체하지 않습니다.
사회자 처음 도서관으로 돌아가면 어떤 세 가지를 물어야 할까요?
답변 오류 직전 장부에는 A가 있습니다. 정상 후속 일에는 B 뒤 C가 있고, 목적지 L의 후속 일에는 C가 있습니다. 오류일 때 셋째 봉투를 고르면 최종 장부는 [A,C]입니다. 식 안에서 빠져나온다면 봉투에 값도 넣습니다. 이 네 줄을 말할 수 있으면 단순히 “goto는 이동이다”라고 외운 것보다 한 단계 더 설명한 셈입니다.
원문·범위 · §3–4, 명령·식 continuation과 점프
점프를 만났을 때 기록할 세 항목을 말해 보세요.
그 순간의 상태, 버려지는 정상 후속 일, 레이블 환경에서 고른 새 후속 일입니다. 값을 들고 나가는 식 탈출이라면 전달되는 값도 함께 기록합니다.
INTERACTIVE NOTEBOOK
장부를 바꾸며 세 가지를 시험하기
먼저 로그나 결과를 예상하고 선택을 바꿔 보세요. 세 실험은 브라우저 안의 작은 언어에서만 실행됩니다.
1. 남은 계산 카드의 순서
세 장의 카드를 다른 순서로 놓으면 뒤에서 묶는 방법과 실제 기록 순서가 어떻게 달라질까요?
2. 점프가 버리는 줄
기록 A와 안내 C 사이에 있는 두 번째 명령을 바꿔 보세요. 존재하지 않는 레이블은 실행 전에 검사합니다.
1. 기록 A 2. goto L 3. 기록 B 4. L: 기록 C
3. 식에서 빠져나올 때의 값과 장부
첫 기록을 남긴 뒤 입력값 그대로 나가거나, 두 번째 기록 후 입력에 3을 더해 나갑니다. 바깥 계산은 넘겨받은 값과 장부의 수정 횟수를 더합니다.
원문으로 돌아가는 길
- 옥스퍼드 PRG-11 원문 PDF. 1974년 1월 기술보고서. 1절의 문제 제기, 3절의 명령·식 후속 계산, 4절의 레이블·반복·식 탈출 방정식을 읽었습니다. 본문 쪽수는 보고서에 인쇄된 쪽입니다.
- 옥스퍼드 컴퓨터과학과 서지. 1973년 파리 발표를 개정·확장한 1974년 판본을 기준으로 삼았습니다.
점프가 바꾸는 것은 다음에 할 일입니다. 그 순간까지의 상태는 새로 고른 후속 계산에 전달됩니다. 식 탈출은 계산한 값도 함께 전달합니다.
