제3화 타미의 수상한 계산

언어 구경

제3화에서 본 "3" + 4, 다른 언어에서는 어떻게 될까?

모모

토파즈, 파이썬, 자바스크립트, 러스트로 같은 일을 하도록 쓴 짧은 프로그램을 하나씩 준비했어.

네 프로그램 모두 먼저 시작을, 그다음 "3" + 4의 결과를 찍도록 썼어.

칸마다 적힌 도구와 판으로 같은 절차를 두 번 따랐어. 두 번 모두 같은 결과가 나왔어.

  1. 토파즈

    토파즈 컴파일러 5.21.1로 실행한 기록

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

    명령

    1. 실행topaz run main.tpz종료 상태 1

      표준 출력

      비어 있음

      표준 오류
      error[TPZ5001]: `+` needs matching int, float, string, BigInt, or Decimal operands, found `string` and `int`
       --> main.tpz:4:14
        |
      4 | let result = "3" + 4
        |              ^^^^^^^
      
      main.tpz: 1 type diagnostic

    쉬운 풀이

    topaz run은 4번째 줄의 "3" + 4에서 멈췄어. 문자열(string)과 정수(int)는 이 +로 함께 쓸 수 없다는 TPZ5001 오류야.

    이 오류를 내고 끝나서, 맨 먼저 찍으려던 시작도 찍히지 않았어.

    오류 끝줄의 1 type diagnostic은 타입 검사에서 나온 오류라는 표시야.

    같은 파일에 topaz check를 따로 해 봐도 같은 오류가 나왔어.

    이 언어의 규칙

    토파즈는 실행 전에 + 양쪽의 타입을 확인해. 문자열을 이으려면 양쪽 모두 문자열이어야 해.

    함께 돌려 본 기록 보기함께 돌려 본 기록 접기
    1. 검사topaz check main.tpz종료 상태 1

      표준 출력

      비어 있음

      표준 오류
      error[TPZ5001]: `+` needs matching int, float, string, BigInt, or Decimal operands, found `string` and `int`
       --> main.tpz:4:14
        |
      4 | let result = "3" + 4
        |              ^^^^^^^
      
      main.tpz: 1 type diagnostic

    문자열 둘을 더하는 "3" + "4"로 바꿔 topaz run으로 돌리면 시작과 34를 찍고 끝났어.

    프로그램 control-string-plus-string.tpz
    import std.io
    
    io.writeLine("시작")
    let result = "3" + "4"
    io.writeLine("{result}")
    
    1. 실행topaz run control-string-plus-string.tpz종료 상태 0

      표준 출력
      시작
      34
      표준 오류

      비어 있음

  2. 파이썬

    CPython 3.13.16으로 실행한 기록

    프로그램 main.py
    print("시작")
    result = "3" + 4
    print(result)
    

    명령

    1. 실행python3.13 -u main.py종료 상태 1

      표준 출력
      시작
      표준 오류
      Traceback (most recent call last):
        File "‹작업 폴더›/main.py", line 2, in <module>
          result = "3" + 4
                   ~~~~^~~
      TypeError: can only concatenate str (not "int") to str

      ‹작업 폴더› 자리에는 프로그램을 둔 폴더의 경로가 찍혀. 기계마다 달라서 여기서는 가렸어.

    쉬운 풀이

    파이썬은 첫 줄을 실행해 시작을 찍었어.

    2번째 줄의 덧셈을 실행하는 순간 TypeError를 내고 멈췄어. 문자열(str)에는 문자열만 이어 붙일 수 있다는 뜻이야.

    표시 줄은 "3" + 4 전체에 걸쳐 있고, ^는 오류가 난 + 바로 아래에 있어.

    이 언어의 규칙

    파이썬은 이 +를 실행할 때 "3" 뒤에 이을 값도 문자열이어야 해.

    함께 돌려 본 기록 보기함께 돌려 본 기록 접기

    같은 파일을 바이트코드로 컴파일하는 py_compile은 오류 없이 끝났어. 이 도구에서는 덧셈을 실행할 때에야 문제가 드러났어.

    1. 컴파일python3.13 -m py_compile main.py종료 상태 0

      표준 출력

      비어 있음

      표준 오류

      비어 있음

  3. 자바스크립트

    Node.js 22.14.0으로 실행한 기록

    프로그램 main.js
    console.log("시작");
    const result = "3" + 4;
    console.log(result);
    

    명령

    1. 실행node main.js종료 상태 0

      표준 출력
      시작
      34
      표준 오류

      비어 있음

    쉬운 풀이

    node main.js는 시작과 34를 찍고 오류 없이 끝났어.

    숫자 4를 문자열로 바꿔 "3" 뒤에 이어 붙인 결과야.

    화면에는 따옴표 없이 34로 찍히지만, 함께 돌려 본 기록에서 typeof로 물어보면 string, 곧 문자열이라고 답해. 이 "34"는 고장이 아니라 규칙대로 나온 값이야.

    이 언어의 규칙

    문자열과 숫자를 +로 이으면 자바스크립트는 숫자를 문자열로 바꾼 뒤 둘을 이어 붙여.

    함께 돌려 본 기록 보기함께 돌려 본 기록 접기

    node --check는 문법만 살펴보고 프로그램을 실행하지 않아. 이 프로그램은 문제 없이 지나갔어.

    1. 검사node --check main.js종료 상태 0

      표준 출력

      비어 있음

      표준 오류

      비어 있음

    typeof로 결과의 타입을 찍으면 string이 나와. 다음 줄은 JSON.stringify로 값을 찍어서 "34"의 따옴표까지 보여 줘.

    프로그램 typeof-probe.js
    console.log("시작");
    const result = "3" + 4;
    console.log(typeof result);
    console.log(JSON.stringify(result));
    
    1. 실행node typeof-probe.js종료 상태 0

      표준 출력
      시작
      string
      "34"
      표준 오류

      비어 있음

  4. 러스트

    rustc 1.96.0으로 컴파일한 기록

    프로그램 main.rs
    fn main() {
        println!("시작");
        let result = "3" + 4;
        println!("{result}");
    }
    

    명령

    1. 컴파일rustc --edition 2024 main.rs -o main종료 상태 1

      표준 출력

      비어 있음

      표준 오류
      error[E0369]: cannot add `{integer}` to `&str`
       --> main.rs:3:22
        |
      3 |     let result = "3" + 4;
        |                  --- ^ - {integer}
        |                  |
        |                  &str
      
      error: aborting due to 1 previous error
      
      For more information about this error, try `rustc --explain E0369`.
    2. 실행실행하지 않음

      컴파일 뒤 폴더 main.rs

    쉬운 풀이

    rustc는 컴파일에서 멈췄어. &str에 정수({integer})를 더할 수 없다는 E0369 오류야.

    오류는 3번째 줄의 +를 가리키고, 양쪽 값의 타입을 따로 적어 보여.

    컴파일 뒤 폴더에는 main.rs만 남았어. 실행할 파일이 생기지 않아서 실행 단계는 없었고, 시작도 찍히지 않았어.

    이 언어의 규칙

    러스트는 컴파일할 때 두 값의 타입이 +로 함께 쓸 수 있는 조합인지 확인해.

나란히 놓고 보면

처음의 "3" + 4 프로그램 네 개를 다시 보자.

시작이 찍힌 칸은 어디였을까?

어떤 명령에서 오류가 나왔을까? 그때 프로그램은 이미 실행을 시작했을까?

오류 없이 끝난 칸은 무엇을 찍었을까?