소개
안녕하세요, 여러분! 다들 잘 지내고 계시죠.
올해도 정말 빠르게 흘러가고 있어요. 벌써 Mindshifting May인데, 아마 제가 가장 기대하는 달일 거예요. 무엇보다 Prolog가 들어 있으니까요!
Analytical April도 즐거우셨길 바라요. 정말 많은 분들이 참여해 주셨고, 지금까지 가장 성공적인 달 중 하나였다고 생각해요. 저는 4월에 Functional February의 뒤늦은 인터뷰로 Simon Peyton Jones와도 이야기를 나눴어요. 정말 좋았으니 다시 보시길 강력히 추천해요. 그것도 정말 멋진 한 문장 때문이라면 더더욱요. “명령형 프로그래밍이라는 석회암이 다 닳아 없어지면, 그 아래에 있던 함수형 프로그래밍이라는 화강암이 드러나게 될 것이다.”
그럼 이제 Mindshifting May로 가볼까요! 늘 그렇듯이 Erik과 제가 이번 달의 주제와 우리가 살펴볼 여러 언어를 간단히 소개해 드릴게요.
이번 달에는 무려 여섯 개 언어가 있어요: Ballerina, Pharo, Prolog, Red, Tcl (Tickle), Unison. 이 언어들은 각각 더 “주류”인 언어와는 꽤 달라서, 하나 이상을 시도해 보고 어떻게 다른지 직접 느껴 보시길 추천해요. 저는 Prolog를 특히 추천하는데, 제가 살면서 코딩할 때 가장 즐거웠던 언어 중 하나거든요. Erik은 Unison에도 아주 열광하고 있어서, 그것도 시도해 볼 만한 좋은 선택이에요.
배지
Mindshifting May 배지를 받으려면 5월 동안 이 언어들 중 하나에서 연습 문제 다섯 개를 완료하면 돼요.
1년 내내 이어지는 12in23 배지도 있어요. 이걸 받으려면 해당 언어에서 우리가 선정한 연습 문제 다섯 개를 풀면 돼요. 5월이 지나서 이 영상을 보고 있다면, 이 부분은 연중 언제든 할 수 있으니 놓친 게 아니에요. 언어들이 모두 너무 달라서 이 연습 문제들을 고르기가 어려웠어요. 그래서 풀기 재미있고 다양한 접근 방식을 탐구하기 흥미로운, 좀 더 일반적인 연습 문제들을 골랐어요.
- 두문자어: 구문을 두문자어로 바꿔요
- 아이소그램: 구문에 반복되는 글자가 있는지 확인해요
- 로마 숫자: 십진수를 로마 숫자로 변환해요
- 빗방울: 숫자를 빗방울 소리로 변환해요
- 우주 시대: 태양계의 행성들에서 누군가 몇 살이 되는지 계산해요
이 연습 문제들과 이전 달의 연습 문제들은 모두 #12in23 페이지에서 찾을 수 있어요.
개요
각 언어를 개요와 함께 파헤쳐 볼까요.
Prolog:
- 사고방식이 달라요. 프로그램은 관계의 집합으로 정의돼요. 그런 다음 단일화(패턴 매칭)를 사용해 관계 데이터베이스에 “질의”해서 답을 찾아요. 규칙 기반 시스템에 딱이에요
- 문법이 적어요. 데이터 타입 하나(항)와 언어 구조 요소 하나(절)만 있으면 돼요. 절은 전적으로 항으로 구성되고, 사실이나 규칙을 정의할 수 있어요.
- 아주 선언적이에요. 어떻게 계산되는지보다 무엇을 계산해야 하는지에 더 신경 써요. 많은 경우 코드가 더 적어져요
- 큰 탐색 공간을 질의하는 데 잘 맞도록 설계됐어요. 다양한 탐색 전략(깊이 우선, 너비 우선)을 지원하고 자동 가지치기도 지원해요
Unison
- Unison 코드에는 버전 충돌이 없어요! Unison 함수는 자신이 의존하는 코드의 해시를 알고 있어서, 필요한 코드의 올바른 버전을 찾을 수 있어요.
- Unison은 로컬 개발 UI와 호스팅된 저장소에서 라이브 코드 탐색을 지원해요. 그래서 의존하는 라이브러리의 소스 코드를 언제든 클릭해서 볼 수 있죠.
- Ability는 “효과”(예: IO)를 순수 함수형 방식으로 관리하는 방법이에요
Pharo
- 문법이 아주 적어서 전체 문법이 엽서 한 장에 들어가요(예약어가 딱 6개예요!). 메시지 문법은 자연어를 닮아서 주어, 동사, 보어로 이루어져요(between: 1 and: 2 +). 의미론도 단순해요(예: 아주 단순한 우선순위 규칙). 그래서 배우고 읽기가 더 쉬워요
- 초기 학습 곡선만 넘기면 생산성이 아주 좋아요. 단순한 의미론과 적은 문법도 이유지만, 뒤에 나오는 Pharo의 뛰어난 기능들도 한몫해요
- 대부분의 플랫폼(Windows, macOS, Linux + ARM 지원)에서 빠른 가상 머신(OpenSmalltalk) 위에서 실행돼요
- 단순한 Smalltalk 구현체가 아니라 지금도 활발히 개발되고 있어요(최신 SmallTalk 버전은 1980년의 SmallTalk 80이에요)
- 친근한 커뮤니티예요
Tcl (“티클”이라고 발음해요)
- 문법이 아주 적어서 규칙이 12개뿐이고 종이 한 장에 들어가요. 의미론도 비교적 간단해요. 그래서 프로그램을 읽고 배우기 쉬워요
- 코루틴을 통한 간단한 동시성 덕분에 비동기 코드를 동기 코드처럼 작성할 수 있어요
- 네트워크 프로그래밍과 비동기 파일 I/O를 위한 내장 이벤트 루프가 있어요
- 성숙했지만 여전히 발전하고 있어요
Ballerina
- 언어에 통합된 쿼리로 JSON, XML, 표 형식 데이터를 타입 안전하게 선언적으로 처리하는 것을 일급으로 지원해요
- 구조적 타이핑(덕 타이핑)이 널리 쓰이는 유연한 타입을 제공해요. 닫힌 타입은 서브타이핑을 하는 방법이고, 열린 타입은 너무 많은 데이터가 전송될 때도 자연스럽게 처리해요. HTTP 리소스로 쓸 때는 데이터 바인딩과 검증을 내장으로 지원해요
- 분산 트랜잭션, 보상, 회로 차단기를 비롯한 일반적인 통합 패턴과 커넥터를 내장으로 지원해요
- 모든 Ballerina 프로그램은 어떤 Open Telemetry 도구로든 자동으로 관찰할 수 있어서, 코드의 동작과 성능을 완전히 제어하고 파악할 수 있어요.
- 가벼운 스레드인 strand를 통한 뛰어난 동시성을 제공해요. 논블로킹 IO 호출도 쉬워요. 컴파일러가 워커 사이의 송수신 호출을 검사하도록 도와줘서 교착 상태를 피할 수 있어요. 불변성도 네트워킹에 아주 좋아요
- 유니언 타입을 통한 명시적 오류 처리와, 이를 돕는
check문법 설탕을 제공해요
Red
- 가벼워요. 전체 툴체인이 약 1.5MB 다운로드에 실행 파일 하나예요.
- 이식성이 좋아요. 크로스 컴파일이 쉬워요. 의존성 없는 작은 바이너리를 만들어요. 메모리 사용량도 적어요.
- Red는 (LISP처럼) 자체 메타 언어이자 자체 데이터 형식이에요. 프로그램이 코드를 변환하거나 읽을 수 있어요.
- 반응형이에요. 객체를 연결해서 프로그램의 크기와 복잡도를 줄일 수 있어요(엑셀 시트를 떠올려 봐요)
이 언어들은 어디에 쓰일까요?
Prolog:
- 인공지능(IBM의 Watson)
- (자연어) 언어 처리
- 지식 베이스를 위한 분산 데이터베이스(TerminusDB)
- 심지어 Java 가상 머신의 타입 규칙을 명세하는 데도 쓰였어요
Unison
- 분산 시스템을 작성하는 데 쓰여요
- 일반적인 웹 서비스
- 배치 컴퓨팅 작업
Pharo
- 대화형 도구에 쓰여요
- 아주 다양한 분야에 쓰여요: 온라인 거래 플랫폼과 투자 관리 클라우드 기반 도구
- 방위 산업에서 사용자 인터페이스와 상호작용 프로토타이핑
- 이벤트 기획을 위한 웹 기반 애플리케이션
- API, 데이터, 시스템 탐색을 위한 변형 가능한 개발 환경 도구
Tcl
- 글루 코드로 쓰이거나 임베드돼요
- CISCO 라우터 GUI에 쓰여요
- 다양한 제조 시스템
- NASA도 여러 차례 사용했어요
- 다른 대기업으로는 Pixar, Boeing, Intel, NBC 등을 비롯해 아주 많아요.
- 윈도잉 툴킷인 Tk는 perl/python/ruby 같은 다른 “스크립팅” 언어들에도 채택됐어요.
- 대화형 CLI 애플리케이션을 자동화하는 도구인 Expect
Ballerina
- 클라우드 네이티브 애플리케이션에 쓰여요
- 정부와 다른 조직이 비용 효율적으로 디지털 및 기반 신원 시스템을 구현하도록 돕는 기반 신원 플랫폼인 MOSIP에서 사용해요.
프로그래밍 관점에서 이 언어들은 왜 흥미로울까요?
Prolog:
- 논리 프로그래밍 언어로(최초의 언어 중 하나예요), 객체 지향과 함수형 프로그래밍처럼 그 자체로 하나의 패러다임이에요
- 동적 타입이에요
Unison
- 순수 함수형 언어예요
- 정적 타입이에요
Pharo
- 객체 지향 언어지만 Smalltalk의 의미에서 그렇죠. “일반적인” 객체 지향 언어와는 달라요: 생성자도, 타입 선언도, 인터페이스도, 기본 타입도 없어요.
- 동적 타입이에요
Tcl
- 다중 패러다임: 객체 지향, 명령형, 함수형 스타일을 지원해요
- 동적 타입이에요
Ballerina
- 다중 패러다임: 객체 지향, 함수형, 선언형
- 정적 타입이에요
Red
- 다중 패러다임: 명령형, 함수형, 객체 지향, 심볼릭, 반응형
- 정적 타입이에요
눈에 띄는 특징은 무엇일까요?
Prolog:
- 유연해요. 많은 내장 술어가 여러 방향으로 작동해요. 같은 문법으로 데이터를 질의하고 생성할 수 있어요. 다른 언어에서는 어려운 문제가 사소해지기도 해요
- DCG는 내장 파서 콤비네이터 같은 것으로, 시퀀스를 파싱하고 생성하고 완성하고 검사하는 데 아주 좋아요
- CLP는 프로그램을 제약 조건으로 정의하는 효율적인 방법이에요
Unison
- 코드는 텍스트가 아니라 (불변) 데이터예요. 코드는 데이터베이스에 저장되고 Unison Codebase Manager를 통해 접근하고 업데이트해요. 텍스트 파일은 코드를 데이터베이스에 넣는 여러 방법 중 하나일 뿐이에요. 불변 데이터라는 점은 테스트 결과를 캐시할 수 있고 타입 검사도 한 번만 하면 된다는 뜻이기도 해요
- 정의는 이름이 아니라 해시로 참조돼요. 이런 방식을 “내용 주소 지정” 코드라고 해요. 정의의 구문 트리가 그 해시를 결정해요. 버전 충돌이 없고, 이름 변경도 간단해요.
- Unison 문서는 언어의 일급 개체이고, 설명하는 함수와 항상 동기화돼요. 문서에 라이브 예제를 넣고 예제 코드가 컴파일되는지 확인할 수 있어요.
- 클라우드 컴퓨팅에 이상적이에요: 빌드가 없고, 함수를 즉석에서 배포할 수 있으며, Unison 서비스 간 통신을 위한 인코더와 디코더를 작성하는 데 드는 시간이 줄어요.
Pharo
- 간단한 실행 모델이에요: 모든 것이 객체이고, 실행은 오직 메시지(이것도 객체예요)를 통해서만 일어나요. 제어 흐름조차 메시지로 처리해요. 모델은 단순하지만 아주 강력해요. 다른 객체 지향 언어와는 꽤 달라요.
- 코드는 텍스트 파일이 아니라 Pharo 이미지에 있어요. Pharo 이미지는 애플리케이션의 전체 상태를 담고 있고 Pharo 가상 머신에서 실행할 수 있어요. 작업을 저장하면 Pharo는 환경의 전체 상태를 이미지 파일로 저장해요. 이 파일에는 모든 객체와 그 관계, 실행 컨텍스트가 들어 있어요. 이미지 파일은 다른 사람과 공유할 수 있고 다른 머신이나 플랫폼에서 로드할 수 있어요. 덕분에 개발자들이 프로젝트에서 쉽게 협업하거나 Pharo로 만든 애플리케이션을 배포할 수 있어요
- Pharo 전용 IDE를 통한 라이브하고 몰입감 있는 경험이에요. 런타임 중에 즉각적인 피드백을 받아요. 프로그램이 실행 중일 때조차 즉석에서 실행하고 바꿀 수 있어요! 메서드 재시작과 즉석 버그 수정을 지원하는 강력한 디버거도 있어요
Tcl
- 간단한 타입 시스템이에요: 모든 것이 문자열이에요. “모든 것이 문자열이다”는 예전에 Tcl이 구현되던 방식이었어요. 지금은 내부적으로 견고한 타입 시스템이 있어서, Tcl 개체(문자열이든 실수든 배열이든 딕셔너리든)가 문자열 표현뿐 아니라 타입별 표현도 함께 가져요. 덕분에 Tcl 코드가 문자열로 왔다 갔다 변환할 필요가 없어져 성능이 크게 향상됐어요.
- “모든 것이 명령으로 실행돼요”. 내장 명령은 없어요. Tcl은
if,while등을 포함한 명령의 “표준 라이브러리”와 함께 제공돼요. 새로운 제어 흐름 명령을 추가하기도 아주 쉬워요: 예를 들어until문 같은 거요. Tcl 명령을 재정의하는 것도 쉬워요. - 컴팩트하고 의미론이 단순하며 C 라이브러리로 구현되어 있어서 임베드하기 쉬워요
Ballerina
- 클라우드 네이티브예요. JSON에서 사용자 정의 타입으로의 변환이 내장되어 있어요. (마이크로)서비스를 만들기 위한 아주 가벼운 문법을 제공해요. 서비스의 동시 실행을 내장으로 지원해요. HTTP(1과 2), graphql, gRPC를 기본으로 지원해요
- 코드를 여러 클라우드에 배포할 아티팩트를 자동으로 생성해요. 이 아티팩트는 Dockerfile, Docker 이미지, Kubernetes YAML 파일, 서버리스 함수 등이 될 수 있어요.
- 코드를 시퀀스 다이어그램으로 시각화하는 기능이 내장되어 있어요. 코드의 흐름을 시각화하기에 아주 좋아요. HTTP 호출까지 시각화할 수 있어요
Red
- 도메인 특화 언어/“방언”(Rebol 용어)을 만들거나 파싱하는 데 아주 좋아요. 몇 가지 내장 방언이 있어요:
- Red/System: 네이티브 코드로 컴파일되는 C 수준의 시스템 프로그래밍 언어
- Parse: 강력한 PEG 파서
- VID: 간단한 GUI 레이아웃 생성 방언
- Draw: 벡터 2D 드로잉 방언
- Rich-text: 리치 텍스트 설명 방언
- GUI를 쉽게 만들 수 있어요. 완전한 크로스 플랫폼이고 네이티브예요. 양방향 바인딩, 라이브 업데이트, 이벤트를 지원하고, 운영체제의 기능에도 접근할 수 있게 해줘요
5월에는 어떤 언어를 시도해 보면 좋을까요?
모두 각자의 방식으로 흥미로운 언어라서, 어떤 것을 골라도 명분이 있어요.
- 클라우드 컴퓨팅에 관심이 있다면 Ballerina와 Unison이 좋은 선택이에요. Tcl도 훌륭한 동시성 기능을 가지고 있어요
- 객체 지향 프로그래밍에 익숙하지만 색다른 관점을 보고 싶다면 Pharo를 시도해 봐요
- 텍스트 파일에 기반하지 않는 언어로 프로그래밍하는 게 어떤 느낌인지 경험하고 싶다면, 독특하고 강력한 IDE를 가진 Pharo나, Unison Codebase Manager를 사용하는 Unison을 시도해 봐요.
- 미니멀리즘을 좋아한다면 Tcl, Prolog, Pharo, Red 모두 문법이 꽤 적고 의미론이 비교적 단순해요
- 패러다임이 흥미롭게 섞인 모습을 보고 싶다면 Ballerina, Tcl, Red 모두 서로 다른 패러다임을 지원해요
- 좀 더 색다른 패러다임을 시도해 보고 싶다면, 논리 프로그래밍은 Prolog, 반응형 프로그래밍은 Red, 선언형 프로그래밍은 Ballerina를 시도해 봐요
- 함수형 프로그래밍을 좋아한다면 Unison을, 특히 그 Ability를 확인해 봐요.
- 메타프로그래밍에 관심이 있다면 Tcl, Prolog, Pharo, Red 모두 훌륭하게 지원해요
물론 시간이 된다면 두어 개는 시도해 보시길 추천해요! 모두 꽤 독특하거든요. 선정된 언어 두어 개에서 같은 연습 문제를 풀어 보고, 구현이 얼마나 다른지 직접 확인해 봐요.