Uploaded avatar of iHiD

12월의 다채로운 즐길 거리

@iHiD
거의 3년 전
동영상

들어가며

안녕하세요, 여러분. 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 프로세스처럼) 서로 쉽게 통신할 수 있어요.

어떤 언어를 고를까요

  1. 웹 애플리케이션을 만들고 싶다면 ColdFusion과 Groovy가 좋은 선택이에요.
  2. 다른 곳에 내장할 수 있는 언어에 관심이 있다면 Lua와 Wren이 우선이고, Groovy도 한번 볼 만해요.
  3. 범용 스크립트를 작성하고 싶다면 같은 세 언어, Lua와 Wren, Groovy도 잘 맞아요.
  4. JVM과 함께 작업한다면 ColdFusion과 Groovy가 자연스러운 선택이에요.
  5. 성능을 중시한다면 Lua와 Wren이 아마 최선의 선택일 거예요.
  6. 주로 쓰는 에디터가 Vim이나 NeoVim이라면 VimScript가 당연히 훌륭한 선택이에요.
  7. 컴파일러와 가상 머신을 배우거나 직접 만들어 보고 싶다면 Wren이 딱이에요.
  8. 객체 지향 배경이 있다면 Wren이 아마 가장 배우기 쉬운 언어일 거예요.
  9. LISP의 단 하나의 보편적인 자료 구조 설계가 마음에 들었다면 Lua를 한번 해봐요.
  10. 이벤트 기반 프로그래밍을 해보고 싶다면 VimScript를 살펴봐요.
2023년 12월 01일 · 유용했나요?