Sollang을 브라우저에 올려봤습니다

안녕하세요. 디모이입니다.

그동안 Sollang의 stream 문법과 self-host 컴파일러를 계속 만들고 있었는데요. 언어를 소개하면서도 한 가지 아쉬움이 있었습니다.

직접 확인하려면 컴파일러를 설치해야 한다는 점이었죠.

그래서 이번에는 설치 없이 브라우저에서 바로 Sollang 코드를 수정하고 실행할 수 있는 플레이그라운드를 만들어봤습니다.

:backhand_index_pointing_right: https://sollang.slogs.dev

단순히 웹 편집기에 문법 색상만 입힌 데모는 아닙니다.

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억 개의 값을 배열로 만들지 않습니다.

중간 mapfilter 결과도 별도의 목록으로 만들지 않고요. 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을 설명으로만 보여드리는 것이 아니라, 브라우저에서 직접 만져볼 수 있게 됐네요.

6개의 좋아요