한줄이
코드마을에 막 태어난 코드 한 줄이야. 여러 관문을 지나며 자기에게 무슨 일이 일어나는지 궁금해하지.
현실에서 연결되는 개념
소스 코드
사람이나 도구가 작성한 코드야. 컴파일러가 읽고 분석하는 대상이지.
읽다가 잘 모르는 친구나 낱말을 만났어? 여기서 다시 찾아보자.
친구들의 모습은 이야기야. 채집 기록은 실제 토파즈 컴파일러가 남긴 자료에서 가져왔어.
코드마을 친구들은 코드가 컴퓨터 안에서 겪는 일을 이야기로 보여줘.
한줄이는 코드 자체를 떠올리게 해. 톡톡, 가지, 타미, 모모는 컴파일러가 하는 서로 다른 일을 보여 줘. 뚝딱이와는 프로그램을 실행할 때 무슨 일이 생기는지 살펴봐. 씨앗과는 그 일을 하는 컴파일러가 무엇으로 쓰였는지 들여다봐.
실제 컴파일러 안에 이런 친구들이 사는 건 아니야. 일을 나누고 처리하는 방법도 컴파일러마다 다를 수 있어.
코드마을에 막 태어난 코드 한 줄이야. 여러 관문을 지나며 자기에게 무슨 일이 일어나는지 궁금해하지.
현실에서 연결되는 개념
소스 코드
사람이나 도구가 작성한 코드야. 컴파일러가 읽고 분석하는 대상이지.
큰 문 앞에서 가위를 들고 기다리는 친구야. 들어오는 코드에서 조각을 알아보고 다음 친구에게 건네줘.
조각들을 살펴보고 나무로 묶는 친구야. 규칙에 맞지 않으면 어디에서 문제가 생겼는지 찾아봐.
돋보기로 나무 안의 값들을 살펴보는 친구야. 연산이 그 값들의 타입을 받을 수 있는지 꼼꼼하게 확인해.
검사를 통과한 나무를 받아 다른 모양으로 옮겨 적는 친구야. 모양은 바꿔도 무엇이 무엇과 이어져 있는지는 그대로 남겨.
검사를 통과한 프로그램을 실제로 실행하는 친구야. 명령이 끝나면 화면 창과 쪽지 받침, 끝 표시를 함께 읽어.
길 끝 화분에 앉아 있는 친구야. 마을 지도를 뒤집어 그 뒷면에 적힌 컴파일러의 소스를 함께 읽어.
쉬운 뜻
코드를 읽고 분석해서 다른 표현으로 바꾸는 프로그램이야.
정확한 뜻
컴파일러는 소스 코드를 분석해 다른 표현으로 번역해. 그 결과는 목적에 따라 기계어일 수도 있고, 다른 언어의 코드나 중간 표현일 수도 있어. 컴파일 과정에서 코드의 문제를 찾아 알려 주기도 해. 어떤 일을 어떤 단계에서 처리하는지는 컴파일러마다 다를 수 있어.
기록을 만든 도구
이 사이트의 코드 분석 기록은 공개된 토파즈 컴파일러의 지정된 버전으로 얻었어.
토파즈 컴파일러 5.21.1
쉬운 뜻
컴파일러가 코드의 글자를 훑으며 알아보는 조각이야.
정확한 뜻
숫자, 이름, 연산 기호처럼 규칙에 따라 알아본 단위를 토큰이라고 해. 글자를 토큰으로 알아보는 일을 어휘 분석이라고 하지. 토파즈의 관측 기록에는 토큰의 종류와 원래 글자, 소스 코드에서 차지한 위치가 담겨 있어. 이 사이트는 기록의 바이트 위치를 독자가 읽기 쉬운 글자 칸으로 바꿔 보여줘.
코드마을 친구들
톡톡1 + 2
| 조각 | 종류 | 소스에서의 위치 |
|---|---|---|
1 | 숫자 integer | 1번째 칸 |
+ | 더하기 기호 plus | 3번째 칸 |
2 | 숫자 integer | 5번째 칸 |
실제 기록에서 1, +, 2는 각각 하나의 토큰이야.
이 식의 빈칸은 화면에 보여주는 토큰으로 남지 않았어.
쉬운 뜻
토큰을 문법 규칙에 맞게 살펴보고 코드의 구조를 알아내는 일이야.
정확한 뜻
구문 분석을 수행하는 부분을 파서라고 해. 파서는 토큰의 차례와 구성을 문법 규칙에 비춰 살펴봐. 규칙에 맞는 구조를 만들거나, 맞지 않는 부분에 관한 오류를 보고할 수 있어.
코드마을 친구들
가지1 + 2는 구문 트리를 만들었어.
하지만 1 + * 2는 문법 오류가 기록됐어.
토파즈는 *가 있는 다섯 번째 칸을 가리켰지.
쉬운 뜻
코드의 여러 부분이 어떤 관계로 묶여 있는지 나무 모양으로 나타낸 거야.
정확한 뜻
구문 트리는 코드의 문법적 구조를 노드와 연결 관계로 표현해. 문법의 세부적인 표기를 덜어 내고 구조를 나타낸 나무를 추상 구문 트리라고 해. 영어로는 Abstract Syntax Tree이고, 줄여서 AST라고 부르지.
1 + 2
더하기 식 부분 발췌
expression/ binary add1 expression/ integer2 expression/ integer이 식의 구문 트리에서는 더하기 식 아래에 왼쪽 숫자 1과 오른쪽 숫자 2가 연결돼 있어.
이 그림은 토파즈 관측 기록에서 해당 식을 나타내는 부분을 옮긴 거야.
쉬운 뜻
코드의 각 부분이 어떤 타입인지 알아내고, 연산에 그 타입을 사용할 수 있는지 확인하는 일이야.
정확한 뜻
타입은 값이나 식의 종류를 나타내. 타입 검사는 표현식의 타입과 연산 규칙이 맞는지 살펴보는 일이야. 언어와 실행 환경에 따라 타입 문제가 발견되는 방식과 시점은 다를 수 있어.
코드마을 친구들
타미1 + 2
1int 숫자2int 숫자1 + 2int 숫자토파즈는 숫자 두 개와 더하기 식 전체의 타입을 기록했어.
세 부분 모두 int야.
이 기록은 프로그램을 실행한 결과가 아니라 컴파일러의 타입 검사 단계에서 얻은 자료야.
쉬운 뜻
컴파일러가 코드에서 문제를 발견했을 때 알려 주는 내용이야.
정확한 뜻
오류 메시지는 무엇이 문제인지 설명하고, 문제가 발견된 소스 위치를 가리킬 수 있어. 토파즈의 이번 관측 기록에는 오류 코드와 영어 메시지, 가리킨 위치가 있어.
1 + * 2 TPZ2001
이 예제에서는 문법에 맞는 식을 만들지 못했어.
expected an expression
가리킨 자리 5번째 칸
1 + "사과" TPZ5001
이 예제에서는 문법 구조를 만들었지만 타입 검사에서 문제가 발견됐어.
`+` needs matching int, float, string, BigInt, or Decimal operands, found `int` and `string`
가리킨 자리 1~8번째 칸
실제 컴파일러가 남긴 영어 문장은 그대로 보존하고, 곁에 쉬운 풀이를 두었어.
쉬운 뜻
프로그램과 도구가 글을 내보낼 수 있는 두 통로야. 보통 결과는 표준 출력에, 진단이나 안내는 표준 오류에 써. 두 통로의 글은 따로 모을 수 있어.
쉬운 뜻
문장과 문장 사이의 경계를 표시하는 토큰이야.
정확한 뜻
컴파일러는 이 토큰을 보고 한 문장이 어디서 끝나는지 알아. 토파즈에서는 세미콜론을 직접 써서 둘 수 있고, 줄바꿈이 정리 단계를 지나며 문장 구분자가 되기도 해.
컴파일러는 한 프로그램을 여러 모양으로 나타낼 수 있어.
프로그램의 구조를 살펴보거나 다음 단계로 옮기는 데 쓰는 이런 모양을 중간 표현이라고 해.
진짜 낱말
중간 표현1 + 2
1 + 2의 작업 기록에는 더하기와 두 정수가 어떻게 연결됐는지 적혀 있어.
현미경에서 더하기 작업의 operands를 따라가 봐.
첫 번째는 1을 담은 작업으로, 두 번째는 2를 담은 작업으로 이어져.
1 줄바꿈 2 줄바꿈
토파즈 5.21.1은 이 입력을 읽으며 찾은 토큰과 정리한 뒤의 토큰을 한 파일에 남겼어.
현미경에서 첫 줄바꿈 자리를 따라가 봐. raw에서 newline이 있던 자리에 layout에서는 separator가 있어.
진짜 낱말
문장 구분자두 칸막이 모두 원문에서 가리키는 자리가 있어.
1 줄바꿈 2 줄바꿈 의 칸막이는 정리대가 첫 줄바꿈 자리에 문장 경계를 표시하면서 생겼어. 이 구분자의 synthetic은 true야.
1; 2 줄바꿈 의 칸막이는 직접 쓴 ;를 가리켜. 이 구분자에는 false가 적혀 있어.