Site Navigation:
 
 

12. Desenvolvimento

Esta seção cobre várias ferramentas e funcionalidades para desenvolvedores

12.1. Tempo de Execução (Runtime)

Estas são as novas funcionalidades na glibc:

  • Suporte para prioridades herdadas e mutexes de proteção de prioridade. As duas funcionalidades estão descritas nos padrões POSIX.

    • Mutexes de prioridades herdadas automaticamente previnem inversões de prioridade causadas pela espera da liberação de mutexes. O kernel automaticamente aumenta a prioridade de um processo segurando o mutex até que ele libere o mutex.

    • A proteção de prioridade permite especificar uma prioridade que todos os processos que adquirirem o mutex irão utilizar até que o mutex seja liberado. Esta funcionalidade não está disponível para mutexes robustos.

  • A organização dos endereços de destino feita pela interface getaddrinfo() para resolução de nomes agora pode ser personalizada por regras no arquivo /etc/gai.conf.

  • Significantes melhorias de velocidade no processamento de NIS e NIS+.

  • Suporte ao RFC 3542 completo (APIs de sockets avançados para IPv6).

  • Significantes melhorias de velocidade na verificação de símbolos dinâmicos.

12.2. Ferramentas

O linker inclui suporte para o novo formato de tabela hash de símbolos ELF. Use a opção --hash-style no linker para selecionar o formato (s).

12.2.1. Arquivos de cabeçalhos do Kernel

Esta versão do Fedora foi construída utilizando cabeçalhos do kernel Linux diretamente do kernel, usando a nova funcionalidade headers_install do kernel 2.6.18. Por conseqüência, o pacote glibc-kernheaders foi removido e substituído pelo kernel-headers, um sub-pacote do kernel.

Desenvolvedores podem notar algumas mudanças entre estes novos cabeçalhos de kernel e aqueles que estava presentes antes, incluindo (mas não limitado a) os seguintes:

  • O arquivo de cabeçalho <linux/compiler.h> foi removido, pois não continha nada de útil para a camada de usuário.

  • Os macros _syscallX() foram removidos. A camada de usuário deve usar syscall(), da biblioteca C.

  • O macro PAGE_SIZE foi removido de algumas arquiteturas, pois o tamanho da paginação é variável. A camada de usuário deve usar, ao invés disso, sysconf(_SC_PAGE_SIZE) ou getpagesize().

  • Os arquivos de cabeçalho <asm/atomic.h> e <asm/bitops.h> foram removidos. Eles não foram feitos para o uso na camada de usuário e podem falhar na compilação em algumas arquiteturas enquanto fornecem comportamentos não-atômicos em outras. O compilador C fornece suas próprias funções atômicas embutidas que são mais apropriadas para o uso em programas na camada de usuário.

  • Conteúdos que antes eram protegidos com #ifdef __KERNEL__ agora são completamente sobrepostas pela ferramenta unifdef. Definir __KERNEL___ com o objetivo de ver as partes visíveis na camada de usuário não é mais eficaz.

Adicionando, alguns outros arquivos de cabeçalho que não são apropriados para o uso na camada de usuário foram removidos e ainda mais cabeçalhos foram editados para remover conteúdo inapropriado.

[Nota]Mudanças nos cabeçalhos do kernel não são específicos ao Fedora

Estas mudanças foram herdadas do kernel principal e não são específicos ao Fedora. Qualquer distribuição utilizando os cabeçalhos exportados do kernel oficial serão os mesmos.

12.2.2. Coleção de Compiladores GCC

Esta versão do Fedora foi construída utilizando o GCC 4.1, o qual está incluído na distribuição.

