VidaGeek.net

Linux, Open-source, Programação e Produtividade

Archive for the ‘Programacao’ Category

Visual Basic no Linux

Sim. Você não leu errado o título deste post. O Projeto Mono acaba de anunciar que eles desenvolveram um compilador de Visual Basic (linguagem que antes apenas rodava em plataforma Windows) para qualquer plataforma que suporte Mono (inclusive Linux). A grande vantagem disso? Cerca de 37% das empresas usam a plataforma .NET. E entre os desenvolvedores .NET, 59% usam apenas Visual Basic como linguagem de programação.
Esse número de usuários é realmente assustador, lembrando que Visual Basic não é uma das linguagens mais poderosas existentes. Mais incrível e assustador ainda é saber que esse compilador foi escrito em Visual Basic.
Bom para programadores Visual Basic e muito bom para Linux, pois agora é mais fácil migrar sistemas para Linux.

Mais informações:Linux Devices, em inglês.

Posts Relacionados:

  • Linguagens de Programação - Basic
  • Aprenda Comandos Básicos de Linux
  • Construção de interfaces com o Glade
  • Gentoo no Summer of Code
  • CodeIDE
  • Livro grátis de Ubuntu
  • Mitos do Linux derrubados
  • Acompanhe-nos por RSS, por Email ou via Twitter.
    Veja como ter um desconto no Dreamhost: um excelente servidor web.

  • 1 Comment
  • Filed under: Linux, Programacao
  • Dia C - Modificadores e extensões GNUC

    Normalmente, quando estamos aprendendo a programar, acabamos lendo código já escrito por outros programadores (as vezes, alguns dos melhores programadores do mundo). Uma das primeiras coisas que notamos é que eles usam modificadores em funções e variáveis. Aqui vou explicar os modificadores que estão no padrão ANSI C (ISOC 1989).

    Modificadores de Tipo:

    long: Dobra o número de bytes de um tipo primitivo
    short: Reduz pela metade o número de bytes de um tipo primitivo
    signed: Determina que o tipo primitivo deve reservar um bit para o controle de sinal
    unsigned: Determina que não deve ser reservado um bit para o controle do sinal do tipo primitivo

    Modificadores de Acesso:

    const: Em uma variável indica que o valor dela não pode ser alterado e em uma função, quando aplicado a um parâmetro, significa que o parâmetro não poderá ser modificado (a função não terá efeitos colaterais com relação ao parâmetro).
    volatile: Significa que a variável (ou parâmetro) pode ser modificado a qualquer momento e por isso o compilador não deve otimizar atribuições sucessivas.

    Modificadores de Armazenagem:

    auto: Este modificador não tem função na linguagem. Foi adiciona à ela por questões de simetria com outros modificadores. Ele simplesmente indica que o compilador deve tratar a varável como ele sempre trata.
    extern: Indica que uma variável em um módulo será referenciada em algum outro módulo. A alocação dela será feita durante a lincagem do programa.
    static: Quando usada em uma variável, significa que quando o módulo (ou função) for carregado, esta variável será alocada apenas uma vez e será compartilhada por cada um dos módulos (ou funções).

    Modificadores definidos pela ISOC 1999:

    restrict: Significa que a variável não poderá ser alterada no escopo onde está declarada. Isso é um pouco diferente de const, que impede que a variável seja modificada de forma direta. Restrict impede que ela seja modificada de formas diretas e indiretas.
    register: Significa que a variável ou parâmetro será mantido em um registrador durante qualquer cálculo que a envolva. Isso aumenta muito a velocidade de trabalho da varável, o que pode aumentar o desempenho de um laço, por exemplo. Como a variável está sendo mantida em um registrador, não faz sentido usar o operador unário & para pegar o endereço dela.
    inline: Significa que o código de uma função deverá ser inserido no meio do código principal, assim como uma macro (um pouco mais segura). Isso aumenta a velocidade porque não existe mais o tempo de chamada de função, mas só deve ser usado em funções pequenas (aproximadamente 10 linhas) e somente compilando com otimização as funções serão inline realmente. Também apresenta o problema de aumentar o tamanho do arquivo compilado, uma vez que as funções fazem parte do código principal agora.

    Extensões:
    Em compiladores padrão GNUC (verifique a existência da constante __GNUC__), existem diversos modificadores extras e que são muito úteis. Para mais informações verifique Extensões GNUC

    Mais informações: C Keywords -> Google

    Próxima semana: Estratégias de Depuração.

    Posts Relacionados:

  • Séries
  • Dia C - Ponteiros de Função
  • Como carregar extensões do kernel no Mac OS X
  • Scripts para o Greasemoney do Firefox
  • Extensões do Firefox
  • Dia C - Tuning
  • Promoção RedBug
  • Acompanhe-nos por RSS, por Email ou via Twitter.
    Veja como ter um desconto no Dreamhost: um excelente servidor web.

    Dia C - Ponteiros de Função

    Ponteiros talvez sejam uma das maiores causas de desistência da utilização de C quando você está começando a programar. Mas nesse momento, vamos falar apenas de um tipo bem específico: Ponteiros de função.

    Em C toda função tem um endereço de memória associado a ela. Esse valor é lido através do nome da função. Portanto é possível fazer uma chamada indireta à função (através do ponteiro dela). Isso vai ser muito útil quando formos falar de algoritmos genéricos em C.

    Um ponteiro de função é declarado da seguinte forma:
    TIPO (*NOME)(tipo1, tipo2, tipo3, tipoN);

    Agora NOME armazena um ponteiro para a função com o protótipo acima. Para utilizá-lo, basta usar NOME como se fosse uma função. Isso parece não ter importância, afinal eu simplesmente declarei uma função no meio do código. Mas ela pode ser declarada no protótipo de uma função também e assim passar uma função para dentro de outra função, como faz o qsort da stdlib.h. No qsort, você passa uma função que ficará encarregada de fazer a comparação entre os elementos do vetor passado. Assim é possível escrever o código da função qsort apenas uma vez e utilizá-lo para ordenar qualquer tipo de vetor (desde que você escreva a função de comparação). Isso pode economizar um tempo incrível no processo de produção de código.

    Mas essa é apenas uma das aplicações. Atualmente estou desenvolvendo um módulo de controle da física de um jogo. Quando fui analizar a colisão, ocorreu-me um problema. Eu deveria manter a física bem genérica (ela não deveria distiguir a forma do objeto durante a colisão) mas ao mesmo tempo deveria lidar com qualquer objeto modelado. A solução foi colocar dentro da struct física um ponteiro para a função que é responsável por obter o ponto de colisão no próprio tipo físico. Assim, quando a física é criada, também é passada esta função de controle e o problema foi resolvido. Sem utilizar ponteiros de função seria muito mais complicado resolver este problema.

    Notas:
    1. Para obter o endereço de uma função não é necessário usar o operador ‘&’ (na verdade isso é um erro, a não ser que você queira o endereço do ponteiro), pois em C todas as funções já são ponteiros.
    2. Não é possível atribuir a um ponteiro de função uma função de protótipo diferente do protótipo do ponteiro.
    3. Cuidado para não perder a coerência. Não é porque funções têm protótipos iguais que elas terão fins semelhantes.

    Este é mais um recurso de C que não é muito bem aproveitado (provavelmente por que a sintaxe é meio estranha).

    Mais informações: ponteiro de função -> Google

    Próxima semana, modificadores de variáveis e funções e as extensões GNUC.

    Posts Relacionados:

  • Séries
  • Dia C - Algoritmos Genéricos
  • Dia C - Ponteiros e Aritmética de Ponteiros.
  • Dia C - Threads em C
  • Dia C - VarArgs
  • YACP (Yet Another C Primer)
  • Linguagens de Programação - C
  • Acompanhe-nos por RSS, por Email ou via Twitter.
    Veja como ter um desconto no Dreamhost: um excelente servidor web.

    Dia C - VarArgs

    A partir de hoje, toda sexta-feira será o dia “C”, dia em que eu irei postar aqui no blog dicas sobre programação na linguagem C (sim, puro C, nada de C++, C#, Objective-C ou outros).
    Antes de mais nada, é bom avisar que os posts não são destinados a quem começou a aprender C agora (nada impede que leiam, mas vai ser difícil de entender) e sim para pessoas que já têm alguma experiência (por exemplo, conseguem fazer um jogo de sudoku). Dados esses avisos, vamos começar.

    VarArgs:

    A primeira coisa que um programador aprende a fazer em C é imprimir algo na tela (geralmente “Hello World”). Vocês ja devem ter notado que a função printf permite que você passe um número variante de argumentos para ela. Até aí nenhum problema. O problema é que C não permite (nativamente) que as funções apresentem mais de um protótipo. Portanto, como isso é feito??

    Utilizando-se quatro macros especiais e um tipo definidos em stdarg.h (Padrão ANSI). São eles:
    - … (sim, isso é uma macro);
    - va_start(va_list, last);
    - va_arg(va_list, type);
    - va_end(va_list);
    - va_list (Este é o tipo definido em stdarg);

    Para usá-los, o que deve ser feito é:
    1. Declarar a função que vai aceitar os argumentos variáveis com pelo menos um parâmetro fixo e após o último parâmetro fixo colocar a macro “…” como se fosse um parâmetro extra.(a função deverá ter essa cara: TIPO foo(tipo1 param1, tipo2 param2, tipoN paramN, …) );
    2. Dentro da função, deve ser declarado uma variável do tipo va_list;
    3. Antes de querer recuperar os parâmetros variáveis, deve-se utilizar a macro va_start para inicializar a va_list. (se a va_list for declarada como args, no nosso exemplo ficaria: va_start(args, paramN); );
    4. Agora é que o problema começa. Para recuperar os parâmetros, deve-se conhecer o tipo do parâmetro. Como fazer isso? Bom, não existe uma forma correta ou errada de se fazer isso. Você pode definir que todos os parâmetros serão de um tipo ou coisas do gênero. A saída mais elegante e eficiênte que eu vi é a usada pelo printf. O parâmetro fixo do printf é uma string que tem a informação sobre os parâmetros. Assim é fácil saber que quando for encontrado um %c deve-se pedir um parâmetro do tipo char e etc. (No nosso exemplo, se eu quisesse recuperar um int, deveria usar va_arg da seguinte forma: int i = va_arg(args, int); );
    5. Depois que já tiver feito o que quiser, lembre-se de colocar a macro va_end no final da função para finalizar e liberar a va_list. Isso é importante pois erros obscuros e estranhos podem ocorrer caso isso não seja feito. (No exemplo: va_end(args); );

    Outra forma de usá-los é passar a va_list como parâmetro para uma outra função e assim ela poderá ler os parâmetros no lugar da função que recebeu os parâmetros variáveis (como a função vprintf (ANSI C) e a função dprintf (Do livro “Obfuscated C Code Contest and Other Mysteries”)). Também fiz um teste e passando para uma função um ponteiro de va_list (va_list *) é possível fazer com que a primeira função leia, por exemplo, três parâmetros, chame uma função para ler mais 2 e depois leia outro parâmetro.

    Isso pode parecer meio confuso, mas depois que você aprende a usar você nota que é um recurso muito poderoso de C, mas que é pouco aproveitado pelos programadores em geral.

    Maiores informações: man stdarg (Para usuários de sistemas Unix), stdarg -> Google (Para qualquer usuário).

    Próxima semana, ponteiros de funções.

    Posts Relacionados:

  • Séries
  • Dia C - Pilha do C
  • Promoção RedBug
  • Game Developers Conference
  • Digam adeus ao mouse
  • O verdadeiro geek
  • Enfim um Terceiro Botão..
  • Acompanhe-nos por RSS, por Email ou via Twitter.
    Veja como ter um desconto no Dreamhost: um excelente servidor web.