안녕하세요. 디모이입니다.
그동안 Sollang의 stream 문법과 self-host 컴파일러를 계속 만들고 있었는데요. 언어를 소개하면서도 한 가지 아쉬움이 있었습니다.
직접 확인하려면 컴파일러를 설치해야 한다는 점이었죠.
그래서 이번에는 설치 없이 브라우저에서 바로 Sollang 코드를 수정하고 실행할 수 있는 플레이그라운드를 만들어봤습니다.
단순히 웹 편집기에 문법 색상만 입힌 데모는 아닙니다.
C#으로 만든 Stage1 컴파일러나 .NET WASM을 올린 것도 아니고요. Sollang으로 작성한 최신 Stage2 self-host 컴파일러 자체를 WebAssembly로 빌드해 브라우저에 올렸습니다.
실행 버튼을 누르면 브라우저 안에서 다음 과정이 진행됩니다.
Sollang 소스 → LLVM → WebAssembly → 실행
소스 코드는 서버로 전송되지 않습니다. 편집부터 컴파일, 실행까지 모두 브라우저 안에서 끝납니다.
이번 플레이그라운드에서는 제가 Sollang에 넣고 싶었던 stream의 느낌도 바로 확인할 수 있습니다.
1..1000000000
-> map sensorId { ... }
-> tap reading { ... }
-> filter reading {
reading.celsius >= 57
}
-> take(5)
-> each alert {
alert -> println
}
이 코드는 10억 개의 값을 배열로 만들지 않습니다.
중간 map과 filter 결과도 별도의 목록으로 만들지 않고요. upstream에서 만들어진 값이 각 stage를 지나 downstream으로 직접 흐릅니다. 그리고 take(5)가 다섯 개를 받은 순간 upstream 전체가 멈춥니다.
실제 샘플에서는 10억 개 중 54개만 검사하고 종료됩니다.
C#의 IEnumerable도 지연 실행을 지원하지만, 기본적으로 소비자가 MoveNext()를 호출하며 값을 당겨오는 iterator 모델입니다. Sollang의 stream은 파이프라인 전체를 컴파일할 때 하나의 흐름으로 연결해 원본 loop 안으로 융합합니다.
그래서 코드를 읽을 때도 “누가 누구를 호출하는가?”보다 “값이 어디에서 만들어져 어디로 흘러가는가?”가 먼저 보이도록 해봤습니다.
컴파일 속도도 꽤 많이 개선했습니다.
전체 self-host 컴파일은 기존 17분대에서 약 46초까지 줄었고, 증분 빌드는 8~9초 정도, 같은 입력의 캐시가 적중하면 수십 ms 정도에 끝납니다. 브라우저의 일반 샘플은 제 환경에서 대체로 200ms 안팎에 컴파일됐습니다.
플레이그라운드에는 기본 문법뿐만 아니라 10억 센서 스트림, 중첩 주문 스트림, 거래 위험 스캔 같은 예제도 넣어두었습니다.
샘플을 선택한 뒤 숫자나 조건을 직접 바꾸고 실행해보시면 Sollang이 어떤 방향을 바라보고 있는지 조금 더 쉽게 느끼실 수 있을 것 같습니다.
아직 만들어가는 언어라 부족하거나 어색한 부분도 있을 텐데요. 직접 사용해보시고 문법이나 실행 결과, 추가했으면 하는 예제가 있다면 편하게 말씀해주세요.
이제 Sollang을 설명으로만 보여드리는 것이 아니라, 브라우저에서 직접 만져볼 수 있게 됐네요.