キップ:トルコ語の文法的格に基づくプログラミング言語
91日前原文(github.com)
概要
Kip Kipは、トルコ語の文法格と母音調和を型システムに統合した実験的プログラミング言語
自然言語形態論と型理論の融合を目指した研究・教育プロジェクト
文法格による柔軟な引数順序やパターンマッチなど独自機能を搭載
インストールや実行方法、例題プログラム、構造・テスト方法も公開
今後も構文や挙動が変更される可能性が高い試験的プロジェクト
Kip Kip プログラミング言語概要
- Kip Kipは、トルコ語の文法格(ismin halleri)と母音調和を型システムに活用する実験的言語
- 自然言語の形態論とプログラミング言語設計の融合を追求する研究・教育目的プロジェクト
- 本格的な実用言語ではなく、言語学と型理論の接点を探るための実験場
- 英語・トルコ語のチュートリアルが用意され、言語の記述方法を学習可能
- 構文・挙動は今後も変更されるため、安定性は未保証
言語の特徴
- トルコ語文法格を型として利用
- 名詞の格(例:yalın hal, -i hali, -e haliなど)が関数引数の関係性を決定
- 例:accusative(-i hali)は「sayiyi」、dative(-e hali)は「sayıya」
- 引数順序の柔軟性
- 格や型が異なれば、引数の順序が入れ替わっても意味が通る
- (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.」
- トルコ語構文で自然数や真理値などの型を表現
- 多相型(ポリモーフィック型)
- ジェネリックデータ構造を型変数で表現可能
- 例:「Bir (öğe listesi) ya boş ya da bir öğenin bir öğe listesine eki olabilir.」
- ジェネリックデータ構造を型変数で表現可能
- パターンマッチ(-sa/-se)
- 条件接尾辞でパターンマッチを記述、ネストやワイルドカードにも対応
- 例:「(bu doğruluğun) tersi, bu doğruysa, yanlış, yanlışsa, doğrudur.」
- 条件接尾辞でパターンマッチを記述、ネストやワイルドカードにも対応
- 定数定義(diyelim)
- 「diyelim」で名前付き定数を定義
- 例:「sıfırın ardılına bir diyelim.」
- 「diyelim」で名前付き定数を定義
- 入出力・効果表現
- -ip/-ıp/-up/-üpでI/Oシーケンス、olarakで束縛
- 例:「isim olarak okuyup, ("Merhaba "yla ismin birleşimini) yazmaktır.」
- -ip/-ıp/-up/-üpでI/Oシーケンス、olarakで束縛
- 組み込み型・演算
- 整数(tam-sayı)、文字列(dizge)、入出力(yazmak/okumak)など
例題プログラム
- ユーザーから数値を入力し、その数だけフィボナッチ数列を出力するサンプル
- コメントは(* ... *)形式
- 文法格付きリテラル(例:5'i yaz.)
- パターンマッチや再帰を活用した関数定義
インストール方法
- 前提ツール
- Foma(有限状態形態素解析ツール)
- macOS: brew install foma
- Debian/Ubuntu: apt install foma libfoma-dev
- Fedora: dnf install foma foma-devel
- Stack(Haskellビルドツール)
- haskellstack.org参照
- Foma(有限状態形態素解析ツール)
- ビルド手順
- リポジトリをクローンし、install.shで一括インストール
- chmod +x install.sh
- ./install.sh
- またはstack buildで手動ビルド
- リポジトリをクローンし、install.shで一括インストール
- 実行方法
- REPL起動: stack exec kip
- ファイル実行: stack exec kip -- --exec path/to/file.kip
- PATHへのインストール: stack install
WASM Playground
- playground/ディレクトリにWASMビルド環境を用意
- kip-playgroundをwasm32-wasi向けにコンパイル
- HTML/JSラッパーでブラウザ上でKipを実行可能
- 詳細はplayground/README.md参照
バイトコードキャッシュ
- 各.kipファイルの型検査済みバイトコードを隣接する.izファイルにキャッシュ
- ソースや依存が未変更なら.izを再利用
- 強制再型検査には.izファイル削除
- .izにはコンパイラハッシュを含み、バージョン変化時は自動無効化
プロジェクト構成
- app/
- Main.hs(CLIエントリポイント)
- src/Kip/
- AST.hs(構文木)、Cache.hs(キャッシュ)、Eval.hs(インタプリタ)、Parser.hs(構文解析)、Render.hs(整形出力)、TypeCheck.hs(型検査)
- src/Language/
- Foma.hs(Fomaバインディング)
- lib/
- giriş.kip(Prelude)、temel.kip(コア型)、temel-doğruluk.kip(ブール関数)、temel-dizge.kip(文字列関数)、temel-etki.kip(I/O)、temel-liste.kip(リスト関数)、temel-tam-sayı.kip(整数関数)
- tests/
- succeed/(成功テスト)、fail/(失敗テスト)
- vendor/
- trmorph.fst(TRmorphトランスデューサ)
テスト・検証
- stack testで自動テスト実行
- tests/succeed/は成功テスト
- tests/fail/は失敗テスト
形態素解析と曖昧性対策
- KipはTRmorphを用いてトルコ語形態素解析を実施
- 解析結果が複数候補の場合、型検査時に解決
- 明示的な解析指定にはアポストロフィを使用
- 例:taka'sı(taka+所有格) vs takas'ı(takas+対格)
ライセンス
- LICENSEファイルを参照