I am Dann Luciano

?

?

If you are a professional writer – i.e., if someone else is getting paid to worry about how your words are formatted and printed – Emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.

Neal Stephenson - In the Beginning … Was the Command Line

O Processo de Compilação

Muitas vezes na compilação de um código fonte pensamos que existe somente um processo de uma única etapa, mas na verdade o processo se dividem em quatro estágios realizados por componentes diferentes:

  • Pre-processador
  • Compilador
  • Montador
  • Ligador

A figura abaixo exemplifica as etapas do processo de compilação e os arquivos “auxiliares” que são gerados apos a execução de cada estagio. A seguir cada processo será explicado.


Pré-processamento:

No estagio de pré-processamento as diretrizes #define, #if, #include e etc são resolvidas.

Compilação:

Neste estagio o compilador executa a “tradução” ou a compilação propriamente dita dos códigos fontes em linguagem de montagem que serão utilizados na próxima etapa do processo.

Montagem:

Ao final o estagio de montagem um arquivo objeto .o é gerado com o montador paradão normalmente o as.

Ligação:

No estagio final o ligador faz a junção entre todos os códigos objetos .o, colocando os códigos objetos no seus locais adequados no executável. O ligador padrão na maiorias dos sistemas é o ld.

No próximo post pretendo exemplificar cada etapa do processo de compilação utilizando o GNU GCC, uma ferramente essencial na vida de todos nos, mesmo que indiretamente.

Linguagem C++ Conselhos 5˚

Ponteiros, Vetores e Estruturas

[1] Evite a aritmética de ponteiros que não são triviais; § 5.3.

[2] Tome cuidado para não escrever além dos limites de um vetor; § 5.3.1.

[3] Use 0, em vez de NULL; § 5.1.1.

[4] Use vector e valarray ao invés de vetores (C-style); § 5.3.1.

[5] Use strings ao invés de vetor de char terminado com zero; § 5.3.

[6] Minimizar o uso de argumentos de referência em tipos primitivos; § 5.5.

[7] Evite void* exceto em código de baixo nível; § 5.6.

[8] Evite literais não triviais (“números mágicos”) no código. Em vez disso, defina e use constantes simbólicas; § 4.8, § 5.4.   

Linguagem C++ Conselhos 4˚

Capitulo 4 Tipos e Declarações

[1] Mantenha escopos pequenos; § 4.9.4. 

[2] Não use o mesmo nome em um escopo que é delimitador por um outro escopo ; § 4.9.4. 

[3] Declare um nome (só) por declaração; § 4.9.2. 

[4] Mantenha nomes comuns e locais curtos, e manter os nomes incomuns e não-locais maiores; § 4.9.3. 

[5] Evite nomes similares; § 4.9.3. 

[6] Manter um estilo de nomenclatura consistente; § 4.9.3. 

[7] Escolha nomes para refletir cuidadosamente significado ao invés de implementação; § 4.9.3.

[8] Use um typedef para definir um nome significativo para um tipo de dados nos casos em que o tipo de dado é usado para representar um valor pode mudar; § 4.9.7.

[9] Use typedefs para definir sinônimos para os tipos; use enumerações e classes para definir novos tipos; § 4.9.7.

[10] Lembre-se que cada declaração deve especificar um tipo (não há int “implícito”); § 4.9.1.

[11] Evite suposições desnecessárias sobre o valor numérico de caracteres; 4.3.1 §, § C.6.2.1.

[12] Evite suposições desnecessárias sobre o tamanho de inteiros; § 4.6.

[13] Evite suposições desnecessárias sobre a variedade de tipos de ponto flutuante; § 4.6.

[14] Prefira um int normal ao invez de um short int ou um long int; § 4.6.

[15] Prefira um double sobre uma float ou um long double; § 4.5.

[16] Prefira char sobre signed char e unsigned char; § C.3.4.

[17] Evite fazer suposições desnecessárias sobre os tamanhos dos objetos; § 4.6.

[18] Evite a aritmética sem sinal; § 4.4.

[19] Veja conversões signed para unsigned e unsigned to signed com suspeita; § C.6.2.6. 

[20] Ver conversões de ponto flutuante para inteiro com suspeita; § C.6.2.6. 

