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.