# Autor
Caloni, 2005-05-16 <computer> <draft> <veryold> [up] [copy]Compulsive programmer. Wanderley Caloni Jr, brasileiro de nascença e programador por paixão, começou a se divertir aos 17 anos com seu Microsoft Quick BASIC recém baixado da internet. Depois que fez seu primeiro programa - uma calculadora - e saiu pulando pela casa feliz da vida, nunca mais parou de programar. Após dominar as técnicas básicas do if, while e for (ohhhhh...) passou a estudar uma tal de C, linguagem que o faria ficar mais doidão ainda por programação. Seu primeiro programa in(útil) foi o jogo genius, o único no mundo (que eu conheço) que guardava recordes no próprio executável! Depois que gabaritou no C passou a desenvolver classes templates com funções polimórficas e herança múltipla em C++.
Seu primeiro emprego na área de informática foi em uma empresa de tecnologia, a SCUA Segurança da Informação SA, onde desenvolveu software por 4 anos. Foi responsável direto pelos aplicativos de interface com o usuário dos produtos SCUA, como SCUA Security 2000, SCUA Security Suite e SCUA Finger True. Foi mantenedor da infraestrutura desses produtos por todo esse período.
Atualmente é sócio da DevSolution, um grupo de desenvolvedores de software de tecnologia. Presta serviços para a Open Communications Security SA, uma das empresas líderes em segurança da informação no mercado nacional. Seu envolvimento resume-se em análise de trojans e desenvolvimento de detecção e proteção contra fraudes eletrônicas.
Fora do trabalho, adquire novos conhecimentos no Instituto Brasileiro de Tecnologia Avançada, onde estuda arquitetura de redes. Nas horas vagas, mantém um blog sobre programação C/C++ e Windows, onde tenta organizar seu conhecimento aprendido nesses anos. Atualmente mantém residência em São Bernardo do Campo, São Paulo. Pode ser contatado através de seu e-mail ou em seu próprio site.
A idéia do blog é tentar disseminar e esclarecer detalhes no uso das linguagens C e C++ - com uma pitada de Windows, que é o ambiente em que o autor atualmente trabalha. C++ já é uma linguagem bastante usada e difundida no mundo todo, mas em território nacional ainda falta muito interesse de conhecer e usar essa poderosa linguagem nos projetos do dia-a-dia.
# A inteligência do if (primeira versão)
Caloni, 2005-05-29 <computer> <draft> <veryold> [up] [copy]Estava outro dia filosofando com meu amigo sobre o funcionamento do conceito mais poderoso em programação de computadores: o if. E me perguntava como que o computador consegue tomar uma decisão a partir de uma comparação. É o tipo de problema cuja resposta parece óbvia mas enquanto você não se aprofunda no tema nunca fica satisfeito de fato (mesmo sabendo a teoria). Após quebrar a cabeça por algum tempo, encontrei uma solução no mínimo interessante.
Computadores lêem e escrevem na memória, e é isso. Uma instrução é uma leitura de bits da memória para o circuito lógico que altera o estado da máquina. Uma comparação é uma escrita em flags depois da entrada ter passado por um filtro de portas lógicas. Um salto é a escrita do endereço da próxima instrução no program counter. Quando uma função é chamada seus parâmetros e o endereço de retorno são escritos na pilha (uma área da memória). Para retornar, uma instrução lê o endereço da pilha e o coloca no program counter.
Sendo assim, confirmado que Von Neumann e Turing ainda não morreram, nada mais justo supor que um if é um salto automaticamente calculado através do resultado de uma comparação feita imediatamente antes. Isso traduzindo em código de alto nível:
#include <stdio.h>
void True()
{
printf("Verdadeiro\n");
}
void False()
{
printf("Falso\n");
}
typedef void (*Jump)();
Jump If[2] = { False, True };
int main(int argc, char* argv[])
{
If[2 > 3]();
If[3 > 2]();
}
Eis um código que executa um salto condicional sem o uso do if que vem de fábrica. Na verdade, o if emulado acima constitui conceitualmente o que imagino que ocorra nas entranhas de um PC. Imagino, pois não fui a fundo o suficiente para vasculhar os documentos da Intel. Para mim, a mágica foi desvendada. O deslumbramento é que continua...
Bom, quando tu falou que as instruções alteram o registrador program counter (registrador que indica qual é a próxima instrução), pra mim já ficou claro como os jumps funcionam... Mas se esse código deixa as coisas mais claras pra ti, seja feliz :-p
Sim, essa explicação por si só já explica como os jumps funcionam. Porém , o que queria na verdade explicar com o código de exemplo é como os jumps condicionais funcionam, ou seja, aquele salto que depende de uma condição prévia, que pode ou não existir.