Inspecting generated code
캔버스의 블록은 실행되기 전에 읽을 수 있는 텍스트 코드로 변환됩니다. 이 코드를 직접 들여다보면 디버깅과 최적화에 도움이 됩니다.
WAT tab
캔버스 위쪽 탭에서 WAT를 누르세요. 변환된 WebAssembly Text가 표시됩니다. 어셈블리에 가까운 형식이지만 사람이 읽을 수 있습니다.
WAT는 다음과 같은 요소로 이루어집니다.
- 함수 정의
(func $main ...)—main함수에 대응합니다. - 호스트 import —
math,debug,tensor,matrix같은 모듈에서 바깥(런타임)이 제공하는 함수들입니다. - 지역 변수
(local $... i32)/(local $... f64)— 블록에서 만든 변수들입니다. - 명령 —
i32.add,f64.mul,call $...,if,loop,br_if등입니다.
블록 한 줄은 여러 WAT 명령에 대응하므로, 완전히 일대일로 맞아 떨어지지는 않습니다.
C++ tab
같은 탭 줄에서 **C++**를 누르면 동일한 워크스페이스를 C++로 번역한 결과가 표시됩니다. WAT보다 읽기 쉽고, 다른 환경(IDE, 노트북)에 옮겨 쓰기에도 좋습니다.
C++ 변환은 워크스페이스를 서버의 변환 서비스로 보낸 뒤 그 결과를 받아오는 방식으로 동작합니다.
Validation diagnostics
Infos 탭은 컴파일 단계에서 나온 진단 메시지를 보여 줍니다.
- 선언하지 않은 변수의 사용.
- 타입 불일치 (정수 자리에 실수가 온 경우 등).
- 모든 경로에서 return 하지 않는 함수.
- 사용되지 않은 호스트 import에 대한 경고.
각 메시지를 클릭하면 캔버스가 문제가 된 블록으로 자동으로 포커싱되므로, 어디가 문제인지 쉽게 찾을 수 있습니다.
Pitfalls
- WAT는 최적화 이전 형태의 코드입니다. 실제로 실행되는 바이트코드는 더 압축돼 있으므로, WAT의 명령 수가 곧바로 성능을 뜻하지는 않습니다.
- C++ 변환은 번역일 뿐 컴파일이 아닙니다. 변환된 C++을 외부에서 컴파일하려면 헤더와 호스트 함수를 흉내 낸 코드가 추가로 필요합니다.
See also
- 실행 파이프라인 전체 — 결과는 어떻게 나오나
- 네이티브 실행 파일 만들기 — 네이티브 빌드