Pular para o conteúdo
UPCode 0.1
Versão 1 · de muitas

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 --detalhado
$ 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
O sistema

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.

1

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.

2

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.

3

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.

4

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.

→ Declarar que o programa existeprograma dá nome ao que vai rodar 1 · fonte
◈ Marcar onde o raciocínio começainicio abre o bloco principal 2 · escopo
▤ Pedir uma ação com o texto exatomostrar é o verbo da saída 3 · operação
✓ Confirmar que a ordem entrou inteirao resultado aparece na tela, sem erro e sem mistério 4 · efeito
Siga o programa

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.

exemplos/01_ola_mundo.upc etapa 1 de 6
ou use ← →
O que a pesquisa mostra

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.

0%
Apontaram dificuldade em desenvolver a lógica como o primeiro fator.
Survey com 110 estudantes de introdução · UFERSA, 2018
0%
Apontaram dificuldade em entender a sintaxe — relevante, mas abaixo da lógica.
Mesma amostra · UFERSA, 2018
0%
Dos estudantes que apontaram raciocínio lógico como a área mais importante, a maioria não se considera dona dela.
Survey com 123 estudantes de TI · 2025
0%
Dos matriculados em disciplinas introdutórias não foram aprovados — cerca de 1.100 por ano.
Análise de ~19.500 matrículas · USP

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.

0%
Do tempo de quem programa em código alheio é gasto tentando compreender, e cerca de 5% editando. Entender é o gargalo.
Dois estudos citados em ACM Communications, 2023
%+
De aumento no esforço de programação quando o código que se modifica é de difícil compreensão.
Estudo com 216 desenvolvedores em início de carreira
0%
Desenvolvem o código sem entender o enunciado; outros 12% não entendem e não seguem.
Survey com estudantes de ADS · IFRN, 2021
0%
Estudam programação todo dia — e ainda assim 69% relatam dificuldade em estudar.
Plataforma de estudos gamificada · RICS, 2024

Fontes citadas nesta seção

  1. Survey com 110 estudantes de disciplinas introdutórias, UFERSA (2018) — dificuldades em lógica, sintaxe e conteúdos mais difíceis.
  2. Mapeamento sistemático da literatura em dificuldades de aprendizagem de programação, RBIE v.33 (2025), SBC — 503 estudos filtrados, 11 mantidos.
  3. 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.
  4. Dificuldades de aprendizagem no curso de ADS, IFRN Campus Pau dos Ferros (2021) — 25 de 64 matriculados responderam.
  5. Fatores autopercebidos por estudantes de TI na primeira disciplina de programação (2025) — 123 respondentes, recorte de gênero.
  6. From Code Complexity Metrics to Program Comprehension, ACM Communications (2023).
  7. Early Career Developers' Perceptions of Code Understandability — 216 desenvolvedores, 12 classes.
  8. Gamificação e inovação na aprendizagem de programadores, RICS v.10 n.2 (2024).
  9. Revisão sistemática de literatura sobre dificuldades de aprendizagem, 69 artigos (2020–2024).
A base

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.

destino: CPython 3.11 ou superior sem dependência em tempo de compilação
o que a camada semântica entregao que o Python executa
────────── a fronteira é esta ──────────

{ "operacao": "MOSTRAR",
  "argumentos": ["ola, mundo!"] }

        vira

def principal():
    print("ola, mundo!")

principal()
Seis motivos

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.

01

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.

02

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.

03

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.

04

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.

05

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.

06

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.

O jogo

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.

Seu navegador precisa oferecer suporte a canvas para jogar.

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.

Espaço pular ↑ pular W pular P pausar R recomeçar toque pular

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.

Offline. O placar global sobe quando você configurar.

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.

instalarWindows
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
rodarseu primeiro programa
# 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/ativar com Authorization: Bearer <chave>
  • Proteger um endpoint: Bearer ou X-API-Key, com escopo por operação
  • Revogar: upc chave revogar --registro chaves.json --id <identificador>
  • Erros: UP4000 válida · UP4010 inexistente · UP4011 revogada · UP4012 expirada · UP4013 sem escopo
OperaçãoLocal, sem chaveAPI hospedada
Compilar e executarliberadorequer chave
Ler a especificaçãoliberado—
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.

Informe seu nome.
Informe um e-mail válido.
Selecione um assunto.
0 de 3000 caracteres Escreva ao menos 10 caracteres.