난해한 프로그래밍언어는 재미로 쓰기 어렵게 만든 프로그래밍언어들이다. 뇌뻑(brainfuck)이 대표적이다. 한글의 독특한 모양과 조합 방식, 발음의 규칙성을 활용하는 언어들도 있다. 아희와 엄랭이 대표적이다. 아는 사람은 몇 없지만 트릭컬 밈에서 발원한 랭슝좍이라는 것도 있다. 프로그래밍 언어 연구자로써 아쉬운 점은 이들 언어가 대체로 튜링기계나 레지스터기계 형태라는 점이다. 다른건 몰라도 프로그래밍언어를 만든다고 하면 프로그래밍언어 하는 사람들이 숨쉬듯 쓰는 람다산술 기반 함수형 언어도 있어야 하지 않나? 이 점에 착안해 어제오늘은 난해한 람다산술 언어를 만들어보고 있다. 베이스는 랭슝좍이다. 슝, 좍, 비비따잇, 순수따잇을 적당히 조합 가능한 문법 요소로 만들면 된다. 여러 후보들을 시험해봤는데, 기본 형태는 슝과 좍을 각각 함수대가리와 변수로 쓰고 음절 길이로 변수명을 구분하는게 균형이 괜찮다. 괄호를 넣으면 난해함이 줄어들기 때문에 연산자 결합 순서와 방향을 최대한 다양하게 해서 괄호 없이도 비교적 자유로운 표현이 가능하게 만드려고 생각중이다. 다행히 연산자 종류 자체는 함수호출 하나뿐이기에 결합방식은 다양하게 선택할 수 있다. 이름은 일단 람슝좍이다. 예시를 간단하게 보여보겠다. 리뉴아 말투의 가장 핵심이 되는 “슝좍”은 항등함수 ^x.x에 해당한다. 슝이 함수대가리, 좍이 변수 하나로 이루어진 함수몸통에 대응된다. 이어서 재귀함수를 만드는 Y 조합자다: 슈웅,슝좍좍좌악~슝좍좍좌악 대칭적인 반복이 들어있어 운율감을 자아낸다. 일반적인 람다식으로는 ^y.(^x.y(xx))(^x.y(xx)) 이렇게 된다. 두 글자로 늘린 슈웅과 좌악이 y에 해당하고 한 글자인 슝과 좍은 x에 해당한다. y(xx)과 좍좍좌악을 같이 놓고 보면 순서가 뒤집힌 것을 볼 수 있는데, 이는 앞서말한 결합방식 변형의 일종이다. 다음으로 자연수 3의 처치인코딩을 소개한다: 슈슝좍좌악좌악좌악 일반적인 람다표기로는 ^sz.s(s(sz))에 해당한다. 람다표기에서 연속한 인자(^s.^z.)를 람다 하나로 줄여쓰듯이(^sz.), 이 언어도 슈웅슝을 슈슝으로 줄여쓴다. 다음은 덧셈 함수다: 슈슈슈슝.좌아아악좌악~좌좌좍 람다표기에서 ^nmsz.ns(msz)에 대응된다. 마침표로 함수몸통에서 쓸 수 있는 연산자의 우선순위를 설정해 물결표가 함수 안쪽으로 인식되게 했다. 마침표는 함수몸통 내의 호출연산자 방향을 뒤집는 역할도 한다. 함수 내에서는 기호없는 호출이 물결표호출보다 우선순위가 높아 좌아악좌악과 좌좌좍을 계산후 앞의 값이 나타내는 함수에 뒤의 값을 인자로 호출하게 된다. 이때 좌좌좍은 슈슈슝의 경우와 같이 좌아악좌악좍을 줄인 표현이다. 람다산술의 문법이 워낙 간단하여 두가지 계통의 한글 단어와 기호 세가지만으로도 이미 대부분의 표현이 가능하다. 하지만 람슝좍의 가장 중요한 난해점은 리뉴아의 말투를 재현하는 데 있기에 순수, 비비, 따잇을 활용할 필요가 있다. 이는 따잇을 let 선언처럼 활용하되 그 앞에 순수와 비비를 추가로 붙이는 방식으로 OCaml의 rec과 같이 여러 옵션을 붙이는 식으로 활용해보려한다. 또 느낌표나 물음표 같은 다른 기호들도 커스텀 후위연산자로 쓸 수 있도록 하려한다. 단순히 밈을 담은 언어가 아닌, 괄호가 적은 람다표기법으로써의 난해함도 담아낼 수 있을 것 같다. 아무래도 사용자의 풀은 여타 명령형 난해한 언어보다 적을 것이다. 람슝좍을 짤줄은 모르더라도 람다산술 특유의 방식으로 한단계식 프로그램이 변하면서 리뉴아의 다양한 대사가 만들어지는 과정을 지켜보는 것도 하나의 볼거리가 되리라고 생각한다.
난해한 프로그래밍언어 만들기
11
0
목록
댓글이 없습니다
- (마지막 글입니다)
-