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…

289 ·GitHub
这是什么?Kof(读作 'coffe')是一门通用型静态类型编程语言,带有自己的编译器。同一门语言可以编译到 JVM、原生二进制、JavaScript 和 Android——变的只是目标平台,语言本身不变。
它是真正的编译器还是转译器?是真正的编译器,不是转译器:它自带词法分析器、语法分析器、类型系统、语义分析和中间表示(Kof IR),从不把 Java 当作中间语言。
使用之前需要先安装 Java 吗?不需要——发行包里内置了 OpenJDK,无需单独安装 Java。如果想从源码构建,则需要 JDK 21+ 和 Maven 3.9+,编译原生目标时还需要 binutils。
它适合用于生产环境吗?目前仍在积极开发中,版本为 0.3.0-beta,应视为测试版质量。一些标准库模块在非 JVM 目标上还不完整——例如 kof.db/kof.orm 在 JS 上不完整,kof.ui 目前只能在 JS 上渲染——所以在依赖某个模块之前,请先查看功能对照表。
一个 Kof 程序可以编译成什么?一套前端支持六种目标:JVM 字节码(通过 ASM 生成 V21)、不依赖 libc 的 x86_64 原生 ELF、riscv64 和 aarch64 原生代码、JavaScript ES Modules、Android(打包成 APK 的 JVM 变体),以及 KofScript——一个直接在 IR 解释器上运行 Kof 的 REPL。
如果编译器是 GPLv3,我的代码也必须用 GPL 协议吗?不需要——GPLv3 只约束编译器及其工具,你自己写的程序可以自由选择任何许可证。用 Kof 编写专有软件是明确允许的。
为什么叫 Kof?它是故意拼错的 'coffee'(咖啡),读作 'coffe',吉祥物是一只麝香猫——一种以爱吃咖啡豆闻名的猫科动物。README 中明确声明与《拳皇》(The King of Fighters)系列没有任何关系。
Kof 中 'intent over ceremony'(意图优先于形式)是什么意思?你只写想做什么——比如 spawn tarefa()、app.get('/users/:id')、Window/Button('+1', ...)——具体怎么做由平台(编译器、运行时、标准库)根据不同目标和约定来决定。当某个目标无法实现某个意图时,你会得到一个类似 CONC001 的编译期错误码,而不是默默出现异常行为。
不用 Spring 也能搭建 Web 后端吗?可以——kof.web 提供一个内嵌 HTTP 服务器,支持路径参数、查询字符串、请求头、请求体、中间件、类型化 JSON、WebSockets、SSE 和 TLS,完全不需要 Spring、Servlet 容器或注解。目前在 JVM 上已经完备,原生和 JS 目标上仍有限制。
spawn/await 在所有目标上都能用吗?并发是内置于语言本身的,三种执行后端全部支持:JVM 上使用虚拟线程,原生平台使用 pthreads,JS 上则只能顺序执行。
What are similar projects?scala, crystal, perry, v, clojure, TypeScript, morloc, jdk
Creator
KofLang
Size
214.5 MB
Stars
289
Age
1mo
Commits · 90 Days