golang 1.11 과 wasm , gopherjs
By SeukWon Kang
현재는 goguelike에서 web client를 만들기 위해서 gopherjs를 사용하고 있습니다.
다른 대안도 없고 약간 야매긴 하지만 잘 작동하고 있기에 만족스럽게 사용하고 있긴 합니다만 그래도 정식으로 golang에서 wasm을 지원하는 것이 베스트기에 wasm 을 정식으로 ( 실제로는 experimental port 라고 release note에 명시 ) 지원한다는 소식을 듣고 1.11의 릴리즈 만을 기다리고 있었습니다. 마침내 어제 1.11의 릴리스 소식을 듣고 바로 1.11의 설치를 하고 기존 gopherjs로 되어 있는 webclient를 wasm으로 포팅하는 작업을 시작했는데 .. 결론만 이야기 하면 일단 작업을 모두 정지하고 코드를 gopherjs 로 롤백 했습니다. 몇가지 사항을 기록해보면 ( 잊지 않기 위해서 ) wasm은 바이너리 포멧이라고 해서 크기가 작아지지 않을까 하는 기대 가 있었는데 gopherjs 로 만든 js 파일 크기가 최소화 옵션을 주면 8M byte , 압축하면 1.3M byte 그냥 컴파일 하면 12.3M , 압축하면 1.8M 일때 wasm으로 빌드하면 15.5M 가 나오더군요. 그리고 빌드시 아무런 에러가 나오지 않는데 web browser에서 로딩하면 컴파일 에러가 나오면서 ( wasm을 컴파일 하는 데 실패 ) 에러가 난 위치를 알려주지 않습니다. ( 아마 wasm을 disasmble 해서 코드를 보면 되겠지만 golang source 코드위치를 알 수 있도록 debug 정보가 없는 듯 합니다. ) gopherjs에서는 map 파일을 사용해서 (최소화 옵션이 아닌 경우 ) golang 코드위치를 알수 있습니다. 이 부분에서 결정정으로 아직 이르다고 판단했습니다. 에러 메시지는 f64에 i64를 대입하려고 한다는 에러인데 그 위치를 알 방법이 없으니 디버그를 할 방법이 없더군요. 아마 조금 시간이 지나면 해결 방법이 나오거나 ( 제가 아직 모르는 해결방법을 찾거나 ) 할 것 으로 생각되지만 아직 아닌 거지요. 그 외에도 제가 사용하기 위해서는 해결 해야 할 문제가 ( 확인 하진 않았지만 ) messagepack 지원 문제 websocket 지원 문제 등이 있습니다. 생각해보면 gopherjs 에서 이 부분들이 잘 해결되었던 것이 대단한것이지요. ( gopherjs 가)