segunda-feira, 23 de janeiro de 2012

Compilador MiniJava


Desde quando comecei meus estudos de computação e aprendi a primeira linguagem de programação, C, eu tenho a curiosidade de entender o funcionamento de um compilador.

Ficava fascinado pelo fato de um programa transformar um arquivo texto contendo construções da linguagem, em outro arquivo contendo código que uma máquina consegue compreender preservando a semântica, ou seja, seu significado. Esse é o processo de compilação.

Para iniciantes, isso fica um pouco abstrato porque o foco inicial é aprender a programar e não como funciona um compilador.
Finalmente, no meu 7° período de curso (bem que poderia ser antes!) tive a oportunidade de, não só entender todo esse processo de compilação, mas também construir um compilador seguindo as etapas de projeto. Cursei a disciplina Compiladores ministrada pelo professor Marcus Ramos o qual agradeço a paciência e disponibilidade para tirar dúvidas e compartilhar seu conhecimento, o que possibilitou a realização desse trabalho!

A linguagem usada para a construção foi MiniJava. Ela é uma versão reduzida do Java. Possui apenas construções simples e comandos básicos como if, while, System.out.println(), permite criação de métodos e atributos de classe e possui apenas tipos int, boolean, objeto e vetor de int.

Como nosso tempo foi curto (pouco menos de 2 meses, porque antes tivemos que ver a teoria que envolve a construção de compiladores), algumas decisões de projeto tiveram de ser tomadas para que pelo menos algo de cada etapa (análise sintática, análise de contexto e geração de código) pudesse ser feito.

A análise sintática consiste em reconhecer os símbolos (tokens) a partir da leitura de um arquivo texto de entrada e verificar se eles respeitam as regras gramaticais da linguagem fonte (no caso foi usada uma BNF estendida que pode ser encontrada aqui).

Na semântica, já com os tokens corretamente reconhecidos, o programa é verificado se está correto agora observando o significado das construções. Basicamente acontece a identificação (reconhecimento de variáveis e métodos) e vinculação (vincula cada uso de variável com sua declaração). Possíveis erros são facilmente identificados e mensagens exatas podem ser emitidas nessas etapas.

E, por fim, geração de código. Com o programa bem escrito e com o significado correto perante as regras da linguagem, as instruções podem ser traduzidas passo a passo para linguagem de máquina. Gerando o PUSH para reservar espaço para variáveis, STORE para guardar valores, LOAD para carregar valor de um registrador, JUMP para desvios, dentre outras. Essas são algumas básicas, cada máquina possui seu conjunto de instruções.

No nosso caso, o código de máquina foi gerado com base em uma máquina abstrata usada a partir do livro base da disciplina (link dele aqui), o TAM (Triangle Abstract Machine).

Aqui nesse link você encontra o arquivo compactado contendo o executável do compilador em bytecode juntamente com uma classe de exemplo. Também há um manual explicando como que instala e usa o compilador! Fique à vontade para testar e comentar.

Um abraço,
Bruno Pinho.

sexta-feira, 13 de janeiro de 2012

Dropbox no Debian Squeeze



Recentemente instalei o dropbox no Debian Squeeze e ele não funcionava de modo algum. Usei os pacotes .deb do site oficial tanto para Ubuntu quanto Debian e todos davam o mesmo problema: não encontrava um arquivo 'dropbox' no diretório /home/user/.dropbox-dist/ sendo que ele estava lá.

Tentei instalar pelo codigo fonte, compilei tudo mas não funcionou também. Mesmo erro. Depois de tanto procurar, resolvi tentar uma dica do site do dropbox mas o download falhava. Ate que encontrei uns arquivos compactados. Fiz o donwload versão x86 (versão 64 bits) deles e extraí para a minha pasta home. Entrei no diretório .dropbox-dist e executei o daemon do dropbox: ./dropboxd