12.2.2.1. Poréns
  • Os desenvolvedores Fedora introduziram mudanças na seção ELF .hash que fornece os símbolos para as ligações dinâmicas. Esta nova seção .gnu.hash, que é produzida pela nova opção padrão --hash-style=gnu do gcc, serve para o mesmo propósito que as seções de hash anteriores. Entretanto, ela fornece uma melhoria de velocidade de 50% nas ligações dinâmicas. Binários e bibliotecas produzidas com a nova função de hash são incompatíveis com versões anteriores da glibc e do linker dinâmico. Para usar as rotinas de hash antigas para compatibilidade com sistemas baseados em uma biblioteca glibc mais velha, passe a opção --hash-style=sysv.

  • Você precisa do GDB 6.1 ou mais novo para depurar binários, a não ser que eles estejam compilados com a opção de compilação -fno-var-tracking.

  • A opção -fwritable-strings não é mais aceita.

  • Mensagens de diagnóstico em inglês agora usam aspas Unicode. Se você não puder lê-las, configure sua variável de ambiente LC_CTYPE para C ou mude o seu emulador de terminal.

  • O arquivo specs não é mais instalado na maioria dos sistemas. Usuários normais não irão notar, mas desenvolvedores que precisem alterar o arquivo podem usar a opção -dumpspecs para gerar o arquivo para edição.

12.2.2.2. Geração de Código
  • O otimizador de código SSA agora é incluído e traz consigo uma melhor propagação constante (constant propagation), eliminação de redundância parcial (partial redundancy elimination), carrega e armazena code motion (load and store code motion), redução de força (strength reduction), eliminação de armazenamento morto (dead storage elimination), melhor detecção de código inalcançavel (detection of unreachable code) e recursão por acumulação (tail recursion by accumulation).

  • Autovetorização (Autovectorization) é suportada. Esta técnica atinge desempenhos maiores para códigos de fluxo repetitivos, em algumas circunstâncias.

12.2.2.3. Extensões de Linguagens
  • A nova atribuição sentinela (sentinel) faz com que o compilador gere um aviso se uma função como a execl(char *path, const char *arg, ...), que requer um terminador de lista nulo (NULL), não contenha o NULL.

  • As extensões cast-as-lvalue , conditional-expression-as-lvalue e compund-expression-as-lvalue foram removidas.

  • A semântica #pragma pack() agora está mais semelhante às usadas por outros compiladores.

  • Tomar o endereço de uma variável declarada no modificador de registro agora gera um erro ao invés de um aviso.

  • Matrizes de tipos de elementos incompletos agora geram um erro. Isto implica em nenhum referenciamento para estruturas de definições.

  • O compilador básico, sem nenhum otimização ( -O0 ) foi medido como aproximadamente 25% mais rápido em códigos reais.

  • Bibliotecas podem agora conter variáveis estáticas de escopo de função em programas de multi-threads. Desenvolvedores de sistemas embarcados podem usar a opção -fno-threadsafe-statics para desabilitar essa funcionalidade, mas usuários normais nunca devem fazer isto.

12.3. Ruby

O diretório de busca padrão para bibliotecas Ruby, $:, foi mudado de acordo com as regras de empacotamento. Mudanças também foram feitas em algumas entradas no Config::CONFIG do módulo rbconfig. As mudanças mais importantes incluem:

  • sitedir e diretórios relacionados (sitelibdir, sitearchdir) estão agora sob rubylibdir. Ao invés de em /usr/lib/site_ruby, estão sob /usr/lib/ruby/site_ruby.

  • Os diretórios para códigos Ruby puros e independentes de arquitetura estão sempre sob /usr/lib, mesmo nas arquiteturas x86_64, onde eles costumavam ficar sob /usr/lib64. Esta mudança afeta as entradas rubylibdir e sitelibdir do Config::CONFIG.

Os diretórios que anteriormente estavam em $: por enquanto continuam no mesmo lugar, para que os códigos já existentes, como por exemplo /usr/lib/site_ruby, não precisem ser modificados. Entretanto, estes diretórios estão fora de uso e irão ser removidos no lançamento do Fedora Core 8. Construa pacotes RPM de Ruby de acordo com as regras de empacotamento. Em particular, bibliotecas Ruby devem ser apenas instaladas nos sitelibdir e sitearchdir. Você deve também seguir esta regra para códigos Ruby que não estão empacotados em RPM.