소개
안녕하세요, 여러분! 다들 잘 지내고 있기를 바라요.
Exercism에서는 8월 한 달이 정말 굵직했어요. Premium과 Insiders를 하나로 합쳤고, 에디터 안에 자동 피드백을 바로 추가했으며, 트랙 트로피를 출시했고, 사이트 곳곳도 조금씩 많이 개선했어요! 아직 자신의 트랙에서 어떤 트로피를 받았는지 확인하지 않았다면 꼭 확인해 봐요. 트로피를 하나 이상 받은 모든 분께 이메일도 보냈으니, 그것도 눈여겨봐요. 8월에는 #12in23에서 사람들이 보통 앱을 만들 때 쓰는 언어들을 살펴보며 정말 즐거운 시간을 보냈어요.
이번 달은 Slimline September이고, 문법이 아주 간결하고 짧은 언어들을 살펴봐요. 구체적으로는 8th(Forth의 후손), AWK, Bash, jq, Perl, 그리고 Raku(예전에는 Perl 6으로 알려졌어요)를 다뤄요.
배지
Slimline September 배지를 받으려면 9월 동안 그 언어 중 하나에서 연습 문제 다섯 개를 아무거나 완료하면 돼요.
일 년 내내 진행되는 12in23 배지도 있어요. 이걸 받으려면 해당 언어로 추천 연습 문제 다섯 개를 풀면 돼요.
- Gigasecond: 날짜 다루기
- Atbash Cipher: 문자열 다루기
- Darts: 숫자와 조건문 다루기
- Luhn: 문자열, 조건문, 숫자 다루기
- Series: 문자열과 시퀀스 다루기
이 연습 문제들과 지난달 연습 문제들은 모두 #12in23 페이지에서 볼 수 있어요.
개요
그럼 각 언어를 하나씩 개요로 살펴보며 파고들어 봐요.
8th
- Ron Aaron이 개발했어요.
- 이름은 주요 영감이 된 Forth 언어를 이용한 말장난이에요. 물론 Forth와 다른 점이 아주 많아요:
- 강타입
- 크로스 플랫폼
- 향상된 보안(직접적인 메모리 접근과 내장 어셈블러가 없어요)
- 무료 버전과 상용 버전을 모두 제공하고, 상용 버전에는 기능이 더 많아요.
- 클로즈드 소스지만, 엔터프라이즈 라이선스를 사면 소스 코드를 볼 수 있어요
AWK
- AWK는 1970년대에 Bell Labs에서 Alfred Aho, Peter Weinberger, Brian Kernighan이 만들었어요. 이름은 세 저자의 성을 딴 두문자어예요.
- 텍스트 처리를 하려고 만든 도메인 특화 언어지만, 다른 용도로도 쓸 수 있어요
- AWK는 sed나 grep처럼 파이프라인에서 쓰도록 만들어진 Unix 필터예요
- Single UNIX Specification과 Linux Standard Base 명세는 모든 구현에 AWK를 포함하도록 요구해요. 그래서 대부분의 *nix 머신에서 쓸 수 있어요
- AWK 언어의 여러 구현:
- awk(원조 AWK를 뜻하는 oawk): 최초 구현
- GNU AWK(gawk): 1988년에 나왔고 언어를 크게 개정하고 확장했어요
- BWK AWK(nawk라고도 해요): 90년대 후반에 나왔어요
- mawk: 빠른 바이트코드 인터프리터 구현
- 많은 *nix 시스템에서
awk명령은gawk또는nawk를 가리키는 심볼릭 링크예요
Bash
- Bash는 Brian Fox가 개발한 Unix 셸로, 1989년에 나왔어요.
- Bourne 셸을 대체할 무료 셸로 설계되었고, 대부분의 Linux 배포판에서 기본 로그인 셸이 되었어요. Bourne 셸 명령 문법의 상위 집합이라 넘어가기 더 쉬워요
- 중괄호 확장, 명령줄 자동 완성, 시그널 처리 등 여러 면에서 Bourne 셸을 확장했어요
jq
- Stephen Dolan이 개발해 2012년에 나왔어요
- JSON 문서를 쉽게 조회하고 변환하고 다루도록 설계되었어요("JSON을 위한 sed")
-
jq도구(언어를 구현한 것)는 원래 Haskell로 구현되었지만, 이후 C로 포팅되었어요. Go와 Rust 기반 포팅도 있어요
Perl
- Perl은 Larry Wall이 1980년대 후반에 개발해 1987년에 처음 나왔어요.
- 리포트 처리를 더 쉽게 하려고 만든 범용 스크립트 언어예요
- 특히 정규 표현식 지원이 아주 큰 영향을 끼쳤어요(이건 나중에 다시 다뤄요)
Raku
- Larry Wall(Perl의 창시자)이 설계해 2015년에 나왔어요
- 원래는 Perl 6으로 알려졌고, 언어를 정리하고 별로 쓸모없거나 헷갈린다고 여겨진 기능을 없애려는 목적이었어요(재미있는 인용: "Perl 6에서는 사용자를 고치는 것보다 언어를 고치는 게 낫다고 결정했어요.", Larry Wall). 결국 Perl 6은 Perl 5와 소스 호환되지 않아서 Raku로 이름을 바꿨어요
- 설계 철학은 프로그래밍을 즐겁고 생산적으로 만들면서 다양한 프로그래밍 문제를 해결할 폭넓은 도구를 제공하는 데 중점을 둬요(범용)
- Raku는 명세이기 때문에 여러 구현이 있을 수 있고 실제로 있어요. 지금 활발히 개발되는 구현은 Rakudo뿐이지만, Pugs(Haskell로 작성), v6-KindaPerl6, Niecza(CLR 대상) 같은 예전 구현도 있어요
이 언어들은 어디에 쓰일까요?
8th
- 아쉽게도 어디에 쓰이는지 찾지 못했어요
AWK
- 데이터 추출과 리포트, 그리고 일반적인 스크립팅에 쓰여요
Bash
- 주로 시스템 관리에 쓰이지만, CLI 유틸리티나 다른 도구를 감싸는 래퍼를 만드는 데도 쓰여요. 우리는 Exercism 저장소를 대량으로 다룰 때 이걸 정말 많이 썼어요
jq
- 셸 스크립트 형태로 JSON 문서를 조회하고 변환하고 다루는 데 쓰여요.
Perl
- 데이터 조작, 파일 파싱, 웹 프로그래밍, 시스템 관리 작업에 쓰여요. 문자열 조작 능력과 방대한 모듈 생태계 덕분에 웹 초창기에 인기를 얻었어요.
Raku
- 텍스트 처리, 시스템 관리 등에 쓰여요
프로그래밍 관점에서 이 언어들은 무엇이 흥미로울까요?
대부분의 언어는 동적 타입이고 인터프리터 방식이라 스크립트 언어라는 성격과 잘 맞아요. 그렇긴 해도 예외가 몇 가지 있는데, 특히 지원하는 패러다임에서 그래요.
8th
- 강타입
- 다중 패러다임: 절차형이고, 더 흥미롭게도 스택 기반(스택 기반 실행 모델), 반영적(자기 구조와 동작을 살펴보고 수정할 수 있는 능력), 연결형(모든 표현식이 함수이고 함수를 나란히 놓으면 함수 합성을 뜻해요)이에요
- 네이티브 코드로 컴파일되지만 REPL에서 해석할 수도 있어요
AWK
- 동적 타입이고 흔히 인터프리터 방식이에요(사용하는 구현에 따라 달라요)
- 주요 패러다임은 데이터 주도 방식이에요. 수행할 단계를 명시적으로 정의하는 대신, 매칭할 데이터와 필요한 처리를 설명하는 문으로 프로그램을 서술해요. AWK는 절차형 프로그래밍도 지원해요
Bash
- 동적이고 인터프리터 방식인 언어예요
- 명령형과 절차형 프로그래밍을 지원해요
jq
- 동적이고 인터프리터 방식인 언어예요
- 순수 함수형 언어(모든 값이 불변)이고 "파이프라인"을 강조해요. 아주 Unix스러운 느낌이에요
Perl
- 동적 타입이고 인터프리터 방식이에요
- 함수형, 객체 지향, 명령형 프로그래밍을 지원하는 다중 패러다임 언어예요
Raku
- 동적 타입이지만 점진적 타이핑을 지원해서 필요할 때 정적 타입을 추가할 수 있어요(Perl은 동적이에요)
- 명령형, 절차형, 객체 지향, 함수형을 아우르는 다중 패러다임 언어예요
이 언어들의 무엇이 훌륭할까요?
8th
- 문법이 아주 적어서 배우고 이해하기 쉬워요. 데이터(객체나 배열 같은)를 설명하는 데 JSON을 써요. 스택, 큐, 힙 같은 다른 컨테이너도 지원해요
- 예약 키워드가 없어요. 서브루틴을 "워드"라고 부르고, 새 워드를 쉽게 정의할 수 있어요. 내장이든 사용자 정의든 모든 워드를 실행 중에 재정의할 수 있어요
- 크로스 플랫폼이에요. 지원하는 플랫폼이라면 실행 파일을 쉽게 만들 수 있어요
- 안전해요. 다양한 버그를 막는 보안 기능이 내장되어 있어요(직접 메모리 접근이 없고, 런타임이 동적 라이브러리에 링크되지 않아요)
AWK
- 문법이 단순하고 AWK 코드 구조가 아주 일관성 있어서 배우고 읽기 쉬워요. 자료 구조도 단순하고 유연해요
- 표현력이 뛰어나서 아주 적은 코드로 많은 걸 할 수 있어요. 한 줄짜리 코드에 딱이에요
- 대부분의 *nix 머신에 설치되어 있어서 AWK 실력을 여러 곳에서 쓸 수 있어요(/bin/sh와 함께 표준 Unix에 들어간 유일한 스크립트 언어예요)
- 다른 도구의 출력을 AWK가 처리하거나 그 반대의 경우에도 파이프라인과 셸 스크립트에서 아주 잘 동작해요
Bash
- 대부분의 플랫폼에서 쓸 수 있어요. macOS를 포함한 거의 모든 *nix 머신에 설치되어 있어요. Windows Subsystem for Linux(WSL) 덕분에 이제 Windows 시스템에서도 bash를 쓸 수 있어요.
- 개별 명령을 실행하거나 파일에서 코드를 읽어 실행하는 RE(P)L로 쓸 수 있어요(이 파일을 셸 스크립트라고 불러요). Linux 터미널을 써 봤다면 bash 코드를 이미 써 봤을 가능성이 커요. 터미널이 보통 bash RE(P)L이거든요
- Bash와 셸 스크립트는 시스템 관리, 데브옵스, 컴퓨터 관리에 널리 쓰여요.
- 활용 범위가 아주 넓고 유연해요
- 아주 간단한 문자열 보간을 포함해 강력한 문자열 조작 기능을 갖추고 있어요
jq
- JSON을 다루는 문법이 단순하고 짧아서 배우기 쉬워요
- 더 복잡한 연산을 위해 사용자 정의 함수를 정의할 수 있어요.
- 꼬리 재귀 최적화를 지원해서 데이터를 재귀적으로 처리할 때 아주 좋아요
- jq 도구는 30KB 정도밖에 안 되는 단일 바이너리로 배포돼요
-
yq도구는jq를 감싸서 같은 문법으로 XML, TOML, YAML 파일을 다룰 수 있게 해줘요(내부적으로 그 데이터 타입들을 JSON으로 변환해요) - C와 Go 구현 모두 다른 애플리케이션에 내장하는 걸 지원해요
Perl
- 대부분의 플랫폼에서 동작해요. 크로스 플랫폼 스크립트를 작성하기에 좋아요
- 유연성은 Perl 설계 철학의 초석이에요. 유명한 모토는 "There's more than one way to do it"(TMTOWTDI)이에요. 당면한 작업에 따라 다른 접근법을 쓸 수 있어요
- 강력한 커뮤니티와 영향력 있는 프로젝트의 유산이 있어요. 많은 스크립트, 도구, 애플리케이션이 Perl로 개발되었어요. 한때 "인터넷을 붙여 놓는 덕테이프"라고 불리기도 했어요
- 모듈과 라이브러리 생태계가 풍부하고, Comprehensive Perl Archive Network(CPAN)를 통해 이용할 수 있어요
Raku
- 크고 복잡하고 강력하지만, 한 번에 다 배우지 않아도 되는 언어로도 설계되었어요. 시작하기 쉽고, 더 강력한 기능은 나중에 필요할 때 살짝 맛볼 수 있어요
- 점진적 타이핑을 포함한 강력하고 확장 가능한 타입 시스템을 갖추고 있어요. 원하는 타입 검사 수준을 지정할 수 있어서 동적 타이핑과 정적 타이핑 사이에서 균형을 잡을 수 있어요
- 다중 디스패치를 지원해서 상속 없이 다형성을 쓸 수 있어요
- Raku에서 Unicode는 일급 시민이에요. 다양한 문자 인코딩을 다루는 걸 기본으로 지원해요
- 고급 동시성과 병렬성 기능을 제공해요. 비동기 프로그래밍, 반응형 프로그래밍, 병렬 실행을 기본으로 지원해요
이 언어들의 두드러지는 특징은 무엇일까요?
8th
- 다른 사고방식을 요구해요. 여러 패러다임이 독특하게 섞여 있어 다른 언어와 아주 다르고, 문제에 접근하는 새로운 방식을 떠올리도록 도전하게 해요
- 스택 기반과 역폴란드 표기법(RPN) 문법 덕분에 프로그램 실행에 대한 머릿속 모형이 아주 단순해져요. 값은 스택에 올려지고, 대부분의 워드는 스택에 미치는 영향으로 정의돼요
AWK
- 데이터 주도 패러다임은 아주 강력해요. 프로그램을 조건/동작 쌍의 집합으로 정의하고, 텍스트를 레코드로 나누고(보통 레코드당 한 줄), 각 레코드를 필드로 나누는(예: CSV 필드나 필드당 한 단어) 다른 사고방식을 요구해요. 이 방식에 익숙해지면 이 접근법의 우아함과 표현력을 느끼게 되고, 어디에나 쓸 곳이 보이기 시작할 거예요
- 텍스트를 다루기에 완벽해요. 텍스트를 파싱하든 변환하든 리포트를 만들든 AWK가 다 해결해 줘요. 시스템의 각 사용자 셸을 출력하거나 CSV 열을 합산하는 작업처럼, 얼마나 적은 코드로 되는지 놀랄 거예요
Bash
- 자동화에 완벽해요. 셸 스크립트는 반복적인 작업을 자동화하는 데 뛰어나요.
- Bash 스크립트는 파이프라인을 사용해서 다른 프로그램들을 손쉽게 붙일 수 있어요. 한 명령의 출력을 다른 명령으로 넘기는 스크립트를 만들거나, 실행한 명령 중 하나라도 실패하면 스크립트가 실패하게 만드는 건 아주 쉬워요.
- 강력해요. 다른 도구를 쉽게 쓸 수 있다는 점이 bash를 놀랍도록 강력한 도구로 만들어 줘요
jq
- 요즘 넘쳐나는 JSON 데이터를 쉽고 깔끔하게 추출하고 다루기에 좋아요. JSON 데이터를 변환하는 사실상 표준 도구가 되었어요. jq로 JSON 데이터를 만들 수도 있어요
- 스트리밍 데이터를 지원해서 메모리 문제 없이 "무한한" 데이터를 다룰 수 있어요
- 파이프라인을 강조하는 방식은 스트림에 익숙한 사람(예: Unix 도구를 쓰는 사람)이라면 쉽게 익힐 수 있어요. 덕분에 jq 코드는 이해하고 따져 보기도 꽤 쉬워요
Perl
- 간결함과 표현력으로 유명해요. 아주 적은 코드로 많은 일을 할 수 있어요
- 특히 텍스트를 다루는 데 잘 맞는데, 상당 부분은 강력한 정규 표현식 지원 덕분이에요. 특히 Perl 5는 역참조, 이름 있는 캡처 그룹, 게으른 수량자 같은 많은 새 기능을 도입했어요. Philip Hazel은 Perl 5 호환 정규 표현식 엔진을 구현한 C 라이브러리인 PCRE(Perl Compatible Regular Expressions)를 만들었어요. PCRE를 기반으로 하지 않는 언어들도 정규 표현식 지원을 PCRE 호환으로(즉, Perl 5 문법을 쓰도록) 설계하는 경우가 많아요
Raku
- 자동 스레딩 정션을 지원해서 병렬성을 훨씬 쉽게 다룰 수 있어요
- 게으른 평가를 지원해서 메모리 문제 없이 무한 리스트와 시퀀스를 다룰 수 있어요. 큰 데이터셋을 다루거나 무한한 데이터 스트림을 사용하는 알고리즘을 다룰 때 특히 유용해요
- 텍스트 처리에 좋고, 더 단순하고 읽기 쉬우며 강력한 정규식 문법을 제공해요
- 문법을 사용해 사용자 정의 도메인 특화 언어(DSL)를 정의하는 걸 기본으로 지원해요. 특정 데이터 형식이나 언어를 위한 파서를 만들 수 있어 복잡한 텍스트 데이터를 다루기 쉬워져요
무엇을 먼저 시도해 볼까요?
- 주로 Unix 시스템을 쓰거나 데브옵스 일을 한다면, Bash는 꼭 배워 둘 가치가 있는 언어예요. AWK, Perl, Raku를 배우는 것도 정말 도움이 되는데, 앞의 둘은 많은 시스템에 미리 설치되어 있기도 해요
- JSON(또는 XML/YAML/TOML)을 다룬다면 jq가 확실한 선택이에요
- 텍스트를 처리하고 싶다면 AWK, Perl, Raku가 확실한 선택이에요.
- 뭔가 조금 다른 걸 시도해 보고 싶다면 8th가 좋은 선택이에요
2023년 09월 01일
·
유용했나요?
게시자
Erik Schierboom