How it runs
블록을 다 끼우고 Run 을 눌렀을 때 Simulizer 안에서 어떤 일이 일어나는지 짧게 설명합니다. 이 과정을 이해하지 않아도 사용에는 지장이 없지만, 알아 두면 디버깅이 한결 쉬워집니다.
In one line
블록 → 사람이 읽을 수 있는 텍스트 코드 → 바이너리 코드 → 브라우저 백그라운드에서 실행 → 결과 패널.
Step by step
캔버스에 놓인 블록은 화면 안에서 트리 구조를 이룹니다. Run 을 누르면 Simulizer는 그 트리를 위에서 아래로 한 번 훑으면서 WAT 이라는 어셈블리와 비슷하면서도 사람이 읽을 수 있는 텍스트로 바꿉니다. 이 텍스트는 캔버스의 WAT 탭에서 그대로 볼 수 있습니다.
WAT은 다시 WebAssembly 바이트코드로 컴파일됩니다. 이 바이트코드는 사람이 읽으라고 만든 것이 아니라, 브라우저가 직접 실행하는 압축된 명령어입니다.
Simulizer는 이 바이트코드를 백그라운드 스레드(Web Worker) 에서 실행합니다. 메인 스레드는 그동안에도 UI를 계속 그리기 때문에, 시뮬이 무거워도 화면이 멈추지 않습니다. 워커가 결과를 보내면 그 결과가 오른쪽 패널에 도착합니다.
Tensor & matrix operations differ
큰 텐서나 행렬 연산은 위의 컴파일 흐름을 거치지 않습니다. 대신 Simulizer는 이런 연산을 TensorFlow.js 라는 라이브러리에 넘겨 처리합니다. 가능한 경우 GPU(WebGPU)에서 돌고, 안 되면 WebGL, 그것도 안 되면 CPU 순으로 자동 폴백됩니다. 지금 어디에서 연산이 도는지는 워크스페이스 위쪽의 백엔드 표시에서 확인할 수 있습니다.
Why it's built this way
Simulizer가 이런 구조를 택한 데에는 세 가지 이유가 있습니다.
- 속도 — WebAssembly는 자바스크립트보다 5~10배 빠르고, 일반 수치 코드에서는 네이티브에 가까운 성능이 나옵니다.
- 투명성 — 모든 중간 산출물(WAT, C++ 변환)을 볼 수 있어야 한다는 설계 원칙을 따릅니다. 사용자가 이 도구는 블랙박스가 아니라는 것을 직접 확인할 수 있어야 하기 때문입니다.
- 격리 — 연산이 브라우저 안의 워커에서 돌기 때문에, Simulizer는 서버로 데이터를 보내지 않으며, 다른 사용자의 코드가 내 결과에 영향을 주지도 않습니다.