# Introdução às Linguagens de Programação/C e C++

Introdução às Linguagens de Programação Assembly | COBOL

# C
## Introdução

A linguagem "C" foi criada entre 1969 e 1973 no AT&T Bell Labs, inicialmente desenvolvido para a implementação do sistema Unix (que originalmente foi escrito em PDP-7 Assembly, por Dennis Ritchie e Kenneth Thompson). No final da década de 70 o UNIX saiu do laboratório e passou a ser disponibilizado para as Universidades, que por sinal foi um grande sucesso na época favorecendo então a popularidade da linguagem de programação C. Vale ressaltar que este foi um dos primeiros núcleos de sistema operativo que foi implementado numa linguagem sem ser o Assembly, sendo exemplos anteriores o sistema multics (escrito em PL/I) e tripos (escrito em BCPL).
Não se sabe ao certo o que deu origem ao nome "C", existem duas teorias a respeito:
A primeira teoria acredita que se deu o nome "C" à linguagem porque muitas das suas características derivaram de uma linguagem de programação anterior chamada "B" e "C" é a letra conseguinte no alfabeto. A segunda teoria se baseia no fato que "C" é a segunda letra do nome da linguagem BCPL, da qual se derivou a linguagem B.
Desde então, espalhou-se por muitos outros sistemas em plena operação, e tornou-se uma das linguagens de programação mais usadas. C tem como ponto forte, a sua eficiência, e é a linguagem de programação preferida para o desenvolvimento de sistemas e softwares de base, apesar de também ser usada para desenvolver programas de computador. É também muito usada no ensino de ciências da computação, mesmo não tendo sido projetada para estudantes e apresentando algumas dificuldades no seu uso. Outra característica importante de C é sua proximidade do código de máquina, que permite que um projetista seja capaz de fazer algumas previsões de como o software irá se comportar, ao ser executado.
Muitas linguagens de programação foram influenciadas por C, entre elas o C++, que por sua vez foi uma das inspirações para Java. A linguagem C possibilita a criação de planilhas eletrônicas, Sistemas Operacionais, programas de comunicação, programas para a solução de problemas de Engenharia, entre outros.
A versão mais atual de "C" é o "C99" criado em 1999, mesmo sendo a versão mais nova, C99 não é a versão mais utilizada, apesar do GCC e vários outros compiladores suportarem grande parte das novas características do C99, os compiladores mantidos pela Microsoft e pela Borland suportam pouquíssimos recursos do C99, e estas duas companhias não parecem estar muito interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft prefere dar mais ênfase ao C++.

## Ambiente da linguagem

A linguagem C é o que se chama de linguagem compilada. Isso significa que, uma vez escrito o programa em C, ele deve ser passado por um compilador para transformar seu programa em Código Executável para o computador rodar (executar). Um programa em C possui um formato legível ao homem, enquanto o executável gerado no compilador possui a forma legível para a máquina e é executada por ela. Isto significa que para escrever e executar um programa em C, é necessário ter acesso a um compilador de C e um editor de texto puro, qualquer sistema operacional pode ser usado para programação em C desde que tenha o compilador necessário. Se estiver trabalhando em uma máquina Windows, você precisará fazer o download de um compilador de C gratuito ou comprar um compilador comercial. Um compilador comercial amplamente utilizado com Windows é o ambiente Visual C++ da Microsoft (ele compila programas em C e C++), que porém é um software pago.
Resumindo, para programar em C é necessário um editor de texto e um compilador, mas também pode ser acrescentado um Ambiente de Desenvolvimento Integrado (IDE - Integrated Development Environment) para programação na linguagem C.

### IDE

