# De Objective Caml para C e C++/Introdução

A linguagem C é uma linguagem bastante simples, criada na década de 70 e pouco atualizada desde então. A linguagem C provê uma camada de abstração em cima do nível de linguagem de assemblagem. Essa camada é composta por tipos básicos (basicamente tipos numéricos), construtores de tipos simples, construções algorítmicas clássicas, e modularização funcional. Os principais pontos fortes da linguagem C são uma ampla difusão, a rapidez de execução dos programas compilados, e a possibilidade de interação com recursos de hardware. A principal desvantagem é que não possui conceitos de linguagens de programação mais avançados, o que pode penalizar a produtividade dos programadores naquela linguagem. A facilidade de acesso aos recursos de hardware, como a memória principal, é uma faca de dois gumes: permite programas muito rápidos, e falhas extremamente súteis (do tipo que se manifesta só em um determinado ambiente, em condições de uso muito específicas e que podem levar semanas a serem identificadas e corrigidas).
A linguagem C++ é uma linguagem derivada de C, e inclui novos paradigmas de programação como a orientação a objetos, tipos referências, polimorfismo paramétrico. C++ oferece muito mais recursos que C e é uma linguagem significativamente mais complexa e difícil de se dominar. Uma propriedade interessante é a sua compatibilidade quase total com a linguagem C, fazendo com que código C possa ser compilado por um compilador C++. Essa compatibilidade se estende até o código objeto: código C++ pode fazer uso de código desenvolvido em C. Embora a linguagem C++ seja bastante complexa, felizmente, não é necessário entender e dominar todos os recursos providos por essa linguagem para poder utilizá-la nos seus projetos de programação.
As linguagens C e C++ possuem ambas uma biblioteca padrão que provê algumas extensões práticas como a possibilidade de realizar entradas e saídas, de interagir com o sistema de arquivos. A biblioteca padrão de C oferece alguns poucos recursos de algoritmos e estruturas de dados. Em compensação a linguagem C++ possui uma biblioteca bem mais rica que
Diferente de Objective Caml, que pode-se interpretada ou compilada para bytecode e linguagem nativa, as linguagens C e C++ podem apenas ser compiladas. As diferentes atividades que compõem o processo de trabalho com essas linguagens são:

### Um primeiro programa em C++

Esse primeiro exemplo vai ilustrar passo a passo as diferentes fases de criação de um programa. Iremos desenvolver em C++ um programa que imprime uma linha na saída padrão com o texto "ola." e que retorna o valor 0. Em Objective Caml, poderíamos programar isso com o seguinte código:
O código seguinte é equivalente ao anterior, e fica mais próximo da versão C++:
Agora vamos para o C++... Você vai reparar que é um pouco mais complexo, mas fundamentalmente não é muito diferente. Para começar, devemos 'criar um programa'. Abra então um editor de texto e cria um novo documento.
Guarda o conteúdo do documento em um arquivo, por exemplo chamado exemplo1.cpp. Temos então nosso primeiro programa em C++! O que faz? Discutiremos isso depois, pois vamos partir logo para a segunda fase, que é a de 'compilação'.
Para isso, devemos utilizar o compilador C++. Podemos fazer isso através de um console de comandos. Abra então um console de comandos e digite o seguinte comando para compilar o arquivo:
Esse comando é composto pelo nome do compilador (g++), duas opções (-ansi e -Wall) e o nome do arquivo a ser compilado. A opção -ansi instrui o compilador a verificar que você está seguindo as recomendações do padrão ANSI da linguagem C++. Isso garante a portabilidade de seu código. A opção -Wall é ainda mais importante, pois ela instrui o compilador a reportar avisos sobre erros possíveis no seu programa. A experiência prova que 99% dos erros possíveis são erros de fatos. Vale então a pena utilizar esse recurso para descobrir (pelo menos parte dos) erros que inevitavelmente são cometidos pelos programadores: 'errare humanum est'.
Deve aparecer a seguinte mensagem no console:
O compilador indica que na função int main, há um erro, localizado na linha 6 (pode ser que você tenha introduzido linhas adicionais no seu editor, neste caso o número da linha onde ocorre esse erro poderá ser diferente).
O que aconteceu? Bom, a mensagem de erro é bastante clara: o compilador estava esperando o caractere ; antes do }. E o compilador está certíssimo, esquecemos de colocar um ponto e vírgula no final da linha 5 e quando encontrou } o compilador reparou essa falta! Corrija então esse erro no seu editor, salve novamente no arquivo e repete o comando de compilação.
Agora não há mais erro detectado pelo compilador. Vamos então executar o nosso programa... Mas onde está ele? Lista o conteúdo do diretório atual (o comando ls permite fazer isto) e observará a presença de um programa chamado a.out. Ao menos que seja instruído de outra forma, o compilador gera um programa em um arquivo com esse nome esquisito. Para gerar o programa com um outro nome, deve se utilizar uma opção específica do compilador, que é -o seguido do nome desejado. Por exemplo, se desejarmos chamar esse programa de exemplo1, o comando seria:
Para executar o programa, basta digitar no console o caminho até o arquivo que contem esse programa, por exemplo:
Aparece então a seguinte mensagem:
Ufa!... Escrevemos o nosso primeiro programa em C++, e vimos como compilá-lo. Aprendemos três opções muito úteis do compilador g++, e verificamos que o compilador tem um papel importante para apoiar o desenvolvimento de programas corretos através da emissão de mensagens de erro e de avisos.

### Explicações complementares

Para terminar essa introdução, precisamos ainda explicar como esse programa funciona. No processo começaremos a aprender algumas coisas da linguagem C++. Então, o que faz esse programa? Vamos incluí-lo novamente, dessa vez identificando as linhas com números:
Nós não vamos entrar muito em detalhes aqui. A linha 1 faz referência a um arquivo chamado iostream, o qual faz parte da biblioteca padrão do C++. Este arquivo contém declarações de tipos e funções relacionadas com fluxos de entrada e saída (iostream abrevia input/output stream), ou seja com leitura e escrita de textos.