Vertical Slice: Speech-to-Markdown Editor, LLVM UI Codegen, and Landscape Split - 우리만의 언어로
Source: Dev.to
우리는 SMS – LLVM을 통해 네이티브 ARM으로 컴파일되는 정적 타입 언어 – 를 만들고 있습니다. 런타임은 ForgeRunner (C++ / Godot)이며, 에디터는 ForgeStudio 로, 이것 역시 SMS로 작성되었습니다.
오늘 우리는 스택의 모든 레이어를 동시에 건드리는 수직 슬라이스를 배포했습니다. 수직 슬라이스의 의미는 바로 전체 컬럼이 동작한다는 것을 증명하는 것이지, 한 층만 작동한다는 것이 아닙니다.
🎙️ SMS에서 연속 음성 입력
새로운 SpeechRecognizer 컴포넌트는 SML (우리의 선언형 UI 언어)에서 다음과 같이 보입니다:
SpeechRecognizer {
id: mic
language: "de-DE"
mode: clean
filters: "zdf,wdr,applaus,musik"
}mode: clean 은 후처리를 활성화합니다: 불필요한 말, 방송 잡음, 박수 표시 등이 텍스트가 애플리케이션 로직에 도달하기 전에 제거됩니다.
음성 입력 흐름
mic.listen()로 인식을 시작합니다.mic.result가 부분 결과와 함께 발생합니다.- SMS는 이를
pendingText에 누적하고 즉시mic.listen()을 다시 호출 → 연속 음성 입력.
- SMS는 이를
음성 입력이 시작되는 순간 confirmRow 가 나타납니다: Stop / Confirm / Cancel. 각 동작은 mic.stop() 을 호출하기 전에 isDictating = false 로 설정합니다 – 레이스 컨디션이 없습니다.
previewLabel 은 wrap: true 로 설정되어 있어 긴 입력 텍스트가 화면을 늘리는 대신 줄 바꿈됩니다. 작은 디테일이지만 UX 차이가 큽니다.
Build 28.
🖥️ 가로 모드 자동 분할
ForgeRunner 가 이제 mainWindow.orientationChanged 를 듣습니다. 기기가 가로 모드로 회전하면 에디터가 자동으로 두 개의 창으로 분할됩니다: 왼쪽에 원본 SMS/Markdown, 오른쪽에 실시간 미리보기.
- 세로 모드에서는 토글 버튼을 사용해 편집과 미리보기를 전환할 수 있습니다.
- 분할(가로) 모드에서는 토글 버튼이 사라집니다 – 중복되기 때문이죠.
툴바는 컴팩트합니다: fontSize 가 14–18 사이. 모든 것이 한 손가락으로 닿을 수 있는 범위에 있습니다.
Build 34.
⚙️ LLVM 코드 생성: UI 속성 할당
대부분의 사람들이 보지 못하는 레이어이지만, 다른 모든 것을 가능하게 하는 레이어입니다.
SMS는 이제 UI 객체에 대한 정수 및 불리언 멤버 할당을 위한 네이티브 LLVM IR을 생성합니다:
sms_native_llvm_set_ui_int_propSMS 코드에서 label.fontSize = 16 을 작성하면 인터프리터를 거치지 않고 LLVM IR을 내보내어 네이티브 ARM 명령어로 컴파일됩니다. UI 속성이 기계 수준에서 설정됩니다.
이 덕분에 ForgeStudio 가 JVM 없이 Android에서 실행됩니다.
📝 실시간 Markdown 미리보기
에디터는 이제 모든 textChanged 이벤트마다 실시간 Markdown 미리보기를 렌더링합니다. 분할 모드에서는 두 창이 동시에 표시되고, 세로 모드에서는 전환이 가능합니다.
미리보기는 ForgeRunner 내부에서 네이티브하게 렌더링됩니다 – WebView도, Electron도, 브라우저 엔진도 없습니다.
🔧 인프라
run.sh: FORGE_ANDROID_JAVA_HOME and adb PATH fix이 한 줄은 약 두 시간에 달하는 디버깅을 의미합니다. Linux에서 Android 툴체인 경로를 해결하는 일은 특별한 고통이었죠. 이제 해결되었습니다.
Clarification: Java는 빌드‑타임 브리지일 뿐입니다. Android SDK는 APK를 패키징하고 서명하기 위해 JDK가 필요하지만, 런타임에는 JVM도, Kotlin도, Compose도 없습니다. 앱은 ForgeRunner (C++/Godot)를 통해 네이티브 ARM 코드로 실행됩니다. Java는 빌드 파이프라인에만 관여합니다.
왜 수직 슬라이스인가?
수직 슬라이스는 사용자 음성 입력부터 SMS 로직, LLVM 코드 생성, 네이티브 UI 레이어, Android 디바이스에서의 렌더링까지 끝‑끝으로 동작하는 완전한 기능입니다.
이는 레이어를 따로따로 구축하는 것과는 반대입니다. 전체 스택이 살아있다는 증거이죠.
우리는 Codeberg 에 있습니다. 이상한 무언가를 만들어 보세요.
Forge 4D 생태계의 일부 – 선언형 UI, 네이티브 컴파일, 클라우드 불필요.