Kof4j README

The project's README from github.com/KofLang/Kof4j. As one markdown file: README.md.

Kof

Kof Logo

Uma linguagem. Um compilador. Vários mundos.

se pronuncia coffe

Menos código. Mais intenção. JVM, nativo, script e web. Tudo partindo da mesma linguagem.


Mascote

Mascote da Kof — uma civetta

O mascote da Kof é uma civetta — também conhecida como gato do almiscar, é um felino que come café. Nada mais adequado para uma linguagem que se pronuncia coffe.


Disclaimer

A linguagem Kof não possui qualquer relação com o jogo The King of Fighters ou com sua franquia.

O nome Kof surgiu como uma referência à palavra "coffee" escrita propositalmente de forma incorreta. A escolha foi feita justamente na tentativa de criar um nome curto, único e facilmente identificável para a linguagem.

Koflang e Kof4J não compactuam com a associação do nome à franquia The King of Fighters. Qualquer semelhança ou associação feita nesse sentido é incidental e não representa a origem, o propósito ou a identidade dos projetos.

Nosso objetivo sempre foi criar uma identidade própria para a linguagem e seus componentes.


Algumas pessoas olham para um problema e escrevem uma biblioteca.

Outras escrevem um framework.

Algumas criam uma ferramenta.

Eu aparentemente olhei para o ecossistema inteiro e pensei:

"Tá tudo complicado demais. Vou criar uma linguagem."

E, aparentemente, uma linguagem só também não era suficiente.

Bem-vinda à Kof.


O que é Kof?

Kof é uma linguagem de programação geral e estaticamente tipada, construída com uma ideia central:

Uma única linguagem não deveria obrigar você a escolher um único mundo.

📖 A especificação formal da linguagem (gramática, sistema de tipos, semântica, status de cada feature) está em docs/language-reference/. A arquitetura do compilador (implementação) está em docs/compiler-architecture.md. A distinção linguagem ≠ compilador ≠ target é o eixo desses documentos.

Kof possui seu próprio compilador, lexer, parser, sistema de tipos, análise semântica e representação intermediária (Kof IR). A partir dessa IR, diferentes backends transformam o mesmo programa em diferentes formas de execução:

            Linguagem Kof  (definida pela especificação)
                          │
                    Kof Compiler  (uma implementação)
                          │
                       Kof IR  (máquina de pilha linear, 30 ops)
                          │
          ┌───────────────┼────────────────┐
          │               │                │
       JVM Backend    Native Backend    JS Backend
          │               │                │
          ▼               ▼                ▼
        JVM          Native Binary      ES Modules
       (.class)      (ELF x86_64,       (Node /
                      riscv64/aarch64)    browser)

A linguagem não muda. O target muda. JVM, Native e JS são targets de compilação da mesma Kof — não dialetos semanticamente diferentes. KofScript (.ks, REPL) é um target de execução direta: Kof puro consumindo o MESMO frontend e executado pelo interpretador da IR, sem compilar e sem fork de JVM — não é JavaScript (let/const/async/fn não existem). KofC é uma ferramenta separada (subconjunto C → ELF), não consome a IR Kof — ver docs/compiler-architecture.md §7.)


Kof não é um transpiler

Kof não funciona assim:

Kof → Java → javac → JVM

Funciona assim:

Kof → Kof Compiler → Kof IR → Backend → Target

O compilador possui sua própria implementação de:

Kof não depende de Java como linguagem intermediária.


Estado Atual

Kof está em desenvolvimento ativo — 0.3.0-beta.

O compilador possui frontend próprio, type system, Kof IR e três backends sobre a IR, que produzem seis targets: JVM (V21 via ASM), Native x86_64 (ELF, sem libc), native.risc/native.arm (riscv64 real + aarch64 via tradutor ISA), KofJS (ES Modules) e Android (variante do JVM + empacotamento APK). KofScript (.ks, REPL) é um target de execução direta: Kof puro no MESMO frontend, executado pelo interpretador da IR (KofInterpreter) sem emitir bytecode nem fork de JVM. KofC (subconjunto C → nativo) é uma ferramenta separada, não consome a IR Kof — ver docs/compiler-architecture.md §7.

