Plugins Para Eclipse

Página inicial para colocar o resultado da pesquisa de Andrea,André,Franciana

Componentes:

André Custódio da Silveira
Andréa Márcia Freire
Franciana Pereira

Introdução

Este trabalho de pesquisa tem como objetivo dar uma idéia da criação de ferramentas que adicionam funcionalidades ao Eclipse (plug-ins), e fazer uma relação com os compiladores.

Projeto Eclipse

Uma arquitetura baseada em plug-in

A Plataforma Eclipse é uma estrutura de desenvolvimento de código aberto (software livre) criada pela IBM®.
É uma arquitetura madura e bem-projetada.
É um ambiente de desenvolvimento integrado e extensível (IDE).
Essa plataforma permite que qualquer pessoa construa ferramentas que são integradas de forma transparente com o ambiente e outras ferramentas.
A chave para a integração transparente de ferramentas com o Eclipse é o plug-in.
Com a exceção de um pequeno kernel de tempo de execução, tudo no Eclipse é um plug-in.

O Workbench e o Workspace são dois plug-ins indispensáveis da Plataforma Eclipse eles fornecem os pontos de extensão usados pela maioria dos plug-ins, conforme mostrado na Figura 1.

figure1.gif

Figura 1. O Workbench e o Workspace do Eclipse

Um plug-in requer um ponto de extensão no qual se conectar para que funcione.
O componente Workbench contém pontos de extensão que, por exemplo, permitem que seu plug-in estenda a interface com o usuário do Eclipse com seleções de menu e botões da barra de ferramentas, para solicitar notificação de diferentes tipos de eventos e para criar novas visualizações.
O componente Workspace contém pontos de extensão que permitem interagir com recursos, incluindo projetos e arquivos.
O Workbench e o Workspace não são os únicos componentes do Eclipse que podem ser estendidos por outros plug-ins, é claro.
Além disso, há um componente Debug que permitirá que seu plug-in ative um programa, interaja com o programa de execução e trate dos erros — tudo que é necessário para construir um depurador.
Apesar de necessário para determinados tipos de aplicativos, o componente Debug não é necessário para a maioria dos aplicativos.
Há também um componente Team que permite que recursos do Eclipse interajam com sistemas de controle de versão (SCV), mas, a menos que você esteja construindo um cliente do Eclipse para um SCV, o componente Team, assim como o componente Debug, não terá sua funcionalidade estendida nem aprimorada.
Por fim, há um componente Help disponível para permitir fornecer documentação on-line e ajuda sensível ao contexto para seu aplicativo.
Não há como negar que a documentação da ajuda é uma parte essencial de um aplicativo profissional, mas não é essencial para a funcionalidade de um plug-in.
Os pontos de extensão que cada um dos componentes acima fornece estão documentados na Ajuda da Plataforma Eclipse, na seção de referência do Platform Plug-in Developer guide.

Arquitetura

A arquitetura de plug-ins do Eclipse, citada anteriormente, é controlada por um microkernel, no qual consta o principal componente genérico: a plataforma Runtime.

Arquitetura_Eclipse.jpg

Figura 2. representação gráfica da arquitetura básica do Eclipse

Componentes genéricos:

• Runtime: Gerenciador dos Plug-ins;
• WorkSpace: Gerenciador de diretórios e arquivos, abrangendo os projetos do usuário;
• SWT e JFace: Gerenciadores de interface com o usuário do Eclipse;
• WorkBench: Suporte e recursos de interface gráfica;
• Team: Interpreta o Workspace para controlar versões e histórico dos recursos;
• Debug: Suporte a depuração de programas;
• Help: Recurso de suporte aos usuários;
• Update: Gerenciador de atualizações.

