- λ-2D는 그림 자체를 코드로 삼는 언어 실험으로, 텍스트 언어가 다루기 어려운 시각적 표현과 프로그램의 미적 형태를 함께 겨냥함
- 언어의 뼈대는 람다 계산법이며, 정해진 실행 순서보다 평가에 가까운 구조가 그림을 바라보는 방식과 닮았다는 점에서 출발함
- 손으로 그리기 쉬우면서도 기계가 해석할 수 있도록 격자 기반 기호와 와이어를 사용해 데이터 흐름을 표현함
- 순수 람다 계산만으로는 사용성이 낮아 숫자, 수학 연산자, 프레임, 슬라이더 같은 문법적 설탕과 상호작용 요소가 추가됨
- 현재 구현은 λ-2D 프로그램을 JavaScript 단일 표현식으로 변환해 실행하며, 아직 회로도처럼 보이는 한계와 학습·스캔 난제가 남아 있음
그림으로 코딩하는 언어 실험
- λ-2D는 “그림을 통해 코딩할 수 있는가”라는 질문에서 출발한 비언어적 프로그래밍 언어 실험임
- 텍스트가 아닌 방식의 언어는 이미 여러 갈래가 있음
- 설계 목표는 세 가지로 압축됨
- 프로그램이 그려진다는 사실을 활용해 텍스트 기반 언어로는 실현하기 어려운 기능을 넣음
- 명령 수가 너무 적어 단순한 프로그램도 어렵거나, 너무 많아 미니멀하지 않고 컴퓨터 비전 처리가 어려워지는 상황을 피함
- 프로그램 자체가 시각적으로 매력적이라 액자에 넣어 걸고 싶을 정도의 드로잉이 되도록 함
람다 계산법과 격자 기반 표현
- λ-2D는 명령형·저수준 방식 대신 람다 계산법을 언어의 기반으로 삼음
- 람다 계산법은 “실행”보다 “평가”에 가깝고, 그림을 볼 때 시선이 특정 순서 없이 점·선·형태·구성을 따라가는 방식과 맞닿아 있음
- 초기 구조는 격자 기반 시스템임
- 사용자는 여러 격자를 가로지르는 연속선을 그릴 수 있음
- 각 격자는 최종적으로 유한한 기호 집합 중 하나로 해석됨
- 사람에게는 그리기 쉽고, 컴퓨터에게는 파싱하기 쉬운 절충안임
함수 기호와 와이어의 데이터 흐름
- 람다 계산법의 기본 명령은 두 가지뿐임
- 함수 적용
- 함수 정의
- λ-2D는 함수 적용을 컵 모양 기호로, 함수 정의를 그리스 문자 λ로 표현함
- 기본 람다 계산법처럼 함수는 항상 하나의 인자를 받고 하나의 출력을 생성함
- 여러 인자를 다루려면 여러 함수를 연결하는 커링(currying) 방식을 사용함
- 기호 사이의 와이어는 데이터가 흐르는 통로 역할을 함
- 이 단계의 언어는 기술적으로 튜링 완전하지만 실제 사용은 매우 번거로워, 숫자와 수학 연산자 같은 추가 기호가 들어감
- 이 추가 기호들은 문법적 설탕임
- 원하면 Church numeral 같은 순수 람다 계산 구조만 사용할 수도 있음
프레임, 드로잉 데이터, 슬라이더
- λ-2D는 Scratch에서 스프라이트를 같은 편집기에서 그려 바로 사용하는 경험을 더 자연스럽게 확장하려 함
- 프레임은 캔버스의 특정 영역을 와이어로 둘러싸고 왼쪽 위에 표시 기호를 두는 방식임
- 영역 안의 낙서는 데이터로 사용할 수 있음
- 수학 함수의 모양을 직접 스케치해 애니메이션 등에 활용 가능함
- 방정식을 직접 찾는 별도 단계 없이 형태를 데이터로 다룸
- 런타임에 드래그할 수 있는 슬라이더도 도입됨
- 프로그램을 매개변수 방식으로 제어하는 용도임
- 향후 다른 GUI 요소도 고려됨
편집기와 5×5 기호
- 초기 아이디어는 점이 찍힌 노트에 손으로 그린 예제 프로그램에서 출발함
- 종이 위 프로그램을 스캔하는 컴퓨터 비전 부분이 준비되지 않아, 먼저 디지털로 프로그램을 그릴 수 있는 간단한 편집기를 만들었음
- 각 기호는 5×5 픽셀로 만들어져 격자 캔버스에 찍기 쉬움
- 사용자는 연필 도구처럼 자유 손그림도 그릴 수 있음
- 임시 수단으로 시작한 편집기는 점차 여러 기능을 갖춘 편집기에 가까워짐
순수 함수형 언어에서의 출력 문제
- λ-2D는 순수 함수형이고 상태가 없기 때문에 일반적인
print문을 구현하기 어려움 - 출력은 상태 변경이며, 특정 순서로 출력되기를 기대하려면 표현식 평가 순서도 가정해야 함
- 해결 방식은 “출력”을 함수형으로 다시 정의하는 것임
- 빈 캔버스를 함수에 넘김
- 텍스트나 원하는 낙서처럼 보이도록 픽셀이 바뀐 새 캔버스를 돌려받음
- 문자열과 문자 대신 캔버스와 픽셀을 중심에 둔 언어로 설계됨
JavaScript 변환과 실행 시각화
- 기본 파서는 λ-2D 프로그램 전체를 동등한 JavaScript 표현식으로 변환함
- 결과 JavaScript는 괄호가 매우 많은 단일 거대 표현식이며, 비효율적이지만 동작함
- 현재 파서는 JavaScript를 출력하고 브라우저의 JavaScript 엔진이 실행을 맡기 때문에 실제 실행 과정을 시각화하기는 어려움
- 대신 파싱 과정은 쉽게 시각화할 수 있으며, 트리 워크 인터프리터가 프로그램을 실행할 때 지나가는 경로와 비슷하게 보일 수 있음
- 파싱 애니메이션에 기호별 소리를 붙이면 프로그램 실행을 노래처럼 “들을” 수 있음
- 결과는 8비트 시대의 이상한 컴퓨터 게임 같은 소리에 가까움
- 온라인 데모의
Menu > Program > Animated Run에서 확인할 수 있음
남은 한계와 다음 단계
- λ-2D는 원래 펜과 종이로 프로그램을 그리고 증강현실로 상호작용 피드백을 받는 더 큰 연구의 일부로 시작함
- 프로젝트가 점점 흥미로워지면서 독립 프로젝트가 됨
- 초기 목표를 완전히 충족하지는 못함
- 프로그램이 드로잉이라기보다 회로도처럼 보이는 경향이 있음
- 일반 사람이 배우기 쉬울지 확신하기 어려움
- 컴퓨터 비전 시스템이 오류 없이 스캔하기도 쉽지 않을 수 있음
- λ-2D를 더 다듬은 뒤, 드로잉을 계산으로 다루는 시스템에 통합할 수 있는 다른 프로그래밍 언어들도 설계할 계획임
- λ-2D 베타 버전은 온라인에서 사용해볼 수 있으며, 파서와 편집기 소스 코드는 곧 GitHub에 공개될 예정임