터키어 문법 격(case)에 기반한 프로그래밍 언어 Kip
(github.com/kip-dili)- Kip은 터키어의 문법 격과 서법(mood) 을 타입 시스템에 통합한 실험적 프로그래밍 언어로, 자연어 형태론과 타입 이론의 결합을 탐구함
- 터키어의 명사 격 변화와 모음 조화를 코드 구조에 반영해, 함수 인자 관계를 격 접미사로 구분하고 인자 순서의 유연성을 지원함
- 패턴 매칭, 다형 타입, 귀납적 자료형, 입출력 효과 등 현대 함수형 언어의 주요 기능을 터키어 문법 형태로 표현함
- Foma 형태소 분석기와 Haskell Stack을 이용해 빌드하며, WASM 기반 브라우저 실행 환경과 바이트코드 캐시(.iz) 기능을 제공함
- 언어학과 프로그래밍 언어 설계의 교차점을 보여주는 연구·교육용 프로젝트로, 자연어 기반 언어 설계 가능성을 실험하는 사례임
Kip 개요
- Kip은 터키어 단어 ‘kip’(서법) 에서 이름을 따온 언어로, 터키어 문법 격을 타입 시스템에 포함시킨 실험적 언어
- 터키어의 명사 격 변화(ismin halleri) 와 모음 조화(vowel harmony) 를 프로그래밍 언어 설계에 통합
- 연구 및 교육 목적의 프로젝트로, 실제 배포용 언어는 아님
- 터키어 및 영어 튜토리얼이 제공되어 Kip 프로그램 작성법을 학습 가능
- 문법과 동작은 실험적 단계로, 향후 변경 가능성이 있음
언어 특징
-
터키어 문법 격을 타입으로 사용
- 주격, 목적격, 여격, 처격, 탈격, 속격, 도구격, 소유격 등 8가지 격을 지원
- 각 격은 접미사로 표시되며, 함수 인자 간 관계를 명시적으로 구분
-
유연한 인자 순서
- 격 접미사가 인자 관계를 명확히 하므로, 인자 순서를 바꿔도 동일한 의미 유지
- 예:
(5'le 3'ün farkını) yaz.와(3'ün 5'le farkını) yaz.는 동일한 결과
-
귀납적 자료형 정의
- 터키어 구문으로 대수적 자료형을 정의
- 예:
Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir.
-
다형 타입 지원
- 제네릭 자료구조 정의 가능
- 예:
(öğe listesi)형태로 리스트 자료형 정의
-
패턴 매칭
- 조건 접미사
-sa/-se를 사용해 패턴 매칭 수행 - 중첩 패턴, 바인더, 와일드카드(
değilse) 지원
- 조건 접미사
-
상수 정의
-
diyelim키워드로 명명된 상수 선언 - 예:
sıfırın ardılına bir diyelim.
-
-
입출력 및 효과 처리
-
-ip/-ıp/-up/-üp접미사로 순차 실행,olarak으로 바인딩 - 예:
selamlamak, isim olarak okuyup, ("Merhaba "yla ismin birleşimini) yazmaktır.
-
-
기본 타입
- 정수(
tam-sayı):toplamı,farkı,çarpımı등 연산 지원 - 문자열(
dizge):uzunluğu,birleşimi,tam-sayı-hali제공 - 입출력:
yazmak,okumak명령 지원
- 정수(
-
주석 및 리터럴
- 주석:
(* ... *) - 리터럴:
"merhaba"'yı yaz.형태로 격 접미사 포함
- 주석:
설치 및 실행
-
필수 도구
- Foma: 유한상태 형태소 분석 툴킷
- Stack: Haskell 빌드 도구
-
빌드 방법
-
install.sh스크립트 실행 또는stack build명령으로 수동 빌드 -
vendor/trmorph.fst에 TRmorph 변환기 포함
-
-
실행
- REPL:
stack exec kip - 파일 실행:
stack exec kip -- --exec path/to/file.kip - PATH 설치:
stack install
- REPL:
WASM Playground
-
playground/디렉터리에 브라우저 실행용 빌드 포함-
kip-playground를wasm32-wasi로 컴파일 - HTML/JS 하니스로 브라우저 내 Kip 실행 가능
- 세부 빌드 절차는
playground/README.md참고
-
바이트코드 캐시(.iz)
- 각
.kip파일의 타입 검사 결과를 캐시하여.iz파일로 저장- 소스나 의존성이 변경되지 않으면 캐시 재사용
-
.iz파일 삭제 시 새로 파싱 및 타입 검사 수행 - 컴파일러 해시 포함으로, 버전 변경 시 자동 무효화
예제 프로그램
- 자연수 정의, 상수 선언, 덧셈 함수, 결과 출력 예시 포함
Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir. sıfırın ardılına bir diyelim. birin ardılına iki diyelim. ikinin ardılına üç diyelim. (bu doğal-sayıyla) (şu doğal-sayının) toplamı, bu sıfırsa, şu, öncülün ardılıysa, (öncülle) (şunun ardılının) toplamıdır. (ikiyle üçün toplamını) yaz.
프로젝트 구조
-
app/ : CLI 진입점 (
Main.hs) - src/Kip/ : AST, 캐시, 인터프리터, 파서, 렌더러, 타입 검사기 포함
-
lib/ : 기본 모듈(
giriş.kip,temel.kip,temel-liste.kip등) -
tests/ : 성공(
succeed/) 및 실패(fail/) 테스트 케이스 -
vendor/ :
trmorph.fst형태소 변환기
테스트
-
stack test명령으로 실행-
tests/succeed/: 통과해야 하는 테스트 -
tests/fail/: 실패해야 하는 테스트
-
형태소 분석
- Kip은 TRmorph를 사용해 터키어 형태소 분석 수행
- 다의적 단어(예: “takası”)는 가능한 모든 해석을 유지한 채 파싱
- 타입 검사 단계에서 의미를 결정
- 특정 해석을 강제하려면 아포스트로피(
') 사용 (taka'sı,takas'ı)
라이선스
- LICENSE 파일 참조
Hacker News 의견들
-
모두 안녕, 나는 Kip의 개발자임
원래는 playground와 랜딩 페이지를 완성한 뒤 공개하려 했지만, 지금까지 만든 브라우저 기반 playground를 공유함
https://alpaylan.github.io/kip/
JavaScript로의 transpilation은 이제 막 시작해서 아직 작동하지 않지만, 언어 자체는 대부분 실행 가능함
버그가 있다면 repo의 issue에 알려주면 좋겠음- 몇 년간 터키어를 공부했는데, 그 문법적·교착적 특성 덕분에 프로그래밍 언어로 만들면 흥미로울 거라 생각했음
나는 그걸 “Ç”라고 부르려 했지만 실제로 만들진 않았음. 누군가 시도한 걸 보니 반가움 - “Kip”이 터키어로 “문법적 서법(mood) ”을 뜻한다고 해서 찾아봤는데, 번역 서비스마다 “mode”, “modal”, “tense”, “module” 등 다양하게 나옴
개인적으로는 “tense(시제)”가 가장 가깝다고 생각함
관련 참고 자료로 BBC Bitesize의 설명을 봤음 - 문법은 흥미롭지만, 숫자 연산 구문이 어떻게 동작하는지 궁금함
예를 들어
이런 문장에서 ‘farkını’(차이) 의 의미와 조사 위치에 따라 5-3인지 3-5인지 구분하는지 궁금함(5'le 3'ün farkını) yaz. (3'ün 5'le farkını) yaz.
자연어 기반 구문이라 수학적 정의를 서술하는 언어처럼 느껴짐 - 업데이트된 웹페이지와 playground가 새로 공개됨
https://kip-dili.github.io/ - 정말 멋진 작업임. 예전부터 이런 영역을 탐구해보고 싶었음
- 몇 년간 터키어를 공부했는데, 그 문법적·교착적 특성 덕분에 프로그래밍 언어로 만들면 흥미로울 거라 생각했음
-
언어의 구조가 여전히 앵글로색슨식 문법 순서를 따르는 것 같음
터키어 문법에 더 맞게 다음과 같은 형태를 보고 싶음Fibonacci-Dizisi (n): n 0'a eşitse: dur. değilse: bu-sayıyı yazdır. şu-sayıyı, (bu-sayı + şu-sayı), (n - 1) ile Fibonacci-Dizisi'ne devam et.이런 시도 자체가 훌륭한 출발점이라 축하함
-
이 프로젝트가 정말 멋짐
나도 Logicaffeine Studio에서 비슷한 아이디어를 실험 중임
Logos lang도 참고해보면 좋겠음. Haskell을 선택한 것도 마음에 듦 -
예전 세대라면 Lingua::Romana::Perligata를 기억할지도 모름
https://metacpan.org/dist/Lingua-Romana-Perligata/view/lib/Lingua/Romana/Perligata.pm -
나도 몇 년 전 비슷한 아이디어를 실험했었음
https://github.com/celaleddin/sembolik-fikir
앞으로 며칠간 더 살펴볼 예정임- 흥미로운 접근임. 접미사 기반의 형태소 추정을 하는 것 같음
Kip에서는 TRmorph를 이용해 형태소 분석을 완전히 수행하고, 타입 검사 단계에서 모호성을 해결함
그래서 거의 아포스트로피가 필요하지 않음. 구현은 힘들었지만 재미있는 문제였음
- 흥미로운 접근임. 접미사 기반의 형태소 추정을 하는 것 같음
-
약간의 터키어를 읽을 수 있는데, 이 프로젝트 덕분에 하루가 즐거워졌음
터키어의 격 체계가 강하고 표준화되어 있어서 이런 언어 설계가 가능하다는 게 흥미로움- 이런 유연한 어순은 터키어뿐 아니라 굴절이 강한 언어들—슬라브어, 산스크리트어, 핀란드어, 헝가리어 등—에서도 가능함
- 사실 영어에서도 어순 유연성이 꽤 있음
예를 들어 “Colonel Mustard killed him in the study at 5:00 with his own knife.” 같은 문장은 순서를 바꿔도 의미가 유지됨
라틴어나 러시아 시에서도 이런 복잡한 어순이 자주 등장함
-
처음엔 편견을 가지고 링크를 클릭했는데, 정의가 깔끔하고 이해하기 쉬움
독일어 버전도 있으면 재미있을 것 같음- 나도 같은 생각임. 단순히 Rust 같은 언어의 키워드를 터키어로 바꾼 수준일 줄 알았는데, 실제로는 훨씬 정교함
-
언어 자체보다는 문법 관련 참고로 Language Log 글을 공유함
-
여자친구가 터키인이라 터키어를 배우고 있었는데, 이제 프로그래밍 감각으로 학습 속도를 높일 수 있을 것 같음
정말 놀라움- 나도 터키인과 결혼했는데, 이런 기술+언어 조합은 상상도 못했음
중급 단계에서 멈춰 있던 학습을 다시 이어갈 좋은 동기부여가 됨
- 나도 터키인과 결혼했는데, 이런 기술+언어 조합은 상상도 못했음
-
AI 시대에는 각 나라가 자국의 언어적 전통을 반영한 프로그래밍 언어를 만들 수 있음
이는 개발 문화의 자율성과 다양성을 크게 확장시키는 일임