Geralmente os IDEs facilitam a técnica de RAD (de Rapid Application Development, ou "Desenvolvimento Rápido de Aplicativos"), que visa a maior produtividade dos desenvolvedores.
As características e ferramentas mais comuns encontradas nos IDEs são:
* Editor - edita o código-fonte do programa escrito na(s) linguagem(ns) suportada(s) pela IDE;
* Compilador (compiler) - compila o código-fonte do programa, editado em uma linguagem específica e a transforma em linguagem de máquina;
* Linker - liga (linka) os vários "pedaços" de código-fonte, compilados em linguagem de máquina, em um programa executável que pode ser executado em um computador ou outro dispositivo computacional;
* Depurador (debugger) - auxilia no processo de encontrar e corrigir defeitos no código-fonte do programa, na tentativa de aprimorar a qualidade de software;
* Modelagem (modeling) - criação do modelo de classes, objetos, interfaces, associações e interações dos artefatos envolvidos no software com o objetivo de solucionar as necessidades-alvo do software final;
* Geração de código - característica mais explorada em Ferramentas CASE, a geração de código também é encontrada em IDEs, contudo com um escopo mais direcionado a templates de código comumente utilizados para solucionar problemas rotineiros. Todavia, em conjunto com ferramentas de modelagem, a geração pode gerar todo ou praticamente todo o código-fonte do programa com base no modelo proposto, tornando muito mais rápido o processo de desenvolvimento e distribuição do software;
* Distribuição (deploy) - auxilia no processo de criação do instalador do software, ou outra forma de distribuição, seja discos ou via internet;
* Testes Automatizados (automated tests) - realiza testes no software de forma automatizada, com base em scripts ou programas de testes previamente especificados, gerando um relatório, assim auxiliando na análise do impacto das alterações no código-fonte. Ferramentas deste tipo mais comuns no mercado são chamadas robôs de testes;
* Refatoração (refactoring) - consiste na melhoria constante do código-fonte do software, seja na construção de código mais otimizado, mais limpo e/ou com melhor entendimento pelos envolvidos no desenvolvimento do software. A refatoração, em conjunto com os testes automatizados, é uma poderosa ferramenta no processo de erradicação de "bugs", tendo em vista que os testes "garantem" o mesmo comportamento externo do software ou da característica sendo reconstruída.

## Instalação

A primeira coisa a fazer antes de desenvolver programas usando a linguagem C é instalar um compilador. Existem diversos compiladores C/C++ disponíveis para os programadores, a decisão sobre qual compilador utilizar pode ser baseada em vários fatores:
* qualidade do compilador (rapidez, está conforme com a padronização da linguagem, a interface com o usuário é agradável, possui ou não um IDE (Integrated Development Enviroment), possui diversas opções de compilação);
* sistema(s) operacional(is) que o compilador funciona (e gera códigos);
* custo do compilador;
* documentação disponível e suporte.

## Características do C

Entre as principais características do C, podemos citar:
* O C é uma linguagem de alto nível com uma sintaxe bastante estruturada e flexível tornando sua programação bastante simplificada;
* Programas em C são compilados, gerando programas executáveis;
* O C compartilha recursos tanto de alto quanto de baixo nível, pois permite acesso e programação direta do microprocessador. Com isto, rotinas cuja dependência do tempo é crítica, podem ser facilmente implementadas usando instruções em Assembly. Por esta razão o C é a linguagem preferida dos programadores de aplicativos;
* O C é uma linguagem estruturalmente simples e de grande portabilidade. O compilador C gera códigos mais enxutos e velozes do que muitas outras linguagens;
* Embora estruturalmente simples (poucas funções intrínsecas) o C não perde funcionalidade, pois permite a inclusão de uma farta quantidade de rotinas do usuário. Os fabricantes de compiladores fornecem uma ampla variedade de rotinas pré-compiladas em bibliotecas.

## Vantagens

* É uma linguagem simples que nos permite trabalhar com funções matemáticas, ficheiros, entre outras sendo necessário para tal a inclusão de bibliotecas padrão as quais já vêem com a linguagem;
* Por haver compiladores C para quase todos os computadores, é possível tomar um código escrito para uma máquina, compilá-lo e rodá-lo em outra com pouca ou nenhuma modificação. Essa "portabilidade" é uma das características do C (Um compilador lê o programa inteiro e converte-o em um código-objeto, que é uma tradução do código-fonte do programa em uma forma que o computador possa executar diretamente. Desta maneira, tudo que o programador precisa fazer para executar o programa é, normalmente, digitar apenas o seu nome);
* Tipos de dados simples;
* Acesso fácil ao hardware, baixos requisitos de memória;
* Definição e declaração simples de variáveis.

## Desvantagens

* Os programas criados em C em termos de segurança não são muito seguros uma vez que o código é escrito de uma forma seqüencial (pode-se facilmente incluir uma instrução no nosso código do programa e tornar o resultado final completamente diferente);
* Não possui coleta automática de lixo (se durante o programa uma variável declarada não for mais usada ao longo do programa a linguagem não tem capacidade para eliminá-la continuando esta a ocupar espaço indevidamente em memória);
* Não faz uso de classes ou objetos (como no JAVA e C++);
* Networking (é uma linguagem que inicialmente não foi pensada para redes).

## Conclusão