Em todos os componentes genéricos da arquitetura do Projeto Eclipse não há especificação de nenhuma linguagem de programação ou plataforma a ser trabalhada.
Na figura anterior, estão em destaque os principais plug-ins que dão suporte a uma determinada linguagem e tecnologia: o JDT e o CDT.
Apesar de compartilharem funcionalidades genéricas, o JDT dá suporte a projetos construídos em JAVA, e o CDT a projetos em C/C++.

Introdução à Teoria dos Compiladores/Definições

Sabe-se que um computador só compreende linguagem binária, porém, mesmo os programas mais simples exigem um nível de abstração muito grande do programador, além de dispender muito tempo.
A Teoria dos Compiladores tem como objetivo estudar e definir os parâmetros que permitem a construção de linguagens de programação e sua execução.

O que é um compilador

Um compilador é um programa (ou um conjunto de programas) que traduz um código fonte para uma linguagem de mais baixo nível (a linguagem alvo, que tem uma forma binária conhecida como código objeto). Normalmente, o código fonte é escrito em uma linguagem de programação de alto nível, com grande capacidade de abstração, e o código objeto é escrito em uma linguagem de baixo nível, como uma seqüência de instruções a ser executada pelo processador.
O compilador é um dos dois tipos mais gerais de tradutores, juntamente com o interpretador.

Componentes de um compilador

A construção de um compilador é dividida em partes, cada uma com uma função especifica:

• Analisador Léxico (AL): separa no programa fonte cada símbolo que tenha algum significado para a linguagem ou avisa quando um símbolo que não faz parte da linguagem é encontrado.

• Análise Sintática (AS): é o responsável por verificar se as seqüências de símbolos existentes no programa fonte formam um programa válido ou não.
É construído sobre uma gramática composta de uma série de regras que descrevem quais são as construções válidas da linguagem.

• Análise Semântica (ASE): irá verificar se os aspectos semânticos estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador.
A ASE depende de uma tabela de símbolos onde são armazenadas as informações de variáveis declaradas, funções ou métodos, entre outros.

• Geração e Otimização de Código (GC): após a verificação que não existem erros sintáticos ou semânticos, o compilador realiza a sua tarefa de criar o programa objeto que reflete, mediante instruções de baixo nível, os comandos do programa fonte. Também pode fazer a melhoria do código, onde são aplicadas diversas técnicas para aperfeiçoar algumas características do programa objeto, como o seu tamanho ou sua velocidade.

O processo de compilação é composto de análise e síntese.

A análise tem como objetivos entender o código fonte, verificar erros, falhas e inconsistências, e representá-lo em uma estrutura intermediária.
Pode ser subdividida ainda em análise léxica, análise sintática e análise semântica.

A síntese constrói o código objeto a partir desta representação intermediária, e é mais variada, podendo ser composta pelas etapas de Geração de código intermediário, melhoria de código e geração de código final (ou código de máquina), sendo somente esta última etapa obrigatória.

120px-Nt-compilador.png

Pré-processador

Muitos compiladores incluem um pré-processador. Um pré-processador normalmente é responsável por mudanças no código fonte destinadas de acordo com decisões tomadas em tempo de compilação.
Por exemplo, um programa em C permite instruções condicionais para o pré-processador que podem incluir ou não parte do código caso uma assertiva lógica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou não. Tecnicamente, pré-processadores são muito mais simples que compiladores e são vistos pelos desenvolvedores como programas à parte, apesar dessa visão não ser necessariamente compartilhada pelo usuário.

Linker

Outra parte separada do compilador que muitos usuários vêem como integrado é o linker, cuja função é unir vários programas já compilados de uma forma independente e unificá-los em um programa executável.
Isso inclui colocar o programa final em um formato compatível com as necessidades do sistema operacional para carregá-lo em memória e colocá-lo em execução.

Interpretador

O que é um interpretador

