- Kip é uma linguagem de programação experimental que integra os casos gramaticais e o modo (mood) do turco ao sistema de tipos, explorando a combinação entre morfologia de linguagem natural e teoria dos tipos
- Reflete as declinações de caso dos substantivos e a harmonia vocálica do turco na estrutura do código, distinguindo relações entre argumentos de função por sufixos de caso e oferecendo flexibilidade na ordem dos argumentos
- Expressa recursos centrais de linguagens funcionais modernas, como pattern matching, tipos polimórficos, tipos de dados indutivos e efeitos de entrada/saída, em formas gramaticais do turco
- É compilada com o analisador morfológico Foma e Haskell Stack, e oferece um ambiente de execução no navegador baseado em WASM e recurso de cache de bytecode (.iz)
- Como um projeto de pesquisa e educação que mostra a interseção entre linguística e design de linguagens de programação, é um caso experimental sobre a possibilidade de projetar linguagens baseadas em linguagem natural
Visão geral do Kip
- Kip é uma linguagem cujo nome vem da palavra turca “kip” (modo), uma linguagem experimental que incorpora os casos gramaticais do turco ao sistema de tipos
- Integra as declinações de caso dos substantivos (ismin halleri) e a harmonia vocálica (vowel harmony) do turco ao design da linguagem de programação
- É um projeto com fins de pesquisa e educação, não uma linguagem para distribuição em produção
- Há tutoriais em turco e inglês, permitindo aprender a escrever programas em Kip
- A gramática e o comportamento estão em estágio experimental, com possibilidade de mudanças futuras
Características da linguagem
- Uso dos casos gramaticais do turco como tipos
- Suporta 8 casos: nominativo, acusativo, dativo, locativo, ablativo, genitivo, instrumental e possessivo
- Cada caso é marcado por um sufixo, distinguindo explicitamente as relações entre argumentos de função
- Ordem flexível dos argumentos
- Como os sufixos de caso deixam claras as relações entre argumentos, é possível mudar sua ordem mantendo o mesmo significado
- Ex.:
(5'le 3'ün farkını) yaz. e (3'ün 5'le farkını) yaz. produzem o mesmo resultado
- Definição de tipos de dados indutivos
- Suporte a tipos polimórficos
- Permite definir estruturas de dados genéricas
- Ex.: definição de lista na forma
(öğe listesi)
- Pattern matching
- Realiza pattern matching usando o sufixo condicional
-sa/-se
- Suporta padrões aninhados, binders e wildcard (
değilse)
- Definição de constantes
- Declara constantes nomeadas com a palavra-chave
diyelim
- Ex.:
sıfırın ardılına bir diyelim.
- Entrada/saída e tratamento de efeitos
- Tipos básicos
- Inteiros (
tam-sayı): suporte a operações como toplamı, farkı, çarpımı
- Strings (
dizge): oferece uzunluğu, birleşimi, tam-sayı-hali
- Entrada/saída: suporte aos comandos
yazmak, okumak
- Comentários e literais
- Comentários:
(* ... *)
- Literais: forma com sufixo de caso, como
"merhaba"'yı yaz.
Instalação e execução
- Ferramentas obrigatórias
- Foma: toolkit de análise morfológica de estados finitos
- Stack: ferramenta de build para Haskell
- Como compilar
- Execute o script
install.sh ou faça a compilação manual com o comando stack build
- Inclui o transdutor TRmorph em
vendor/trmorph.fst
- Execução
- REPL:
stack exec kip
- Executar arquivo:
stack exec kip -- --exec path/to/file.kip
- Instalação no PATH:
stack install
Playground em WASM
- O diretório
playground/ inclui uma build para execução no navegador
- Compila
kip-playground para wasm32-wasi
- Um harness em HTML/JS permite executar Kip no navegador
- Consulte
playground/README.md para os procedimentos detalhados de build
Cache de bytecode (.iz)
- Armazena em arquivos
.iz os resultados da verificação de tipos de cada arquivo .kip
- Reutiliza o cache se o código-fonte ou as dependências não tiverem mudado
- Se o arquivo
.iz for apagado, o parsing e a verificação de tipos são refeitos
- Inclui um hash do compilador, invalidando automaticamente o cache em caso de mudança de versão
Programas de exemplo
- Inclui exemplos de definição de números naturais, declaração de constantes, função de soma e saída do resultado
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.
Estrutura do projeto
- app/ : ponto de entrada da CLI (
Main.hs)
- src/Kip/ : inclui AST, cache, interpretador, parser, renderizador e verificador de tipos
- lib/ : módulos básicos (
giriş.kip, temel.kip, temel-liste.kip etc.)
- tests/ : casos de teste de sucesso (
succeed/) e falha (fail/)
- vendor/ : transdutor morfológico
trmorph.fst
Testes
- Executados com o comando
stack test
tests/succeed/: testes que devem passar
tests/fail/: testes que devem falhar
Análise morfológica
- Kip usa TRmorph para realizar a análise morfológica do turco
- Palavras ambíguas (ex.: “takası”) são analisadas preservando todas as interpretações possíveis
- O significado é determinado na etapa de verificação de tipos
- Para forçar uma interpretação específica, usa-se apóstrofo (
') (taka'sı, takas'ı)
Licença
- Consulte o arquivo LICENSE
1 comentários
Comentários do Hacker News
Olá a todos, sou o desenvolvedor do Kip
Eu pretendia anunciar só depois de terminar o playground e a landing page, mas por enquanto estou compartilhando o playground baseado em navegador que fiz até agora
https://alpaylan.github.io/kip/
A transpilação para JavaScript está só começando e ainda não funciona, mas a maior parte da linguagem em si já pode ser executada
Se encontrarem bugs, ficarei feliz se avisarem na issue do repositório
Eu queria chamar isso de “Ç”, mas nunca cheguei a fazer. Fico feliz em ver alguém tentando
Pessoalmente, acho que “tense” é o mais próximo
Como referência relacionada, vi a explicação da BBC Bitesize
Por exemplo Em frases assim, queria entender se a distinção entre 5-3 e 3-5 é feita pelo significado de ‘farkını’ (diferença) e pela posição das partículas
Como é uma sintaxe baseada em linguagem natural, ela passa a sensação de uma linguagem para descrever definições matemáticas
https://kip-dili.github.io/
A estrutura da linguagem ainda parece seguir a ordem gramatical anglo-saxônica
Eu gostaria de ver algo assim, mais adequado à gramática turca
De qualquer forma, parabéns: essa tentativa por si só já é um ótimo ponto de partida
Este projeto é realmente muito legal
Eu também estou experimentando uma ideia parecida no Logicaffeine Studio
Talvez valha a pena dar uma olhada também em Logos lang. Gostei da escolha de Haskell
Quem é de uma geração anterior talvez se lembre de Lingua::Romana::Perligata
https://metacpan.org/dist/Lingua-Romana-Perligata/view/lib/Lingua/Romana/Perligata.pm
Eu também experimentei uma ideia semelhante alguns anos atrás
https://github.com/celaleddin/sembolik-fikir
Pretendo analisar com mais calma nos próximos dias
No Kip, usamos TRmorph para fazer a análise morfológica completa e resolver ambiguidades na etapa de verificação de tipos
Por isso quase não é preciso usar apóstrofos. Foi difícil de implementar, mas um problema divertido de resolver
Consigo ler um pouco de turco, e este projeto alegrou meu dia
É interessante como o sistema de casos do turco é forte e padronizado, a ponto de tornar possível esse tipo de design de linguagem
Por exemplo, em uma frase como “Colonel Mustard killed him in the study at 5:00 with his own knife.”, o sentido se mantém mesmo mudando a ordem
Em poesia latina ou russa também aparecem com frequência ordens de palavras complexas desse tipo
No começo cliquei no link com preconceito, mas a definição é limpa e fácil de entender
Acho que uma versão em alemão também seria divertida
Mais do que sobre a linguagem em si, estou compartilhando como referência gramatical este post do Language Log
Minha namorada é turca e eu estava aprendendo turco, então agora acho que vou conseguir acelerar o aprendizado com uma intuição de programação
Realmente impressionante
Isso vira uma ótima motivação para retomar os estudos, que estavam parados no nível intermediário
Na era da IA, cada país pode criar linguagens de programação que reflitam sua própria tradição linguística
Isso amplia muito a autonomia e a diversidade da cultura de desenvolvimento