'\n'의 출처
-
just foo 명령을 실행하면, justfile은 0x0A 바이트를 bar라는 파일에 기록함
-
just는 Rust로 작성되었으며, just 파서는 cook_string이라는 함수를 통해 escape 시퀀스를 포함하는 just 문자열 토큰을 UTF-8 문자열로 변환함
Rust의 처리
-
rustc는 scan_escape라는 함수에서 escape 코드를 처리함
-
rustc는 Rust로 작성되어 자체 컴파일되며, '\n'의 의미를 파악하기 위해 rustc에 위임함
- 초기 버전의 rustc는 OCaml로 작성되었으며, OCaml 버전의 rustc는 lexer에서 문자 escape를 처리함
OCaml의 처리
- OCaml 컴파일러는 \n을 \010으로 평가하여 결과를 삽입함
-
0x0A는 10이므로, OCaml 컴파일러가 \n을 처리할 때 0x0A 바이트 값을 얻게 됨
결론
-
justfile에서 \n 문자 escape가 있을 때, just 바이너리는 0x0A 바이트를 포함하여 최종 문자열에 기록함
- 이 0x0A 바이트는 rustc에 의해 삽입되었으며, 이는 OCaml 컴파일러가 처음으로 rustc 바이너리에 0x0A 바이트를 삽입한 것에서 시작됨
GN⁺의 정리
- 이 글은 \n 문자 escape가 어떻게 0x0A 바이트로 변환되는지를 설명함
- Rust와 OCaml 컴파일러의 역사적 배경을 통해 0x0A 바이트의 출처를 추적함
- 프로그래밍 언어의 컴파일러가 어떻게 문자 escape를 처리하는지에 대한 흥미로운 통찰을 제공함
- Rust와 OCaml의 컴파일러 동작을 이해하는 데 도움이 되는 글임