Interpretadores são programas de computador que lêem um código fonte de uma linguagem de programação e os convertem em código executável.
Seu funcionamento pode variar de acordo com a construção. Em muitos casos o interpretador lê linha-a-linha e converte em código objeto à medida que vai executando o programa. Linguagens interpretadas são mais dinâmicas por não precisarem escrever-compilar-testar-corrigir-compilar-testar-distribuir, e sim escrever-testar-corrigir-escrever-testar-distribuir. Mas existem também linguagens que funcionam tanto como interpretadores quanto como compiladores, como, por exemplo, Python (quando requerido).

A princípio, podem-se construir compiladores e interpretadores para qualquer linguagem de programação. Mas para determinadas linguagens é mais fácil "fabricar" interpretadores, e para outras é mais prático um compilador.

Bytecode

Como vimos, um compilador traduz um programa de uma linguagem textual, facilmente entendida por um ser humano, para uma linguagem de máquina, específica para um processador ou um sistema operacional.

Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de Bytecode (código em bytes), que é um estágio intermediário entre o código-fonte (escrito numa linguagem de programação específica) e a aplicação final.

Para executar o bytecode utilizamos uma máquina virtual, que serve para interpretar e executar o bytecode.

As principais vantagens do bytecode são:

• Portabilidade (Independência de Sistema Operacional) — pois o bytecode roda na máquina virtual, e não no Sistema Operacional do equipamento.

• Não-necessidade do pré-processamento, típico dos compiladores.

O bytecode é encarado como um produto final, cuja validação da sintaxe e tipos de dados (entre outras funções dos compiladores) não será necessária.

Exemplos de linguagens que utilizam bytecode: Java, C# e Lua.

Just-In-Time Compiler (JIT)

Um compilador é chamado de Just-in-time compiler (JIT) quando seu processo de compilação acontece apenas quando o código é chamado.
Normalmente, o usuário tem a percepção que um compilador JIT é um interpretador.

Conclusão:

O Eclipse por ser uma IDE baseada em plugins, existem componentes que fazem parte do Eclipse e que são ferramentas que fazem análise, mas não são compiladores, a exemplo dos:

Editores Estruturados

Fornecidos como parte do ambiente de desenvolvimento de uma linguagem ou como recurso independente, mas vinculado a uma definição específica de uma linguagem.
Executa a criação e manipulação de textos como um editor de textos normal, mas direcionado para fontes em determinada linguagem.
Checa se as entradas estão corretas.
Coloca palavras chaves automaticamente.
Procura delimitadores de blocos de programa (begin, end, if, endif, etc…).

Pretty-print

Formatadores de código fonte.
Arruma o código escrito em determinada linguagem.
Chamados também de code beautifier.
Disponíveis para PHP, Java, C++, C, Perl, JavaScript, CSS, XML, etc.
Faz identação automática de linhas.
Adiciona comentários.
Remove espaços em branco.
Adiciona quebra de linha depois de ; }, etc.

Static Checker

Lê, analisa e descobre erros em potencial no programa fonte, sem traduzir ou executar o programa objeto.
Detecta partes do programa que nunca serão executadas.
Detecta que variável é executada sem a definição.
Detecta código morto.
Checa padrões.
Testa complexidade.

Referência Bibliográfica:

Eclipse Tarde - http://pesquompile.wikidot.com/eclipse-t
Eclipse Noite - http://pesquompile.wikidot.com/eclipse-n
Desenvolvendo Plug-ins do Eclipse - http://www.ibm.com/developerworks/br/library/os-ecplug/
Introdução à Teoria dos Compiladores/Definições - http://pt.wikiversity.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_Teoria_dos_Compiladores/Defini%C3%A7%C3%B5es
Compilador - http://www.guiadohardware.net/termos/compilador
Compiler, artigo da Wikipédia em inglês - http://en.wikipedia.org/wiki/Compiler
History of Compiler Writing, artigo da Wikipédia em inglês - http://en.wikipedia.org/wiki/History_of_compiler_writing
Interpreter, artigo da Wikipédia em inglês - http://en.wikipedia.org/wiki/Interpreter_%28computing%29

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License