들어가며
안녕하세요, 여러분. 12월이 왔네요. 다들 잘 지내고 있죠?
10월은 정말 정신없이 바빴어요. 커뮤니티 솔루션에 큰 개선을 막 적용했거든요. 이제 비슷한 솔루션은 중복을 제거해서 하나만 보여주고, 정렬 기준도 새로 추가했어요. 코드로 검색하는 기능도 넣었고요. C# 트랙을 보면 알겠지만, 프로그래밍 개념별로 필터링하는 기능도 추가했어요. 그래서 비트 시프트나 재귀를 쓰는 솔루션, 아니면 원하는 어떤 것이든 찾아볼 수 있어요. 이 기능은 커뮤니티 위크에 다른 트랙으로도 확대할 예정이에요.
그럼 지금은 #12in23에 집중해볼까요. 11월은 어셈블리 언어를 살펴보는 흥미로운 달이었는데, 이번 달에는 아주 다양한 언어를 다뤄요. 바로 ColdFusion, Groovy, Lua, VimScript, Wren이에요. 늘 그렇듯 Erik이 이 언어들이 왜 흥미롭고 독특한지 하나씩 소개해줄 거예요.
배지
늘 그렇듯 이 언어들로 된 연습 문제를 다섯 개 풀면 December Diversions 배지를 받을 수 있어요. 많은 분들이 목표로 삼고 있는 Year-Long 배지도 있어요. 이 배지를 위해서는 추천 연습 문제 다섯 개를 풀면 돼요. 바로 이거예요:
- All Your Base: 숫자를 자릿수 나열로 표현한 뒤 다른 진법으로 변환해요.
- Flatten Array: 중첩된 컬렉션을 받아서 중첩되지 않은 하나의 컬렉션으로 반환해요.
- Queen Attack: 체스판 위의 두 퀸이 서로 공격할 수 있는지 판별해요.
- D&D Character: 던전 앤 드래곤즈 캐릭터를 무작위로 생성해요.
- Run-Length Encoding: 런 렝스 인코딩과 디코딩을 구현해요.
개요
ColdFusion
- 1995년에 Allaire Corporation이 만들었어요. 이 회사는 2001년 Macromedia에 인수됐고, 2005년에는 Adobe에 다시 인수됐어요.
- 빠른 웹 개발 플랫폼을 목표로 설계됐어요.
- 자바 가상 머신(JVM) 위에서 동작해요.
- 겉보기에는 다르지만 의미는 같은 두 가지 문법이 있어요:
- HTML을 확장해 동적 콘텐츠를 표시하는, 태그 기반의 오래된 마크업 문법이에요.
- ECMAScript를 닮은 최신 문법은 태그 기반 문법이 쓰이는 곳에서도 쓸 수 있고, 별도의 스크립트 파일에서도 쓸 수 있어요. 마크업에서 비즈니스 로직을 떼어내 별도 스크립트 파일로 옮기는 것이 목표였어요.
- CFScript는 JVM 위에서 동작하는 범용 언어이고, Exercism도 이 방식을 써요. 실제로는 웹 서버에서 출발한 뿌리에서 크게 벗어나지 못했어요.
- ColdFusion은 유료 제품이지만, 스위스에 기반을 둔 비영리 단체 Lucee Foundation이 오픈소스 ColdFusion 서버를 여전히 활발히 개발하고 있어요. Exercism 트랙에서는 이 재단의 Lucee Server를 사용해요.
- 지금도 활발히 개발되고 있어요.
- 주로 엔터프라이즈 소프트웨어에서 쓰이고, Apple, Adobe, General Motors 같은 곳이 고객이에요.
Groovy
- 2003년부터 James Strachan이 개발했어요. 2015년에는 Apache 재단이 프로젝트를 받아들였어요.
- 정적 타입인 Java와 달리 JVM 위에서 동작하는 동적 타입 언어를 만들면서, 반복되는 상용구 코드도 줄이는 것이 목표였어요.
- Java 코드 대부분은 Groovy 코드로도 유효하지만, 차이점도 많아요. 예를 들어 Groovy는 동적 타이핑과 고급 메타프로그래밍을 지원해요. Python과 Ruby의 영향도 많이 받았어요.
- 스크립팅, 빌드 도구(Gradle), CI(지속적 통합, Jenkins), 웹 앱(Grails), 테스트(Spock) 등에 쓰여요. Atlassian 도구용으로 인기 있는 서드파티 애드온에서도 Groovy 스크립팅을 쓸 수 있어요.
Lua
- Lua는 1993년 브라질 리우데자네이루 가톨릭 대학교에서 Roberto Lerusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes가 만들었어요.
- 이름은 '루아'라고 발음하고, 포르투갈어로 '달'이라는 뜻이에요. Lua가 부분적으로 영감을 받은 Sol 언어를 가리키는 말인데, Sol은 포르투갈어로 '태양'이라는 뜻이에요.
- 주로 다른 프로그램에 내장되는 용도로 설계됐고, 속도와 이식성, 확장성, 개발 편의성에 중점을 뒀어요.
- Modula, CLU, C++, SNOBOL, AWK의 영향을 받았어요. LISP과 Scheme이 단 하나의 보편적인 자료 구조(리스트)를 갖고 있었던 것처럼, Lua에는 테이블이 그런 역할을 해요.
- 바이트코드를 사용해 실행하는데, 보통 실행하는 시점에 인터프리트하고, 미리 해둘 수도 있어요.
- 주로 스크립팅에 쓰여요. World of Warcraft, Dota 2, Crysis 같은 게임이나 Adobe Lightroom 같은 애플리케이션, 일부 FreeBSD 시스템 소프트웨어가 대표적이에요. Redis, Neovim, Nginx처럼 확장 기능을 더할 때도 많이 쓰여요.
VimScript
- VimScript(Vim Script라고 띄어 쓰기도 하고, Vim Language를 줄여 VimL이라고도 해요)는 Vim 텍스트 에디터에서 쓰는 스크립팅 언어예요.
- Vi보다 먼저 나온 줄 단위 비주얼 에디터인 ex에서 비롯됐어요.
- 범용 언어가 아니라, 플러그인과 설정, 매크로, 함수를 통해 Vim의 기능을 확장하고 꾸밀 수 있도록 효과적이고 최적화된 스크립팅 환경을 제공하는 특화된 언어예요.
- Vim은 주로 C로 작성됐지만, Vimscript를 쓰면 사용자가 고수준 스크립팅 언어로 Vim을 꾸미고 확장할 수 있어요.
- 쓰이는 곳은 물론 Vim이고, Vim에서 갈라져 나온 NeoVim에서도 쓰여요.
Wren
- 『Crafting Interpreters』라는 책을 쓴 Bob Nystrom이 2016년에 만들었어요.
- 목표는 작고, 단순하고, 빠른 언어였어요.
- 다른 애플리케이션에 내장되도록 설계됐어요. 만든 사람은 Lua나 TCL 같은 기존 선택지가 부족하다고 느꼈고, 객체 지향에 익숙한 사람에게 자연스럽게 느껴지는 단순하고 내장하기 쉬운 언어를 원했어요.
- 쓰이는 곳:
- TIC-80: 작은 게임을 만들고 즐기고 공유하는 판타지 컴퓨터예요(PICO8과 비슷해요).
- DOME: 게임을 만들기 위한 크로스 플랫폼 프레임워크예요.
- luxe: 게임을 만들기 위한 크로스 플랫폼 고속 개발 게임 엔진이에요.
- Wren Console: 오랫동안 Exercism에 기여해 온 Josh Goebel이 대부분 Wren으로 직접 작성한 Wren REPL이자 CLI로, Wren 트랙에서 사용해요.
프로그래밍 관점에서는 어떤 점이 다를까요?
ColdFusion
- 동적 타입 언어예요.
- 여러 패러다임을 지원하는데, 주로 객체 지향이고 점점 함수형 쪽으로 가고 있어요.
Groovy
- 보통은 동적 타입이지만 정적 타입(그리고 점진적 타입)으로도 쓸 수 있어요.
- 인터프리트 방식과 컴파일 방식 모두 지원해요(2 버전부터). 그래서 스크립트에서 자주 쓰여요.
- 여러 패러다임을 지원해요. 주로 객체 지향이지만 명령형, 함수형, 선언형이기도 해요.
Lua
- 동적 타입이고 보통 인터프리트 방식으로 실행하지만, 미리 컴파일해둘 수도 있어요.
- 여러 패러다임을 지원해요. 절차형, 객체 지향(조금 다른 방식이긴 해요), 함수형, 데이터 주도 방식이에요.
VimScript
- 동적 타입이고 인터프리트 방식으로 실행해요.
- 여러 패러다임을 지원해요. 명령형, 함수형, 그리고 단순한 형태의 객체 지향 프로그래밍이에요.
Wren
- 동적 타입이지만 정적으로 정의돼서 컴파일러가 아주 빠를 수 있어요.
- 주로 객체 지향 언어지만 명령형이고 함수형 요소도 조금 있어요.
이 언어들의 매력은 무엇일까요?
ColdFusion
- 서버 관리와 애플리케이션 개발이 아주 잘 분리돼 있어요. 관리자 콘솔에서 데이터베이스 연결과 서버 모니터링(그 밖의 모든 것도)을 설정하면, 애플리케이션을 만드는 사람은 데이터소스 이름(필요한 메서드를 갖추고 DBMS의 알맞은 부분에 미리 연결된 CF 객체예요)과 애플리케이션 파일을 둘 디렉터리에 대한 쓰기 권한만 있으면 돼요.
- JVM과 Java 생태계의 힘을 활용할 수 있어요. 어떤 Java 라이브러리든 가져와서 CF 안에서 쓸 수 있는 것도 여기에 포함돼요.
Groovy
- 범용 언어예요. 앱과 웹사이트를 비롯해 거의 모든 작업에 쓸 수 있어요.
- JVM 위에서 동작하기 때문에 그 장점을 그대로 누려요. 성숙하고 성능이 뛰어난 가상 머신, 방대한 라이브러리 생태계가 있고, Java와도 잘 연동돼요.
- Java에서 사람들이 아쉬워할 만한 여러 문제를 덜어줘요. 예를 들어 검사 예외,
- null 안전성, 장황함, 고급 메타프로그래밍의 부재 같은 것들이요.
- 현대적인 언어예요. 고급 타입 추론, 클로저, 정규 표현식을 위한 내장 문법, 게터와 세터 자동 생성 같은 기능이 있어요.
- 함수형 프로그래밍 지원이 훌륭해요. Ruby의 블록 같은 클로저, 커링(부분 적용), 지연 평가, 불변성 등이 있어요.
Lua
- 범용 언어예요. 임베디드 시스템, 프로토타이핑, 스크립팅, 게임, 웹, 백엔드 개발에 쓰여요.
- 단순해요. 문법이 비교적 적어서 배우기 쉬워요. 원시 데이터 타입이 몇 개뿐이고, 내장 복합 데이터 타입은 테이블 하나예요. 메모리는 가비지 컬렉션으로 관리돼요.
- 이식성이 좋아요. 인터프리터가 ANSI C로 작성돼 있어서, 거의 모든 플랫폼에 컴파일러가 있어요.
VimScript
- 단순해요. 가볍고 배우고 쓰기 쉬운 문법이에요.
- 상호 운용성이 좋아요. 파일, 셸, 다른 프로그램에 쉽게 접근할 수 있어요. Vim을 벗어나지 않고도 외부 도구의 힘을 다 쓸 수 있어요.
- 표현력이 좋아요. 적은 코드로 많은 일을 해요. 짧으면서도 읽기 쉬운 스크립트를 작성할 수 있어요.
- 강력한 정규 표현식 엔진이 있어요. Vimscript의 정규 표현식 구현은 Emacs Lisp에서 영감을 받아, 텍스트를 다루는 강력한 도구가 돼줘요.
Wren
- 작아요. VM이 4000줄도 안 되는 코드로 구현돼 있어요.
- 배울 만해요. VM 구현은 정성스럽게 주석이 달려 있고, C로 작성돼서 그렇게 읽기 어렵지도 않아요. 언어를 어떻게 만드는지 배우기에 아주 좋아요. 표준 라이브러리 대부분이 Wren으로 구현돼 있어서, 그 구현도 볼 수 있고요.
- 익숙해요. 문법 덕분에 금방 적응할 수 있어요. Java나 C++에 익숙하다면 바로 편안하게 느껴질 거예요. 인자 개수에 따른 메서드 오버로딩도 지원해요.
- 문서가 정말 좋아요. 언어와 표준 라이브러리 문서가 읽기 쉽고, 양도 많고, 예제도 풍부해요.
- 작지만 놀랄 만큼 완성도 높은 표준 라이브러리를 갖추고 있어요.
눈에 띄는 특징
ColdFusion
- 필요한 기능이 다 들어 있어요. PDF, ZIP, Excel, XML, JSON 작업, API 생성, 이메일, S3 연동, 다양한 데이터베이스 지원까지 추가 패키지 없이 기본으로 쓸 수 있어요. 버전 비호환을 줄이는 데 아주 좋아요.
- 확장성과 보안이 좋아서 엔터프라이즈 소프트웨어에 잘 맞아요.
- 단순하고 직관적인 프로그래밍 덕분에 초보자도 복잡한 데이터 기반 웹 페이지를 아주 빠르게 띄울 수 있어요. DreamWeaver 연동도 훌륭하고요.
Groovy
- 유연한 문법이에요. 점과 괄호를 생략할 수 있어서 아주 멋진 도메인 특화 언어를 만들 수 있어요.
- 메타프로그래밍을 지원해요. 런타임과 컴파일 타임 메타프로그래밍을 모두 지원하는데, 예를 들어 @ToString 애너테이션은 컴파일 타임에 ToString 구현을 만들어 주고, 런타임에 객체의 메타클래스를 바꾸면 몽키 패치를 할 수 있어요.
- 빌더가 있어요. 보기 좋은 코드로 JSON, XML, HTML을 빠르게 다루고 만들 수 있어요. Swing으로 빠르게 GUI를 개발할 수도 있어요.
- 트레이트가 있어요. Groovy의 트레이트로 동작과 속성을 재사용 가능한 덩어리로 조합할 수 있어요. Ruby의 믹스인과 비슷해요.
Lua
- 내장하기 쉬워요. 쉽게 내장할 수 있도록 비교적 단순한 C API를 제공해요. 크기도 문제가 안 돼요. 전체 참조 인터프리터가 겨우 247kB거든요!
- 확장하기 쉬워요. 기본 언어는 일부러 비교적 작게 유지했지만, 그 대신 언어를 쉽게 확장할 수 있어요. 덕분에 배우기 더 단순하고, 내장하기 더 가볍고, 아주 유연해요.
- 빨라요. Lua는 흔히 가장 빠른 동적 언어 중 하나로 꼽히는데, 특히 LuaJit 인터프리터를 쓸 때 그렇죠.
VimScript
- 확장성: Vimscript로 에디터에 새 기능을 더할 수 있어요.
- 사용자 정의: 에디터를 원하는 방식대로 맞출 수 있어요(Vimscript 플러그인 자체도 주로 Vimscript로 작성돼요).
- 이벤트 기반: 파일을 열거나 버퍼를 저장할 때처럼 특정 이벤트나 조건에 따라 코드가 자동으로 실행돼요.
- Vim의 힘을 활용할 수 있어요. Vim의 기능과 API에 기본으로 접근할 수 있어서, 스크립트로 텍스트와 버퍼, 창 등을 다룰 수 있어요.
Wren
- 빠름: 동적 언어치고 성능이 아주 좋아요.
- 내장 가능: 다른 소프트웨어에 쉽게 내장할 수 있어요. 만든 사람이 예전에 게임 개발자였는데, 게임에 스크립팅 기능을 넣고 싶어 했어요. C API도 깔끔하고 단순해요.
- 동시성: 파이버를 이용한 손쉬운 동시성과 코루틴을 제공해요. 파이버는 아주 가벼운 구조라서(고루틴이나 Erlang 프로세스처럼) 서로 쉽게 통신할 수 있어요.
어떤 언어를 고를까요
- 웹 애플리케이션을 만들고 싶다면 ColdFusion과 Groovy가 좋은 선택이에요.
- 다른 곳에 내장할 수 있는 언어에 관심이 있다면 Lua와 Wren이 우선이고, Groovy도 한번 볼 만해요.
- 범용 스크립트를 작성하고 싶다면 같은 세 언어, Lua와 Wren, Groovy도 잘 맞아요.
- JVM과 함께 작업한다면 ColdFusion과 Groovy가 자연스러운 선택이에요.
- 성능을 중시한다면 Lua와 Wren이 아마 최선의 선택일 거예요.
- 주로 쓰는 에디터가 Vim이나 NeoVim이라면 VimScript가 당연히 훌륭한 선택이에요.
- 컴파일러와 가상 머신을 배우거나 직접 만들어 보고 싶다면 Wren이 딱이에요.
- 객체 지향 배경이 있다면 Wren이 아마 가장 배우기 쉬운 언어일 거예요.
- LISP의 단 하나의 보편적인 자료 구조 설계가 마음에 들었다면 Lua를 한번 해봐요.
- 이벤트 기반 프로그래밍을 해보고 싶다면 VimScript를 살펴봐요.
2023년 12월 01일
·
유용했나요?
게시자
Jeremy Walker