uma esolang para iniciantes?
Durante essa pandemia eu resolvi resgatar um projeto que estava parado há alguns anos. O projeto era de uma linguagem de programação diferente em que fosse usado o menor número de caracteres para escrever um programa, porém, em que o código ficasse conciso e ao mesmo tempo continuasse inteligível, este último, normalmente é algo que as chamadas esolangs (ou linguagens de programação esotéricas) não se preocupam muito. No geral quanto mais críptico e "esotérico" o código final for, melhor a piada.
&>:1-:v v *$.@
^ $>:^
fatorial em befunge - oi?
inspiração #
Sempre achei muito interessante a idéia de explorar os limites do que pode ser usado para programar um computador, e uma das esolangs mais populares sempre me facinou, o brainfuck, nome apropriado para uma linguagem que só possui 8 comandos (< > + - . , [ ]) e todo o restante da tabela ASCII é ignorado e pode ser usado como comentário.
A linguagem bf se comporta como uma máquina de turing, onde uma "cabeça de leitura anda sob uma fita" e pode ler e escrever valores. A ideia é simples:
- a fita possui infinitas "casas" contendo o número
0; - você pode usar os comandos
> <para "andar" para a direita ou esquerda; + -para somar ou subtrair1do valor da casa atual;- todo o código cercado por
[ ]repete enquanto o valor da casa atual for diferente de0; - você pode usar
. ,para exibir o valor atual como ASCII ou ler um byte da entrada padrão.
Na pratica, a programação se torna um verdadeiro desafio.
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
exemplo de um hello world em bf
apresentação #
A minha contribuição para o universo das esolangs é a linguagem *T (lê-se "start").
*T é uma linguagem de programação estruturada e interpretada em que a maior parte dos operadores possui apenas um caractere, dígitos são usados para constantes e letras maiúsculas são usadas para definir variáveis ou funções.
A biblioteca de funções padrão da linguagem varia de acordo com a plataforma. Atualmete existe um interpretador online com algumas funções para saída de texto. A linguagem ainda está sendo desenvolvida para ser executada em microcontroladores, de forma similar à uLisp ou MicroPython. Um dos proximos passos é montar alguns gadgets que possam ser programados direto no dispositivo (standalone).
Na sequência você pode ver o diagrama de sintaxe da linguagem, um diagrama inspirado em mapas ferroviarios, lido da esquerda para a direita, e que representa todas as combinações válidas dos simobolos usados na linguagem. Se existe um caminho no mapa, então, ele é um programa válido e pode ser interpretado.
diagrama de sintaxe / mapa ferroviario
operações #
- NOP - Nenhuma operação
- Qualquer caractere em branco (espaço, tab e quebra de linha) é ignorado
- Constante numérica
- Uma sequência de números é sempre guardada no acumulador
- Existem 4 comandos usados para definir o tipo em uso:
b8bits sem sinal - padrãos16bits sem sinali32bits sem sinalffloat 32bits
- Exemplos:
123b255s350f876
- Operações de memória
<- Move a fita para a esquerda pelo tamanho do tipo>- Move a fita para a direita pelo tamanho do tipo!- Copia o valor do acumulador para a fita;- Copia o valor da fita para o acumulador@- Troca o valor da fita pelo valor do acumulador e vice-versaz- Anda para a direita até encontrar um zero#- Executa valores na fita como se fossem comandos
- Operações matematicas
+- Soma o valor do acumulador com o valor na fita-- Subtrai o valor do acumulador do valor na fita*- Multiplica o valor da fita pelo valor do acumulador/- Divide o valor da fita pelo valor do acumulador%- Guarda o resto da divisão do valor da fita pelo valor do acumulador na fita
- String
- Sequencia de digitos cercados por aspas duplas
", aspas duplas internas devem ser precedidas de\ - Sempre são salvas na fita em sequência e terminadas com o valor 0
- Essa operação não move a fita, porém adicionando o comando
>em sequência move a fita até o fim da string
- Sequencia de digitos cercados por aspas duplas
- Identificadores
- Qualquer sequência de letras maiúsculas representa um identificador
- Identificadores podem conter
_após a primeira letra - Caso o id seja de uma variável, então a fita é movida até ela
- Caso o id seja de uma função, então a mesma é executada
- No interpretador online existem 3 funções implementadas:
- PC ou PRINT:
- Imprime o valor do acumulador como caratere
- PS ou PRINTSTR:
- Imprime a fita atual como string (da posição atual até o primeiro
0)
- Imprime a fita atual como string (da posição atual até o primeiro
- PN:
- Imprime o valor do acumulador como número (depende do tipo usado)
- PC ou PRINT:
- Variaveis
- Posições da fita podem ser mapeadas para ids usando o operador
^seguido do id - Exemplo:
X^1!>2!>3!X;- salva a primeira posição da fita como o idX, salva1na primeira casa,2na segunda e3na terceira, volta até a primeira casa usando o nome do id e lê o valor no acumulador, que é1
- Posições da fita podem ser mapeadas para ids usando o operador
- Comparações
- Existe um acumulador exclusivo para comparações que é usado pelas operações if e while
- Todas as operações de comparação devem ser precedidas de
? - A comparação é feita entre acumulador (esquerda) e fita (direita)
>- maior que<- menor que=- igual!- diferentel- menor ou igualg- maior ou igual?- diferente de zeroz- igual a zero- Exemplos:
0@1?<-1é menor que0? Falso1@1?<-1é menor que1? Falso2@1?<-1é menor que2? Verdadeiro
- If
- Sintaxe:
(bloco1)ou(bloco1:bloco2) - Usa o valor do acumulador de comparações para definir se o primeiro ou segundo bloco deve ser executado
- O primeiro bloco é sempre executado caso o valor seja
1 - O segundo bloco é executado caso o valor seja
0e o bloco não tenha sido omitido - Exemplo:
2@1@?>(2:3)!- salva2caso2seja maior que1caso contrario salve3, portanto2é salvo
- Sintaxe:
- While
- Sintaxe:
[bloco] [- entra no loop caso o valor do acumulador de comparações seja1]- repete caso o valor do acumulador de comparações seja1c- continue - volta ao inicio do loopx- break - encerra o loop
- Sintaxe:
i46!>0!>1!?=[2<1-?!2>;<@>+] PN
fibonacci de 46 em *T
" 34! PC 32! PS 34! PC 35! PC"#
quine em *T
Se você achou interessante e gostou do desafio, eu sugiro dar uma olhada no playground da linguagem, assim você pode testar o interpretador online. Se programar algo legal me mande um e-mail que eu coloco aqui como exemplo!
tags: start programação
/home