A partir daí ele baixou uns arquivos de instalação e pude usá-lo normalmente. Para criar o atalho, pode ser na mão, mas se já tiver a versão instalada a partir do .deb, basta apagar o diretorio .dropbox-dist e substituí-lo pelo baixado do site como fiz acima. Pronto, agora o seu dropbox funciona tranquilamente no Squeeze!

Depois de vasculhar e tentar sem sucesso inúmeras vezes pelo .deb, consegui resolver o problema.
Espero que tenha ajudado!

3DSP? Nunca mais!


Placa wireless 3DSP
Hoje venho compartilhar com vocês, usuários de notebook MUB (Microboard Ultimate Black) da Microboard que vem com a placa de conexão wireless 3dsp de fabricação chinesa, o fim dos meus problemas com a rede sem fio. Recentemente instalei o Windows Seven e, ao instalar o driver da dita placa e usá-lo, volta e meia dava a famosa tela azul. Não sei por que isso, mas o problema era por conta da placa. Sempre a usei no Xp e sempre funcionou bem, não tenho do que reclamar. No entanto, eu gosto de usar Linux e na versão open source dos drivers o negócio é um pouco complicado.

Eu tenho a preferencia pela distro Debian. Mas eu tinha uma barreira que impedia de usá-lo. Os drivers não funcionavam corretamente. Para compilar era um trabalho e tinha que renomear uns diretórios e mesmo assim não funcionava. Quando pensava estar tudo ok, a placa não tinha um bom desempenho. Instabilidade na conexão e superaquecimento do meu note são só 2 problemas que listo... Só havia uma distribuição Linux em que os drivers funcionavam corretamente: Ubuntu. Você baixava o pacote .deb e instalava numa boa. Só que eles tinham limitação de versão do kernel e, sempre na próxima versão do Ubuntu que sair e tiver uma atualização do lernel, o drive pára de funcionar. Então teria que e esperar sair o pacote pré-compilado para a próxima versão do Ubuntu. Ou seja, sempre ficava dependendo do pessoal desenvolver o próximo pacote para a versão... Isso não é uma coisa boa!

Mas há o código fonte, você poderia compilar e resolver o problema... Não! Simplesmente esse código fonte só funcionava também no Ubuntu. Tentei inúmeras vezes instalar no Debian mas aí aparecia a famosa frase dessa placa quando abria o seu gerenciador: “no valid wireless device”.

Então, já cansado de ficar limitado a usar ao o Ubuntu,  abdiquei do bluetooth (só para lembrar, a 3dsp possui wireless e bluetooth na mesma placa) e a troquei. Antes de tudo, precisava pesquisar quais placas teriam suporte no Linux ou pelo menos drivers que funcionassem. Isso pode ser visto para o Debian aqui. Achei duas placas de nome no mercado que teria suporte no Linux: atheros e rtl. Não achei atheros com preço acessível. Então parti para a rtl. Mas possuem 3 versões. Eu optei pela rtl8187b da azurewave. Além de ter suporte, possui drivers open source. E, para nossa alegria, o Debian Squeeze já possui módulo para essas placas: rtl8187. Bastava então instalá-lo e carregar. 

Placa RTL8187B da Azurewave
Comprei a placa Minipci no valor de 39 reais. Abri o notebook e fiz apenas trocar pela 3dsp reconectando os cabos da antena da mesma maneira que estavam. Liguei o notebook e pronto. Tanto o Windows quanto o Linux reconheceram automaticamente o driver. Fiquei surpreso já que tinha separado os drivers.. Mas o importante é que agora tenho a liberdade de escolher qualquer distribuição Linux porque essa placa tem suporte em muitas versões do kernel e o código fonte esta disponível para instalação manual. E, na pior das hipóteses, pode usá-la com o ndiswrapper. A 3dsp não funcionava com o ndiswrapper porque não possui o arquivo necessário.    

Então, para aqueles que ainda têm dor de cabeça com essa placa, segue mais uma experiência de alguém que resolveu trocá-la para ter melhor desempenho e liberdade com seu notebook MUB!