Feature JVM Native KofJS
println, variáveis, aritmética ✅ ✅ ✅
if/else, if-expr, while, for, for-in, switch ✅ ✅ ✅
functions (sem fun), lambdas com capturas ✅ ✅ ✅
records, classes, herança, interfaces, virtual dispatch ✅ ✅ ✅
generics (erasure), Box<T> com primitivos ✅ ✅ ✅
exceptions (throw "msg", try/catch/finally) ✅ ✅ ✅
null safety String? + narrowing ✅ ✅ ✅
pattern matching case String s + record destructuring ✅ ✅ ✅
spawn/await (Handle<T>, unboxing) ✅ ✅ (pthread) ✅ sequencial
strings (concat +, ==, API completa) ✅ ✅ ✅
arrays, List<T>/Map<K,V>/Set<T> + map/filter/reduce ✅ ✅ ✅
enums + switch exaustivo ✅ ✅ ✅
JSON encode/decode (objetos/records/arrays, 3 targets) ✅ ✅ ✅
kof.io (File, Path, Directory) ✅ ✅ ✅
kof.time (now/sleep/interval), kof.cache ✅ ✅ ✅
kof.web (web.app(), ws, sse, TLS) ✅ WEB002 WEB001
kof.http client + retry/circuit ✅ HTTP002 ✅
kof.security (passwords, crypto, jwt, secrets, auth) ✅ ✅ ✅
kof.db / kof.orm (SQLite nativo, MySQL WIP, MongoDB) ✅ ✅ DB001/ORM001
kof.config / kof.log ✅ ✅ CONF001/LOG001
kof.ui (Color, Palette, Theme, widgets) no-op no-op ✅ render

Concorrência: spawn tarefa() / val r = spawn f(); await r — virtual threads na JVM, pthread_create no Native (CONC001 fechado 31/08), sequencial no JS (CONC003). Ver docs/concurrency.md.

Null safety: String?/Int? + if (x != null) narrowing nos 3 targets (fix JVM 02/09). Map.get devolve V? para valores de referência.

Testes: test "nome" { } + assert(cond, "msg") + kof test — 810 testes (793 kof-compiler + 8 kof-script + 5 kof-c-compiler + 4 kof-cli). Ver learn/23-testing.md.

Depuração: kof debug <file.kf> — servidor DAP sobre stdio com JDWP cru (breakpoints por linha Kof, call stack com funções/linhas Kof, continue, disconnect). Ver docs/debugging.md.

Auditoria do ecossistema: matriz de cobertura da stdlib (inventário, gaps G1-G12, prioridade e estratégia) em docs/development/ecosystem-coverage.md. Plano de evolução para plataforma completa: docs/development/plan-platform-completion.md.


kof.ui — A plataforma de UI

A fundação da UI do Kof: Color (RGBA 32-bit), Palette (cores nomeadas) e Theme (light/dark com cores semânticas) — mesma semântica em JVM, Native e JS. A renderização é KofJS: widgets → DOM real no webview nativo (bin/kof-webview, WebKitGTK embutido) ou no browser.

Widgets: Window (título, bind, show/close, size, theme), Label (text, fontSize, bold, color), Button (texto + ação por lambda com capturas), Input (text), containers Column/Row, View+Style (background, padding, radius).

class App {
    static Int count = 0
}

main() {
    var w = Window("Contador")
    var label = Label("contagem: 0")
    w.bind(label)
    w.bind(Button("+1", () -> {
        App.count = App.count + 1
        label.text = "contagem: " + App.count
    }))
    w.show()
}
kof run contador.kf --target=js   # abre a janela; fechar encerra o programa

Ver: learn/35-kof-ui.md e learn/37-kofjs.md.