A linguagem C foi criada com o objetivo principal em mente: facilitar a criação de programas extensos com menos erros, recorrendo ao paradigma da programação algorítmica ou procedimental, mas sobrecarregando menos o autor do compilador, cujo trabalho complica-se ao ter de realizar as características complexas da linguagem.
Apesar da lista de características úteis que C possui não ser longa, isso não tem sido um impedimento à sua aceitação, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e também permite que o programador permaneça sempre em controle do que o programa está a fazer. Isto é o que por várias vezes permite o código de C correr de uma forma mais eficiente que muitas outras linguagens.

# C++
## Introdução

No mundo da programação nós podemos classificar as linguagens de duas maneiras: Linguagem de Baixo Nível e Linguagem de Alto Nível. Quando nos referimos à linguagem de Baixo Nível estamos nos referindo a sintaxes próximas ao código de maquina, ou seja, a linguagem que o computador consegue facilmente interpretar. Em contrapartida a definição de linguagem de Baixo Nível nós encontramos as linguagem de Alto Nível, com relação a esse tipo de linguagem podemos afirmar que a mesma possui uma sintaxe próxima à linguagem humana um exemplo desse tipo de linguagem é o próprio C/C++, entre outras.
O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs durante a década de 1980 (originalmente com o nome C with Classes, como um adicional à linguagem C) com o objectivo de melhorar a linguagem de programação C ainda que mantendo máxima compatibilidade. Em 1983 o nome da linguagem foi alterado de C with Classes para C++, novas características foram adicionadas, como funções virtuais, sobrecarga de operadores e funções, referências, constantes, gerenciamento manual de memória, melhorias na verificação de tipo de dado e estilo de comentário de código de uma linha (//).
Stroustrup percebeu que a linguagem simula possuía características muito úteis para o desenvolvimento de software, mas era muito lenta para uso prático. Por outro lado, a linguagem BCPL era rápida, mas possuía muito baixo nível, dificultando sua utilização em desenvolvimento de aplicações. Durante seu período na Bell Labs, ele enfrentou o problema de analisar o kernel do Unix com respeito à computação distribuída. A partir de sua experiência de Doutorado, começou a acrescentar elementos do simula no C. O C foi escolhido como base de desenvolvimento da nova linguagem, pois possuía uma proposta de uso genérico, era rápido e também portável para diversas plataformas. Algumas outras linguagens que também serviram de inspiração para o cientista da computação foram Algol 68, Ada, Clu e Ml. Em 1985 foi lançada a primeira edição do livro The C++ Programming Language, contendo referências para a utilização da linguagem, já que ainda não era uma norma oficial. A primeira versão comercial foi lançada em outubro do mesmo ano. Em 1989 a segunda versão foi lançada, contendo novas características como herança múltipla, classes abstratas, métodos estáticos, métodos constantes e membros protegidos, incrementando o suporte a orientação a objeto. Em 1990 foi lançado o livro The Annotated C++ Reference Manual, que se tornou base para o futuro padrão. Outras adições na linguagem incluem Templates, tratamento de exceções, espaço de nomes, conversão segura de tipo de dado e o tipo Booleano.
Um fator extremamente importante para as pessoas que estão conhecendo a linguagem de programação C++ é afirmar que é mesma é case sensitive, ou seja, ao programar nesse tipo linguagem as pessoas devem tomar muito cuidado ao declarar variáveis ou fazer o uso de determinados métodos, pois ao se declarar uma variável chamada conta e outra chamada cONta (note as letras maiúsculas), nesse caso o compilador entenderá que isso são variáveis distintas e provavelmente ocorrera algo completamente diferente do resultado esperado. O mesmo vale ressaltar sobre o uso da estrutura de seleção if (se) e else (senao), a declaração das mesmas devem ser sempre minúsculas, caso o programador defina as mesmas com letras maiúsculas o compilador entenderá que a declaração corresponde a uma variável.
Após a padronização ISO realizada em 1998 e a posterior revisão realizada em 2003, uma nova versão da especificação da linguagem foi lançada em setembro de 2011, conhecida informalmente como C++11 ou C++0x. Este novo padrão incluirá muitas adições ao núcleo da linguagem (sua implementação principal), e estenderá a biblioteca padrão do C++, incluindo a maior parte da biblioteca do chamado C++ Technical Report 1 — um documento que propõe mudanças ao C++ — com exceção das funções matemáticas específicas.

## Ambiente da linguagem

O C++ pode ser chamado de linguagem compilada, ou seja, além de escrever o código, é necessário um outro software que possa entender esse código e traduzí-lo para uma sintaxe que o computador possa interpretar denominado Código de Máquina.
É necessário um editor de texto puro (como o Bloco de Notas) e um compilador para o desenvolvimento de aplicativos na linguagem C++, nesse caso quando o programador digitar o código-fonte o mesmo deve ser salvo com a extensão .CPP ao invés de .TXT, em seguida o índividuo deve abrir o prompt digitar o comando de compilação do compilador instalado (por exemplo no compilador Borland C++Builder 3.0 o respectivo comando de compilação é bcc32) seguido pelo nome do arquivo salvo.CPP, ou então o programador pode optar por utilizar um Ambiente de Desenvolvimento Integrado (IDE - Integrated Development Environment) para otimizar o desenvolvimento de suas aplicações.

## Instalação

A primeira coisa a fazer antes de desenvolver programas usando a linguagem C++ é instalar um compilador. Existem diversos compiladores C++ disponíveis para os programadores, a decisão sobre qual compilador utilizar pode ser baseada em vários fatores:
* qualidade do compilador (rapidez, está conforme com a padronização da linguagem, a interface com o usuário é agradável, possui ou não um IDE (Integrated Development Enviroment), possui diversas opções de compilação);
* sistema(s) operacional(is) que o compilador funciona (e gera códigos);
* custo do compilador;
* documentação disponível e suporte.

## Características do C++

C++ pode ser visto como uma linguagem procedimental tradicional com alguns construtores adicionais. Começando pelo C, alguns construtores para programação orientada a objetos e para melhorar a sintaxe procedimental foram acrescentados.
Um programa bem escrito em C++ irá refletir elementos tanto do estilo de programação orientada a objetos como programação procedimental clássica. Isto porque o C++ é na verdade uma linguagem extensível já que podemos definir novos tipos de tal maneira que eles agem de mesmo modo que os tipos pré-definidos que fazem parte da linguagem padrão.
Abaixo estão listados itens que caracterizam a linguagem C++:
* Programação Orientada à Objetos: A possibilidade de utilizar programação orientada a objetos permite ao programador projetar aplicações de um ponto de vista mais parecido com comunicação entre objetos que de uma seqüência estruturada de código. Alem disso, permite a reusabilidade de código de uma forma mais lógica e produtiva. A linguagem foi desenvolvida com o cuidado de prover atributos Orientados à Objeto para a linguagem C sem comprometer a eficiência;
* Portabilidade: Pode-se praticamente compilar o mesmo código C++ em qualquer tipo de computador e sistema operacional sem fazer grandes mudanças. C++ é uma das mais usadas e portadas linguagens de programação;
* Brevidade: Código escrito em C++ é muito menor em comparação com outras linguagens, desde o uso de caracteres especiais e preferidos antes de palavras chave, evitando esforço;
* Programação Modular: Um corpo de aplicação em C++ pode ser feita de vários arquivos de código que serão compilados separadamente e “linkados” juntos. Economizando tempo, pois não é necessário recompilar toda a aplicação quando se faz uma mudança simples, mas apenas aquele arquivo que a contem. Alem do mais, esta característica permite C++ ligar com código produzido em outras linguagens como o Assembler ou C;
* Compatibilidade com C: Qualquer código escrito em C pode ser facilmente incluído em um programa C++ sem fazer grandes mudanças;
* Velocidade: O código resultante de uma compilação C++ é muito eficiente, devido a sua dualidade de linguagem de Alto e Baixo nível e do tamanho reduzido da linguagem em si;
* Não há um "dono" da linguagem. Há vários compiladores e sistemas operacionais que utilizam o padrão C/C++ ANSI. Isto significa na prática que esta linguagem tem inúmeros patrocinadores, famosos e anônimos. Isto mantém o suporte sempre muito atualizado e disponível pela internet.
* C++ é desenvolvido para fornecer ao programador múltiplas escolhas, mesmo que seja possível ao programador escolher a opção errada.

## Vantagens

* Produção de código o quanto mais eficiente possível;
* Possibilidade em programação de alto e baixo nível;
* Alta flexibilidade, portabilidade e consistência;
* Adequado para grandes projetos;
* Não está sob o domínio de uma empresa (em contraste do Java — Sun ou Visual Basic — Microsoft);
* Padronização pela ISO;
* Grandes possibilidades para a metaprogramação e programação genérica;
* Compatibilidade com C, resultando em vasta base de códigos.

## Desvantagens

* Compatibilidade com o C, herdou os problemas de entendimento de sintaxe do mesmo;
* Os compiladores atuais nem sempre produzem o código mais otimizado, tanto em velocidade quando tamanho do código;
* Grande período para o aprendizado;
* A biblioteca padrão não cobre áreas importantes da programação, como threads, conexões TCP/IP, interface gráfica e manipulação de sistemas de arquivos, o que implica a necessidade de criação de bibliotecas próprias para tal, que pecam em portabilidade;
* Devido à grande flexibilidade no desenvolvimento, é recomendado o uso de padrões de programação mais amplamente que em outras linguagens.

## Críticas

    " C faz com que dar um tiro no pé seja fácil; C++ torna isso mais difícil, mas quando nós o fazemos arrebentamos com a perna toda. " $_{-BjarneStroustrup}$
A linguagem é por vezes criticada como sendo muito complicada e, portanto, difícil de dominar completamente, porque ele inclui a maior parte da linguagem de programação C como um subconjunto. C++ também herda muitas das críticas feitas ao C.
Outras críticas relacionam-se à ausência de funcionalidades, como a falta de facilidades multithreading "nativas" -- recurso presente em alguns outros idiomas como, por exemplo, Ada, C# e Java. O atual padrão C++11 resolve este problema, adicionando suporte para concorrência direta com a linguagem, mas no momento isto só é possível usando chamadas do sistema operacional ou bibliotecas de terceiros.
C++ também é por vezes comparada desfavoravelmente com linguagens como Eiffel, Java ou Smalltalk por permitir aos programadores "misturar e combinar" estilos de programação declarativa, funcional, genérico, modular, e processuais com programação orientada a objetos, ao invés de estritamente impor um estilo único, embora C++ seja intencionalmente uma linguagem multi-paradigma.
Um artigo satírico amplamente distribuído apresenta uma suposta entrevista com Bjarne Stroustrup em 1998 que seria publicada na revista Computer, editada pela IEEE Computer Society. Nela haveria a confissão de que C++ foi deliberadamente concebida para ser complexa e difícil, com o intuito de eliminar programadores amadores e elevar os salários dos poucos programadores capazes de dominar a linguagem. A seção FAQ do site pessoal Stroustrup contém uma negação e um link para a entrevista real.
Outro ponto de crítica é a característica de herança múltipla, cujo uso descuidado produz uma codificação confusa e de manutenção difícil. Um exemplo é o problema conhecido como Diamond problem.

## Conclusão

Um dos objetivos da criação da linguagem de programação C++ foi a programação orientada à objetos pois, possibilita ao programador projetar aplicações de um ponto de vista mais parecido, com comunicação entre objetos. O programador pode programar tanto em alto nível como em baixo nível, entre outras coisas. Porém, devido à semelhança que possui com a linguagem de programação C, herdou os seus problemas de entendimento de sintaxe.
C++ foi escolhida por possuir uma proposta de uso genérico, ser rápido e portável para diversas plataformas e também por apresentar grandes possibilidades para a metaprogramação e programação genérica.
É uma linguagem complexa, utilizada principalmente por programadores profissionais.

# Referências

* http://www.cenapad.unicamp.br/servicos/treinamentos/apostilas/apostila_C.pdf
* http://informatica.hsw.uol.com.br/programacao-em-c.htm
* http://www.tiexpert.net/programacao/c/introducao-c.php
* http://pt.wikipedia.org/wiki/C_(linguagem_de_programa%C3%A7%C3%A3o)#Ferramentas_de_programa.C3.A7.C3.A3o
* http://pt.wikibooks.org/wiki/Programar_em_C/Hist%C3%B3ria_da_linguagem_C#Desenvolvimentos_iniciais
* http://pt.wikipedia.org/wiki/C%2B%2B
* http://www.dca.ufrn.br/~xamd/dca0800/apostila_C.pdf
* http://www6.ufrgs.br/engcart/PDASR/linguagens.html#3
* http://www.ime.usp.br/~ueda/ldoc/notas-c.html
* http://www.numaboa.com.br/informatica/tutos/c
* http://www.xmarks.com/site/www.global.estgp.pt/engenharia/Alunos/eSebentas/Tutoriais/c.htm
* http://paginas.fe.up.pt/~jms/SUC/AulaLab3.pdf
* http://www.tiexpert.net/programacao/algoritmo/lista-compiladores-c.php
* http://www2.research.att.com/~bs/iso_release.html
* http://www.cplusplus.com/info/history/
* http://www2.research.att.com/~bs/
* http://harmful.cat-v.org/software/c++/I_did_it_for_you_all
* http://en.wikipedia.org/wiki/C%2B%2B#cite_note-42
* http://es.wikipedia.org/wiki/C%2B%2B
* http://www.dca.ufrn.br/~xamd/dca0800/apostila_C.pdf
* http://www.youtube.com/watch?v=YYm4tzuSCy0
* Esta página é somente um esboço. Ampliando-a você ajudará a melhorar a Wikiversidade.