domingo, 12 de abril de 2015

Hardcore Devel #12 - Problemas de Compilação

Você, que já escreveu um código fonte em alguma linguagem de programação. Você obviamente deve ter tido problemas para mostrar o eu trabalho final para outras pessoas, afinal, sempre vai dar um erro quando você vai mostrar o seu trabalho para outras pessoas, correto?

Bom, eu definitivamente não serei capaz de lhe salvar disso pois como programador eu sofro do mesmo mal. Tudo o que eu faço da errado na primeira vez que eu vou mostrar pra alguém, mas a gente sempre estuda um pouco mais por causa disso e chega a alguma conclusão frutífera. Eu por exemplo tenho alguns ases na manga que eu irei compartilhar com vocês.

Esse é o Hardcore Devel #12



- Esse é o meu ás na manga. Não pera...

Bom vamos a alguns conceitos básicos. Se a sua linguagem roda em uma máquina virtual. Técnicamente o que quer que você faça vai rodar em quem tiver essa máquina virtual instalada. Bom, essa é uma das vantagens particulares do código em Java. Isso é na verdade uma das grandes sacadas do Java.

O problema é que você não pode forçar ninguém a ter uma máquina virtual java para rodar as coisas. Mas para a maioria dos propósitos, fazer um programa em java serve. O problema do Java é que ele é ruim pra fazer coisas de alto desempenho justamente por causa da JVM(Java Virtual Machine), ele poderia ser útil se tivesse algo que o rodasse nativamente.

Mas isso não significa que a coisa vai funcionar pois um programa depende de muitos recursos e bibliotecas. Então como fazer pra que tudo funcione fora do seu próprio ambiente perfeito?

Leve tudo com você.

Sério, leve os arquivos e as bibliotecas todas que você vai usar com você. Na verdade essa é uma estratégia comum quando você distribui um código em java. Você fornece também uma máquina virtual a parte que será acessada especificamente para aquele programa, o que vai acontecer é que o seu programa pode engordar um pouco, e a pessoa pode ficar com duas máquinas virtuais no próprio computador, mas a maioria dos usuários nem sabe o que é isso. Isso funciona, e é normal.

Mas as vezes o seu projeto não é em Java. Como você faz? Bom, quando você está mexendo com C e você precisa escrever coisas para Windows, o seu primeiro problema é decidir qual compilador você pretende usar entre os dois disponíveis: Visual Studio e MinGW. Isso acontece porque a Microsoft abriu o Visual Studio e agora você não precisa mais pagar por ele. O MinGW sempre foi a alternativa popular porque ele é grátis e tenta imitar o GCC, que é aquilo que é usado nos sistemas Unix.

Não sei se vocês já usaram esses compiladores, mas hoje em dia é difícil de dizer o quão poderosos e automatizados eles estão. O compilado do código C não é linguagem de máquina, mas algo que se transformará em linguagem de máquina quando ligado pelo "ld" ou pelo que eles chamam de Linker. Esses conceitos vem da programação em assembly language, onde você compilava vários arquivos e por fim os connectava. Daí o nome Linker.

Mas os compiladores hoje em dia já chamam e linker e você nem percebe! Isso gera algumas confusões e algumas dores de cabeça quando você compila um código fonte em Windows para ele ser usado em outro lugar, mas para quem usa o MinGW eu já vim com a solução pronta. Geralmente nós compilamos por linha de comando, então você adiciona isso aqui:

-static-libstd -static-libc++

Essas duas opções irá fazer aquilo que a gente faz com o Java. Ele trás a biblioteca junto e dá uma engordada no programa, mas em compensação você elimina a necessidade das DLLs que fazem os programas compilados com o MinGW funcionar.

Isso nos leva ao conceito de compilação dinâmica e estática. A coisa funciona mais ou menos assim:
Quando algo é compilado dinâmicamente, o código de máquina gerado supõe que você possui uma biblioteca com outros códigos ja na sua própria máquina, algo que seria similar as DLLs, que por sinal são apenas uma sigla para Dynamic Loaded Library. Mas você pode fazer uma compilação estática e trazer esses códigos pra dentro do seu próprio programa ao custo já dito antes.

Existem coisas interessantes que você pode fazer quando você compreende o processo de compilação de um código como as Ant Builds do Java, então as vezes é importante programar sem o auxílio de uma IDE toda pomposa.

Ainda estou tentando descobrir como faz pra fazer compilação estática com o Visual Studio, apesar do MinGW já ter resolvido o meu problema.

Bom, vou ficando por aqui! Agora vocês já sabem mais um truque pra usar quando compilar coisas em C!

Nenhum comentário:

Postar um comentário