요약
Teal은 Lua에 정적 타입을 더하고 일반 Lua 코드로 컴파일하는 언어입니다.
히샴 무하마드가 시작해 여러 기여자가 함께 개발하는 오픈소스 프로젝트의 소개 페이지입니다. 자바스크립트 세계에서 TypeScript가 맡은 역할을 Lua에서 하겠다는 목표를 내걸었습니다.
왜 중요한가
- Lua의 가벼움과 이식성, 다른 프로그램에 끼워 넣기 쉬운 장점을 지키면서 타입 검사를 쓸 수 있습니다.
- 결과물이 평범한 Lua 파일이라 기존 Lua 환경에서 그대로 돌아갑니다.
- 2019년부터 발표가 이어진 프로젝트로, 2024년에는 5년을 돌아보는 발표도 있었습니다.
핵심 내용
- 배열, 맵, 레코드, 인터페이스, 유니언 타입(여러 타입 중 하나를 허용하는 타입), 제네릭을 지원합니다.
- 컴파일러 tl이 .tl 파일을 .lua 파일로 바꾸며, LuaRocks로 설치하거나 리눅스·윈도용 실행 파일을 받을 수 있습니다.
- 컴파일러 자체가 Teal로 작성되어 있습니다.
- 큰 프로젝트용 빌드 도구 Cyan, VS Code 확장, 언어 서버, 브라우저 플레이그라운드를 제공합니다.
- 라이선스는 Lua와 같은 MIT입니다.
HN 반응
- Luau와의 비교를 묻는 질문에, Teal은 Lua로 변환하는 도구라 별도 언어이자 런타임인 Luau와는 다르다는 답이 나왔습니다.
- Lua는 기능이 너무 적어 큰 프로그램에 맞지 않는다는 의견과, LuaJIT로 만든 앱을 수년째 문제없이 운영 중이라는 반박이 맞섰습니다.
규모가 큰 Teal 코드베이스의 좋은 예로는 Lua 패키지 관리자인 Luarocks가 있습니다. https://github.com/luarocks/luarocks/tree/main/src/luarocks
Luarocks가 있다는 건 알았는데 Teal이 있는 줄은 몰랐네요. 잠깐 Terra와는 어떻게 다른가 싶었다가, 이게 Lua판 TypeScript 같은 거라는 걸 깨달았습니다(그것도 좋죠).
타입 힌트는 어떤 동적 언어에든 쓸모가 있는 것 같습니다. 결국 대부분의 동적 언어가 타입 힌트를 갖추게 되니까요.
Luau와 비교한 글이 있는지 궁금합니다.
이건 트랜스파일러입니다. Luau는 완전히 다른 언어이자 런타임이고요.
Lua 문법 계열의 3대장 중 하나입니다. Teal(TypeScript 스타일), Fennel(Lisp 스타일), Moonscript(Ruby 비슷한 스타일)가 그 셋입니다.
트랜스파일러가 아닌 것도 하나 더 있습니다. https://github.com/rochus-keller/luon
웬만한 관점에서(거의 다?) Fennel은 Lisp 느낌이 나는 정도가 아니라 그냥 Lisp 계열 언어입니다. 굳이 말하자면 Clojure 느낌인데, Fennel을 만든 사람을 생각하면 그럴 만하죠.
하하, Fennel 얘기만 나오면 원래 글이 뭐든 간에 꼭 이 논쟁이 나오더라고요. 코드 골프하는 사람들이 에소랭의 튜링 완전성을 두고 논쟁하는 것 같아요. :)
참고로 저는 무슨 의미를 담으려던 게 아니라, 트랜스파일되는 Lua의 사용성이 서로 닮았다는 점을 짚으려던 것뿐이에요. 저는 Lua가 정신적으로는 Lisp이라고 생각하고, Fennel은 그 성질을 드러내 주는 도구라고 봐요. 사실 최근에 Teal과 Fennel을 합쳐서 정적 타입 Fennel 컴파일러를 만들었는데, 규모가 큰 프로젝트에서는 삶의 질이 확실히 좋아져요. 저는 Lisp 계열이나 명령 호출형 언어를 좋아할 수밖에 없는 운명인가 봐요. 둘 다 이제는 유행이 지났는데도요.
둘 다 배울 점이 많아요.
그 정적 타입 Fennel 컴파일러 링크 있으세요? 정말 흥미로울 것 같네요.
Techomancy는 Fennel의 메인테이너이고, 만든 사람은 Calvin Rose입니다(Janet도 그가 만들었습니다). 두 사람의 인터뷰는 다음과 같습니다.
technomancy https://alexalejandre.com/interviews/interview-with-technomancy/
calvin rose https://alexalejandre.com/interviews/interview-with-bakpakin/
덕분에 웃었네요.
그런데 정적 타입 Lua 방언이 대체 몇 개나 되죠? Terra는 알고 있고요. 그리고... Sol이었나, 그런 것도 있었던 것 같은데. 또 있나요?
이렇게 쏟아져 나오는 멋지고 주목할 만한 도구들을 우리가 대체 어떻게 다 따라가라는 거죠? 너무 감당이 안 되네요.
일단 Teal은 나온 지 최소 6~7년은 됐어요.
정말 중요한 정보네요.
Algernon 웹 서버는 Teal을 기본으로 지원합니다.
Hisham은 여기서 핵심 개발자 중 한 명입니다. GoboLinux와 htop 등을 만든 사람이죠.
개인적으로는 Lua를 그리 좋아하지 않습니다. 모든 면에서 너무 가벼운 언어이거든요(문법이든 기능이든, 제 생각에는 너무 가볍습니다). 그래도 이렇게 창의적인 시도가 계속 발전을 이끄는 건 좋은 일입니다.
GoboLinux와 htop을 같은 개발자가 만들었다는 것도 몰랐는데, Teal까지일 줄은 몰랐네요. 단순하고 직관적인 걸 선호해서 GoboLinux 같은 걸 만든 사람이 Lua와 직접 관련된 일에도 참여한다는 게 어느 정도 이해는 됩니다.
너무 가볍다는 점이 답답하다는 말씀에는 저도 동의합니다. 다만 저는 작년 초에 모드를 만들려고 처음 써 봤는데, 여러모로 처음부터 제대로 설계한 JavaScript 같다는 생각이 들었습니다. 둘 다 모든 것에 맵 자료구조 하나를 씁니다. 배열도 "정수 키가 순서대로 늘어나는 맵"이죠. 그런데 Lua는 배열 순회가 달라야 한다는 걸 예상하고, 반복문 문법에서 어느 쪽으로 순회할지 고를 수 있게 해 놨습니다. 둘 다 기본으로 제공하는 API가 많지는 않지만, Lua는 첫날부터 모듈 시스템을 정의해 뒀고(그랬을 거라고 생각하는데, 확실하지는 않습니다) 그걸 객체를 정의하는 데 쓰는 방법까지 제공합니다. 반면 JavaScript는 프로토타입 상속 체계가 필요 이상으로 복잡한 데다, 표준적인 import 방식이 정해지기까지 수십 년이 걸렸죠. 또 Lua에는 연산자의 암묵적 형 변환이라는 JavaScript의 악명 높은 문제(두 가지 동등 비교 중 더 눈에 익은 쪽까지 포함해서)도 없습니다. 그것만 피할 수 있다면 배열이 1부터 시작하는 건 얼마든지 감수하겠습니다.
Lua로 작업하는 게 좋지는 않습니다. 그래도 그렇게 많은 사람이 JavaScript를 진심으로 즐기는 것 같다는 게 저로서는 이해가 안 되는 만큼, 적어도 언어 기능 면에서는 Lua로도 충분해 보입니다.
모든 면에서 가볍다는 건 이 언어의 가장 중요한 특징입니다.
Lua는 C/C++로 작성한 프로그램을 고수준에서 제어하는 데 아주 좋습니다. 그렇게 구성할 때 Lua 표준 라이브러리에서 파일 I/O 같은 기능을 빼도 나머지가 문제없이 굴러간다는 점이 늘 고마웠습니다.
하지만 Lua만으로 프로그램을 짜기에는 형편없습니다. 사람들이 자꾸 그렇게 만들려고 하지만, 사소하지 않은 프로그램이라면 헛수고입니다.
LuaJIT 위에 스택 전체와 앱을 통째로 만들어서 돈도 받았고, 몇 년이 지난 지금도 아무 문제 없이 돌아가고 있는 사람으로서, 이런 소리는 이제 좀 지겹습니다.
Perl 쓰는 사람들도 몇 년 동안 똑같은 소리를 들었죠 :)
JS 쓰는 사람들도 그렇지 않나요?
musl + Lua + C 라이브러리 + Lua 코드 전부를 합치면 리눅스용 정적 바이너리 하나를 만들 수 있어서, 저는 이 방식을 많이 씁니다.
컴파일러가 정적 링킹밖에 지원하지 않던 시절이 아직도 기억납니다.
그중 일부는 오버레이라는 멋지고 현대적인 아이디어를 갖고 있었는데, 추가 코드 세그먼트를 같은 프로세스 메모리 슬롯에 직접 관리해서 적재하는 방식이었습니다.
Lua는 Rust 라이브러리와 얼마나 잘 연동되나요? 그리고 UI 만드는 데는 Lua가 얼마나 괜찮습니까?
저는 mlua 라이브러리로 Rust와 함께 Lua를 폭넓게 써 봤는데, 훌륭하고 기능도 충실합니다.
https://github.com/mlua-rs/mlua
제 생각에는, Teal은 더 단순한 웹 브라우저용 훌륭한 스크립트 언어가 될 것 같습니다. JavaScript 기반이 아닌 브라우저, 예를 들면 'Surf' 웹 브라우저( https://surf.suckless.org/ ) 같은 것 말이죠.
또 Teal을 Wasm으로 컴파일하는 기능, 아니면 적어도 Teal에서 Lua를 거쳐 Wasm으로 가는 기능도 있어야 할 겁니다. 그런 용도로 다음 GitHub 저장소가 있긴 한데, 아직 100% 동작하는지는 잘 모르겠습니다.
https://github.com/ysugimoto/webassembly-lua
와아아~