- 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. は同じ結果
- 帰納的データ型の定義
- 多相型をサポート
- ジェネリックなデータ構造を定義可能
- 例:
(öğe listesi) の形でリストデータ型を定義
- パターンマッチ
- 条件接尾辞
-sa/-se を使ってパターンマッチを実行
- ネストしたパターン、バインダー、ワイルドカード(
değilse)をサポート
- 定数定義
diyelim キーワードで名前付き定数を宣言
- 例:
sıfırın ardılına bir diyelim.
- 入出力とエフェクト処理
- 基本型
- 整数(
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
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'ı)
ライセンス
1件のコメント
Hacker Newsのコメント
みなさんこんにちは、私はKipの開発者です
本当は playground とランディングページを完成させてから公開するつもりでしたが、今のところ作ったブラウザベースの playground を共有します
https://alpaylan.github.io/kip/
JavaScript への transpilation は始めたばかりでまだ動きませんが、言語自体はほとんど実行可能です
バグがあれば repo の issue で知らせてもらえると嬉しいです
私はそれを「Ç」と呼ぼうとしていましたが、実際に作ることはありませんでした。誰かが試しているのを見ると嬉しいです
個人的には「tense(時制)」がいちばん近い気がします
関連する参考資料として BBC Bitesize の説明 を見ました
たとえば こういう文で 「farkını」(差) の意味と助詞の位置によって 5-3 なのか 3-5 なのかを区別するのか気になります
自然言語ベースの構文なので、数学的定義を記述する言語のようにも感じられます
https://kip-dili.github.io/
言語の構造が依然として アングロサクソン的な文法順序 に従っているように見えます
トルコ語の文法により合う形として、次のような形を見てみたいです
こうした試み自体が素晴らしい出発点なので、おめでとうございます
このプロジェクトは本当にすごいです
私も 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.” のような文は、順序を変えても意味が保たれます
ラテン語やロシア語の詩でも、こうした複雑な語順はよく登場します
最初は偏見を持ってリンクをクリックしたのですが、定義が すっきりしていて分かりやすい です
ドイツ語版もあれば面白そうです
言語そのものというより、文法関連の参考として Language Log の記事 を共有します
恋人がトルコ人でトルコ語を学んでいたのですが、これで プログラミング感覚 を使って学習速度を上げられそうです
本当に驚きました
中級段階で止まっていた学習を再開する良いモチベーションになります
AI時代 には、各国が自国の言語的伝統を反映したプログラミング言語を作れるようになります
これは開発文化の 自律性と多様性 を大きく拡張することです