Guilherme Felipe Oliveira
Luiz Guilherme F. Rosa
Ctrl + Alt + Del ⌨️ é uma linguagem de programação baseada em emojis. Seu nome deriva da clássica sequência de teclas do MS Windows usada em situações onde a máquina não responde como esperado, gerando impaciência e ódio.
A Ctrl + Alt + Del ⌨️ é baseada em emojis. Isso não significa que todo o seu código é construído em torno de emojis, apenas as palavras e expressões reservadas. O usuário ainda pode livremente fazer uso de variáveis, strings e demais recursos utilizando caracteres comuns do seu teclado.
Em suma, é uma linguagem simples. Não possui comentários e nem subprogramas, além de possuir poucas estruturas de laços ou saltos condicionais.
Todo o código da linguagem é envolto por um início e fim, a saber, 🌞 e 🌚. Cada programa pode ter apenas um início e fim.
Não há nenhuma linguagem orientada a emojis com expressão no mercado. Isso deve-se a dificuldade de escrita dos programas (muito por conta da não existência de um teclado de emojis nativo para computador) e da peculiaridade de tal forma de escrita.
O principal recurso é a economia de espaço dos códigos fonte de um programa. Veja o comparativo de um programa Hello World em Java e Ctrl + Alt + Del ⌨️.
- Java (101 bytes)
class Main {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
- Ctrl + Alt + Del ⌨️ (32 bytes - Alguns emojis possuem 4 bytes, outros 6 bytes)
🌞
✍️ "Hello, World";
🌚
Se o programador possuir um teclado de emojis, sua vida será ainda mais facilitada.
A linguagem conta com os seguintes tipos de dados:
Identificador | Significado | Descrição |
---|---|---|
😂 | Tipo de dado booleano | Um byte preenchido com zeros ou uns |
😋 | Tipo de dado caractere | Quatro bytes UTF-8 |
😎 | Tipo de dado ponto flutuante de dupla precisão | Oito bytes, padrão IEEE-754 |
🔠 | Tipo de dado cadeia de caracteres | Uma cadeia de caracteres, é iniciado com 32x4 bytes (32 caracteres) e tem o tamanho aumentado neste mesmo valor sempre que excede este valor, sendo realocado em memória |
Ctrl + Alt + Del ⌨️ não possui muitos operadores. Porém, possui os essenciais para qualquer programa básico:
Operadores lógicos tem como entrada dois valores booleanos (exceto o NOT) e retorna um novo valor booleano.
Identificador | Nome | Significado |
---|---|---|
🤙 | AND | Verdadeiro se ambos valores são verdadeiros |
🤞 | OR | Verdadeiro se um ou mais dos valores é verdadeiro |
🚫 | NOT | Toma como entrada um valor booleano e retorna o seu inverso |
🖕 | XOR | Verdadeiro se um dos valores é verdadeiro e falso se ambos são falsos ou verdadeiros |
Os operadores aritméticos só trabalham com valores em ponto flutuante de dupla precisão, já que este é o único tipo de dado disponível na linguagem.
Identificador | Nome | Significado |
---|---|---|
➕ | Soma | Soma dois valores numéricos (double) |
➖ | Subtração | Subtrai, do valor numérico a esquerda, o valor numérico da direita |
✖️ | Multiplicação | Multiplica dois valores numéricos |
➗ | Divisão | Divide o valor numérico da esquerda pelo valor numérico da direita |
Os operadores relacionais tem como entrada dois valores numéricos e retornam um valor booleano. Os operadores "igual" e "diferente" também se aplicam a caracteres (não cadeias). O operador "igual em tamanho" se aplica somente a cadeias.
Identificador | Nome | Significado |
---|---|---|
🤜 | Maior que | Verdadeiro se o valor da esquerda é maior que o da direita |
🤛 | Menor que | Verdadeiro se o valor da esquerda é menor que o da direita |
👩❤️💋👩 | Igual | Verdadeiro se ambos os valores são verdadeiros ou falsos |
⚔️ | Diferente | Verdadeiro se um dos valores é verdadeiro e outro é falso |
👥 | Igual em tamanho | Verdadeiro se ambas as cadeias possuem o mesmo tamanho |
A atribuição depende do tipo de dado declarado, não há atribuição entre diferentes tipos de dados. O operador de atribuição é o 🤘.
Destino | Origem | Sintaxe |
---|---|---|
Numérico | Numérico | <variável numérica> 🤘 <variável numérica> |
Caractere | Caractere | <variável caractere> 🤘 <variável caractere> |
Booleano | Booleano | <variável booleana> 🤘 <variável booleana> |
Cadeia | Cadeia | <variável cadeia> 🤘 <variável cadeia> |
Os blocos não são delimitados por chaves, mas pelo início e fim de cada condicional, no estilo "se ... fim-se".
Executa um bloco se a condição for satisfeita. Não existe "senão", para este caso deve ser testado novamente utilizando o operador de negação.
Símbolo | Significado |
---|---|
🤔 | Início do bloco condicional |
👌 | Fim do bloco condicional |
Exemplo de código
🤔 (1 🤜 result)
...
👌
É necessário que a expressão sendo testada esteja envolta em parênteses.
Dado um valor numérico ou caractere, executa determinado bloco. Os blocos são indicados pela expressão "caso" (👉).
Símbolo | Significado |
---|---|
🖐️ | Início condicional |
✊ | Fim do bloco condicional |
👉 | Indicador de caso |
É necessário que o valor (ou variável) sendo testado esteja envolto em parênteses. Os elementos de caso não precisam estar.
Exemplo de código
🖐️ (var)
👉 1:
...
👊
...
👉 n:
...
👊
✊
Toda expressão caso deve encerrar com um break (👊).
Há dois laços de repetição fundamentais na linguagem.
O para consiste de uma tupla de <condição de continuidade, expressão>. O bloco é executado sempre que a condição de continuidade é satisfeita e executa a expressão (geralmente incremento ou decremento) ao final de cada laço.
Símbolo | Significado |
---|---|
🌊 | Declaração do para |
💧 | Fim do bloco de para |
Exemplo de código
😎 i
i 🤘 0
🌊 (i 🤛 10; i 🤘 i ➕ 1)
...
💧
O faça enquanto é um laço de repetição com pós condição.
Símbolo | Significado |
---|---|
🏄 | Declaração do faça |
🏊 | Fim do bloco de faça e declarador da condição de parada |
Exemplo de código
🏄
...
🏊 (i ⚔️ 10)
Os identificadores na linguagem são bastante flexíveis. Pode-se utilizar qualquer caractere ASCII ou emoji em um nome de variável. Não pode-se, contudo, utilizar os emojis reservados. O nome da variável termina com um espaço ou quebra de linha. Isso significa que não há a possibilidade de declarar múltiplas variáveis em uma linha. Também não pode-se assinalar um valor à variável em sua declaração, isso deve ser feito a posteriori.
Exemplo de código
😂 variablesCanHave🐻Emojis
🔠 🎅🔫
A atribuição depende do tipo da variável. Cadeias podem receber atribuições por meio de aspas duplas. Caracteres podem ser atribuidos por aspas simples.
Exemplo de código
boolVar 🤘 👎
stringVar 🤘 "This is some string!"
charVar 🤘 'a'
numericVar 🤘 3.14159
Emoji | Significado |
---|---|
🌞 | Início do programa |
🌚 | Fim do programa |
✍️ | E/S Escrever em tela |
📰 | E/S Ler do teclado |
🌊 | Início do laço de repetição do tipo "para" |
💧 | Fim do laço de repetição do tipo "para" |
🏄 | Início do laço do tipo "faça enquanto" |
🏊 | Fim do laço do tipo "faça enquanto" |
🖐 | Início da condicional "caso" |
👉 | Identificador de caso |
✊ | Fim da condicional "caso" |
👊 | "Break", paralisa a execução de um bloco |
🤔 | Início condicional "se" |
👌 | Fim condicional "se" |
😂 | Declaração de dado booleano |
😋 | Declaração de dado caractere |
😎 | Declaração de dado ponto flutuante de dupla precisão |
🔠 | Declaração de dado cadeia de caracteres |
👍 | Booleano verdadeiro (true ) |
👎 | Booleano falso (false ) |
❔ | Nulo, sem valor (NULL ) |
A linguagem é delimitada por um início e fim. Tudo o que estiver fora destes delimitadores será considerado um erro de sintaxe. Portanto, resumidamente:
{ }
(chaves) delimitam um bloco opcional, não foi utilizado chaves para não conflitar com expressões regulares.
\E
, usado em expressões regulares, neste contexto significa "qualquer emoji".
<BEGIN> -> 🌞 <STRUCTURE> 🌚
<STRUCTURE> -> <VARIABLE DECLARATION> {<STRUCTURE>} | <VARIABLE ASSIGNMENT> {<STRUCTURE>} | <LOOP> {<STRUCTURE>} | <CONDITIONAL> {<STRUCTURE} | <IO> {<STRUCTURE} | <SPECIAL EXPRESSION> {<STRUCTURE>}
<SPECIAL_EXPRESSION> -> 👊
<VARIABLE DECLARATION> -> <VAR_TYPE> <VAR_NAME>
<VAR_TYPE> -> [😂|😋|😎|🔠]
<VAR_NAME> -> [0-9A-Za-z_\E]¹[0-9A-Za-z_\E]*
<VARIABLE_ASSIGNMENT> -> <VAR_NAME> 🤘 <VALUE> | <VAR_NAME> 🤘 <ARITHMETIC_EXP> | <VAR_NAME> 🤘 <BOOLEAN_EXPRESSION>
<ARITHMETIC_EXP> -> ( <ARITHMETIC_EXP> ) | <VAR_NAME> [➕|➖|✖️|➗] <VAR_NAME> | <VAR_NAME> [➕|➖|✖️|➗] <ARITHMETIC_EXP> | <ARITHMETIC_EXP> [➕|➖|✖️|➗] <VAR_NAME> | <VALUE>
<VALUE> -> [[👍|👎|❔] | [\d+|\d+.\d+] | ["\."] | ['\.¹']]
<BOOLEAN_EXPRESSION> -> (<BOOLEAN_EXPRESSION>) | <VAR_NAME> | 🚫 (<VAR_NAME>) | <VAR_NAME> [🤙|🤞|🤜|🤛|👩❤️💋👩|⚔️|👥] <VAR_NAME> | 👍 | 👎
<LOOP> -> 🌊(<BOOLEAN_EXPRESSION>; <VARIABLE_ASSIGNMENT>) <STRUCTURE> 💧 | 🏄 <STRUCTURE> 🏊 (<BOOLEAN_EXPRESSION>)
<CONDITIONAL> -> 🖐️ ([<VAR_NAME>|<VALUE>]) { <CASE_OPTION> } ✊ | 🤔 (<BOOLEAN_EXPRESSION>) <STRUCTURE> 👌
<CASE_OPTION> -> 👉 ([<VAR_NAME>|<VALUE>]) <STRUCTURE> 👊 { <CASE_OPTION> } | 👉 [<VAR_NAME>|<VALUE>] <STRUCTURE> 👊 { <CASE_OPTION> }
<IO> -> 📰 <VAR_NAME> | ✍️ <VAR_NAME> | 📰 <VALUE> | ✍️ <VALUE>
Ler dois valores inteiros e escrever o maior deles.
🌞
😎 x1
😎 x2
✍️ "Informe o primeiro valor"
📰 x1
✍️ "Informe o segundo valor"
📰 x2
🤔 (x1 🤜 x2)
✍️ x1
👌
🤔 (🚫(x1 🤜 x2))
✍️ x1
👌
🌚
Dado o ano de nascimento de uma pessoa, escrever sua idade
🌞
😎 anoNasc
😎 idade
😎 anoAtual
✍️ "Informe o ano de nascimento"
📰 anoNasc
✍️ "Informe o ano atual"
📰 anoAtual
idade 🤘 anoAtual ➖ anoNasc
✍️ anoNasc
🌚