1P by GN⁺ 7일전 | ★ favorite | 댓글 1개
  • 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.fstTRmorph 변환기 포함
  • 실행
    • REPL: stack exec kip
    • 파일 실행: stack exec kip -- --exec path/to/file.kip
    • PATH 설치: stack install

WASM Playground

  • playground/ 디렉터리에 브라우저 실행용 빌드 포함
    • kip-playgroundwasm32-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의 설명을 봤음
    • 문법은 흥미롭지만, 숫자 연산 구문이 어떻게 동작하는지 궁금함
      예를 들어
      (5'le 3'ün farkını) yaz.  
      (3'ün 5'le farkını) yaz.  
      
      이런 문장에서 ‘farkını’(차이) 의 의미와 조사 위치에 따라 5-3인지 3-5인지 구분하는지 궁금함
      자연어 기반 구문이라 수학적 정의를 서술하는 언어처럼 느껴짐
    • 업데이트된 웹페이지와 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 시대에는 각 나라가 자국의 언어적 전통을 반영한 프로그래밍 언어를 만들 수 있음
    이는 개발 문화의 자율성과 다양성을 크게 확장시키는 일임