Documentação — onde procurar o quê

Pasta Para quem O que contém
docs/ arquitetos, mantenedores, decisões Documentação técnica e de projeto: estado atual (status.md, development/actual-state.md), arquitetura (architecture.md), segurança (security.md), performance (performance.md), depuração (debugging*.md), roadmap (development/roadmap.md), stdlib (stdlib/, stdlib-web.md...), targets (targets/), distribuição (distribution/), ferramentas (tooling/), visões futuras (development/future/) e auditorias (development/ecosystem-coverage.md, development/complexity-audit.md)
learn/ humanos aprendendo Kof Trilha de aprendizado em capítulos numerados (00 Introdução → 37 KofJS): linguagem, classes, funções, lambdas, UI, segurança — cada capítulo um guia prático; learn/native/ para o alvo nativo
training/ LLMs e ferramentas de IA Corpus estruturado otimizado para modelos de linguagem: fatos por tópico (language/), idiomas (idioms/), padrões/anti-padrões (patterns/, anti-patterns/), exemplos compiláveis (examples/), referência (reference/), migração Java→Kof (migration/), tooling e releases

Regra prática: docs/ diz como o Kof é (estado e arquitetura); learn/ ensina como usar o Kof (passo a passo); training/ alimenta quem gera código Kof (LLMs).


kof.web — Stack Web Nativa

Aplicações web sem Spring, sem servlet container, sem annotations:

record User(String name, Int age)

main() {
    var app = web.app()

    app.use {
        if (header("x-auth") == "secret") {
            return null
        }
        return "{\"error\": \"unauthorized\"}"
    }

    app.get("/hello") {
        return "Hello from Kof"
    }

    app.get("/users/:id") {
        return "user " + param("id") + " q=" + query("name")
    }

    app.post("/user") {
        var user = json.decode<User>(body())
        return json.encode(user)
    }

    app.listen(8080)
}
kof serve app.kf

Path params, query, headers, body, middleware, JSON tipado e servidor HTTP embutido no runtime do programa. Ver: docs/stdlib-web.md.


kof.io — Filesystem

Arquivos, diretórios e caminhos com uma API única em todos os targets:

var path = Path("data/users.txt")
path.parent().createDirectories()
path.writeText("Mel\nKof\n")
println(path.readText())
println(path.size())
var dir = Directory("data")
dir.createDirectories()
for (var entry in dir.list()) {
    println(entry.name)
}

Texto sempre UTF-8; bytes como Int[]; ausência como String? (null) e size() lança em vez de sentinela -1. Ver: learn/34-file-system.md e docs/stdlib/IO.md.


Instalação

Kof é uma distribuição: instale e receba compilador, CLI, runtime, stdlib, tooling, editor support e um OpenJDK embutido. Nenhuma instalação externa de Java é necessária — e não precisa saber a versão para instalar.

  1. Baixe o pacote do seu sistema em GitHub Releases: linux-x86_64.tar.gz / macos-arm64.tar.gz / windows-x86_64.zip.
  2. Extraia e adicione o bin ao PATH:
# Linux
tar -xzf kof-*-linux-x86_64.tar.gz
export PATH="$PWD/$(ls -d kof-*-linux-x86_64 | head -1)/bin:$PATH"

# macOS (Apple Silicon)
tar -xzf kof-*-macos-arm64.tar.gz
export PATH="$PWD/$(ls -d kof-*-macos-arm64 | head -1)/bin:$PATH"

# Windows (PowerShell)
Expand-Archive .\kof-*-windows-x86_64.zip
$DIR = (Get-ChildItem -Directory -Filter "kof-*-windows-x86_64" | Select-Object -First 1).FullName
$env:PATH = "$DIR\bin;$env:PATH"
  1. Confira:
kof version   # kof <versão da release>
kof info      # ambiente completo (JVM embutida, Tooling API 21, targets)

