Lógica direta. Você escreve o que quer.
A dificuldade de programar quase nunca é querer um resultado. É a distância entre a ideia na sua cabeça e o passo exato que a máquina exige. O UPCode encurta essa distância: você escreve a intenção, uma camada legível mostra o que vai acontecer, e o Python executa.
Fundação 0.1.0-alpha. Experimental, livre e offline. Sem cadastro, sem chave, sem ligação.
$ upc executar exemplos/01_ola_mundo.upc --detalhado UPCode 0.1.0-alpha analise: sintaxe ............ OK semantica .......... OK upir: { "nome": "ola_mundo", "instrucoes": [ { "operacao": "MOSTRAR", "argumentos": ["ola, mundo!"] } ] } geracao: Python ............. OK saida: ola, mundo! status: APROVADO cadeia sha256 verificada
Lógica direta: quatro regras, sem curva de aprendizado
Lógica direta não é sinônimo de fácil. É sinônimo de sem degrau escondido. Você sempre sabe em que passo está, o que aquele passo fez e o que ele entrega ao próximo. Nada de chegar no fim e descobrir que faltava entender alguma coisa.
O que você escreve é o que quer dizer
A frase que sai da sua cabeça é a frase que entra. Não há tradução implícita nem convenção a decorar para casos comuns: o verbo que você quer é o verbo que você usa.
Cada instrução tem um nome que é o seu nome
As operações são identificadores legíveis, escritos na sua língua. Você não decora o nome interno de nada: o nome da operação é a palavra que descreve a operação.
Entre a sua frase e a execução existe um espelho
A representação intermediária é texto legível, em formato aberto, que você abre, lê e confere. Você vê o significado do programa antes de ele rodar, e não depois.
Nenhum passo esconde o seguinte
Cada etapa do encadeamento recebe um resumo, e o resumo aponta o resumo seguinte. Quando algo falha, o erro diz em qual passo foi e o que aquele passo recebeu.
Anatomia de um primeiro pensamento
Quatro intenção, uma operação, um resultado. Você lê isso e sabe exatamente o que o programa vai fazer.
programa dá nome ao que vai rodar
1 · fonte
inicio abre o bloco principal
2 · escopo
mostrar é o verbo da saída
3 · operação
Do que você escreve até o que sai na tela
Avance uma etapa por vez. Cada uma mostra o artefato que aquela etapa produziu de verdade — nada aqui é ilustração. É o mesmo conteúdo que o programa de linha de comando imprime.
Muita gente desiste. O motivo não é a pontuação.
A intuição diz que programadores desistem porque a sintaxe é difícil. Os dados de Surveys com estudantes de programação no Brasil e a literatura revisada dizem outra coisa — e a diferença importa, porque aponta para um problema que dá para resolver.
A ressalva que muda o enquadramento
Um mapeamento sistemático da literatura publicado na RBIE, que filtrou 503 estudos e manteve 11, concluiu que a sintaxe aparece entre as cinco categorias de dificuldade mais frequentes — mas escreveu, com todas as letras, que não parece ser a sintaxe o problema que leva a reprovações e desistências. A sintaxe é uma dificuldade a mais, somada a outras.
Isso corta caminho para o lugar certo. A distância que faz alguém desistir não é o parêntese: é a distância entre o raciocínio e a instrução, e a sensação de nunca alcançar o raciocínio.
É por isso que o centro do UPCode é a lógica e não a ergonomia do teclado. Enfeite de sintaxe teria vendendo a solução para o sintoma menos importante.
Fontes citadas nesta seção
- Survey com 110 estudantes de disciplinas introdutórias, UFERSA (2018) — dificuldades em lógica, sintaxe e conteúdos mais difíceis.
- Mapeamento sistemático da literatura em dificuldades de aprendizagem de programação, RBIE v.33 (2025), SBC — 503 estudos filtrados, 11 mantidos.
- Tese sobre padrões de dificuldades no aprendizado de programação, USP — análise de ~19.500 matrículas e 139 tipos de equívocos.
- Dificuldades de aprendizagem no curso de ADS, IFRN Campus Pau dos Ferros (2021) — 25 de 64 matriculados responderam.
- Fatores autopercebidos por estudantes de TI na primeira disciplina de programação (2025) — 123 respondentes, recorte de gênero.
- From Code Complexity Metrics to Program Comprehension, ACM Communications (2023).
- Early Career Developers' Perceptions of Code Understandability — 216 desenvolvedores, 12 classes.
- Gamificação e inovação na aprendizagem de programadores, RICS v.10 n.2 (2024).
- Revisão sistemática de literatura sobre dificuldades de aprendizagem, 69 artigos (2020–2024).
Python. É isso, e é escolha
O destino do UPCode é Python, e isso é deliberado — não é etapa intermediária, não é plano futuro, não é promessa. O que você já tem instalado continua instalado. Toda biblioteca do seu ambiente, toda ferramenta do seu sistema, todo script de deploy que já existe: nada precisa ser reescrito, e nada precisa conviver em dois mundos.
Python é a base mais defendível que existe para isso, porque é mercado pronto de biblioteca, de empacotamento, de tipos, de community e de leitura por iniciante ao mesmo tempo. Uma linguagem que traduz para Python não precisa inventar nada para além do seu próprio propósito. Ela precisa escrever a intenção e sair do caminho.
────────── a fronteira é esta ──────────
{ "operacao": "MOSTRAR",
"argumentos": ["ola, mundo!"] }
vira
def principal():
print("ola, mundo!")
principal()
Seis motivos para querer isso
Nenhum destes é promessa de futuro. Todos são o que o repositório já faz hoje, com arquivo, execução e resultado verificados. Abra o cartão de cada um para ver a evidência.
A distância encurta
Entre o que você quer e o que a máquina exige há um espelho legível. Você atravessa essa distância olhando, não adivinhando.
Você lê o que o código faz
A representação intermediária é texto aberto em formato aberto, não bytecode opaco. Você audita a intenção do programa antes de ele rodar.
Python faz o trabalho
O destino é Python. A biblioteca que você já tem continua ali, e continua sendo a mesma biblioteca, sem wrapper e sem reimplementação.
Você pode provar o que rodou
Cada execução encadeia o hash da fonte, da análise, da UPIR, do Python gerado e da saída. Se algo mudar no caminho, a cadeia acusa.
Ninguém te prende
Apache 2.0. Sem chave, sem cadastro, sem telefone para casa. Funciona offline, funciona num avião, funciona num servidor sem internet.
Você escreve na sua língua
Português brasileiro é a primeira interface, não a única. As palavras são identificadores, e o destino é Python — sempre, não por enquanto.
Programar para muita gente é alegria, não obrigação. E isso não é retórica — é um desenho.
Existe um momento muito específico na programação em que o programa faz o que você queria, e você entende por que ele fez. Não porque deu sorte: porque cada passo foi visível. Esse momento é o prêmio. Ele não vem de decorar mais sintaxe — vem de ter visto a lógica inteira antes de sair na tela.
Uma revisão sistemática de 69 artigos aponta o caminho contrário como o caminho do fracasso: programação é percebida como abstrata e desconectada, e a ansiedade que aparece vira falta de interesse e perda de confiança. A mesma revisão encontra que jogos sérios e plataformas interativas melhoram a retenção. Um ensaio sobre gamificação registra 76,9% estudando todo dia e ainda assim 69% com dificuldade — porque frequência sem caminho não é aprendizado.
Por isso a página tem uma lógica para ser percorrida e não apenas lida. Por isso o programa mostra a cara do que está fazendo. Por isso o exemplo é dezoito caracteres e roda na sua frente.
E por isso vale dizer o contrário também: se programação não for alegria para você, ela não precisa ser sua obrigação. Os lugares onde a programação aparece como obrigação são os que ensinam pior, porque ensinam a obedecer. A promessa do UPCode não é convencer mais gente a sofrer com sintaxe. É tornar a parte que dá prazer — ver a ideia virar executável, e entendê-la — acessível a quem nunca teve acesso a ela.
Um corredor infinito, em português
Para a seção sobre alegria não ser só conversa, ela precisava de uma prova. Corra Espaço, ↑ ou toque para pular, P para pausar, R para recomeçar. Pulo duplo existe. Recorde fica no seu navegador.
Qual parte é UPCode
Os textos deste jogo saíram do compilador. Eles vivem em
jogo/mensagens.upc, são compilados de verdade para
jogo/mensagens.py, e um teste confere a lista do jogo
contra essa saída — se alguém editar no braço, o teste falha.
A física não é UPCode, e a página diz isso na cara. O
UPCode 0.1.0-alpha implementa uma instrução só, mostrar.
se, enquanto e funcao são
rejeitados com UP1004. Gravidade e colisão não cabem no
que existe hoje.
# jogo/mensagens.upc — compilado de verdade programa up_runner inicio: mostrar "Espaço, seta ou toque para pular." mostrar "Pulo duplo no ar." mostrar "A física é JavaScript. Estes textos são UPCode."
Controles
Pulo duplo funciona em qualquer momento, mesmo no ar.
Quem pediu menos movimento no sistema continua jogando: sem tremor, sem partícula, sem rastro. O jogo não muda de dificuldade por causa disso.
Placar global — desligado por padrão
O placar local já funciona, sem rede. Para subir um placar de verdade a página usa Supabase para identidade e Neon como armazenamento autoritativo das marcas — o navegador nunca fala com o Neon: a escrita passa por uma Edge Function, que é o único lugar onde a conexão existe. As duas peças têm papéis que não se sobrepõem.
Nada disso está ligado nesta cópia. Enquanto não for configurado, o
jogo é honesto sobre isso e continua inteiro offline. O passo a passo
está em online/README.md.
Comece em dois minutos
Requer Python 3.11 ou superior e Git. Sem cadastro, sem ativação, sem chave — a instalação é inteiramente local e offline.
git clone https://github.com/upcodebr/upcode.git
cd upcode
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e .
upc --versao
# executar
upc executar exemplos/01_ola_mundo.upc --detalhado
# validar sem executar
upc verificar exemplos/01_ola_mundo.upc
# conferir a cadeia de hashes
upc verificar exemplos/01_ola_mundo.upc \
--ouro testes/ouro/01_ola_mundo.json
Hospedar você mesmo: nginx ou Apache
Se for preciso servir a API, o processo é upc servir: ele
sobe um servidor HTTP da biblioteca padrão do Python, preso a
127.0.0.1:8765 por padrão. O nginx ou o Apache fica na
frente, termina o TLS, entrega os arquivos estáticos e encaminha só o
/api/v1 para esse processo. Os dois arquivos de
configuração estão prontos no repositório, com cabeçalhos de segurança
e a unidade de systemd, em
docs/infraestrutura/servidor-web.md.
Falando dos limites com honestidade: não há camada WSGI no projeto, e isso é escolha de projeto, não esquecimento — a dependência zero também é o que faz o compilador rodar offline. O servidor da biblioteca padrão não é recomendado para a internet aberta, o que é exatamente o motivo de o proxy existir. O documento registra o que ainda falta para um carregamento grande.
Chave existe — e é exatamente onde deve
Se você chegou aqui desconfiado de chave, a resposta curta é: a chave protege a API hospedada. Ela nunca é requisito para compilar ou executar localmente. Decisão registrada em ADR-0008, e o código faz isso de verdade.
A chave é um segredo de 256 bits, exibido uma única vez na criação. O registro guarda apenas o SHA-256, o identificador, o nome, os escopos, a expiração e a eventual revogação. A verificação é de tempo constante.
- Gerar:
upc chave criar --registro chaves.json --nome "meu cliente" --dias 30 - Validar no serviço:
POST /api/v1/ativarcomAuthorization: Bearer <chave> - Proteger um endpoint:
BearerouX-API-Key, com escopo por operação - Revogar:
upc chave revogar --registro chaves.json --id <identificador> - Erros:
UP4000válida ·UP4010inexistente ·UP4011revogada ·UP4012expirada ·UP4013sem escopo
| Operação | Local, sem chave | API hospedada |
|---|---|---|
| Compilar e executar | liberado | requer chave |
| Ler a especificação | liberado | — |
| Compilação pela API | — | escopo compilar |
| Verificação pela API | — | escopo verificar |
Livre por definição
Linguagem, compilador, CLI, especificação e exemplos usam Apache License 2.0. Decisão registrada em ADR-0009.
- Funciona offline. Sem cadastro, sem ativação, sem chave, sem chamada de rede na instalação.
- A chave nunca bloqueia código local. Ela autentica clientes técnicos da API hospedada, e só isso.
- Telemetria desligada por padrão. Quando existir, não-enviará código-fonte, caminhos, variáveis de ambiente, credenciais nem dados pessoais.
- UPDados é separado. Módulo proprietário, fechado e fora desta licença. A fronteira está em ADR-0007.
Contato
Sugestão de linguagem, erro, caso de uso, interesse em colaborar: a fundação é a primeira de muitas, e o que vier agora define o que existe depois.