[21] Ver as conversões para um tipo menor, como int para char, com suspeita; § C.6.2.6.

Linguagem C++ Conselhos 3˚

Capitulo 3 Uma volta na biblioteca padrão

[1] Não reinvente a roda; use bibliotecas (libraries).

[2] Não acredite em mágica; entenda o que as bibliotecas fazem, como eles fazem isso, e a que custo elas fazem isso.

[3] Quando você tem uma escolha, prefira a bibliotecas padrão (standard library) a outras bibliotecas.

[4] Não pense que a biblioteca padrão é ideal para tudo.

[5] Lembre-se de por #include nos cabeçalhos para as incluir bibliotecas ou arquivos que você utiliza; § 3.3.

[6] Lembre-se que as facilidades da biblioteca padrão são definidos no namespace std; § 3.3.

[7] Use string, em vez de char *; § 3.5, § 3.6.

[8] Em caso de dúvida use um verificador de intervalos em vector (tais como em Vec); § 3.7.2.

[9] De preferencia use vector<T>, lista<T>, e map<key,value> a T[]; § 3.7.1, § 3.7.3, § 3.7.4.

[10] Ao adicionar elementos para um recipiente (container), use push_back() ou back_inserter(); § 3.7.3, § 3.8.

[11] Use push_back() em um vetor ao invés de realloc() em um array; § 3.8.

[12] Capturar exceções comuns em main(); § 3.7.2.

LISP and Java programmers take garbage collection for granted. With the Boehm-Demers-Weiser library, you easily can use it in C and C++ projects, too

—A biblioteca BDWGC ou libgc é um coletor de lixo (garbage collector) para c/c++. Por enquanto estou estudando e dando uma olhada geral. Em breve pretendo escrever um post sobre como utilizar essa lib.

Linguagem C++ Conselhos 2˚

[1] Não entre em pânico! Tudo ficará claro no tempo; § 2.1.
[2] Você não tem que saber todos os detalhes do C + + para escrever bons programas, § 1.7.
[3] Foco em técnicas de programação, e não em recursos de linguagem; § 2.1.

Linguagem C++ Conselhos 1˚

Aqui está um conjunto de “regras” que você pode considerar enquanto aprende C++. Quando você obter mais proficiência poderá evoluir em algo adequado para seu tipo de aplicações e seu estilo de programação. Os conselhos são deliberadamente muito simples, para que eles careçam de detalhes. Não leve-os muito literalmente. Para escrever um bom programa você precisa ter inteligência, gosto e paciência. Você não vai acertar na primeira vez. Experimente! 

 [1] Quando você programa, você cria uma representação concreta das idéias em sua solução para algum problema. Deixe a estrutura do programa refletir essas idéias tão diretamente quanto possível: 

  • [A] Se você pode pensar que “isso” é uma idéia separada, crie uma classe (class).
  • [B] Se você pode pensar que “isso” é uma entidade separada, crie um objeto de alguma classe.
  • [C] Se duas classes possuem uma interface comum, crie essa interface (interface) como uma classe abstrata (abstract).
  • [D] Se as implementações de duas classes têm algo significativo em comum, faça com que classe comum seja uma classe uma base. 
  • [E] Se uma classe é um recipiente (contêiner) de objetos, crie um modelo (template).
  • [F] Se uma função implementa um algoritmo para um recipiente, crie uma função de modelo implementando o algoritmo para uma família de recipientes.
  • [G] Se um conjunto de classes, modelos, etc, são logicamente relacionados, os coloque em um namespace comum.

[2] Quando você define uma classe que não implementa qualquer uma entidade matemática como uma matriz ou um número complexo ou um tipo de baixo nível, como uma lista ligada:

  • [A] Não use dados globais (use membros).
  • [B] Não use as funções globais.
  • [C] Não use membros de dados públicos.
  • [D] Não utilize friends, exceto para evitar [a] ou [c]. 
  • [E] Não coloque um “tipo de campo” em uma classe; use funções virtuais. 
  • [F] Não use funções inline, exceto como uma otimização significativa.

Referencias

Stroustrup, Bjarne. The C++ Programming Language. Third Edition. pg 16-17. 1997.