Ver: docs/distribution/INSTALL.md (guia completo com cada sistema, checksum e solução de problemas) e docs/distribution/ARCHITECTURE.md.


CLI

kof build <dir> [--target jvm|native|native.risc|native.arm|js|android] [--output <dir>] [--release]
kof run <file.kf> [--target jvm|native|native.risc|native.arm|js] [args...]
kof serve <file.kf> [--port <port>] [--host <host>]
kof check <file.kf|dir>
kof test <file.kf|dir> [--target jvm|native|js]
kof script | repl | c | fmt | config
kof bench | profile | inspect | debug
kof info | lsp | install | version

kof fmt (formatter idempotente) e kof config gen implementados — ver docs/tooling/README.md.



Compilando e instalando a partir do source

Requisitos: JDK 21+ (Temurin recomendado — é a Tooling API baseline) e Maven 3.9+. Para o target native: as/ld (binutils). O target js não exige nada externo (GraalJS embarcado no jar).

# 1. Compilar tudo (compilador, runtime, CLI com GraalJS embarcado)
mvn clean package -DskipTests

# 2. Rodar a suíte completa (JVM + Native + KofJS E2E)
mvn test

# 3. Usar direto do source (dev build, java do sistema)
mkdir -p lib
cp kof-cli/target/kof-cli-$(cat VERSION).jar lib/kof.jar
bin/kof version
bin/kof info

# 4. Instalar num prefixo (instalação local completa)
bin/kof install ~/.kof
export PATH="$HOME/.kof/bin:$PATH"
kof version

# 5. Empacotar a distribuição oficial (com OpenJDK 21 embutido)
scripts/package.sh --jdk      # gera dist/kof-<versão>-<os>-<arch>.tar.gz

O kof install <dir> copia o kof.jar para <dir>/lib/ e gera o launcher <dir>/bin/kof (usa o JDK embutido de <dir>/jdk/ quando presente; senão o java do sistema). O scripts/package.sh --jdk baixa o Temurin 21 do Adoptium e monta o layout completo de distribuição.

Versionamento centralizado em VERSION — ver docs/distribution/VERSIONING.md.

Windows: use o Git Bash para scripts/package.sh — o bash genérico do PATH pode resolver para o WSL e gerar uma distribuição Linux (OBS-005). No Windows, o Python pode estar disponível apenas como o launcher py — o script o descobre automaticamente (python3/python/ py -3).


Arquitetura

Source (.kf)
  ↓ Lexer
  ↓ Parser
  ↓ AST
  ↓ Type System
  ↓ Semantic Analysis
  ↓ Kof IR (backend-agnostic)
  ├── JVM Backend (ASM) → .class
  ├── Native Backend (x86_64 / riscv64 / aarch64) → ELF
  └── JS Backend (GraalJS) → ES Modules

Princípios

  1. Menos código, mesma capacidade
  2. Tipagem forte
  3. Intenção acima de cerimônia
  4. Um frontend, múltiplos backends
  5. Direto para o target
  6. Interoperabilidade
  7. Sem mágica desnecessária
  8. Ferramentas importam

O "paradigma" da intenção

Kof é orientada à intenção — o que não é um paradigma formal, e sim a orientação a objetos levada ao extremo: o código expressa o que quer, e a plataforma (linguagem + compilador + runtime + stdlib) decide como, por target e por convenção.

intenção → Kof → compilador → backend

Você escreve spawn tarefa() (não Thread), app.get("/users/:id") (não servlet container), Window/Button("+1", () -> ...) (não WebView/JavaFX), json.decode<User>(body) (não parser manual), Palette.red (não 0xFF0000FF). Se é essencial para qualquer programa, pertence à plataforma.

Quando um target não consegue realizar a intenção, ele diz isso em compile-time com um código de gap (CONC001, JSN002, ...) — nunca silenciosamente.

Detalhes: docs/philosophy.md · idiomas: training/idioms/ · anti-padrões: training/anti-patterns/.


O que Kof NÃO é

