Simulizer

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