Kip, un langage de programmation fondé sur les cas grammaticaux du turc
(github.com/kip-dili)- Kip est un langage de programmation expérimental qui intègre les cas grammaticaux et les modes du turc dans son système de types, afin d’explorer la combinaison entre morphologie des langues naturelles et théorie des types
- Il reflète dans la structure du code les déclinaisons nominales et l’harmonie vocalique du turc, distingue les relations entre arguments de fonction via des suffixes de cas et prend en charge une flexibilité de l’ordre des arguments
- Il exprime, sous des formes grammaticales turques, les principales fonctionnalités des langages fonctionnels modernes, comme le pattern matching, les types polymorphes, les types de données inductifs et les effets d’entrée/sortie
- Il se construit avec l’analyseur morphologique Foma et Haskell Stack, et propose un environnement d’exécution dans le navigateur basé sur WASM ainsi qu’une fonction de cache de bytecode (.iz)
- C’est un projet de recherche et d’enseignement qui montre le point de rencontre entre linguistique et conception de langages de programmation, en expérimentant la possibilité de concevoir un langage fondé sur une langue naturelle
Vue d’ensemble de Kip
- Kip est un langage nommé d’après le mot turc « kip » (mode), un langage expérimental qui intègre les cas grammaticaux turcs dans son système de types
- Il intègre à la conception du langage les déclinaisons nominales du turc (ismin halleri) et l’harmonie vocalique (vowel harmony)
- Il s’agit d’un projet à visée de recherche et d’enseignement, et non d’un langage destiné à un usage en production
- Des tutoriels en turc et en anglais sont proposés pour apprendre à écrire des programmes Kip
- La grammaire et le comportement sont encore à un stade expérimental et pourront évoluer à l’avenir
Caractéristiques du langage
- Utilisation des cas grammaticaux turcs comme types
- Huit cas sont pris en charge : nominatif, accusatif, datif, locatif, ablatif, génitif, instrumental et possessif
- Chaque cas est indiqué par un suffixe, ce qui permet de distinguer explicitement les relations entre arguments de fonction
- Ordre flexible des arguments
- Comme les suffixes de cas clarifient la relation entre arguments, changer leur ordre conserve le même sens
- Exemple :
(5'le 3'ün farkını) yaz.et(3'ün 5'le farkını) yaz.produisent le même résultat
- Définition de types de données inductifs
- Les types de données algébriques sont définis avec une syntaxe turque
- Exemple :
Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir.
- Prise en charge des types polymorphes
- Il est possible de définir des structures de données génériques
- Exemple : définition d’un type liste sous la forme
(öğe listesi)
- Pattern matching
- Le pattern matching s’effectue avec le suffixe conditionnel
-sa/-se - Les patterns imbriqués, les binders et le joker (
değilse) sont pris en charge
- Le pattern matching s’effectue avec le suffixe conditionnel
- Définition de constantes
- Déclaration de constantes nommées avec le mot-clé
diyelim - Exemple :
sıfırın ardılına bir diyelim.
- Déclaration de constantes nommées avec le mot-clé
- Entrées/sorties et gestion des effets
- Exécution séquentielle avec le suffixe
-ip/-ıp/-up/-üp, et liaison avecolarak - Exemple :
selamlamak, isim olarak okuyup, ("Merhaba "yla ismin birleşimini) yazmaktır.
- Exécution séquentielle avec le suffixe
- Types de base
- Entiers (
tam-sayı) : opérations commetoplamı,farkı,çarpımı, etc. - Chaînes (
dizge) :uzunluğu,birleşimi,tam-sayı-hali - Entrée/sortie : commandes
yazmaketokumak
- Entiers (
- Commentaires et littéraux
- Commentaires :
(* ... *) - Littéraux : suffixes de cas inclus, comme dans
"merhaba"'yı yaz.
- Commentaires :
Installation et exécution
- Outils requis
- Foma : boîte à outils d’analyse morphologique à états finis
- Stack : outil de build Haskell
- Méthodes de build
- Exécuter le script
install.shou construire manuellement avec la commandestack build - Le convertisseur TRmorph est inclus dans
vendor/trmorph.fst
- Exécuter le script
- Exécution
- REPL :
stack exec kip - Exécution d’un fichier :
stack exec kip -- --exec path/to/file.kip - Installation dans le PATH :
stack install
- REPL :
Playground WASM
- Le répertoire
playground/contient une version destinée à l’exécution dans le navigateurkip-playgroundest compilé pourwasm32-wasi- Un harnais HTML/JS permet d’exécuter Kip dans le navigateur
- Voir
playground/README.mdpour la procédure de build détaillée
Cache de bytecode (.iz)
- Les résultats de la vérification de types de chaque fichier
.kipsont mis en cache dans des fichiers.iz- Si les sources ou les dépendances n’ont pas changé, le cache est réutilisé
- Si le fichier
.izest supprimé, une nouvelle analyse syntaxique et une nouvelle vérification de types sont effectuées - Le hash du compilateur est inclus, ce qui invalide automatiquement le cache en cas de changement de version
Programme d’exemple
- Inclut un exemple de définition des nombres naturels, de déclaration de constantes, de fonction d’addition et d’affichage du résultat
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.
Structure du projet
- app/ : point d’entrée CLI (
Main.hs) - src/Kip/ : inclut l’AST, le cache, l’interpréteur, le parseur, le moteur de rendu et le vérificateur de types
- lib/ : modules de base (
giriş.kip,temel.kip,temel-liste.kip, etc.) - tests/ : cas de test de réussite (
succeed/) et d’échec (fail/) - vendor/ : convertisseur morphologique
trmorph.fst
Tests
- Exécution avec la commande
stack testtests/succeed/: tests qui doivent réussirtests/fail/: tests qui doivent échouer
Analyse morphologique
- Kip utilise TRmorph pour effectuer l’analyse morphologique du turc
- Les mots ambigus (par ex. « takası ») sont analysés en conservant toutes les interprétations possibles
- Le sens est déterminé à l’étape de la vérification de types
- Pour forcer une interprétation particulière, on peut utiliser une apostrophe (
') (taka'sı,takas'ı)
Licence
- Voir le fichier LICENSE
1 commentaires
Commentaires sur Hacker News
Bonjour à tous, je suis le développeur de Kip
Je comptais à l’origine le dévoiler après avoir terminé le playground et la landing page, mais je partage ici le playground basé sur navigateur que j’ai construit jusqu’à présent
https://alpaylan.github.io/kip/
La transpilation vers JavaScript vient tout juste de commencer, donc elle ne fonctionne pas encore, mais le langage lui-même est en grande partie exécutable
S’il y a des bugs, ce serait super de les signaler dans les issues du repo
Je voulais l’appeler « Ç », mais je ne l’ai jamais réellement construit. Ça fait plaisir de voir que quelqu’un a essayé
Personnellement, je pense que « tense » est ce qui s’en rapproche le plus
Comme référence, j’ai regardé l’explication de BBC Bitesize
Par exemple Dans ce genre de phrase, je me demande si le sens de « farkını » (différence) et la position des suffixes permettent de distinguer 5-3 de 3-5
Comme la syntaxe repose sur la langue naturelle, on a l’impression d’un langage qui décrit des définitions mathématiques
https://kip-dili.github.io/
La structure du langage semble toujours suivre un ordre grammatical anglo-saxon
J’aimerais voir quelque chose de plus conforme à la grammaire turque, comme ceci
En tout cas, bravo : ce type d’essai constitue déjà un excellent point de départ
Ce projet est vraiment génial
Moi aussi, j’expérimente une idée similaire chez Logicaffeine Studio
Tu devrais aussi jeter un œil à Logos lang. J’aime bien aussi le choix de Haskell
Les générations précédentes se souviendront peut-être de Lingua::Romana::Perligata
https://metacpan.org/dist/Lingua-Romana-Perligata/view/lib/Lingua/Romana/Perligata.pm
J’avais moi aussi expérimenté une idée similaire il y a quelques années
https://github.com/celaleddin/sembolik-fikir
Je vais regarder cela de plus près dans les prochains jours
Dans Kip, l’analyse morphologique est effectuée de façon complète avec TRmorph, puis les ambiguïtés sont résolues à l’étape de vérification de types
Du coup, il n’y a presque pas besoin d’apostrophes. C’était difficile à implémenter, mais c’était un problème intéressant
Je sais lire un peu le turc, et ce projet a illuminé ma journée
Je trouve fascinant qu’une telle conception de langage soit possible grâce au caractère fort et standardisé du système de cas du turc
Par exemple, une phrase comme « Colonel Mustard killed him in the study at 5:00 with his own knife. » conserve son sens même si on change l’ordre
On retrouve souvent ce genre d’ordre complexe des mots dans la poésie latine ou russe
J’ai cliqué sur le lien avec des préjugés au départ, mais la définition est propre et facile à comprendre
Une version allemande serait amusante aussi
Je partage surtout ce billet de Language Log comme référence grammaticale, plus que pour le langage lui-même
Ma petite amie est turque et j’apprenais le turc, donc j’ai maintenant l’impression de pouvoir accélérer mon apprentissage grâce à un réflexe de programmation
C’est vraiment impressionnant
C’est une très bonne motivation pour reprendre un apprentissage qui s’était arrêté au niveau intermédiaire
À l’ère de l’IA, chaque pays peut créer des langages de programmation qui reflètent sa propre tradition linguistique
Cela peut considérablement élargir l’autonomie et la diversité des cultures de développement