Kof é uma linguagem. Um compilador. Uma IR. Vários backends.


Licença

Kof é software livre distribuído sob a licença GNU General Public License v3.0.

Isso se aplica ao código-fonte do compilador, ferramentas e demais componentes do projeto.

Programas escritos em Kof NÃO são automaticamente GPLv3.

O autor do programa mantém o direito de escolher a licença do próprio software. Usar o compilador Kof não obriga ninguém a abrir seu código-fonte.

Software proprietário escrito em Kof é permitido, desde que respeite as licenças das dependências que efetivamente incorporar.

Para mais detalhes, consulte docs/LICENSING.md.


Kof

Uma linguagem. Um compilador. Vários mundos.

Menos cerimônia. Mais intenção.

Kof4j (KofLang/Kof4j)

Searching Database…

286 ·GitHub
Что это такое?Kof (произносится «кофе») — универсальный статически типизированный язык программирования с собственным компилятором. Один язык компилируется в JVM, нативные бинарники, JavaScript и Android — меняется только цель, а не язык.
Это настоящий компилятор или транспайлер?Настоящий компилятор, а не транспайлер: в нём есть собственные лексер, парсер, система типов, семантический анализ и промежуточное представление (Kof IR), и Java никогда не используется как промежуточный язык.
Нужно ли сначала установить Java?Нет — в дистрибутив уже встроен OpenJDK, отдельная установка Java не требуется. А вот сборка из исходников потребует JDK 21+, Maven 3.9+ и binutils для нативной цели.
Можно ли использовать это в продакшене?Проект активно развивается и находится на версии 0.3.0-beta, так что рассчитывайте на бета-качество. Некоторые модули stdlib на не-JVM целях пока неполные — например, kof.db/kof.orm на JS и kof.ui, который рендерится только на JS, — поэтому перед тем как полагаться на модуль, сверьтесь с таблицей возможностей.
Во что можно скомпилировать программу на Kof?Шесть целей из одного фронтенда: байткод JVM (V21 через ASM), нативный x86_64 ELF без libc, нативные riscv64 и aarch64, JavaScript ES Modules, Android (JVM-вариант, упакованный в APK), плюс KofScript — REPL, который запускает Kof напрямую на IR-интерпретаторе.
Если компилятор под GPLv3, мой код тоже должен быть под GPL?Нет — GPLv3 распространяется на компилятор и его инструменты, а программы, которые вы пишете, сохраняют любую выбранную вами лицензию. Проприетарное ПО на Kof прямо разрешено.
Почему язык называется Kof?Это намеренно искажённое «coffee» — произносится «кофе», а маскот — мусанг, зверёк, известный тем, что ест кофейные зёрна. В README прямо говорится, что связи с франшизой The King of Fighters нет.
Что в Kof означает идея «intent over ceremony»?Вы пишете, чего хотите, — spawn tarefa(), app.get('/users/:id'), Window/Button('+1', ...) — а платформа (компилятор, рантайм, stdlib) решает, как это сделать, в зависимости от цели и по соглашениям. Если цель не может реализовать намерение, вы получите код проблемы времени компиляции вроде CONC001, а не молчаливое странное поведение.
Можно ли делать веб-бэкенды без Spring?Да — kof.web даёт встроенный HTTP-сервер с параметрами пути, query, заголовками, телом запроса, middleware, типизированным JSON, WebSockets, SSE и TLS, и всё это без Spring, контейнера сервлетов и аннотаций. На JVM всё готово, на native и JS пока возможности ограничены.
Работают ли spawn/await на всех целях?Конкурентность встроена в язык на всех трёх бэкендах исполнения: виртуальные потоки на JVM, pthreads в нативном коде и только последовательное выполнение на JS.
What are similar projects?scala, crystal, perry, v, clojure, TypeScript, morloc, jdk
Creator
KofLang
Size
205.2 MB
Stars
286
Age
1mo
Commits · 90 Days