Universidade de Brasília

Tamanho: px
Começar a partir da página:

Download "Universidade de Brasília"

Transcrição

1 Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação Desenvolvimento de um plugin para Applets Python em navegadores baseados no engine Gecko Johnny Souza Monografia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da Computação Orientador Prof. Dr. Marcus Vinicius Lamar Brasília 2009

2 Universidade de Brasília UnB Instituto de Ciências Exatas Departamento de Ciência da Computação Bacharelado em Ciência da Computação Coordenadora: Prof. a Dr. a Carla Maria Chagas e Cavalcante Koike Banca examinadora composta por: Prof. Dr. Marcus Vinicius Lamar (Orientador) CiC/UnB Prof. a Dr. a Carla Denise Castanho CiC/UnB Prof. Dr. Marco Aurélio de Carvalho CiC/UnB CIP Catalogação Internacional na Publicação Souza, Johnny. Desenvolvimento de um plugin para Applets Python em navegadores baseados no engine Gecko / Johnny Souza. Brasília : UnB, p. : il. ; 29,5 cm. Monografia (Graduação) Universidade de Brasília, Brasília, Python, 2. applet, 3. out-of-process, 4. navegador CDU 004 Endereço: Universidade de Brasília Campus Universitário Darcy Ribeiro Asa Norte CEP Brasília DF Brasil

3 Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação Desenvolvimento de um plugin para Applets Python em navegadores baseados no engine Gecko Johnny Souza Monografia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da Computação Prof. Dr. Marcus Vinicius Lamar (Orientador) CiC/UnB Prof. a Dr. a Carla Denise Castanho CiC/UnB Prof. Dr. Marco Aurélio de Carvalho CiC/UnB Prof. a Dr. a Carla Maria Chagas e Cavalcante Koike Coordenadora do Bacharelado em Ciência da Computação Brasília, 16 de julho de 2009

4 Dedicatória Dedico este trabalho ao querido amigo João Antônio (in memorian), que, mesmo ausente, influenciou as decisões relativas a este trabalho. iv

5 Agradecimentos Agradeço aos meus pais que não pouparam esforços para que eu chegasse até a Universidade. A Valquíria, minha esposa, pelo apoio, incentivo e compreensão desde o pré-vestibular e, principalmente, na conclusão deste trabalho. Ao Programa Interlegis, especialmente a Jean Ferri e a Rafahela Bazzanella, pela oportunidade de trabalhar com Python e pelo conhecimento compartilhado. Ao Instituto de Artes da Universidade de Brasília, especialmente ao Grupo Arteduca e às professoras Sheila Campello e Suzete Venturelli, pelos vários anos de convivência, amizade e valiosa contribuição para a minha formação acadêmica e profissional. Ao professor Marcus Vinicius Lamar, pela disposição em orientar este trabalho, confiança e paciência. À banca examinadora, professores Marco Aurélio e Carla Castanho, pelas contribuições para a melhoria da qualidade deste trabalho. v

6 Resumo Este trabalho apresenta a linguagem de programação Python comentando as suas principais características e diferenças entre as atuais implementações estáveis. Assim como o Gecko, um engine de renderização de páginas HTML, descrevendo o modelo de execução dos plugins, a sua interface de interação, plugins out-of-process e o uso da Máquina Virtual Python de forma embarcada. Os softwares implementados estendem as possibilidades de uso da linguagem Python, possibilitando o desenvolvimento de jogos incorporados a páginas da Internet. A implementação é descrita em um considerável nível de detalhes, assim como as propostas de restrições, as dificuldades encontradas e os resultados obtidos. Palavras-chave: Python, applet, out-of-process, navegador vi

7 Abstract This work presents the Python programming language commenting on its main characteristics and the differences between the current stable implementations. Gecko, a HTML rendering engine, is analyzed as well, describing the plugin execution model, it s interaction interface, out-of-process plugins and the use of the embedded Python Virtual Machine. The implemented softwares extend the use possibilities of the Python language, enabling the development of games embedded in web pages. The implementation is described in a considerable level of detail, as well as the proposed restrictions, the difficulties encountered and the achieved results. Keywords: Python, applet, out-of-process, browser vii

8 Sumário 1 Introdução Objetivos Definições preliminares Projetos relacionados Microsoft Silverlight Applets em Jython Grail Conclusões do capítulo Firefox e Gecko História Plugins Modelo de Execução Renderização e tratamento de eventos Python História Filosofia Python Características Simplicidade Fácil de aprender Software livre Altíssimo nível Portável Interpretada Multi-paradigma viii

9 3.3.8 Extensível Embarcável Biblioteca extensa Desempenho Desvantagens Linguagem de script Áreas de aplicação Modelo de execução Byte Code Embedding Python/C API Implementações CPython Jython IronPython Implementação Plugin Plug-in Software Development Kit - PSDK Registro e inicialização Out-of-process Classe nsplugininstance Pypplet Janelas e eventos Ligação estática Mensagens Depuração Modificações na PVM Estratégia Métodos Compilação e instalação Licenças de uso Resultados Obtidos 49 ix

10 5.1 Limitações Conclusão Trabalhos futuros Referências 58 x

11 Lista de Figuras 3.1 (a) Captura de tela do Código 3.5 (Java) em execução no Linux; (b) Captura de tela do Código 3.6 (Jython) em execução no Linux Integração entre IronPython e.net [21] Captura de tela do Código 3.7 em execução no Linux Registro do plugin Applet integrada à página HTML Delimitação da área da Applet Applet executada como uma aplicação Python comum Applets em execução paralela na mesma página Applet em execução no navegador Galeon Applet em execução no navegadores Epiphany xi

12 Lista de Tabelas 3.1 Funções da API comuns [39] xii

13 Lista de Códigos 1.1 Estendendo um programa em C com Python Programa Python Função fatorial recursiva em Python Byte Code do código Comando para compilação de programa C que utiliza Python Verão em Python do Código Aplicação com interface gráfica em Java Aplicação com interface gráfica em Jython Aplicação com interface gráfica em IronPython Estrutura de mensagem Estrutura de comandos Envio/recebimento de mensagens Macro DMSG Diretiva de proteção para alterações Diretiva de proteção para remoções Instalação de dependências Compilar Python Instalar Pygame Código HTML para uso de uma applet Configuração das dimensões da janela no Pygame xiii

14 Lista de Siglas.NET 3D ANSI API ASP BMP Framework para desenvolvimento e execução de sistemas e aplicações 3 dimensões American National Standards Institute Application Programming Interface Active Server Pages Bitmap file format CD-ROM Compact Disc Read-Only Memory CGI CLR COM CORBA CPU CSS DOS ELF FTP GDB GIF GIMP GPL GTK HTML Common Gateway Interface Common Language Runtime Component Object Model Common Object Request Broker Architecture Central Processing Unit Cascading Style Sheets Disk Operating System Executable and Linking Format File Transfer Protocol GNU Project debugger Graphics Interchange Format GNU Image Manipulation Program GNU General Public License The GIMP Toolkit HyperText Markup Language xiv

15 HTTP IBM IL IMAP IPC JPEG LGPL MB NASA NPAPI NPL PDA PEP PID PIL PNG POSIX PSDK PVM QNX RPC SDL SMTP TIFF VMS WAV XML ZIP ZODB HyperText Transfer Protocol International Business Machines Intermediate Laguage Internet Message Access Protocol Inter-process communication Joint Photographic Experts Group GNU Lesser General Public License Mega Byte National Aeronautics and Space Administration Netscape Plugin Application Programming Interface Netscape Public License Personal Digital Assistant Python Enhancement Proposals Process Identifier Python Imaging Library Portable Network Graphics Portable Operating System Interface Plug-in Software Development Kit Python Virtual Machine Sistema operacional de tempo real Remote Procedure Call Simple DirectMedia Layer Simple Mail Transfer Protocol Tagged Image File Format Virtual Memory System Waveform audio format extensible Markup Language Formato de compactação de arquivos Zope Object Database xv

16 Capítulo 1 Introdução Com a grande expansão da Internet ocorrida na última década [3] e os avanços das tecnologias implementadas na construção de hardwares e transmissão de dados, funcionalidades inovadoras foram adicionadas aos sites disponibilizados na Internet. As páginas deixaram de ter apenas textos estáticos e passaram ser compostas por vários tipos de conteúdos combinados, proporcionando aos usuários a apresentação da informação de forma mais dinâmica e interativa com o uso conjunto de vídeos, sons e até aplicações (applets). Dessa forma, os navegadores Web passaram a ser mais exigidos no que tange à diversidade de tipos de conteúdos que são capazes de manipular e exibir para o usuário. Durante esse mesmo período, surgiram novas linguagens de programação voltadas para os mais diversos domínios de aplicação e com características bastante variadas. Uma dessas linguagens, a linguagem Python, vem se destacando nos últimos anos pela simplicidade, versatilidade e flexibilidade atuando satisfatoriamente em vários domínios de aplicações e ganhando a atenção de grandes empresas que procuram um processo de desenvolvimento e manutenção de aplicações rápido e de baixo custo. Apesar da evolução observada tanto do lado dos navegadores e da Web, quanto do lado das linguagens de programação, ainda são poucas as opções de linguagens para o desenvolvimento de applets, principalmente se for levar em consideração as licenças sob as quais são disponibilizadas. Este trabalho propõe o uso da linguagem Python para o desenvolvimento de applets como uma solução livre e conservando as características da linguagem e de seu ambiente de execução. Neste contexto também se destaca a preocupação com a segurança para garantir tanto a integridade do sistema e a integridade e sigilo de dados sensíveis dos usuários. A importância dos tipos de transações realizadas pela Internet leva desenvolvedores e usuários a dar atenção as características de seus softwares que possam ser vulneráveis a ataques, principalmente no desenvolvimento de novas tecnologias. 1

17 1.1 Objetivos O objetivo deste trabalho é estudar técnicas que possibilitem a execução de código Python incorporados a páginas HTML (Applets) exibidas em navegadores Web implementando um plugin com essa finalidade. O objetivo específico deste trabalho é implementar um middleware 1 para possibilitar o uso da Máquina Virtual Python (PVM Python Virtual Machine) incorporada em conteúdos HTML, como Applets, semelhante à forma de integração de Java Applets e Flash com os navegadores disponíveis no mercado atualmente. Nesse contexto, esse middleware é chamado de plugin. Foi dado ênfase ao suporte de applets que implementem jogos e mini-jogos. O módulo Pygame, utilizado no auxilio ao desenvolvimento de jogos, foi disponibilizado para a construção da interface com o usuário. Como o aspecto de segurança não pode ser desconsiderado, foram implementados restrições à PVM para bloquear algumas funcionalidades que possam ser perigosas para o usuário quando estiver executando código Python desconhecido e não confiável. Não é objetivo deste trabalho uma implementação efetivamente segura, porém as questões relativas à segurança devem ser levados em consideração desde o início do desenvolvimento. 1.2 Definições preliminares Antes de detalhar este projeto é necessário definir alguns termos e tecnologias que são utilizados. Em alguns casos, por se tratar de termos conhecidos, porém muito amplos a definição apresentada é limitada e direcionada ao escopo deste trabalho. Python: Linguagem de programação orientada a objetos, interpretada, alto nível, de tipagem forte e dinâmica, com uma vasta biblioteca padrão e usada em diversos domínios de aplicação devido à sua alta flexibilidade e facilidade de aprendizado [28]. Este termo ora será usado para referenciar a linguagem de programação, ora para referenciar a implementação padrão da linguagem de programação, também conhecida como CPython. O capítulo 3 apresenta uma descrição mais detalhada de Python. Gecko: Núcleo de navegadores como o Netscape, Mozilla e seus derivados. É responsável pela leitura de conteúdos de páginas Web, principalmente HTML e imagens, e representá-los na tela. No navegador Firefox 3, o Gecko é usado para a renderização de toda a interface com o usuário. O termo navegador às vezes é utilizado para designar um processo que utiliza o Gecko. O capítulo 2 apresenta mais detalhes sobre Gecko, Firefox e a integração entre eles. Plugin: Um componente binário, uma biblioteca dinâmica escrita em C/C++ usando a NPAPI (Netscape Plugin Application Programming Interface), que manipula um 1 Segundo o Software Engineering Institute, middleware é um termo utilizado para designar um software que integra aplicações ou sistemas. [52] 2

18 tipo de conteúdo específico ou apenas alguns tipos de conteúdos similares. Estende as funcionalidades do Gecko e permite a exibição de diferentes tipos de conteúdo incorporados a páginas Web. De forma geral, os plugins se restringem a manipular conjuntos restritos de tipos de conteúdos. A variedade de tipos de conteúdos possíveis de usar em uma página Web é dependente dos plugins instalados no navegador. Os plugins mais comuns manipulam vídeos e animações. A seção 2.2 detalha questões sobre a integração entre os plugins e o Gecko. Applet: Pequena aplicação que pode ser executada sob o contexto de outra aplicação. O termo é mais usado para denotar uma aplicação que é carregada e executada automaticamente incorporada a páginas HTML como complemento ao conteúdo estático dessas páginas. As Applets mais difundidas são as Java Applets e Flash. A área de aplicação das Applets é muito abrangente, exemplos conhecidos são teclados virtuais para digitação segura de senhas e exibição de vídeos sem a necessidade de instalação de softwares adicionais. Para executar uma Applet no Gecko é necessário o plugin adequado para fazer a interface entre a Applet e o navegador. A Máquina Virtual Python pode ser utilizada para estender programas escritos em outras linguagens (principalmente C e C++) [46], conforme exemplificado no código #include <python2. 5 / Python. h> 2 int main ( int argc, char argv [ ] ) { 3 P y I n i t i a l i z e ( ) ; 4 PyRun SimpleString ( from time import time, ctime \n 5 p r i n t Today i s, ctime ( time ( ) ) \ n ) ; 6 P y F i n a l i z e ( ) ; 7 return 0 ; 8 } Código 1.1: Estendendo um programa em C com Python No código 1.1, adaptado de [46], o programa escrito na linguagem C executa, através da função PyRun SimpleString, o pequeno programa escrito em Python apresentado no código 1.2: 1 from time import time, ctime 2 print Today i s, ctime ( time ( ) ) Código 1.2: Programa Python Do mesmo modo que exemplificado nos códigos 1.1 e 1.2, foi escrito em C/C++ um plugin para o Gecko que execute um pequeno programa Python embutido em páginas Web. O uso de Python para complementar aplicações é abordado com mais profundidade na seção 3.9. Para isso foi necessário implementar o plugin usando técnicas de execução paralela (threads ou processos) para possibilitar o maior nível de assincronissidade possível entre o navegador e a Applet. Deixando a Applet e a interface gráfica do navegador independentes e minimizando o tempo de resposta ao usuário. Também é necessário um mecanismo para troca de input e output entre o plugin e a Applet. O output de uma Applet pode ser apenas texto, interfaces gráficas providas 3

19 por toolkits como GTK (The GIMP ToolKit), ou um framebuffer como o usado pela biblioteca de desenvolvimento de jogos Pygame. Para implementar tal mecanismo foi necessário estudar os métodos necessários para desenhar janelas das bibliotecas de acesso ao servidor X e do GTK, bem como os benefícios e detalhes de cada um dos sistemas. Além da parte funcional, deve ser levada em consideração a segurança para o usuário que executa o Applet em seu navegador. Apenas com a estrutura já apresentada, os Applets são executados sem nenhum tipo de restrição, ou seja, Applets maliciosos podem ter acesso a dados, danificar programas e arquivos do usuário. Nesse sentido, alguns aspectos devem ser considerados: Acesso não autorizado a dados do usuário. Acesso não autorizado de escrita ao sistema de arquivos. Uso excessivo de recursos de hardware (CPU (Central Processing Unit) e memória). Ataques de negação de serviço. Monopolização do processo do navegador. Um nível aceitável de segurança pode ser obtido usando um ambiente de execução restrito para a Applet em que as funções padrão da PVM que dão espaço para algum tipo de ataque são bloqueadas e a inclusão de módulos é controlada. Por exemplo, impedir que a Applet acesse o módulo so, que possibilita execução de tarefas específicas do sistema operacional, como o fork. Outra estratégia será substituir algumas funções, como a função open (para abrir arquivos) que pode ser substituída por uma similar que permita abrir apenas a alguns arquivos ou imponha restrições quanto ao modo de abertura dos arquivos. O plugin implementado é compatível, inicialmente, com o Gecko 1.9 (usado no Firefox 3 ) na plataforma Linux e oferece suporte à versão 2.6 da linguagem Python. Assim como a implementação de uma politica mais rígida de segurança, a compatibilização com outros sistemas operacionais e navegadores poderá ser feita posteriormente, não sendo uma meta deste trabalho. 1.3 Projetos relacionados Durante a pesquisa e revisão bibliográfica foram encontrados alguns projetos com finalidade semelhante a este trabalho Microsoft Silverlight O Silverlight é um framework para desenvolvimento de aplicações para a Web. Os programas desenvolvidos com esse framework são executados como Applets incorporadas em páginas HTML [4]. O Silverlight suporta as mesmas linguagens de programação suportadas pelo framework.net, incluindo IronPython [21]. 4

20 Atualmente esse framework pode ser executado somente nos sistemas operacionais Windows e Mac OS, entretanto existem planos para lançamento de uma versão compatível com Firefox no Linux usando o Mono, uma implementação do.net para plataformas não-windows Applets em Jython Utiliza toda a estrutura oferecida pelas Applets Java para a execução de programas Python por intermédio do interpretador Jython. É necessário carregar o interpretador além do programa que será efetivamente executado. [33] As Applets são escritas com código Python utilizando as bibliotecas disponibilizadas pelo Java. Exigindo, às vezes, do desenvolvedor um conhecimento maior das bibliotecas da linguagem Java do que da linguagem Python Grail O Grail foi um projeto ambicioso, que tinha como objetivo escrever um navegador Web puramente em Python, onde as Applets eram apenas uma de suas funcionalidade [53]. As restrições impostas às Applets e limitações da implementação são descritas por Guido van Rossum (criador da linguagem Python) em [53]. A última versão do Grail foi lançada em abril de 2000 e desde então o projeto parece estar abandonado [22]. As Applets são executadas em um ambiente restrito obtido pela eliminação de funções e módulos, além dá alteração do comportamento de outras funções [53]. As políticas de segurança do Grail são: Acesso somente de leitura a todo o sistema de arquivos, perante autorização do usuário. Acesso para leitura e escrita em arquivos em um diretório reservado para a Applet. Acesso irrestrito à rede. Acesso irrestrito a criação de widgets Tk. Acesso limitado a alguns componentes internos do Grail. As Applets são escritas utilizando a biblioteca gráfica de CPython, e são carregadas e executadas pelo AppletLoader, que tenta trabalhar assincronamente. Entretanto, como as Applets utilizam a thread principal do navegador, há sérios problemas de assincronissidade, podendo uma Applet monopolizar a CPU, congelando a interface do navegador. [53] 1.4 Conclusões do capítulo Este capítulo apresentou o objetivo deste trabalho, definição geral de termos e tecnologias utilizadas ou relacionadas ao contexto no qual está inserido. 5

21 Com o atual ritmo acelerado de desenvolvimento de aplicações, a linguagem Python vem ganhando espaço nesse cenário devido à sua simplicidade e flexibilidade que permitem rapidez tanto no aprendizado quanto no desenvolvimento propriamente dito. A proposta desse trabalho é estender as possibilidades de uso da linguagem Python para o desenvolvimento de Applets para navegadores de Internet. Existem iniciativas e esforços empregados em projetos com finalidade semelhante a este trabalho, porém algumas características destes projetos justificam o desenvolvimento deste trabalho: Silverlight: como descrito na seção , existem diferenças e incompatibilidades entre a linguagem Python implementada por CPython e pelo IronPython. Além disso a biblioteca padrão utilizada é a do framework.net. Applets em Jython: Ainda são applets em Java, o suporte a Python é provido por um interpretador escrito em Java. A biblioteca padrão utilizada é a da linguagem Java. Grail: Não é um plugin para um dos navegadores atualmente utilizados, é um navegador completo que suporta applets em Python. O projeto parece abandonado desde Estes projetos apresentam problemas principalmente quanto às licenças de uso e à necessidade do conhecimento das bibliotecas e características de outras linguagens de programação. Dessa forma, este trabalho propõe uma implementação fortemente baseada na implementação CPython, que utilize a biblioteca padrão do Python e que possua uma licença compatível como a GPL (GNU General Public License). Não impondo aos desenvolvedores que já conhecem Python a necessidade de adaptação às características diferenciadas das demais implementações, de conhecimento da biblioteca padrão de outras linguagens e de restrições de uso devido a licenças de software. 6

22 Capítulo 2 Firefox e Gecko O Firefox é um navegador Web de código livre, o principal produto da Mozilla Fundation, que traz funcionalidades inovadoras para o conceito de navegador [25]. É uma alternativa de qualidade ao navegador da Microsoft, o Internet Explorer, e vem ganhando mercado no mundo todo, uma vez que no primeiro semestre de 2008 apresentou crescimento de 26% no número de usuários. No Brasil, possui de 8,6% do mercado [54]. Dentre as suas funcionalidades [26] da versão 3, as principais são: Fácil gerenciamento de senhas salvas. Instalação de extensões simplificada. Gerenciador de downloads. Zoom de página completa. Barra de buscas integrada com os principais sites de buscas. Mensagens de alerta de segurança em linguagem fácil e acessível. Monitoramento de Plugins. Criação de arquivos ZIP. O Gecko é o núcleo do Firefox e de muitos outros navegadores Web, como o Mozilla e o Galeon, também é utilizado em aplicações para leitura de e qualquer outra aplicação que possa se beneficiar da sua principal funcionalidade: representar páginas HTML na tela. Foi inicialmente desenvolvido para o Netscape, já teve muitos nomes (assim como o Firefox), hoje é um programa de código livre de alta qualidade, sua implementação é compatível com os padrões definidos de HTML e CSS 1 (Cascading Style Sheets) [26]. Atualmente o Gecko é utilizado também para representação de toda a interface gráfica do Firefox [26]. Tem suporte a plugins que expandem as suas capacidades o tornando muito flexível e poderoso com um vasto campo de possibilidades de uso. 1 Algumas incompatibilidades existem devido a ambiguidades dos padrões [26] 7

23 2.1 História O núcleo de renderização do Netscape Navigator [15], originalmente escrito para a versão 1.0 deste navegador, foi atualizado durante anos e era considerado inferior ao usado pelo Internet Explorer devido a uma série de limitações. Em 1997 a Netscape começou a desenvolver em paralelo um novo núcleo de renderização de páginas HTML com a intenção de substituir o anterior. Em 1998 com o surgimento do projeto Mozilla, a Netscape licenciou o código fonte do novo núcleo de renderização sob uma licença de código aberto. Originalmente o seu nome era Raptor, mas por problemas de propriedade de marca foi alterado para NGLayout (Next Generation Layout), e depois para Gecko (marca registrada da Netscape). Em 2000, foi lançado o Netscape 6.0, que usava o Gecko. Em 2003 a Mozilla Foundation (fundada no mesmo ano) passou a ser a principal desenvolvedora do Gecko. Desde 1998 o projeto Mozilla (e depois a Mozilla Foundation) desenvolve a Mozilla Application Suite, um conjunto de aplicações completo para Web. Em 2003 anunciou que focaria seus esforços de desenvolvimento para um navegador, que seria uma variação do navegador Mozilla Suite, inicialmente chamado Phoenix que teve a primeira versão lançada em Por problemas com marcas registradas, passou a ser chamado de Firebird e por pressão da comunidade de desenvolvedores do banco de dados Firebird, o nome foi alterado para Mozilla Firebird e, depois para Mozilla Firefox (ou somente Firefox) [20]. Em 2004 foi lançada a versão 1.0 do Firefox. As versões subsequentes do software fizeram grande sucesso, o Firefox foi eleito o Software do Ano pelo Prêmio INFO 2007 [9] e o Produto do Ano 2008 pela PC World na categoria Web Browser [10]. Em 2008 lançou a versão 3.0 utilizando o Gecko Plugins Os plugins são bibliotecas de ligação dinâmica, específicas a uma plataforma, e só podem ser executados pelo navegador [42] utilizando a Netscape Plug-in API (NPAPI). São armazenados em arquivos com o mesmo formato utilizado pelo sistema operacional em uso para representar bibliotecas dinâmicas. A NPAPI é dividida em 3 partes: Métodos do plugin: são métodos ou funções implementadas pelo plugin e invocadas pelo Gecko. Todas tem nomes com o prefixo NPP, exceto as funções NP Initialize e NP Shutdown. Métodos do Navegador: são funções implementadas pelo Gecko e invocadas pelo plugin. Todas tem nomes com o prefixo NPP. Estruturas de dados: Todas tem nomes com o prefixo NPP. 8

24 2.2.1 Modelo de Execução Na inicialização do navegador (mais precisamente, do Gecko), é executado um procedimento de varredura em diretórios pré-definidos em busca de plugins disponíveis. Quando um plugin é encontrado, ele é registrado com a informação dos tipos de conteúdos suportados, que é disponibilizada pela função NPP GetMIMEDescription. Quando é solicitado ao Gecko a exibição de uma página HTML que possua um tipo de conteúdo incorporado através das tags OBJECT ou EMBED, o Gecko procura nos plugins registrados qual suporta o tipo de conteúdo incorporado. Ao encontrar o plugin necessário, o seu código é carregado à memória, se ainda não estiver. Toda vez que o plugin é carregado em memória, é executada uma única vez a função de inicialização, a NP Initialize. Essa função é chamada pelo navegador e é responsável pela inicialização global do plugin, pela a alocação de memória e de outros recursos que serão compartilhados por todas as instâncias do plugin. No processo de inicialização do plugin o navegador disponibiliza para o plugin duas tabelas com todas as funções da NPAPI. Uma das tabelas já está preenchida com os endereços das funções implementadas pelo navegador e a outra será preenchida pelo plugin com os endereços das funções que implementa durante a execução de NP Initialize. O navegador cria instâncias do plugin com chamadas à função NPP New. O Navegador cria quantas instâncias forem necessárias e elas podem ser usadas em uma mesma página quando há vários conteúdos de mesmo tipo incorporados ou quando várias janelas ou abas do navegador exibem páginas em utilizam conteúdos do tipo suportado pelo plugin. A função NPP New recebe, entre os seus argumentos, todos os atributos da tag EMBED usada para incorporar o conteúdo e é responsável pela instanciação de uma instância do plugin e pela alocação de memória e outros recursos que serão usados por essa instância. Cada instância do plugin é responsável por desenhar e redesenhar o espaço de tela designado a ela e tratar os eventos gerados pelos usuários ou enviados pelo navegador. Estes processos serão abordados posteriormente. Quando o usuário fecha uma página todas as instâncias do plugin usadas por ela são destruídas com uma chamada à função NPP Destroy que é responsável pela liberação da memória e outros recursos usados pela instância que está sendo destruída. Após a destruição da última instância do plugin, não é mais necessário manter o código do plugin em memória, então, o navegador chama a função NP Shutdown que é responsável pelas estruturas e recursos globais do plugin. Após a execução de NP Shutdown, o código do plugin é retirado da memória do computador. Se o sistema possuir grande quantidade de memória disponível, o navegador pode manter o plugin carregado em memória para eventual uso posterior Renderização e tratamento de eventos O modo de renderização e tratamento de eventos é dependente do tipo de janela selecionada para uso no plugin, windowned ou windowless, que é uma escolha do desenvolvedor do plugin. 9

25 Uma instância do plugin pode ser exibida como parte de uma página HTML ou como um arquivo separado em sua própria janela. Caso seja exibida de forma incorporada a um conteúdo (página) HTML, pode ter as formas windowed ou windowsless. Caso exibida em sua própria janela, a forma usada é windowed. A principal diferença entre windowned e windowless está no alvo de renderização, o primeiro renderiza em uma janela nativa do sistema de janelas da plataforma o outro renderiza em um buffer bitmap. Informações como o identificador da janela (ou porta), offset e dimensões da área do plugin são passadas à instância na função NPP SetWindow como um parâmetro de tipo NPWindow, que pode representar tanto janelas nativas quanto buffers bitmaps. Essa estrutura é específica de cada plataforma e os seus dados variam de acordo com o sistema operacional em uso Plugin windowned Possui sua própria janela nativa, normalmente como uma janela filha da janela do navegador, provida pelo sistema de janelas da plataforma em uso. É nesta janela que o plugin usará rotinas específicas do sistema de janelas para renderizar as informações necessárias ao usuário. Na plataforma Mac OS, a instância do plugin não recebe uma janela própria devido a limitações da plataforma, a renderização é feita em uma parte da porta gráfica associada à janela principal do navegador delimitada por um offset definido pelo navegador. A área de renderização é retangular, opaca, e é tratada pelo Gecko de forma que esconde a parte da página que estiver atrás dela. O plugin determina quando e como a área será desenhada sem interferência do navegador. O navegador cria uma janela para cada instância do plugin e o notifica através da função NPP SetWindow tipicamente logo após a criação da instância para que o plugin inicie imediatamente a renderização. Porém o navegador pode chamar essa função novamente sempre que as dimensões da área de renderização forem alteradas, ou para substituir, ou eliminar a janela em uso. Em sistemas derivados do Unix, o navegador cria um Motif Drawing Area widget para cada instancia do plugin e passa o window ID desse widget para o plugin no campo window da estrutura NPWindow. O campo ws info recebe um ponteiro para uma estrutura do tipo NPSetWindowCallbackStruct que contêm atributos do Standard X Toolkit com informações sobre a conexão do servidor X referente à janela criada pelo navegador e disponibilizada à instância do plugin. Com essas informações é possível recuperar os eventos gerados pelo usuário e desenhar na janela. Todos os eventos da interface gráfica e do usuário são manipulados de acordo com o mecanismo do sistema de janelas da plataforma. No Unix, o processamentos de eventos são relativos à janela-filha recebida em NPWindow e é realizado através da a API do servidor X. Todos os plugins são windowned por padrão. 10

26 Plugin windowless Uma instância de um plugin windowless não requer uma janela nativa, mas sim um buffer. No Unix esse buffer é a estrutura Drawable provida pela Xlib. O plugin deve informar ao navegador que é windowsless, caso contrário, será considerado windowed. Isso deve ser feito durante a instanciação, na execução da função NPP New, com uma chamada à função NPN SetValue alterando a variável NPPVpluginWindowBool para falso. A área de renderização é retangular, como a de um plugin windowed, porém pode ter partes transparentes e partes opacas, possibilitando que, como resultado visual, o plugin assuma formas irregulares. O navegador é responsável por renderizar a região da página HTML que está atrás das partes transparentes do plugin. Como o plugin não possui uma janela própria, o navegador é responsável pela entrega dos eventos do usuário que o plugin deve tratar através da função NPP HandleEvent. O navegador separa os eventos que deve processar dos que o plugin deve tratar, e utiliza a função NPP HandleEvent como meio de entregar ao plugin os eventos que ele deve realizar o tratamento. Os eventos são específicos do sistema de janelas da plataforma, o navegador apenas os separa. Como o plugin não pode renderizar diretamente na janela do navegador e nem no momento que desejar, o navegador é responsável por exibir o drawable do plugin na tela e o plugin não pode renderizar em sua drawable sem receber uma Paint Message. Antes de atualizar o drawable, o plugin deve invalidar a parte que será atualizada por meio das funções NPN InvalidateRect ou NPN InvalidateRegion. Em intervalos regulares de tempo o navegador solicita ao plugin que ele redesenhe as áreas inválidas, enviando um evento (Paint Message) com uma chamada à função NPP HandleEvent. Sempre que parte da drawable é invalidada, o plugin recebe uma Paint Message assíncrona. O plugin pode forçar uma Paint Message com uma chamada à função NPN ForceRedraw, que envia uma Paint Message síncrona. Caso o plugin precise criar menus de contexto ou caixas de diálogo, será necessário obter a janela do navegador para criá-los. Isso pode ser feito com uma chamada à função NPN GetValue buscando o valor da variável NPNVnetscapeWindow. De forma geral um plugin windowsless, quando comparado a um plugin windowed, oferece mais flexibilidade no layout de uma página HTML por poder assumir formas irregulares, porém é mais difícil de desenvolver, mais instável, e apesar de não utilizar janelas nativas da plataforma ainda continua dependente da plataforma para a renderização e tratamento de eventos. 11

27 Capítulo 3 Python Python é uma linguagem desenvolvida para uso geral objetivando a abrangência de vários domínios de aplicação. Atualmente é usada por muitos usuários e empresas para diversas tarefas como, construção de Web sites, testes de hardware, análise e cálculos numéricos, customização de bibliotecas e aplicações, animações de vídeos e muitas outras. Como Python é uma linguagem de uso geral, os domínios de aplicação nos quais pode ser utilizada são limitados apenas ao escopo dos computadores. É uma linguagem interpretada de altíssimo nível com tipagem dinâmica e fortemente tipada. Proporciona alta produtividade aos programadores, código legível e reaproveitável como conseqüência de sua sintaxe simples e abstração de detalhes de implementação. Programas escritos em Python podem ser executados sem modificações na grande maioria dos sistemas operacionais em uso atualmente. É uma linguagem de programação simples, porém não deixa de ser flexível e aplicável em diversos domínios de aplicação. A sintaxe é limpa, fácil ler e entender código Python mesmo no primeiro contato com a linguagem. É uma linguagem simples tanto para iniciantes como para programadores experientes. O Python (interpretador e biblioteca padrão) é livre e seu código fonte é distribuído sob uma licença compatível com GPL. Não há restrições para cópias, modificação, ou redistribuição inclusive para uso comercial. O Python é desenvolvido por uma comunidade que coordena os seus esforços através da Internet, formada por Guido van Rossum (ditador benevolente) e milhares de membros em vários países. Muitos módulos Python são distribuídos juntamente com o interpretador, por isso fazem parte da Biblioteca Padrão do Python. A Biblioteca Padrão é composta por módulos multiplataforma e alguns dependentes de plataforma e dão suporte a muitas tarefas. A biblioteca padrão está disponível em qualquer computador que possua o Python instalado. Módulos adicionais que acrescentam funcionalidades aos módulos da biblioteca padrão ou implementam novas classes e procedimentos podem ser instalados separadamente. 12

28 3.1 História Em 1989, Guido van Rossum, criador da linguagem Python [28], pensou em desenvolver uma linguagem de script para escrever e testar scripts de administração no sistema operacional em que trabalhava, o Amoeba. Anteriormente, Guido trabalhou por 4 anos no projeto que desenvolveu a linguagem ABC e queria usar idéias interessantes da linguagem ABC (algumas que não foram implementadas) e viu na nova linguagem uma oportunidade de aplicá-las. [34, 50] O nome Python é uma homenagem à série britânica de televisão Monty Python s Flying Circus, exibida no início da década de 70, da qual Guido é fã. O desenvolvimento da nova linguagem teve início nos feriados de fim de ano de 1989, e em 1991 a primeira versão foi publicada. De 1995 a 2001, o desenvolvimento da linguagem foi patrocinado pelas empresas Corporation for National Research Initiatives, BeOpen.com e Digital Creations (hoje Zope Corporation), que possuem a propriedade intelectual das versões lançadas este período. Em 2001 foi criada a Python Software Foundation com objetivo de deter a propriedade intelectual sobre o Python. Atualmente a Zope Corporation é membro patrocinadora da Python Software Foundation. Atualmente Guido trabalha no Google (maior usuário de Python do mundo) e dedica parte do seu tempo ao Python. Muitos dos principais desenvolvedores do Python trabalham na Zope Corporation. 3.2 Filosofia Python O desenvolvimento da linguagem Python é guiado por 4 princípios, qualidade, produtividade, portabilidade e integração, que também são os principais motivos para usar Python. Qualidade de Software: Com Python é possível escrever programas que podem ser facilmente entendidos, modificados e reutilizados. A sintaxe simples força os programadores a escreverem código legível que pode ser reaproveitado ou modificado por outras pessoas facilmente. E como a linguagem Python tenta fazer o melhor, a comunidade de usuários corresponde com a mesma atitude, gerando um esforço geral em prol de softwares com elevado nível de qualidade. A linguagem foi projetada para ser ortogonal, explícita e minimalista no seu núcleo, adicionando a complexidade de ferramentas específicas a domínios de aplicação separadas em um extenso conjunto de bibliotecas modulares. Como a sintaxe da linguagem é simples, é possível usá-la sem consultas constantes ao manual de referência. Outro ponto importante é que limita o número de meios para realizar uma tarefa, reduzindo assim a complexidade do código e a possibilidade de bugs no código escrito. 13

29 Produtividade dos desenvolvedores: Python é otimizado para velocidade de desenvolvimento. É possível escrever programas em Python com maior velocidade do que é possível escrever programas em C/C++ ou Java devido à sintaxe simplificada e ao fato do interpretador abstrair detalhes que necessitam ser explícitos em linguagens de baixo nível, como declaração de tipos e variáveis e gerenciamento de memória. Como a quantidade de código produzido é consideravelmente menor, também diminuem o custo de manutenção e a quantidade de bugs para resolver, proporcionando maior velocidade no desenvolvimento. A não obrigatoriedade de definir tipos de dados de variáveis contribui muito para a flexibilidade da linguagem. Como o código não é restrito a um determinado tipo de dado, ele pode ser reaproveitado para os mais variados tipos de dados. Os tipos das variáveis são definidos automaticamente para obter a melhor forma de representar o dado a ser armazenado na variável, quando é realizada uma operação entre tipos de dados incompatíveis, um erro ocorre. Como resultado disso obtém-se uma linguagem ágil e flexível. Portabilidade: Programas escritos em Python podem ser executados sem modificações na grande maioria dos sistemas operacionais em uso atualmente. O núcleo da linguagem e a biblioteca padrão são amplamente independente de plataforma e provêm mecanismos para lidar com a dependência, quando ela existe. Programas desenvolvidos em uma plataforma específica e que não usam recursos dependente de plataforma podem ser executados de forma idêntica em outras plataformas. Interfaces gráficas implementadas usando o módulo Tkinter da biblioteca padrão funcionam de forma similar em diferentes plataformas, porém a aparência é a padrão do sistema operacional em uso, módulos como o wxpython possibilitam similaridade também na aparência. Alguns módulos que disponibilizam interfaces para recursos específicos de um sistema operacional, como o módulo winsound que possibilita acesso ao sistema de som do Windows, apesar de pertencerem à biblioteca padrão, tornam os programas que os utilizam não portáveis. A portabilidade disponibilizada pelo Python contribui para a velocidade no desenvolvimento e teste de aplicações multiplataforma. Integração de componentes: O Python foi projetado para possibilitar a integração com componentes de outras ferramentas ou linguagens. Tornando-se útil para controle de aplicações e de seus componentes, e também possibilitando o uso de bibliotecas e módulos de outras linguagens de programação, aliando as vantagens e funcionalidades dessas linguagens com as próprias do Python. Tin Peters escreveu 19 versos para descrever os princípios do Python [44]. vinte versos, porém o vigésimo nunca foi escrito. Seriam Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. 14

30 Sparse is better than dense. Readability counts. Special cases aren t special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one and preferably only one obvious way to do it. Although that way may not be obvious at first unless you re Dutch. Now is better than never. Although never is often better than right now. If the implementation is hard to explain, it s a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea let s do more of those! 3.3 Características Nesta seção serão comentadas as principais características da linguagem de programação Python. Essas características fazem da linguagem uma ferramenta extremamente abrangente e amigável, além de serem desenvolvidas seguindo os princípios da filosofia que guia o desenvolvimento do Python Simplicidade Python é uma linguagem de programação simples, porém não deixa de ser flexível e aplicável em diversos domínios de aplicação. Python segue o princípio de que uma boa linguagem não deve conter atalhos convenientes, casos especiais e otimizações misteriosas, mas deve balancear os princípios gerais com bom senso e de modo que atinja um alto grau de praticidade. A sintaxe é uma simplificação de linguagens como Pascal, Algol e C, não utiliza símbolos como {, } e ; para a delimitação de linhas e blocos de código, a maioria das palavras chaves são derivadas de C e próximas do inglês. A sintaxe enxuta e com poucas regras possibilita maior naturalidade e facilidade para escrever e ler código Python, resultando em aumento ganho de produtividade dos programadores. Normalmente programas escritos em Python são de 3 a 5 vezes menores que programas equivalentes escritos em Java, e de 5 a 10 vezes menores que programas equivalentes escritos em C++ [17] Fácil de aprender Quando comparada com outras linguagens de programação, Python é considerada notavelmente fácil de aprender. É possível escrever programas significantes em apenas alguns dias de estudo, ou horas para os que já tem experiência em programação. Isso é consequência da sintaxe extremamente simples, como já foi mencionado. 15

31 É fácil ler e entender código Python mesmo no primeiro contato com a linguagem. É uma linguagem simples tanto para iniciantes como para programadores experientes Software livre A comunidade de desenvolvedores do Python liderada por Guido van Rossum possui milhares de membros em vários países. O direcionamento dos esforços de desenvolvimento é feito em conjunto com a comunidade de usuários através das Python Enhancement Proposals (PEPs). Qualquer pessoa pode propor uma mudança ou melhoria no Python escrevendo uma PEP que é discutida pela comunidade. O uso do Python é gratuito e o seu código fonte é distribuído livremente e licenciado pela Python license (compatível com GPL). O uso para fins comerciais é permitido pela Python license Altíssimo nível Python possibilita a abstração de detalhes de baixo nível da implementação, como gerenciamento de memória e chamadas ao sistema. As bibliotecas e tipos de dados inclusos em Python possibilitam o uso de chamadas ao sistema (módulos sys e os), strings de tamanho variável, arrays de tamanho variável (listas), tabelas de hash (dicionários) de forma muito simples e intuitiva, sem a dificuldade e de implementar essas funcionalidades em C. Também possibilitam a construção expressões complicadas em uma única linha de código sem perder a legibilidade. Não é necessário declarar variáveis, se precisar de uma nova variável, use-a. Quando um valor é atribuído a um nome, o Python automaticamente determina o tipo de dado requerido para a correta representação do valor. Isso possibilita maior liberdade para o programador se concentrar no algoritmo e não na forma de representá-lo na linguagem Portável Na implementação padrão de Python (CPython), o interpretador Python é escrito em ANSI 1 C e não depende de nenhum recursos específico de uma plataforma de hardware ou de um sistema operacional, o que possibilita que seja compilado e executado de forma idêntica na grande maioria das plataformas em uso atualmente. É possível compilar e executar o interpretador Python em uma grande variedade de sistemas operacionais (Linux, Unix, Windows, DOS, FreeBSD, Mac OS, Solaris, OS/2, Amiga, BeOS, OS/390, z/os, VMS (Virtual Memory System), QNX, VxWorks, Palm OS, PocketPC, Symbian OS) e em diversos dispositivos de hardware que vão desde celulares, PDAs (Personal Digital Assistant), vídeo games e ipods até mainframes IBM e supercomputadores. [31] Assim como o interpretador da linguagem, os módulos da biblioteca padrão distribuída com o interpretador também são implementados de forma a serem multiplataforma, dentro de suas possibilidades. 1 American National Standards Institute 16

32 Os programas escritos em Python usando apenas os principais módulos da biblioteca disponibilizada com o interpretador não são dependentes de uma plataforma específica para serem executados. Podem ser executados em qualquer computador ou dispositivo no qual exista o interpretador Python e o funcionamento será idêntico ao obtido quando executados em outras plataformas. Existem módulos que possibilitam o uso de funcionalidades específicas de uma plataforma como, por exemplo o módulo winsound que disponibiliza acesso ao mecanismo básico de reprodução de sons no Windows. Obviamente, programas que utilizem este módulo não são multiplataforma Interpretada Programas escritos em linguagens como C, C++ e Pascal são compilados para a linguagem de máquina reconhecida pelo computador que executará o programa (código binário). No momento da execução, o programa é carregado do disco rígido para a memória, ligado às bibliotecas compartilhadas e o processador realiza a execução. Programas escritos em Python não necessitam de compilação para o código binário, o programa é executado diretamente a partir do código fonte pelo interpretador. Internamente o código fonte e traduzido para um código intermediário chamado Byte Code e então o interpretador executa as instruções nativas do hardware correspondente ao Byte Code Multi-paradigma Python é uma linguagem de programação completamente Orientada a Objetos. Todos os componentes do Python são objetos, inclusive tipos de dados primitivos, funções e módulos. Seu modelo de classes disponibiliza funcionalidades como determinação de atributos em tempo de execução, polimorfismo (argumentos variáveis, número ilimitado de argumentos), sobrecarga de operadores, herança múltipla, ligação postergada. O modelo e classes é facilmente representado dentro da sintaxe simples de Python, além de servir como uma poderosa ferramenta de integração com outras linguagens, podendo especializar classes de outras linguagens orientadas a objetos, com o devido código de ligação. Porém a Programação Orientada a Objetos não é um paradigma imposto pelo Python [41], é possível programar com orientação estruturada/procedural ou orientação funcional. Isso evita que os programas se tornem desnecessariamente complexos, mas também permite o uso das vantagens da orientação a objetos quando necessário Extensível Python pode ser integrada com outras linguagens de programação possibilitando o aproveitamento de classes e funções já implementadas nessas linguagens e, também, as vantagens que as outras linguagens podem oferecer, como a velocidade que a linguagem C oferece [17]. Existem muitos módulos de Python que são construídos sobre bibliotecas já 17

33 existentes para outras linguagens (normalmente C) estendendo as suas funcionalidades. Um exemplo é o módulo Pygame, destinado ao desenvolvimento de jogos, que adiciona uma camada de abstração e de funcionalidade sobre a Simple DirectMedia Layer (SDL), uma biblioteca para acesso de baixo nível a recursos de áudio, vídeo e dispositivos de entrada. A capacidade de integração também pode ser utilizada para implementar partes críticas do algoritmo que necessitam de alta velocidade de execução ou de sigilo do algoritmo. A desvantagem é que a portabilidade da aplicação fica reduzida, mesmo que a parte em C não dependa da plataforma, é necessário recompilá-la novamente para cada arquitetura em que será executada. Além de C e C++, é possível a integração com objetos Component Object Model (COM),.NET, Common Object Request Broker Architecture (CORBA) e Java [18]. A seção 3.10 apresenta mais detalhes sobre implementações do Python que possibilitam acesso automático e transparente a APIs de outras linguagens Embarcável É possível utilizar o interpretador Python como parte de outra aplicação, isso permite que seja utilizado código Python para implementar partes do código da aplicação maior. Esta característica (ou funcionalidade) do Python é muito utilizada em diversos softwares como linguagem de script ou para o desenvolvimento de plugins, como exemplos, temos os programas PhotoShop (editor de imagens) e o Blender (modelagem e animação 3D 3 dimensões). A seção 3.9 apresenta maiores detalhes Biblioteca extensa Muitos módulos Python são distribuídos juntamente com o interpretador, por isso fazem parte da Biblioteca Padrão do Python. A Biblioteca Padrão é composta por módulos multiplataforma e alguns dependentes de plataforma, que dão suporte a muitas tarefas envolvendo expressões regulares, cálculos matemáticos, testes de unidade, threads, acesso a banco de dados, rede, , HTTP, FTP (File Transfer Protocol), HTML, CGI (Common Gateway Interface), XML (extensible Markup Language), XML-RPC (XML Remote Procedure Call), WAV (Waveform audio format), criptografia e interface gráfica. [30, 38] A biblioteca padrão está disponível em qualquer computador que possua o Python instalado. Módulos adicionais que acrescentam funcionalidades aos módulos da biblioteca padrão ou implementam novas classes e procedimentos podem ser instalados separadamente. 18

34 3.4 Desempenho Pelas características já apresentadas é possível perceber que o desempenho dos programas em Python é inferior ao desempenho de programas equivalentes escritos em C ou C++. Porém, a importância dessa diferença na velocidade de execução dos programas varia de acordo com a finalidade do programa. Na maioria dos domínios de aplicação essa diferença de desempenho não é relevante. Geralmente programas que necessitam de muita interação com o usuário ou utilizam a rede com frequência não são afetados. As interações com o sistema, como acessar arquivos e criar interfaces gráficas, são ligações externas com as mesmas bibliotecas nativas usadas pelos programas em C ou C++. Adicionalmente, o interpretador Python possui uma implementação extremamente otimizada das bibliotecas e estruturas de dados usadas para implementar os tipos de dados padrões, dessa forma a maioria dos programas escritos em Python apresentam desempenho muito próximo ao de programas semelhantes escritos em C ou C Desvantagens Em termos gerais, Python não é indicado para aplicações que necessitem de alta velocidade de execução. Para a maioria das aplicações a diminuição do desempenho não é relevante, mas alguns domínios específicos de aplicação, por exemplo aplicações que necessitam de respostas em tempo real, não são atendidos de forma satisfatória pelo Python. Mesmo assim o Python pode ser útil no processo de desenvolvimento dessas aplicações como linguagem para protótipos. Havendo, assim, uma economia de tempo na elaboração, teste e depuração do algoritmo. 3.6 Linguagem de script Python é uma linguagem de uso geral que frequentemente é classificada como linguagem de script, às vezes como linguagem de script orientada a objetos. É comum também utilizar o termo script ao invés de programa para denotar um software escrito em Python. Isso causa uma certa confusão principalmente porque linguagem de script pode ter significados diferentes para observadores diferentes. Normalmente, três associações muito diferentes costumam ser feitas quando as pessoas ouvem que Python é uma linguagem de script: Ferramenta de Shell: Algumas pessoas pensam que Python é uma ferramenta para codificação de scripts voltados sistemas operacionais, como programas que são chamados por linha de comando e realizam tarefas como o processamento de textos e lançamento de outros programas. 19

35 Programas Python podem desempenhar essa função com grande simplicidade e flexibilidade, porém este é apenas um dos vários domínios de aplicação da linguagem. Linguagem de controle: Deste ponto de vista, Python é visto como código usado para controlar e direcionar componentes de outra aplicação. Programas Python são utilizados no contexto de grandes aplicações. Por exemplo, na execução de teste de hardware, Python é usado para controlar programas de baixo nível que realizam tarefas especificas no dispositivo de hardware. Outro exemplo de uso é para a personalização de aplicações, onde Python é usado em pontos estratégicos possibilitando alterar aspectos da aplicação sem a necessidade de recompilação. Python pode ser, e é, utilizado para este fim com grande sucesso, principalmente em aplicações gráficas e de animação que utilizam Python nos scripts de controle e extensão. Porém é possível escrever programas Python que não dependam do contexto de outra aplicação, este é apenas mais um domínio de aplicação da linguagem. Facilidade de uso: Outras pessoas pensam que Python é uma linguagem simples e de fácil uso para realização de tarefas rápidas. Isso é verdade, a simplicidade da linguagem é uma das principais características, porém permite que os programas evoluam para aplicações tão sofisticadas quanto necessário. Python é de fato uma linguagem de script, mas não está limitada a isso. De forma geral o termo linguagem de script é melhor usado para descrever a possibilidade de desenvolvimento rápido e flexível oferecida pelo Python do que um domínio de aplicação específico, como os mostrados acima. 3.7 Áreas de aplicação Nesta seção serão apresentados breves resumos de alguns dos possíveis domínio de aplicação da linguagem Python. Ferramentas de sistema Uma das intenções iniciais do criador do Python, scripts e administração de sistemas. A interface do Python com o sistema operacional faz dele uma ferramenta poderosa para processamento de arquivos e monitoramento de de outras tarefas. A biblioteca padrão do Python possui ligações para a todas as ferramentas POSIX (Portable Operating System Interface): variáveis de ambiente, arquivos e sockets. Interfaces gráficas A biblioteca padrão possui o módulo Tkinter que provê acesso ao sistema de janelas da plataforma em uso. É multiplataforma, porém, a aparência das janelas variam de acordo com o tema padrão da plataforma em uso. Internet Os módulos da biblioteca padrão relacionados com Internet e rede possibilitam o realização de várias tarefas relacionadas aos protocolos HTTP, FTP (File Transfer Protocol), IMAP (Internet Message Access Protocol), SMTP (Simple Mail Transfer Protocol) e outros, atuando tanto como cliente quanto como servidor. 20

36 Integração de componentes É possível, pela facilidade de implementação de uma interface entre o Python e componentes de outras linguagens, principalmente C e C++. Banco de dados Existem conectores para diversos bancos de dados, possibilitando o desenvolvimento de aplicações que os utilizem. Existe também o módulo pickle que provê a serialização de objetos e o seu armazenamento em arquivos. O Zope Object Database (ZODB) foi construído baseado nisso. O ZODB é um banco de dados orientado a objetos com versionamento de objetos usado no servidor de aplicações Web Zope. Protótipos de aplicações Desenvolvimento de rápido de protótipos para elaboração, testes e validação de algoritmos. Depois do algoritmo finalizado, ele é traduzido para outra linguagem. Em alguns casos pode ocorrer de verificar-se que a implementação do algoritmo em Python atende os requisitos da aplicação, então não é necessário traduzi-lo. Programação numérica e científica O módulo NumPy disponibiliza ferramentas a- vançadas, como arrays, interface para biblioteca matemática e procedimentos para cálculos científicos. Integrado com Python formam uma poderosa ferramenta de cálculos. Jogos O módulo Pygame faz a interface do Python com a biblioteca SDL e acrescenta diversas funcionalidades que tornam o processo de desenvolvimento de jogos simples e fácil. A Pygame se baseia na idéia de que as tarefas mais intensivas a nível computacional em um jogo podem ser abstraídas separadamente da lógica principal. Manipulação de imagens O módulo PIL (Python Image Library) é responsável pela interface do Python com as bibliotecas para manipulação de imagens nos formatos mais comuns, como PNG (Portable Network Graphics), JPEG (Joint Photographic Experts Group), GIF (Graphics Interchange Format), BMP (Bitmap File Format), TIFF (Tagged Image File Format) e outros. Manipulação de XML Criação e parser de arquivos XML são realizados através do módulo xml. O módulo xmlrpc implementa o uso deste protocolo para comunicação com aplicações remotas. Dentre os projetos que utilizam Python, se destacam o servidor de aplicação Zope, o compartilhador de arquivos Mnet, o site o sistema de gerenciamento de conteúdos Plone e o cliente oficial do BitTorrent. Dentre as organizações, se destacam Google, Yahoo!, NASA (National Aeronautics and Space Administration), e a Industrial Light & Magic, que produz filmes da série Star Wars utilizando Python para a computação gráfica nos processos de produção dos filmes. 21

37 3.8 Modelo de execução Programas escritos em Python podem ser executados diretamente no interpretador interativamente através de uma interface de linha de comando ou no modo script, diretamente de um arquivo. No modo interativo, o usuário digita os comandos e a resposta é exibida em seguida. No modo script, o caminho para o arquivo que contém o código é passado como parâmetro para o interpretador e a execução acontece sem interatividade, a não ser que o programa em execução precise de interação com o usuário, através de leituras de input e impressão de output Byte Code Assim que o interpretador recebe o código a ser executado, é chamado o compilador. O compilador é responsável por traduzir o código Python para um código intermediário, chamado Byte Code, que então será executado pela Python Virtual Machine (PVM). Não é necessário compilar um programa escrito em Python para o código binário suportado pela plataforma no qual será executado, o programa é executado diretamente a partir do código fonte pelo interpretador. Internamente o código fonte e traduzido para um código intermediário chamado Byte Code e então o interpretador executa as instruções contidas neste Byte Code em sua máquina virtual. O Byte Code é independente de plataforma e pode ser executado em qualquer plataforma que possui uma PVM instalada que suporte a versão do Byte Code e todos os módulos adicionais à biblioteca padrão que por ventura vieram a ser usados. A compilação pode ser feita de maneira explícita. Dessa forma é necessário distribuir apenas os arquivos compilados, que por convenção possuem extensão.pyc, mantendo o código em sigilo se assim for desejado. O código 3.1 apresenta a implementação em Python de uma simples função que calcula o fatorial de um número positivo de forma recursiva. 1 def f a c t ( n ) : 2 i f n==0 or n==1: 3 return 1 4 else : 5 return n f a c t (n 1) Código 3.1: Função fatorial recursiva em Python O código 3.2 apresenta o Byte Code gerado após a compilação da função do código LOAD FAST 0 ( n ) 3 LOAD CONST 1 ( 0 ) 6 COMPARE OP 2 (==) 9 JUMP IF TRUE 13 ( to 25) 5 12 POP TOP 13 LOAD FAST 0 ( n ) 22

38 16 LOAD CONST 2 ( 1 ) 19 COMPARE OP 2 (==) 22 JUMP IF FALSE 8 ( to 33) 10 >> 25 POP TOP 3 26 LOAD CONST 2 ( 1 ) 29 RETURN VALUE 30 JUMP FORWARD 19 ( to 52) 15 >> 33 POP TOP 5 34 LOAD FAST 0 ( n ) 37 LOAD GLOBAL 0 ( f a c t ) 40 LOAD FAST 0 ( n ) LOAD CONST 2 ( 1 ) 46 BINARY SUBTRACT 47 CALL FUNCTION 1 50 BINARY MULTIPLY 51 RETURN VALUE 25 >> 52 LOAD CONST 0 ( None ) 55 RETURN VALUE Código 3.2: Byte Code do código Embedding Esta seção pretende apresentar e demonstrar o uso de Python incorporado em programas escritos em linguagens compatíveis com C. A incorporação acontece por meio de chamadas a funções da Python/C API. Apesar da Python/C API poder ser utilizada em linguagens compatíveis com C, como C++, e qualquer outra linguagem que possa fazer chamadas a funções escritas em C, daremos enfase para a integração com a linguagem C e utilizaremos apenas o termo C para representar todas as linguagens que são capazes de utilizar a Python/C API, nas quais os mesmos conceitos se aplicam. O código Python pode ser armazenado em arquivos, bancos de dados, gerados pela própria aplicação em C, fornecido pelo usuário em tempo de execução, e executado por outra aplicação como forma de complemento, estendendo-a ou personalizando-a [40]. A aplicação principal não é o interpretador Python, e sim um programa escrito em C que eventualmente invoca o interpretador Python para executar código Python em pontos estratégicos [46] Python/C API A API Python/C possibilita a programadores C/C++ acesso a funcionalidades do interpretador Python em diferentes níveis de abstração e tem dois principais usos: a extensão de Python com módulos escritos em C ou a extensão de programas C incorporando a eles código Python. [46] A parte da Python/C API destinada à incorporação de Python em programas C é menos estruturada que a parte de extensão de Python. A parte de extensão impõe regras 23

39 que os módulos escritos em C devem seguir para serem usados pelo Python e regras que o Python deve seguir para efetuar esse uso, deixando a estrutura da integração bem óbvia. Devido à grande diversidade de formas que um programa C pode ter necessidade de utilizar Python, a parte de incorporação possui funções genéricas e de uso variado para possibilitar a incorporação, não impondo uma única forma para o programa C interagir com a PVM. O desenvolvedor tem a liberdade de utilizar as funções mais adequadas para os seus objetivos ou as que melhor se encaixam na arquitetura do seu programa, o lado não tão bom é que o desenvolvedor terá que usar a sua criatividade (e seu tempo) para encontrar uma solução que se encaixe em suas metas. [39] Para detalhar a incorporação de Python em Programas C, serão comentadas as principais linhas do programa apresentado no Código 1.1 procurando esclarecer o funcionamento da API e a contribuição das duas partes envolvidas nesta integração (C e Python). Linha 1 É realizada a inclusão do arquivo Python.h que contém as assinaturas das funções da API e a definição dos tipos que serão utilizados. Este arquivo é distribuído com o código fonte do Python ou no pacote para desenvolvimento Python das principais distribuições Linux. A sua inclusão implica na inclusão de outros arquivos de headers como <stdio.h>, <string.h>, <errno.h>, <limits.h>, e <stdlib.h>. Python.h faz definições de preprocessamento que podem alteram as definições dos headers padrões do sistema, então é necessário incluí-lo antes de qualquer outro arquivo de header. [46] Linha 2 A função main é definida, seguindo o padrão ANSI C. Linha 3 A função Py Initialize é responsável pela inicialização do interpretador Python. Inicializa e faz a ligação com as bibliotecas Python preenchendo a tabela de módulos carregados (sys.modules), cria os módulos fundamentais builtin, main e sys, inicializa o path para busca de módulos (sys.path). [46, 39] Esta função sempre deve ser executada antes das demais funções da API (com exceção das funções Py SetProgramName, PyEval InitThreads, PyEval ReleaseLock, e PyEval AcquireLock). [46] Linhas 4 e 5 A função PyRun SimpleString é o modo mais simples e de mais alto nível para executar um (ou vários) comandos Python, não são aceitas expressões. Os comandos a serem executados são representados em um vetor de caracteres padrão da linguagem C (string) e são passados como parâmetro a esta função. O código nessa string é compilado e executado no escopo main do interpretador e não há possibilidade de comunicação entre o programa C e o código Python em execução, seja ela por mecanismos de entrada e saída ou pelo valor de retorno dessa função (que indica somente sucesso ou falha durante a execução do código Python). [39] Linha 6 Desfaz todas as inicializações que foram feitas pela função Py Initialize e outras funções da API, apaga todos os sub-interpretadores (criados por possíveis chamadas à função Py NewInterpreter), liberando toda a memória alocada para habilitar o uso de Python. Não há valor de retorno e os erros que possam vir a ocorrer são ignorados. 24

40 Neste exemplo o uso desta função tem caráter mais didático do que funcional, como o programa termina sua execução na próxima linha (linha 7), o interpretador Python seria desalocado juntamente com todo o programa, porém em uma aplicação real mais complexa pode ser necessário reiniciar o interpretador Python sem reiniciar toda a aplicação, ou então liberar a memória ocupada pelo interpretador nos momentos em que ele não for necessário. Essa função apresenta alguns bugs, por exemplo, os objetos, módulos e funções são destruídos em ordem aleatória que pode causar falha na execução dos destrutores que dependam de elementos externos. Outro possível problema é o vazamento de memória alocada pelo interpretador ou por módulos. [46] Linha 7 Saída do programa retornando o valor zero. A compilação deste exemplo pode ser realizada com qualquer compilador da linguagem C que suporte ANSI C, são necessários apenas os arquivos da biblioteca para desenvolvimento Python instalados, entre eles Python.h e libpythonx.y.so em sistema Unix (onde X.Y é o número da versão do Python). Algumas opções devem ser passadas como parâmetro para o compilador, conforme indicações abaixo no código 3.3. gcc lpythonx.y arquivo. c Código 3.3: Comando para compilação de programa C que utiliza Python O arquivo executável gerado (a.out) tem como dependência a biblioteca dinâmica libpythonx.y.so, ou a DLL correspondente na plataforma Windows. Uma parte considerável das funções para incorporação da API são equivalentes a funções/métodos/comandos em Python, algumas dessas equivalências são listadas na Tabela 3.1. Essas equivalências permitem a prototipação em Python de programas que incorporem código Python [39]. Função da API Função equivalente em Python PyImport ImportModule import module, import PyImport ReloadModule reload(module) PyImport GetModuleDict sys.modules PyModule GetDict module. dict PyDict GetItemString dict[key] PyDict SetItemString dict[key]=val PyDict New dict = PyObject GetAttrString getattr(obj, attr) PyObject SetAttrString setattr(obj, attr, val) PyEval CallObject funcobj(*argstuple) PyRun String exec stmtstr PyRun File execfile(filename) Tabela 3.1: Funções da API comuns [39] 25

41 O Código 3.4 é uma versão escrita puramente em Python do Código 1.1 e procura exemplifica o uso destas equivalências para a prototipação de programas. 1 cmd = from time import time, ctime 2 p r i n t Today i s, ctime ( time ( ) ) 3 exec cmd Código 3.4: Verão em Python do Código Implementações Como já foi mencionado nos capítulos e seções anteriores, existem várias implementações de Python. Atualmente existem 3 com qualidade e estabilidade suficiente para serem usadas em ambientes de produção. O principal foco deste trabalho é a implementação CPython, mas faz-se necessário comentar as demais implementações para fins de completude. Nesta seção as diferenças entre a implementação referência (CPython) e as demais implementações, história e benefícios de cada uma delas são apresentados CPython É a implementação clássica de Python, também conhecida apenas como Python, é a uma das implementações mais usadas [28, 21], esta é a implementação objeto de estudo deste trabalho e a que foi até este momento usada nas análises e descrições. É composta por compilador, interpretador e um abrangente conjunto de bibliotecas de módulos, tanto padrões quanto adicionais. Desenvolvida em ANSI C, esta é a opção mais rápida, completa, atualizada e sólida quando comparada às outras duas implementações apresentadas nas subseções seguintes. CPython é considerada a implementação referência da linguagem Python porque os documentos de especificação de Python não trazem uma especificação formal. Python é definida pelos documentos de referência da linguagem e pela implementação CPython, para conhecer alguns aspectos (principalmente do funcionamento interno) que não estão documentados, ou insuficientemente documentados, é necessário usar o código fonte da implementação como referência Jython É uma implementação da linguagem Python escrita puramente em Java e bem integrada com a plataforma Java [45]. Foi criada em 1997 por Jim Hugunin com o nome de JPython. Em 2000 o nome foi alterado para Jython e atualmente Finn Bock é o mantenedor do projeto. Há um grande esforço por parte dos desenvolvedores para manter Jython com o maior nível de compatibilidade possível com CPython. A última versão (2.2) é compatível com 26

42 a versão 2.2 do CPython, laçada em 30 de maio de 2003 [28]. A versão compatível com CPython 2.5 está em desenvolvimento, no estado beta. A defasagem temporal do Jython em relação ao CPython causa a não contemplação de funcionalidades das versões mais atuais da linguagem. Outro ponto de incompatibilidade entre as duas implementações é que Jython não pode utilizar os módulos de CPython que são escritos em C/C++, uma vez que vai contra a sua filosofia (100% Java), sendo necessário escrever módulos equivalentes em Python ou Java apenas. A maioria dos módulos da biblioteca padrão já são suportados, porém alguns desses módulos possuem limitações ou não estão completamente implementados, principalmente os módulos com estreito relacionamento com o sistema operacional. A página oficial do projeto [45] disponibiliza uma relação de diferenças entre as duas implementações, ambas na versão 2.0, que provavelmente não deixarão de existir. Vão desde diferenças simples e óbvias decorrentes de características das implementações até alterações significantes na estrutura da linguagem, as mais perceptíveis são: Sintaxe e Semântica Jython suporta o comando continue dentro de um bloco try-exception. CPython não suporta porque um bloco try-exception não é considerado um laço de repetição. Diferença entre a representação de literais ponto flutuante. Números representados no formato (com zeros à esquerda) não era suportado por CPython na versão 2.0, na versão 2.5 o problema já foi sanado. Tipos e funções Jython possui apenas um tipo de dados para manipular strings e strings unicode, o modificador u que precede strings unicode é completamente ignorado. Em CPython são tipos separados. Em Jython, a função chr aceita valores compreendidos no intervalo [0,65535). Em CPython o intervalo é restrito a [0,256). A representação de valores na tela (impressão) pode variar. Por exemplo, 0.1**4 é impresso como E-4 no Jython enquanto o mesmo valor é impresso como no CPython. Módulos O Módulo time pode produzir resultados diferentes. Interpretador As opções passadas como parâmetros via linha de comando diferem. Jython utiliza coletor de lixo para gerenciar o uso de memória, CPython utiliza contagem de referências para determinar quando um objeto pode ser apagado. 27

43 Jython suporta todos os pacotes e frameworks Java como módulos Python [45], possibilitando o uso das facilidades e benefícios das duas linguagens. A extensão de classes Java também é suportada, porém não é permitida herança múltipla de classes Java pelas mesmas razões que isso não é suportado na linguagem Java. Herança múltipla de classes Python é suportada. Com Jython é possível escrever aplicações equivalentes a aplicações Java com grande facilidade e similaridade [12], como demonstrado nos códigos 3.5 e 3.6: import java. awt. ; 2 import java. awt. event. ; class SimpleJavaGUI implements A c t i o n L i s t e n e r { private Button mybutton = new Button ( Hello World! ) ; 7 public SimpleJavaGUI ( ) { Frame top frame = new Frame ( ) ; top frame. s e t T i t l e ( A Basic Jython GUI ) ; top frame. addwindowlistener ( new WindowAdapter ( ) { 12 public void windowclosing ( WindowEvent e ) { System. e x i t ( 0 ) ; } } ) ; mybutton. addactionlistener ( this ) ; top frame. add ( mybutton ) ; top frame. pack ( ) ; 17 top frame. s e t V i s i b l e ( true ) ; } public static void main ( S t r i n g [ ] args ) { SimpleJavaGUI s = new SimpleJavaGUI ( ) ; 22 } 27 } public void actionperformed ( ActionEvent event ) { System. e x i t ( 0 ) ; } Código 3.5: Aplicação com interface gráfica em Java 3 import java from java import awt def e x i t ( e ) : java. lang. System. e x i t ( 0 ) top frame = awt. Frame ( t i t l e= A Basic Jython GUI, windowclosing=e x i t ) 8 mybutton = awt. Button ( H e llo World!, actionperformed=e x i t ) top frame. add ( mybutton ) top frame. pack ( ) t o o l k i t = awt. T o o l k i t. g e t D e f a u l t T o o l k i t ( ) top frame. v i s i b l e = 1 Código 3.6: Aplicação com interface gráfica em Jython Os códigos 3.5 e 3.6, mostrados acima, são implementações de uma pequena aplicação com interface gráfica. O código 3.5 é a implementação na linguagem Java. O código 3.6 é 28

44 (a) (b) Figura 3.1: (a) Captura de tela do Código 3.5 (Java) em execução no Linux; (b) Captura de tela do Código 3.6 (Jython) em execução no Linux. a implementação na linguagem Python, utilizando as bibliotecas da linguagem Java, que pode ser interpretada por interpretadores Jython. O resultado produzido pelos dois programas são mostrados nas figuras 3.1a e 3.1b e são idênticos 2, já que utilizam as mesmas bibliotecas da linguagem Java. No código 3.6, o acesso às bibliotecas Java é feito pelo comando import na linha 1 e pelo comando from/import na linha 2, que normalmente são usadas para disponibilizar módulos Python. As duas implementações apresentam diferenças quanto aos módulos/bibliotecas importados devido ao diferente estilo adotado em cada uma delas, por exemplo, no código Java, todos os componentes do módulo java.awt são importados e utilizados diretamente, já no código Jython, foi importado apenas o módulo java.awt e os seus componentes são acessados através deste módulo da mesma forma que a classe Button é instanciada na linha 8. Outra diferença é a necessidade de importar o módulo java no código Jython, em Java esse módulo já está disponível e não precisa ser importado. A utilização de bibliotecas Java pelo Jython pode ser usada, também, para a implementação de Applets que utilizem a linguagem Python, a utilização de Jython em Applets é abordada na seção Uma das principais vantagens do uso desta implementação é a integração transparente com toda a biblioteca Java, porém para ter proveito dessa vantagem é necessário o conhecimento da API da linguagem Java IronPython Implementação da Microsoft, porém de código livre, que possibilita o uso da linguagem Python com o frameworks.net [21]. IronPython é escrito em C# e a versão 1 é compatível com a versão 2.4 do CPython, a versão 2 será compatível com CPython 2.5. Com a experiência adquirida na implementação de Jython (veja a seção ) e motivado pela expansão das linguagens dinâmica e do CLR (Common Language Runtime), em 2003 Jim Hugunin escreveu um artigo examinando porque.net não era bom para lingua- 2 O traçado pontilhado nas margens do botão Hello World! indica apenas o que o botão está em foco durante a captura de tela, portanto não é considerado como uma diferença. 29

45 gens dinâmicas. Para embasar as suas análises, escreveu uma pequena implementação de Python usando o.net. O resultado foi surpreendente, executava o teste de desempenho pystone 1.7 vezes mais rápido que CPython [21]. Interessada nas dificuldades encontradas por Jim, a Microsoft o contratou para trabalhar no grupo de desenvolvimento do CLR e melhorá-lo para aumentar o suporte a linguagens dinâmicas. Como resultado disso, em 2006, foi lançada a primeira versão estável do IronPython. O IronPython é composto basicamente pelo IronPython engine e outras ferramentas para facilitação do seu uso, como o suporte para criação, desenvolvimento e depuração de projetos IronPython que o Microsoft Visual Studio 2005 oferece, e o IronPython Studio para integração com o Microsoft Visual Studio O IronPython engine é responsável pela compilação do código Python em uma linguagem intermediária, a IL (Intermediate Laguage), formando os Assemblies (bibliotecas ou executáveis de linguagens do.net) que são mantidos em memória e executados pelo CLR (Common Language Runtime), a máquina virtual utilizada pelo.net. Os Assemblies também podem ser persistidos no sistema de arquivos para distribuição apenas binária (sem o código fonte). A figura 3.2, adaptada de [21], ilustra o processo de compilação e execução de código Python pelo IronPython. Biblioteca Python Chamadas Código Python Chamadas Classes do Framework.NET Compilação IronPython Engine Produz Chamadas Execução Assembly.NET CLR Figura 3.2: Integração entre IronPython e.net [21] Os Assemblies gerados são dependentes das DLLs do IronPython, mas são apenas código intermediário do.net e por isso podem acessar todas as classes do framework 30

46 sem a necessidade de trabalhos extras com conversão de tipos de parâmetros e de retorno [21]. O uso das bibliotecas.net é transparente e extremamente fácil, possibilitando o uso de Python para realizar todas as tarefas possíveis utilizando as outras linguagens do framework.net, como aplicações Web com ASP.NET (Active Server Pages) e aplicações com Windows Form. A compatibilidade com a CLR distribuída com o Silverligth 2 permite o desenvolvimento de Applets, como descrito na seção IronPython é compatível também com o Mono [21], uma implementação multiplataforma do.net [43], o que o torna multiplataforma. import c l r c l r. AddReference ( System. Windows. Forms ) 3 c l r. AddReference ( System. Drawing ) from System. Windows. Forms import ( Application, Form, FormBorderStyle, Label ) from System. Drawing import ( Color, Font, F on t S ty l e, Point ) 8 form = Form ( ) form. Text = H e l l o World form. FormBorderStyle = FormBorderStyle. Fixed3D form. Height = newfont = Font ( Verdana, 16, FontStyle. Bold FontStyle. I t a l i c ) l a b e l = Label ( ) l a b e l. AutoSize = True l a b e l. Text = My H e l l o World Label 18 l a b e l. Font = newfont l a b e l. BackColor = Color. Aquamarine l a b e l. ForeColor = Color. DarkMagenta l a b e l. Location = Point (10, 50) 23 form. Controls. Add( l a b e l ) A p p l i c a t i o n. Run( form ) Código 3.7: Aplicação com interface gráfica em IronPython Figura 3.3: Captura de tela do Código 3.7 em execução no Linux 31

47 O código 3.7 está escrito na linguagem Python e utiliza as classes e bibliotecas do framework.net, o acesso a estes componentes é feita nas linhas 1 a 6 pelos comandos import e pelas configurações realizadas ao CLR (linhas 2 e 3). A figura 3.3 é o resultado da execução do código 3.7 na plataforma Linux utilizando o Mono. Há um grande esforço por parte da equipe de desenvolvedores para manter um alto grau de compatibilidade com CPython, e planos para remover todas as incompatibilidade inaceitáveis determinadas a partir de discussões com a comunidade de usuário Python [14]. Assim como em Jython, as diferenças estão espalhadas por vários níveis de significância, as mais notáveis são: Sintaxe e Semântica Algumas mensagens de erro de sintaxe diferem das mensagens de CPython, embora a exceção lançada seja do mesmo tipo (SyntaxError). Suporta identificadores com caracteres não-ascii. Uma variável pode conter acentos em seu nome. Não aceita o comando yield em blocos do tipo try-exception. Quando o expoente de uma operação de potenciação é muito grande (por exemplo, 10 ** ), uma exceção é lançada. CPython tenta calcular o resultado da operação. Tipos e Funções Para imprimir um objeto na saída de texto do programa, IronPython chama o método str do objeto que será impresso. CPython chama o método str. As mensagens de erro da função eval utilizam <string> como nome do arquivo, em CPython o nome do arquivo é suprimido. A função dir, que retorna uma lista de atributos e métodos de um objeto passado como parâmetro, suprime os métodos delattr, getattribute, hash, setattr, e str quando o objeto passado como parâmetro for instância de uma meta-classe apesar desses métodos existirem e poderem ser usados. O tipo primário char suporta caracteres unicode. A função unicode lança uma exceção caso não consiga decodificar algum caractere. CPython retorna a string passada como argumento sem qualquer alteração. Suporta o comando continue em blocos finally. A hierarquia dos tipos primários é simplificada, todos os tipos primários estendem uma única classe base. Módulos Vários módulos da biblioteca padrão de CPython não são suportados. Os módulos suportados não estão disponíveis por padrão. 32

48 Não existe DeprecationWarning, um mecanismo de alerta a funcionalidades da linguagem ou dos módulos que serão removidas nas próximas versões. O módulo codecs está incompleto, principalmente a parte de tratamento de erros. A função system do módulo os não é implementada. Interpretador Não existe limite máximo pré-definido para o tamanho da pilha de execução. IronPython não suporta controles de alertas (warnings). As opções passadas como parâmetros via linha de comando diferem. Um coletor de lixo é usado para gerenciar o uso de memória. Algumas diferenças já foram citadas, mas é conveniente ressaltá-las com mais detalhes devido à sua importância no modo de funcionamento dessa implementação. Além dos módulos e classes do Framework.NET, também é possível usar os módulos padrão de Python, mas eles não estão disponíveis no ambiente de execução por padrão, é necessário habilitar o seu uso adicionando o diretório em que esses módulos se encontram ao path em que o interpretador busca pelos módulos existentes [14]. Alguns módulos como cmath, md5 e signal não são suportados. O uso de coletor de lixo em IronPython ao invés de contador de referencias (usado em CPython) é considerada uma diferença aceitável, porém traz uma série de implicâncias no modelo dos softwares desenvolvidos usando IronPython. Não é necessário preocuparse com referências cruzadas entre objetos, o coletor de lixo garante de que eles serão desalocadas e que isso será feito de modo seguro, mas, por outro lado, não há garantia de quando a finalização (execução do método del ) do objeto será feita. A grande vantagem dessa implementação e a integração com o framework.net e para usá-la efetivamente é necessário que o desenvolvedor tenha familiaridade com a API.NET. 33

49 Capítulo 4 Implementação A proposta deste trabalho é o desenvolvimento de um plugin para o Gecko (e consequentemente, Mozilla, Firefox e todos os outros navegadores Web derivados ou baseados nestes) que possibilite a execução de Applets escritas em Python (e utilizando a implementação CPython) como complementos incorporados em páginas Web. A implementação deste plugin utiliza os conceitos apresentados nos capítulos anteriores como base de conhecimento para a tomada de decisões e codificação. A linguagem escolhida para a codificação do plugin é a linguagem C++. Como o plugin pode ser usado em mais de uma página ao mesmo tempo, ou em várias applets na mesma página, e cada instância possui dados que devem ser armazenados durante sua vida útil (veja a Seção 2.2.1), as possíveis linguagem disponíveis para a escolha foram limitadas àquelas que fornecem suporte a Programação Orientada a Objetos. A escolha específica por C++ foi feita pela facilidade de suportar a NPAPI e a Python/C API sem a necessidade da utilização de wrappers para conversão de parâmetros e valores de retorno. 4.1 Plugin Devido aos aspectos do plugin que são dependentes do sistema operacional (descritos na Seção 2.2.2), a implementação realizada neste trabalho é compatível somente com o sistema operacional Linux. Esta decisão não impede que a solução apresentada seja adaptada para funcionamento equivalente utilizando recursos disponibilizados por outros sistemas operacionais. Apesar de, teoricamente, os plugins desenvolvidos para o Gecko serem compatíveis com todos os navegadores que o utilizam como engine de renderização, os testes foram realizados apenas com o navegador Firefox versão 3, que utiliza o Gecko

50 4.1.1 Plug-in Software Development Kit - PSDK O PSDK tem por finalidade auxiliar no desenvolvimento de plugins, reunindo um conjunto mínimo dos arquivos de definição necessários para compilar um plugin sem a necessidade da presença de todo o código fonte do Mozilla. [42] Nos seus exemplos, distribuídos também com o código completo do Mozilla, traz a definição em C++ da classe nsplugininstancebase, utilizada para encapsular as funções e dados de uma instância de plugin em um objeto. Para tornar isso possível, são definidas, também, abstrações (stubs) das funções da NPAPI [42] que fazem a tradução das chamadas às funções originais da NPAPI para o método correspondente do objeto correto e tratam os endereços de entry points preenchendo automaticamente as tabelas de endereços durante a inicialização. Os stubs são divididos em três conjuntos separados nos arquivos, levam em consideração os aspectos do sistema operacional alvo e normalmente não precisam ser alterados. As customizações necessárias podem ser feitas nas funções implementadas pelo plugin em desenvolvimento. Segue uma breve descrição destes conjuntos e principais funções específicos para sistemas Unix e derivados: np entry.cpp: Define os principais entry points, que são utilizados durante a inicialização do plugin: NP GetMIMEDescription: faz um simples proxy, transferindo a responsabilidade da implementação descrita em [42] à função NPP GetMIMEDescription. NP Initialize: Preenche a tabela de funções com os endereços das funções de plugin e do navegador e chama a função NS PluginInitialize permitindo ao plugin executar ações durante a inicialização. NP GetValue: De forma semelhante à NP GetMIMEDescription, faz proxy para a função NS PluginGetValue, porém omitindo um parâmetro. Em [42] esta função é descrita como NPP GetValue. NP Shutdown: apenas chama a função NS PluginShutdown permitindo que o plugin execute ações durante o processo de finalização. npp gate.cpp: Define as funções da NPAPI que compete ao plugin implementá-las (as funções com prefixo NPP ). Basicamente estas funções obtém a instância do plugin e chamam o método correspondente passando os argumentos recebidos. A função NPP New faz o tratamento dos parâmetros recebidos antes de chamar a função NS NewPluginInstance e a função NPP Destroy faz chamada ao método shut da instância e à função NS DestroyPluginInstance. npn gate.cpp: Define as funções da NPAPI que são implementadas pelo navegador (as funções com prefixo NPN ). Trabalha repassando as chamadas do plugin para a função correta cujo o endereço está na tabela de funções preenchida pela função NP Initialize. Em algumas funções são realizadas verificações com a finalidade de manter compatibilidade com versões anteriores. 35

51 4.1.2 Registro e inicialização Durante a inicialização do Firefox, é executado um procedimento de busca por plugins em diretórios pré-definidos carregando em memória os arquivos no formato ELF (.so Executable and Linking Format) e faz chamadas às funções NS PluginGetValue e NPP GetMIMEDescription (conforme descrito na seção 2.2.1). Segue uma descrição das chamadas a estas funções no caso específico do plugin implementado neste trabalho. NP GetMIMEDescription Função obrigatória no ELF do plugin que deve retornar uma string contendo o tipo de conteúdo, a extensão do arquivo e a descrição do tipo de conteúdo [42]. No caso de sistemas Unix e utilizando o PSDK, essa função faz proxy para a função NPP GetMIMEDescription que deve ser definida e implementada no plugin. Na implementação deste trabalho, a string retornada para especificar os valores já mencionados é application/x-pypplet:ppy:python applets;. Os valores são separados por dois pontos. A informação sobre o tipo de conteúdo é extremamente importante. Baseado nesta informação o navegador seleciona o plugin correto para manipular um determinado conteúdo[42]. NS PluginGetValue Essa função é opcional, sendo utilizada pelo navegador para obter informações adicionais sobre o plugin[42]. Na fase de registro, são solicitados os valores de duas variáveis: NPPVpluginNameString: Solicita o nome do plugin em uma string, o valor retornado é Pypplet [versão]. NPPVpluginDescriptionString: Solicita a descrição do plugin. Os valores retornados por estas duas funções estão definidos como constantes no arquivo config.h. Para verificar se o registro do plugin foi efetuado de maneira correta, é necessário, usando o Firefox, acessar a página about:plugins e observar se existe uma seção para o plugin e se os valores nela apresentados estão corretos. A figura 4.1 mostra as informações sobre o plugin implementado. Tendo o plugin registrado, quando necessário, o navegador irá selecionar este plugin para manipular conteúdo do tipo especificado por NPP GetMIMEDescription, quando então o plugin é inicializado. Como parte do processo de inicialização o navegador fornece duas tabelas com ponteiros para funções, uma delas é preenchida pelo navegador com o endereço das funções NPN antes da chamada à função NP Initialize, que, por sua vez, preenche a outra tabela com o endereço das funções NPP [42]. Nenhuma chamada a funções da API (exceto NP Initialize e NP Shutdown) pode ser feita antes do preenchimento dessas tabelas. Toda a manipulação das tabelas de funções é feita, no lado do plugin, pelas funções definidas no arquivo np entry.cpp. As tabelas de funções também contem informações 36

52 Figura 4.1: Registro do plugin sobre a versão da API implementada pelo navegador e pelo plugin, essa informação é utilizada para verificações nos arquivos npp gate.cpp e npn gate.cpp. Além do preenchimento das tabelas com os ponteiros para as funções da NPAPI, a função NP Initialize chama a função NS PluginInitialize, para que o plugin possa alocar os recursos necessários e compartilhados entre todas as suas instâncias. No plugin implementado neste trabalho, nenhum recurso é alocado, apenas a função debug with gdb (descrita na Seção 4.4) é chamada Out-of-process Uma das tendências dos navegadores Web é a adoção de arquiteturas com multiprocessos [26, 27, 1, 7, 51]. A proposta básica para divisão em processos apresentada em [27] pela Mozilla é a separação da interface com o usuário em um processo, a renderização de conteúdo em outro processo que seria instanciado várias vezes (por domínio, página ou aba) e dos plugins em outro processo. O Projeto Chromium (no qual o navegador Google Chrome é baseado) utiliza também um processo com o núcleo do navegador, que é responsável pelo acesso aos recursos do sistema operacional, como o acesso a rede [11], possibilitando que os processos que lidam diretamente com o conteúdo de páginas Web sejam executados em ambientes com permissões restritas de acesso ao sistema operacional e ao sistema de arquivos (sandbox)[1, 48, 47]. Há também uma tendência dos plugins para navegadores (e para outras aplicações) adotarem arquiteturas em que são executados fora dos processos do navegador (out-ofprocess) [5, 7, 51]. Todos apontam alguns benefícios dessa abordagem: Um erro fatal em uma instância de um plugin não causará o encerramento abrupto do navegador ou o congelamento da interface. 37

53 É possível obter melhor tempo de resposta, principalmente com o uso de processadores com múltiplos núcleos. Enquanto o plugin é inicializado, o navegador continua atendendo às demais requisições do usuário. Isolamento do plugin, o que diminui o potencial de danos que podem ser causados pela exploração de falhas de segurança no software do plugin sem que as funcionalidades do navegador sejam reduzidas. Os sistemas operacionais modernos provêem mecanismos para a proteção do espaço de memória dos processos, aumentando consideravelmente a dificuldade para que dados do usuário sejam acessados indevidamente através da exploração de uma eventual vulnerabilidade do plugin. É possível executar o plugin em ambientes restritos, no qual não tenha acesso direto à rede, ao sistema de arquivos e a funcionalidades específicas do sistema operacional. Porém há um adicional de complexidade no que tange à comunicação entre o plugin e o navegador. Como mostrado em 3.9, é necessário inicializar e finalizar o Python antes e depois de usá-lo. Porém a implementação de Py Finalize possui alguns bugs que geram vazamento de memória: os objetos, módulos e funções são destruídos em ordem aleatória, o que pode causar falha na execução dos destrutores que dependam de elementos externos; módulos do Python que são carregados dinamicamente não são descarregados, o que pode causar erros na próxima vez que esses módulos forem utilizados; memória alocada pelo interpretador ou pelos módulos podem não ser desalocadas; objetos com referência circular não são destruídos[46]. Isso se torna um problema quando é necessário inicializar e/ou finalizar várias vezes o Python durante a mesma execução do navegador. Com a parte responsável pela incorporação do Python em um processo separado, quando a instância do plugin não estiver mais em uso, esse processo é terminado e conseqüentemente toda a memória por ele utilizada é liberada. Existe a necessidade de executar mais de uma instância do plugin ao mesmo tempo, para isso a API C/Python disponibiliza a função Py NewInterpreter que cria um novo sub-interpretador, que é um ambiente quase totalmente separado para execução de código Python. Porém os módulos carregados dinamicamente são compartilhados (inclusive suas variáveis globais) e quando um sub-interpretador é inicializado, os módulos dinâmicos já carregados não são inicializados novamente[46], o que impede o correto funcionamento do Pygame utilizando a variável SDL WINDOWID para mais de uma janela[2] (mais detalhes na Seção 4.2.1). Como os sub-interpretadores são executados no mesmo processo, é possível que um interpretador interfira no outro[46]. Além de trazer as vantagens representadas pelos benefícios de estabilidade e segurança apresentados anteriormente, utilizar a abordagem out-of-process para este plugin isola os problemas de desalocação de memória do Python e possibilita várias instâncias do plugin serem executadas realmente independentemente, o que deixa a complexidade de implementar a comunicação plugin/navegador com um ótimo custo benefício. 38

54 4.1.4 Classe nsplugininstance Classe que herda de nsplugininstancebase, disponibilizada pelo PSDK, e implementa as funções específicas do plugin desenvolvido neste trabalho. Para cada função NPP que é utilizada no plugin, foi definido um método na classe nsplugininstance, os métodos da NPAPI que não são utilizados não foram implementados. Adicionalmente, foram implementados métodos usados internamente e que não tem relação direta com a NPAPI Inicialização Após o plugin ser inicializado, como descrito na seção 4.1.2, o navegador chama a função NPP New, que faz um proxy para a função NS NewPluginInstance. Nessa função é instanciado um objeto da classe nsplugininstance. No método construtor é apenas realizado a inicialização de alguns atributos, que serão descritos ao longo desta seção. Após a instanciação do objeto, ainda na função NS NewPluginInstance, o método nsplugininstance::launchthreadandprocess é chamado, e executa os procedimentos necessários para a criação do mecanismo de comunicação e do novo processo. Para a comunicação entre os processo envolvidos é utilizado uma fila de mensagens, que é criada com as permissões de uso 0600, permissão de leitura e escrita apenas para o usuário que criou a fila. A chave da fila utilizada no momento da criação é IPC PRIVATE, que indica ao sistema operacional que uma nova fila deve ser criada com uma chave randômica. O identificador dessa nova fila de mensagens é retornado pela função msgget. O identificador da fila de mensagens é armazenada no atributo queue da instância em uso, e então, é realizada uma operação de fork dividindo a execução em dois processos. O processo pai (navegador) não realiza mais nenhuma operação neste método. O processo filho realiza um exec e é substituído pelo programa pypplet, que é descrito na Seção Configuração Já com a instância criada, o navegador chama a função NPP GetValue requisitando o valor da variável NPPVpluginNeedsXEmbed. A função NPP GetValue faz proxy para o método nsplugininstance::getvalue, que, para esta variável, retorna valor verdadeiro, ativando suporte a XEmbed que é necessário ao plugin e será descrito na seção Na seqüência, o navegador chama a função NPP SetWindow com informações da janela nativa do ambiente gráfico em uso destinada ao uso do plugin. A função NPP SetWindow faz proxy para o método nsplugininstance::setwindow, que salva as informações recebidas nos atributos window e ws envia uma mensagem do tipo CMD SET WINDOW com estas informações para o processo pypplet. As mensagens são descritas em detalhe na Seção

55 O arquivo com o código fonte a ser executado é especificado no código HTML da página que contêm o plugin. Este código é acessado pelo navegador, que notifica o plugin sobre a criação de um novo stream de dados com uma chamada à função NPP NewStream. A função NPP NewStream faz proxy para o método nsplugininstance::newstream. Nesse método, uma mensagem do tipo CMD SET FILE é alocada e preparada com os valores recebidos como parâmetro pelo método. Nesse momento, somente o MIMEType do arquivo é preenchido na estrutura da mensagem. O endereço da memória alocada para a estrutura da mensagem é atribuído ao campo pdata do parâmetro *stream (NPStream), e passa a ser tratado pelo navegador como dados do plugin associados a este stream. O parâmetro *stype é utilizado pelo plugin para informar ao navegador a forma que o stream deve ser disponibilizado. No plugin implementado neste trabalho, valor informado é NP ASFILEONLY, que indica ao navegador que o plugin necessita do arquivo inteiro salvo no disco. Quando o download do arquivo é concluído, o navegador salva o seu conteúdo em um arquivo temporário, por exemplo, ~/.mozilla/firefox/wjexl86s.default/cache/50 F99966d01, e chama a função NPP StreamAsFile, que faz proxy para o método nsplugin Instance::StreamAsFile. No método StreamAsFile, a mensagem criada em NewStream é recuperada através do parâmetro stream, preenchida com o path do arquivo temporário fornecido pelo parâmetro fname e então enviada assincronamente para o processo pypplet. Antes de destruir o stream, o navegador chama a função NPP DestroyStream, que faz proxy para o método nsplugininstance::destroystream. A única ação desse método é desalocar a memória utilizada para a mensagem anteriormente enviada. Destruir o stream significa desalocar toda a memória utilizada para armazenar dados e meta-dados do stream, porém o arquivo temporário salvo não é destruído Destruição No momento em que a página que contém uma applet Python é fechada, é iniciado o processo de destruição das instâncias do plugin que eram utilizadas por esta página. O navegador função NPP Destroy é chamada para cada instância do plugin a ser destruída. A função NPP Destroy chama o método nsplugininstance::shut que envia um sinal SIGTERM para o processo pypplet correspondente à instância que será destruída, aguarda a finalização deste processo e então destrói a fila de mensagens utilizada para a comunicação entre o plugin e o processo pypplet. Em seguida, NPP Destroy chama a função NS DestroyPluginInstance que efetivamente destrói a instância do plugin por meio do comando delete da linguagem C++. Após todas as instâncias do plugin serem destruídas, o navegador chama a função NP Shutdown que faz proxy para a função NS PluginShutdown que, por sua vez, desaloca os recursos de uso comum a todas as instâncias do plugin. Nesta implementação essa função não executa nenhuma operação, já que nenhum recurso comum foi alocado em NS PluginInitialize. 40

56 4.2 Pypplet O Pypplet é o programa desenvolvido para executar as ações relacionadas à execução de código Python em processo separado do navegador. Deve receber como argumento (em argv[1]) uma string com a representação em hexadecimal do identificador da fila de mensagens que deverá ser usada para a comunicação com o navegador. Durante a inicialização, configura a função para tratamento do sinal SIGTERM, converte a identificador da fila e mensagens para o tipo inteiro e imprime o total de memória em uso pelo programa. Em seu loop principal, fica à espera de mensagens na fila de mensagens. Os tipos de mensagens e finalidades são descritos na seção 4.3. No momento em que recebe as mensagens com as informações necessárias para iniciar a execução, que são o identificador da janela que será usada e o arquivo com o código fonte que será executado, inicia uma thread que é responsável pela execução do interpretador Python. As threads utilizadas neste trabalho são disponibilizadas pela biblioteca Pthreads e seguindo so procedimentos descritos por Richard Carver e Kuo-Chung Tai em [13] e por Daniel Robbins em [49]. Paralelamente, a thread principal aguarda a inicialização do interpretador e de mecanismos internos da SDL para configurar a janela e os eventos como descrito na seção Em seguida, continua em loop à espera de novas mensagens. O interpretador Python é inicializado e executa o arquivo cujo o caminho foi especificado em uma mensagem do tipo CMD SET FILE com uma chamada à função PyRun Simple File Janelas e eventos O XEmbed é um protocolo especificado sobre o protocolo de gerenciamento de janelas X Window System Protocol que permite o controle out-of-process de parte da interface gráfica de uma aplicação. [19] Como descrito na seção , é solicitado ao navegador o suporte a XEmbed na janela criada para o plugin. A estrutura NPWindow recebida pelo método nsplugininstance::setwindow como parâmetro contêm o identificador e as dimensões da janela destinada ao plugin. Essas informações são enviadas para o processo pypplet em uma mensagem, como descrito nas seções e 4.3. Ao receber a mensagem contendo as informações referentes à janela, o processo pypplet adiciona a variável SDL WINDOWID no seu ambiente de execução com identificador da janela recebido na mensagem, indicando à SDL e consequentemente ao Pygame qual a janela que deve usar para renderização e captura de eventos. 41

57 Quando o módulo de vídeo do SDL é inicializado utilizando a variável SDL WINDOWID, nenhuma janela é efetivamente criada, uma janela já existente é recuperada pelo SDL e usada. Nesse processo de recuperar a janela, o SDL não configura o atributo que define quais eventos a janela está apta a receber, portanto, nenhum evento é recebido pela janela. Após a inicialização do módulo de vídeo da SDL, verificada através do valor de retorno da função SDL WasInit(SDL INIT VIDEO), é necessário habilitar o recebimento desses eventos configurando a máscara de eventos que o servidor X deve entregar para a janela. As funções e constantes utilizadas para definir a máscara de eventos são descritas em The Xlib Manual [8]. Por características do protocolo XEmbed, apenas os eventos relacionados ao mouse são entregues diretamente pelo servidor X para a janela utilizada pelo processo pypplet. Os eventos relacionados ao teclado devem ser encaminhados pela aplicação principal, neste caso o plugin. Atualmente os eventos de teclado não são encaminhados para o processo pypplet, somente os eventos de mouse (cliques e movimentação) podem ser utilizados Ligação estática Normalmente programas que utilizam o interpretador Python embarcado utilizam a biblioteca libpython ligada dinamicamente. Nesses casos o Python instalado no sistema é utilizado, e, consequentemente todos os módulos que estiverem instalados. Para dar suporte às limitações da PVM implementadas, é necessário utilizar outro interpretador definido em outra biblioteca. Objetivando simplificar as configurações necessárias para a execução do plugin e do processo pypplet com relação a qual biblioteca o ligador deve ligar ao programa, a ligação é feita estaticamente em tempo de compilação utilizando a biblioteca libpython2.6.a que contêm as alterações necessárias. A seção 4.6 descreve os processos de compilação e instalação. O fato da ligação ser estática implica em um acréscimo de aproximadamente 3,3 megabytes no tamanho final do arquivo executável, porém a quantidade de memória utilizada no início da execução é ligeiramente menor quando o programa é ligado estaticamente. Com a ligação dinâmica são utilizados 2,16 MB de memória, enquanto com a ligação estática são utilizados 1,97 MB. 4.3 Mensagens As mensagens utilizadas para comunicação entre o plugin e o processo pypplet são definidas no arquivo msg.h como um conjunto de structs e unions da linguagem C. O tipo de dados msg t, apresentado no código 4.1, foi declarado para encapsular todas as mensagens simplificando o modo de envio e recebimento das mensagens. typedef struct msg t { msg type mtype ; 3 union { struct msg cmd cmd ; struct msg cmd resp cmd resp ; 42

58 struct msg req req ; 7 struct msg req resp r e q r e s p ; } ; } msg t ; Código 4.1: Estrutura de mensagem O campo mtype define o tipo de mensagem e indica como as informações contidas no restante da mensagem devem ser acessadas. Existem 4 tipos de mensagem definidos de modo a suportar comunicação em duas vias no futuro. Os tipos são: MSG CMD Mensagem enviada pelo plugin contendo um comando destinado ao processo pypplet, que, ao receber a mensagem toma as ações necessárias. As informações de um comando são armazenadas no formato de uma struct msg cmd e são acessadas através do nome cmd. struct msg cmd { msg cmd type cmd ; 3 union { struct msg set window window ; struct m s g s e t f i l e f i l e ; 6 } ; } ; Código 4.2: Estrutura de comandos A struct msg cmd, por sua vez, encapsula todos os comandos, como mostrado no código 4.2. O campo cmd define qual é o tipo de comando. Atualmente existem dois tipos de comando: CMD SET WINDOW Utilizado para informar ao navegador qual é a janela do servidor X que o processo pypplet deve utilizar. O comando contêm o identificador da janela, e as suas dimensões. CMD SET FILE Utilizado para informar ao processo pypplet qual é o arquivo de código Python que deve ser executado pelo interpretador. O comando contêm o caminho absoluto no campo filepath e o MIMEType no campo mimetype. O contexto da utilização destes comandos é descrito na seção MSG CMD RESP Mensagem enviada pelo processo pypplet em resposta a um comando. Como os comandos implementados até esse momento não necessitam de uma resposta elaborada, a struct cmd resp possui apenas um campo de tipo inteiro, onde são armazenados valores que representam sucesso do comando ou indicam o erro ocorrido. MSG REQ Mensagem enviada pelo processo pypplet fazendo uma requisição ao plugin. Atualmente não é utilizada. MSG REQ RESP Mensagem enviada pelo plugin contendo a resposta/resultado de uma requisição feita anteriormente pelo plugin. Atualmente não é utilizada. 43

59 As mensagens são transmitidas utilizando o mecanismo padrão de IPC por fila de mensagens dos sistemas operacionais baseados em Unix por meio das chamadas de sistema padrões do Unix. As primitivas do sistema operacional utilizadas para enviar e receber as mensagens são msgsnd e msgrcv, respectivamente. struct msg t message ; 2 message. mtype = MSG CMD; message. cmd. cmd = CMD SET WINDOW; message. cmd. window. id=(unsigned int ) ( awindow >window ) ; 5 message. cmd. window. h=awindow >height ; message. cmd. window. w=awindow >width ; msgsnd ( queue, &message, sizeof ( message ), IPC NOWAIT ) ; 8... msgrcv ( queue,& message, sizeof ( message ),MSG CMD, 0 ) ; Código 4.3: Envio/recebimento de mensagens O código 4.3 exemplifica a construção, envio e recebimento de uma mensagem com o comando CMD SET WINDOW utilizando o encapsulamento provido pelo tipo msg t e os mecanismos de IPC (Inter-process communication) do sistema operacional. 4.4 Depuração Para facilitar a depuração do plugin durante o desenvolvimento, foi implementado o pequeno módulo debug, de funcionalidade bastante simples porém de grande utilidade já que o plugin é executado no contexto de uma aplicação muito maior, o Firefox. Sua única função, debug with gdb imprime o PID (Process Identifier) do processo em execução e um comando para ser executado no GDB (GNU Project debugger), entrando, então, em um loop sobre uma variável global booleana com valor true, bloqueando o processo. A função debug with gdb é chamada na inicialização de cada instância do plugin. Na primeira chamada o processo imprime o seguinte texto: Attach GDB to PID to debug! This thread will block until then! Once blocked here, you can set other breakpoints. Do a "set variable waitforgdb=\$false" to continue Enquanto o processo está bloqueado, é necessário anexar o GDB ao PID informado e atribuir valor falso à variável waitforgdb executando o comando impresso, permitindo que o processo siga sua execução. Antes dessa atribuição, é possível definir os breakpoints no código do plugin necessários para o acompanhamento da execução. Também é definida a macro DMSG, que imprime mensagens na tela de acordo com o nível de importância. Os níveis são diferenciados pela cor da fonte impressa e podem ser filtrados (ignorados). As mensagens podem ser classificadas em 5 níveis, de 0 a 4, onde as mensagens do nível 0 são as mais importantes. 44

60 A variável global DEBUG define qual o último nível de mensagens que será impresso (os níveis com número maior que o valor de DEBUG não são impressos). Por exemplo, a utilizacão da macro DMSG mostrada no código 4.4: 1 DMSG( 3, Child << g e t p i d ( ) ) ; Imprime: Código 4.4: Macro DMSG [3] plugin.cpp:152:launchthreadandprocess Child Além da mensagem desejada, é impresso também, o nível da mensagem (valor expresso entre [ e ] ), o nome do arquivo fonte, o número da linha e o nome da função correspondentes ao local onde a macro foi utilizada. 4.5 Modificações na PVM No ambiente de execução do Python, o objeto builtins ou builtin é uma lista que contém todas as funções globais do Python, é definido no arquivo bltinmodule.c e possui 143 objetos, entre eles funções básicas e tipos de dados. Um dos elementos de builtins é a função import que é utilizada como callback dos statements import e from... import. Estes são os mecanismos base da linguagem Python, todas as suas funcionalidades estão listadas em builtins ou então são importadas Estratégia A estratégia adotada até o momento para eliminar alguns dos possíveis riscos da execução de código desconhecido inicia com a remoção dos elementos de builtins que oferecem riscos ou alterar implementação interna para que esses elementos atuem com algum tipo de restrição. O elemento import foi modificado para impedir o acesso a alguns módulos, como por exemplo o módulo socket que disponibiliza acessa de baixo nível à rede. A função import da linguagem Python é mapeada para a função C builtin import, que por sua vez faz chamadas às funções do arquivo import.c, tratando importações de módulos e submódulos. O comando import xml.dom.minidom é executado por etapas, definidas através da string com o nome do submódulo a ser importado, os pontos separam as etapas. A verificação do bloqueio dos módulos é feita com base nas etapas de importação definidas nesta string. O módulo Pygame foi alterado para bloquear alguma função ou método específico, impedindo, por exemplo, o módulo Pygame de abrir a gaveta do driver de CD-ROM (Compact Disc Read-Only Memory). Para este exemplo específico, o método eject do módulo pygame.cdrom.cd foi bloqueado. As funções system e fork do módulo so também 45

61 foram bloqueadas para impedir que applets executem outros programas ou iniciem novos processos. Esta estratégia não é efetiva para garantir a segurança do usuário final e foi adotada como prova de conceito para verificar a viabilidade desse tipo de alteração. Uma estratégia futura mais eficiente para a proteção do usuário é a remoção de todos os elementos de builtins e adicioná-los novamente um a um, rastreando os trechos de código que oferecem risco aos usuários, e realizando as alterações necessárias. Seguindo um modelo test-driven são executados testes muito simples e a cada erro encontrado durante a execução, é verificado qual elemento de builtin deve ser habilitado para a correta execução dos testes. A complexidade dos testes deve ser cada vez maior de forma a cobrir o maior número de funcionalidades possíveis da linguagem e também para verificar se as alterações realizadas em relação à segurança são satisfatórias Métodos Todas as alterações realizadas no código do Python estão protegidas pela diretiva de compilação mostrada a seguir no código 4.5. #i f d e f PYPPLET 2 / Codigo a l t e r a d o /novo / i ; #else 5 / Codigo o r i g i n a l / i ++; #endif Código 4.5: Diretiva de proteção para alterações Nos casos em que é necessário adicionar código, a parte else é omitida. Nos casos em que é necessário remover algum trecho de código é usada a diretiva ifndef, conforme exemplo no código 4.6 abaixo. #ifndef PYPPLET 2 / Codigo removido / i ; #endif Código 4.6: Diretiva de proteção para remoções 4.6 Compilação e instalação O ambiente de execução do plugin é composto por 4 softwares principais: o plugin, o processo externo pypplet, uma versão do Python com as devidas modificações, e o módulo Pygame. Esta seção descreve como compilar e instalar cada uma das partes envolvidas na distribuição Linux Ubuntu 9.04, que foi utilizada para o desenvolvimento e testes. 46

62 Todo o código fonte necessário está localizado na pasta src deste trabalho. O primeiro passo é instalar as dependências de compilação necessárias para cada um dos softwares. Os comandos necessários são apresentados no código 4.7 abaixo. apt get i n s t a l l build e s s e n t i a l apt get i n s t a l l xulrunner dev apt get build dep python2. 6 apt get build dep python pygame Código 4.7: Instalação de dependências O código fonte do Python que é utilizado está localizado na pasta src/cpython, para compilá-lo e instalá-lo, os comandos apresentados no código 4.8 abaixo devem ser executados.. / c o n f i g u r e p r e f i x = /bin / pypplet python with pydebug \ d i s a b l e shared EXTRA CFLAGS= DPYPPLET make make i n s t a l l As opções do comando configure são: Código 4.8: Compilar Python --prefix: define o prefixo para a instalação dos binários compilados. --with-pydebug: habilita macros auxiliares para desenvolvimento e depuração. --disable-shared: esta opção desabilita a compilação e uso da biblioteca dinâmica libpython-2.6.so. O binário executável é compilado utilizando a biblioteca estática libpython-1.6.a. É eliminada a necessidade de configuração do ligador para não incluir a biblioteca existente no sistema e sim a que foi compilada, dessa forma as funções corretas já ficam ligadas estaticamente ao arquivo executável. Para a execução do comando make é definida a variável de ambiente EXTRA CFLAGS com o valor -DPYPPLET que é adicionado aos parâmetros de compilação. A opção -DPYPPLET habilita as modificações no código fonte necessárias para a sua adequação ao propósito deste trabalho. O código do Pygame está localizado na pasta src/pygame e a sua compilação é realizada com os comandos mostrados a seguir no código 4.9. / bin /python pypplet / bin /python setup. py b u i l d / bin /python pypplet / bin /python setup. py i n s t a l l Código 4.9: Instalar Pygame O código fonte do plugin e do programa pypplet está localizado na pasta src e é compilado através de um comando make. O processo de instalação consiste na cópia dos binários resultantes para pastas prédefinidas na pasta home do usuário (a instalação é realizada somente para um usuário). 47

63 A biblioteca dinâmica pypplet.so (o plugin) é copiado para o diretório /.mozilla/pl ugins, onde o Firefox busca por plugins durante o seu processo de inicialização. O programa pypplet é copiado para a pasta /bin, que é adicionada ao path do usuário, possibilitando que o programa pypplet seja executado como um comando instalado no sistema. O Python é instalado no diretório base /bin/python-pypplet, este diretório poderia ser qualquer outro, este foi escolhido apenas para ficar no mesmo diretório do executável pypplet. A compilação e instalação do Pygame deve ser feita com o Python recém instalado, não se deve utilizar a versão do Python instalada no sistema anteriormente. Os arquivos correspondentes à biblioteca Pygame são copiados para diretórios internos da instalação do Python ( /bin/python-pypplet). Para verificar a correta instalação inicie (ou reinicie) o Firefox e verifique se o plugin foi corretamente registrado, mais detalhes podem ser obtidos na Seção Licenças de uso Os softwares e bibliotecas nos quais este trabalho é baseado têm seus códigos fonte publicados sob licenças que permitem a alteração e redistribuição do código, desde que citado a fonte[25, 28, 6]. A licença do Python, a Python Software Foundation License [29], é compatível com GPL [23], porém não possui a restrição copyleft, permitindo que outras licenças sejam atribuídas aos resultados de modificações de seu código. O PSDK é licenciado sob a NPL (Netscape Public License) [16] ou, alternativamente, sob GPL ou LGPL (GNU Lesser General Public License) [25]. A licença do Pygame é LGPL[6]. A licença do software implementado neste trabalho será LGPL [24]. 48

64 Capítulo 5 Resultados Obtidos Os resultados alcançados neste trabalho são softwares que possibilitam aos navegadores Web baseados no engine Gecko executar aplicações Python como applets incorporadas às páginas HTML exibidas. O tipo de conteúdo application/x-pypplet foi definido para identificar as applets Python, que são contidas em arquivos.ppy. Foram desenvolvidos um plugin compatível com o Gecko que, utilizando a interface definida pela NPAPI, implementa os procedimentos necessários para manipular conteúdos do tipo Pypplet (ou Python Applets) de forma integrada a páginas HTML; uma aplicação (pypplet) capaz de executar código Python utilizando a interface da PVM embarcada; e a integração entre ambos por meio de fila de mensagens. Foram aplicadas algumas restrições à PVM para diminuir os riscos aos quais o usuário está exposto ao executar código desconhecido, porém só é possível considerar como resultado os métodos definidos que poderão ser utilizados para a implementação de futuras restrições. Foi dado ênfase para o suporte a applets no domínio de aplicação dos jogos, o Módulo Pygame foi integrado à PVM restrita para fornecer às applets rotinas para manipulação de eventos gerados pelos usuários e a applets que utilizam a biblioteca Pygame para o desenvolvimento da parte gráfica e interação com o usuário. A utilização das Applets Python pode ser feita através da tag HTML object, como demonstrado no código 5.1. O atributo data indica a localização do arquivo que contém o código da applet que será executada e os atributos width e height definem, em pixels, as dimensões da área destinada à applet. 1 <object data= draw. ppy type= a p p l i c a t i o n /x pypplet width=600 4 height=400 > </ object> Código 5.1: Código HTML para uso de uma applet 49

65 Uma página HTML que contenha o trecho de código apresentado no código 5.1 quando renderizada pelo Gecko irá exibir a applet integrada com os demais elementos da página, como mostra a figura 5.1. Figura 5.1: Applet integrada à página HTML Na figura 5.1 a cor de fundo da applet coincide com a cor de fundo do elemento que a contém, dando a impressão visual de serem um único elemento. A figura 5.2 mostra o limite entre a applet e o restante da página HTML destacando a área destinada à applet com a cor verde, uma área retangular que é a janela controlada pela applet com as dimensões especificadas nos atributos width e height. A janela é criada pelo Gecko e as suas dimensões são especificadas pelos atributos da tag object. No código da applet, o Pygame deve ser configurado para utilizar uma janela com as mesmas dimensões, como exemplificado no código 5.2. pygame. d i s p l a y. set mode ( ( 6 0 0, ) ) Código 5.2: Configuração das dimensões da janela no Pygame Parte dos gráficos renderizados pelo Pygame poderá não ser exibida caso a área utilizada pelo Pygame seja maior que a área criada pelo Gecko, ou então parte da janela não será utilizada caso a área utilizada pelo Pygame seja menor que a área da janela criada pelo Gecko. As applets podem ser exibidas pelo navegador como o conteúdo principal, e não parte de um conteúdo HTML. Neste caso a janela destinada ao plugin ocupa toda a área disponível para os conteúdos. Caso o Pygame não utilize toda a área da janela disponibilizada, as partes não utilizadas são exibidas na cor cinza. 50

66 Figura 5.2: Delimitação da área da Applet As applets são aplicações Python e também podem ser executadas fora do contexto do Gecko utilizando um interpretador Python comum que geralmente já está instalado no sistema, como mostra a figura 5.3. O caminho inverso (utilizar uma aplicação como applet) também pode ser feito com poucas ou nenhuma alteração, o que determina a necessidade de alteração são as restrições da PVM utilizada para executar as applets. A figura 5.4 apresenta uma captura de tela do Firefox exibindo applets de forma integrada ao restante o conteúdo da página. Na mesma figura é possível observar o suporte a várias instâncias em paralelo, que é uma característica dos plugins para o Gecko e foi preservada neste trabalho. A applet exibida nas figuras 5.5 e 5.6 são a adaptação de um mini-jogo desenvolvido por Seth Yastrov em A única alteração realizada para utilizá-lo como como applet foi nas dimensões da tela, para melhor se adequar à página. Todo o processo de desenvolvimento e testes foi realizado utilizando o navegador Firefox como referência. Porém, após breves testes realizados na fase final do trabalho, foi constatado a correta execução de Applets Python também nos navegadores Epiphany e Galeon sem a necessidade de nenhuma alteração nos softwares desenvolvidos. As figuras 5.5 e 5.6 mostram Applets Python em execução no Galeon e Epiphany, respectivamente. 51

67 Figura 5.3: Applet executada como uma aplicação Python comum 5.1 Limitações A implementação apresentada possui limitações decorrentes das tecnologias que foram trabalhadas, de falta de documentação suficientemente completa e dificuldades técnicas encontradas durante desenvolvimento do trabalho. A limitação mais perceptível, inclusive para os usuários finais, é a ausência de tratamento para o eventos gerados pelo teclado. Applets que utilizam mais de um arquivo de código ou façam uso de arquivos externos como imagens não são suportadas. Porém, é possível encapsular imagens e outros tipos de arquivos de dados de forma serializada em um único arquivo.ppy juntamente com o código do programa. A comunicação entre processos não está totalmente implementada, os erros não são tratados adequadamente e os tipos de mensagens definidos até o momento limitam a interação entre o processo pypplet e o plugin. A tag object, utilizada para adicionar applets a páginas HTML, suporta além dos atributos, parâmetros para a applet. Atualmente esses parâmetros e atributos não são enviados para a applet. 52

68 Figura 5.4: Applets em execução paralela na mesma página. A dependência de sistemas operacionais derivados do Unix, como o Linux, também pode ser considerada uma limitação, assim como a pouca restrição aplicada à PVM permitindo que as applets possam vir a causar danos ao sistema e aos dados dos usuários. 53

69 Figura 5.5: Applet em execução no navegador Galeon 54

70 Figura 5.6: Applet em execução no navegadores Epiphany 55

Introdução. à Linguagem JAVA. Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação. Laboratório de Visão Computacional

Introdução. à Linguagem JAVA. Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação. Laboratório de Visão Computacional Introdução à Linguagem JAVA Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação Laboratório de Visão Computacional Vantagens do Java Independência de plataforma; Sintaxe semelhante às linguagens

Leia mais

CONCEITOS INICIAIS. Agenda A diferença entre páginas Web, Home Page e apresentação Web;

CONCEITOS INICIAIS. Agenda A diferença entre páginas Web, Home Page e apresentação Web; CONCEITOS INICIAIS Agenda A diferença entre páginas Web, Home Page e apresentação Web; O que é necessário para se criar páginas para a Web; Navegadores; O que é site, Host, Provedor e Servidor Web; Protocolos.

Leia mais

Conteúdo Programático de PHP

Conteúdo Programático de PHP Conteúdo Programático de PHP 1 Por que PHP? No mercado atual existem diversas tecnologias especializadas na integração de banco de dados com a WEB, sendo o PHP a linguagem que mais se desenvolve, tendo

Leia mais

Figura 01 Kernel de um Sistema Operacional

Figura 01 Kernel de um Sistema Operacional 01 INTRODUÇÃO 1.5 ESTRUTURA DOS SISTEMAS OPERACIONAIS O Sistema Operacional é formado por um Conjunto de rotinas (denominado de núcleo do sistema ou kernel) que oferece serviços aos usuários e suas aplicações

Leia mais

Desenvolvendo Websites com PHP

Desenvolvendo Websites com PHP Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.

Leia mais

Capítulo 2 Introdução à ferramenta Flash

Capítulo 2 Introdução à ferramenta Flash Capítulo 2 Introdução à ferramenta Flash Índice 1. O uso da ferramenta Flash no projeto RIVED.... 1 2. História do Flash... 4 1. O uso da ferramenta Flash no projeto RIVED. É importante, antes de iniciarmos

Leia mais

ESTUDO SOBRE AS LINGUAGENS DE PROGRAMAÇÃO HOSPEDEIRAS SUPORTADAS PELA FERRAMENTA HTML. Aluno: Rodrigo Ristow Orientador: Wilson Pedro Carli

ESTUDO SOBRE AS LINGUAGENS DE PROGRAMAÇÃO HOSPEDEIRAS SUPORTADAS PELA FERRAMENTA HTML. Aluno: Rodrigo Ristow Orientador: Wilson Pedro Carli ESTUDO SOBRE AS LINGUAGENS DE PROGRAMAÇÃO HOSPEDEIRAS SUPORTADAS PELA FERRAMENTA HTML Aluno: Rodrigo Ristow Orientador: Wilson Pedro Carli Objetivo; Roteiro da Apresentação Visão Geral sobre Internet,

Leia mais

Arquitetura de Computadores. Introdução aos Sistemas Operacionais

Arquitetura de Computadores. Introdução aos Sistemas Operacionais Arquitetura de Computadores Introdução aos Sistemas Operacionais O que é um Sistema Operacional? Programa que atua como um intermediário entre um usuário do computador ou um programa e o hardware. Os 4

Leia mais

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Conceitos básicos e serviços do Sistema Operacional Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Tipos de serviço do S.O. O S.O.

Leia mais

World Wide Web e Aplicações

World Wide Web e Aplicações World Wide Web e Aplicações Módulo H O que é a WWW Permite a criação, manipulação e recuperação de informações Padrão de fato para navegação, publicação de informações e execução de transações na Internet

Leia mais

Ontologia Navegadores_Codigo-Aberto

Ontologia Navegadores_Codigo-Aberto Ontologia Navegadores_Codigo-Aberto Documento Lista de Termos (versão 1.0) 04-04-2008 report by ontokem Web Tool - ontologies for Knowledge Engineering and Management 1) bookmark: instância da característica

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Sistemas Operacionais Prof. Marcelo Sabaris Carballo Pinto Gerenciamento de Dispositivos Gerenciamento de Dispositivos de E/S Introdução Gerenciador de Dispositivos Todos os dispositivos

Leia mais

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Faculdade de Tecnologia SENAC Goiás. Disciplina: Gerenciamento de Rede de Computadores. Goiânia, 16 de novembro de 2014.

Faculdade de Tecnologia SENAC Goiás. Disciplina: Gerenciamento de Rede de Computadores. Goiânia, 16 de novembro de 2014. Faculdade de Tecnologia SENAC Goiás Disciplina: Gerenciamento de Rede de Computadores : Goiânia, 16 de novembro de 2014. Faculdade de Tecnologia SENAC Goiás Professor: Marissol Martins Alunos: Edy Laus,

Leia mais

ESTUDO DE CASO WINDOWS VISTA

ESTUDO DE CASO WINDOWS VISTA ESTUDO DE CASO WINDOWS VISTA História Os sistemas operacionais da Microsoft para PCs desktop e portáteis e para servidores podem ser divididos em 3 famílias: MS-DOS Windows baseado em MS-DOS Windows baseado

Leia mais

Introdução. Hardware X Software. Corpo Humano Parte Física. Capacidade de utilizar o corpo em atividades especificas explorando seus componentes

Introdução. Hardware X Software. Corpo Humano Parte Física. Capacidade de utilizar o corpo em atividades especificas explorando seus componentes Introdução Hardware X Software Corpo Humano Parte Física Componentes 18 Capacidade de utilizar o corpo em atividades especificas explorando seus componentes Hardware Introdução Parte física: placas, periféricos,

Leia mais

2. O AMBIENTE DE PROGRAMAÇÃO EM C

2. O AMBIENTE DE PROGRAMAÇÃO EM C 2. O AMBIENTE DE PROGRAMAÇÃO EM C Este capítulo trata de colocar a linguagem C para funcionar em um ambiente de programação, concentrando-se no compilador GNU Compiler Collection (gcc). Mas qualquer outro

Leia mais

SISTEMAS OPERACIONAIS

SISTEMAS OPERACIONAIS SISTEMAS OPERACIONAIS Tópico 4 Estrutura do Sistema Operacional Prof. Rafael Gross prof.rafaelgross@fatec.sp.gov.br FUNÇÕES DO NUCLEO As principais funções do núcleo encontradas na maioria dos sistemas

Leia mais

ATIVIDADES PRÁTICAS SUPERVISIONADAS

ATIVIDADES PRÁTICAS SUPERVISIONADAS ATIVIDADES PRÁTICAS SUPERVISIONADAS CST em Análise e Desenvolvimento de Sistemas 5ª. Série Programação e Design para Web A atividade prática supervisionada (ATPS) é um procedimento metodológico de ensino-aprendizagem

Leia mais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP) Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,

Leia mais

1 http://www.google.com

1 http://www.google.com 1 Introdução A computação em grade se caracteriza pelo uso de recursos computacionais distribuídos em várias redes. Os diversos nós contribuem com capacidade de processamento, armazenamento de dados ou

Leia mais

Manual do Usuário Android Neocontrol

Manual do Usuário Android Neocontrol Manual do Usuário Android Neocontrol Sumário 1.Licença e Direitos Autorais...3 2.Sobre o produto...4 3. Instalando, Atualizando e executando o Android Neocontrol em seu aparelho...5 3.1. Instalando o aplicativo...5

Leia mais

Noções de. Microsoft SQL Server. Microsoft SQL Server

Noções de. Microsoft SQL Server. Microsoft SQL Server Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados

Leia mais

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira IFPE Disciplina: Sistemas Operacionais Prof. Anderson Luiz Moreira SERVIÇOS OFERECIDOS PELOS SOS 1 Introdução O SO é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Aula 6 Estrutura de Sistemas Operacionais Prof.: Edilberto M. Silva http://www.edilms.eti.br Baseado no material disponibilizado por: SO - Prof. Edilberto Silva Prof. José Juan Espantoso

Leia mais

Dado: Fatos conhecidos que podem ser registrados e têm um significado implícito. Banco de Dados:

Dado: Fatos conhecidos que podem ser registrados e têm um significado implícito. Banco de Dados: MC536 Introdução Sumário Conceitos preliminares Funcionalidades Características principais Usuários Vantagens do uso de BDs Tendências mais recentes em SGBDs Algumas desvantagens Modelos de dados Classificação

Leia mais

Sistemas Operacionais

Sistemas Operacionais UNIVERSIDADE BANDEIRANTE DE SÃO PAULO INSTITUTO POLITÉCNICO CURSO DE SISTEMAS DE INFORMAÇÃO Sistemas Operacionais Notas de Aulas: Tópicos 7 e 8 Estrutura do Sistema Operacional São Paulo 2009 1 Sumário

Leia mais

SISTEMAS DISTRIBUIDOS

SISTEMAS DISTRIBUIDOS 1 2 Caracterização de Sistemas Distribuídos: Os sistemas distribuídos estão em toda parte. A Internet permite que usuários de todo o mundo acessem seus serviços onde quer que possam estar. Cada organização

Leia mais

Resumo: Perguntas a fazer ao elaborar um projeto arquitetural

Resumo: Perguntas a fazer ao elaborar um projeto arquitetural Resumo: Perguntas a fazer ao elaborar um projeto arquitetural Sobre entidades externas ao sistema Quais sistemas externos devem ser acessados? Como serão acessados? Há integração com o legado a ser feita?

Leia mais

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi 5 Conclusão Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi permitir que scripts Lua instanciem e usem

Leia mais

Linguagem de Programação JAVA. Professora Michelle Nery Nomeclaturas

Linguagem de Programação JAVA. Professora Michelle Nery Nomeclaturas Linguagem de Programação JAVA Professora Michelle Nery Nomeclaturas Conteúdo Programático Nomeclaturas JDK JRE JEE JSE JME JVM Toolkits Swing AWT/SWT JDBC EJB JNI JSP Conteúdo Programático Nomenclatures

Leia mais

3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio

3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio 32 3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio Este capítulo apresenta o framework orientado a aspectos para monitoramento e análise de processos de negócio

Leia mais

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 2. Cursos de Computação

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 2. Cursos de Computação Cursos de Computação Sistemas Operacionais Prof. M.Sc. Sérgio Teixeira Aula 05 Estrutura e arquitetura do SO Parte 2 Referência: MACHADO, F.B. ; MAIA, L.P. Arquitetura de Sistemas Operacionais. 4.ed. LTC,

Leia mais

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES Alexandre Egleilton Araújo, Jaime Willian Dias Universidade Paranaense (Unipar) Paranavaí PR Brasil araujo.ale01@gmail.com, jaime@unipar.br Resumo.

Leia mais

SISTEMAS OPERACIONAIS. Apostila 03 Estrutura do Sistema Operacional UNIBAN

SISTEMAS OPERACIONAIS. Apostila 03 Estrutura do Sistema Operacional UNIBAN SISTEMAS OPERACIONAIS Apostila 03 Estrutura do Sistema Operacional UNIBAN 1.0 O Sistema Operacional como uma Máquina Virtual A arquitetura (conjunto de instruções, organização de memória, E/S e estrutura

Leia mais

Histórico da Revisão. Versão Descrição Autor. 1.0 Versão Inicial

Histórico da Revisão. Versão Descrição Autor. 1.0 Versão Inicial 1 of 14 27/01/2014 17:33 Sistema de Paginação de Esportes Universitários Documento de Arquitetura de Software Versão 1.0 Histórico da Revisão Data 30 de novembro de 1999 Versão Descrição Autor 1.0 Versão

Leia mais

Introdução à Linguagem Java

Introdução à Linguagem Java Introdução à Linguagem Java Histórico: Início da década de 90. Pequeno grupo de projetos da Sun Microsystems, denominado Green. Criar uma nova geração de computadores portáveis, capazes de se comunicar

Leia mais

Sistema Operacional LINUX

Sistema Operacional LINUX SISTEMA OPERACIONAL Sistema Operacional LINUX Para que o computador funcione e possibilite a execução de programas é necessária a existência de um sistema operacional. O sistema operacional é uma camada

Leia mais

Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por Codd.

Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por Codd. Apresentação Este curso tem como objetivo, oferecer uma noção geral sobre a construção de sistemas de banco de dados. Para isto, é necessário estudar modelos para a construção de projetos lógicos de bancos

Leia mais

LINUX. Lapro I Profa. Fernanda Denardin Walker. - Aula 2 - Material adaptado de: Isabel Mansour, Marcia Moraes e Silvia Moraes SISTEMA OPERACIONAL

LINUX. Lapro I Profa. Fernanda Denardin Walker. - Aula 2 - Material adaptado de: Isabel Mansour, Marcia Moraes e Silvia Moraes SISTEMA OPERACIONAL LINUX Lapro I Profa. Fernanda Denardin Walker - Aula 2 - Material adaptado de: Isabel Mansour, Marcia Moraes e Silvia Moraes SISTEMA OPERACIONAL Para que o computador funcione e possibilite a execução

Leia mais

DESENVOLVIMENTO WEB DENTRO DOS PARADIGMAS DO HTML5 E CSS3

DESENVOLVIMENTO WEB DENTRO DOS PARADIGMAS DO HTML5 E CSS3 DESENVOLVIMENTO WEB DENTRO DOS PARADIGMAS DO HTML5 E CSS3 Eduardo Laguna Rubai, Tiago Piperno Bonetti Universidade Paranaense (Unipar) Paranavaí PR- Brasil eduardorubay@gmail.com, bonetti@unipar.br Resumo.

Leia mais

UM FRAMEWORK PARA DESENVOLVIMENTO DE

UM FRAMEWORK PARA DESENVOLVIMENTO DE UNIVERSIDADE FEDERAL DE PERNAMBUCO GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO CENTRO DE INFORMÁTICA UM FRAMEWORK PARA DESENVOLVIMENTO DE APLICATIVOS EM WINDOWS MOBILE. PROPOSTA DE TRABALHO DE GRADUAÇÃO Aluno:

Leia mais

Sistemas Operacionais. Conceitos de um Sistema Operacional

Sistemas Operacionais. Conceitos de um Sistema Operacional Sistemas Operacionais Conceitos de um Sistema Operacional Modo usuário e Modo Kernel Como já vimos são ambientes de execução diferentes no processador Há um conjunto de funções privilegiadas acessadas

Leia mais

MQSeries Everyplace. Leia-me primeiro G517-7010-00

MQSeries Everyplace. Leia-me primeiro G517-7010-00 MQSeries Everyplace Leia-me primeiro G517-7010-00 MQSeries Everyplace Leia-me primeiro G517-7010-00 Primeira Edição (Junho de 2000) Esta edição se aplica ao MQSeries Everyplace Versão 1.0 e a todos os

Leia mais

5 Mecanismo de seleção de componentes

5 Mecanismo de seleção de componentes Mecanismo de seleção de componentes 50 5 Mecanismo de seleção de componentes O Kaluana Original, apresentado em detalhes no capítulo 3 deste trabalho, é um middleware que facilita a construção de aplicações

Leia mais

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

Introdução a Computação

Introdução a Computação Sistemas Operacionais: Software Oculto Introdução a Computação Sistemas Operacionais Serve como um intermediário entre o hardware e os softwares aplicativos. Sistema Operacional Software de sistemas Kernel

Leia mais

SISTEMAS OPERACIONAIS

SISTEMAS OPERACIONAIS SISTEMAS OPERACIONAIS Conceitos Básicos Sistema Operacional: Um Sistema Operacional é um programa que atua como intermediário entre o usuário e o hardware de um computador. O Propósito do SO é fornecer

Leia mais

11/3/2009. Software. Sistemas de Informação. Software. Software. A Construção de um programa de computador. A Construção de um programa de computador

11/3/2009. Software. Sistemas de Informação. Software. Software. A Construção de um programa de computador. A Construção de um programa de computador Sistemas de Informação Prof. Anderson D. Moura Um programa de computador é composto por uma seqüência de instruções, que é interpretada e executada por um processador ou por uma máquina virtual. Em um

Leia mais

Informática. Informática. Valdir

Informática. Informática. Valdir Informática Informática Valdir Questão 21 A opção de alterar as configurações e aparência do Windows, inclusive a cor da área de trabalho e das janelas, instalação e configuração de hardware, software

Leia mais

PROJETO INFORMÁTICA NA ESCOLA

PROJETO INFORMÁTICA NA ESCOLA EE Odilon Leite Ferraz PROJETO INFORMÁTICA NA ESCOLA AULA 1 APRESENTAÇÃO E INICIAÇÃO COM WINDOWS VISTA APRESENTAÇÃO E INICIAÇÃO COM WINDOWS VISTA Apresentação dos Estagiários Apresentação do Programa Acessa

Leia mais

LICENCIAMENTO V14 USANDO REPRISE LICENSE MANAGER

LICENCIAMENTO V14 USANDO REPRISE LICENSE MANAGER LICENCIAMENTO V14 USANDO REPRISE LICENSE MANAGER V14 de BricsCAD vem com um novo sistema de licenciamento, com base na tecnologia de licenciamento de Reprise Software. Este novo sistema oferece um ambiente

Leia mais

Aplicação Prática de Lua para Web

Aplicação Prática de Lua para Web Aplicação Prática de Lua para Web Aluno: Diego Malone Orientador: Sérgio Lifschitz Introdução A linguagem Lua vem sendo desenvolvida desde 1993 por pesquisadores do Departamento de Informática da PUC-Rio

Leia mais

Introdução a listas - Windows SharePoint Services - Microsoft Office Online

Introdução a listas - Windows SharePoint Services - Microsoft Office Online Page 1 of 5 Windows SharePoint Services Introdução a listas Ocultar tudo Uma lista é um conjunto de informações que você compartilha com membros da equipe. Por exemplo, você pode criar uma folha de inscrição

Leia mais

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br LP II Estrutura de Dados Introdução e Linguagem C Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br Resumo da aula Considerações Gerais Introdução a Linguagem C Variáveis e C Tipos de

Leia mais

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. 1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. Editando um Artigo 4.3. Excluindo um Artigo 4.4. Publicar

Leia mais

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia O Sistema Operacional que você usa é multitasking? Por multitasking, entende-se a capacidade do SO de ter mais de um processos em execução ao mesmo tempo. É claro que, num dado instante, o número de processos

Leia mais

Introdução à Tecnologia Web. Tipos de Sites. Profª MSc. Elizabete Munzlinger www.elizabete.com.br

Introdução à Tecnologia Web. Tipos de Sites. Profª MSc. Elizabete Munzlinger www.elizabete.com.br IntroduçãoàTecnologiaWeb TiposdeSites ProfªMSc.ElizabeteMunzlinger www.elizabete.com.br ProfªMSc.ElizabeteMunzlinger www.elizabete.com.br TiposdeSites Índice 1 Sites... 2 2 Tipos de Sites... 2 a) Site

Leia mais

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 ArpPrintServer Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 1 Sumário INTRODUÇÃO... 3 CARACTERÍSTICAS PRINCIPAIS DO SISTEMA... 3 REQUISITOS DE SISTEMA... 4 INSTALAÇÃO

Leia mais

O que é o Virto ERP? Onde sua empresa quer chegar? Apresentação. Modelo de funcionamento

O que é o Virto ERP? Onde sua empresa quer chegar? Apresentação. Modelo de funcionamento HOME O QUE É TOUR MÓDULOS POR QUE SOMOS DIFERENTES METODOLOGIA CLIENTES DÚVIDAS PREÇOS FALE CONOSCO Suporte Sou Cliente Onde sua empresa quer chegar? Sistemas de gestão precisam ajudar sua empresa a atingir

Leia mais

3 SERVIÇOS IP. 3.1 Serviços IP e alguns aspectos de segurança

3 SERVIÇOS IP. 3.1 Serviços IP e alguns aspectos de segurança 3 SERVIÇOS IP 3.1 Serviços IP e alguns aspectos de segurança Os serviços IP's são suscetíveis a uma variedade de possíveis ataques, desde ataques passivos (como espionagem) até ataques ativos (como a impossibilidade

Leia mais

FileMaker Pro 13. Utilização de uma Conexão de Área de Trabalho Remota com o FileMaker Pro 13

FileMaker Pro 13. Utilização de uma Conexão de Área de Trabalho Remota com o FileMaker Pro 13 FileMaker Pro 13 Utilização de uma Conexão de Área de Trabalho Remota com o FileMaker Pro 13 2007-2013 FileMaker Inc. Todos os direitos reservados. FileMaker Inc. 5201 Patrick Henry Drive Santa Clara,

Leia mais

Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com

Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com Sistemas Operacionais Aula 06: Threads Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com Objetivos Introduzir o conceito de thread Discutir as APIs das bibliotecas de threads Pthreads, Win32

Leia mais

Faculdades Santa Cruz - Inove. Plano de Aula Base: Livro - Distributed Systems Professor: Jean Louis de Oliveira.

Faculdades Santa Cruz - Inove. Plano de Aula Base: Livro - Distributed Systems Professor: Jean Louis de Oliveira. Período letivo: 4 Semestre. Quinzena: 5ª. Faculdades Santa Cruz - Inove Plano de Aula Base: Livro - Distributed Systems Professor: Jean Louis de Oliveira. Unidade Curricular Sistemas Distribuídos Processos

Leia mais

GLOSSÁRIO. ActiveX Controls. É essencialmente uma interface usada para entrada e saída de dados para uma aplicação.

GLOSSÁRIO. ActiveX Controls. É essencialmente uma interface usada para entrada e saída de dados para uma aplicação. GLOSSÁRIO Este glossário contém termos e siglas utilizados para Internet. Este material foi compilado de trabalhos publicados por Plewe (1998), Enzer (2000) e outros manuais e referências localizadas na

Leia mais

Intranets. FERNANDO ALBUQUERQUE Departamento de Ciência da Computação Universidade de Brasília 1.INTRODUÇÃO

Intranets. FERNANDO ALBUQUERQUE Departamento de Ciência da Computação Universidade de Brasília 1.INTRODUÇÃO Intranets FERNANDO ALBUQUERQUE Departamento de Ciência da Computação Universidade de Brasília 1.INTRODUÇÃO As intranets são redes internas às organizações que usam as tecnologias utilizadas na rede mundial

Leia mais

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E 33 2015-2 AULA TEÓRICA 2 PROF. MARCELO LUIZ SILVA (R E D)

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E 33 2015-2 AULA TEÓRICA 2 PROF. MARCELO LUIZ SILVA (R E D) Universidade Federal de Ouro Preto - UFOP Instituto de Ciências Exatas e Biológicas - ICEB Departamento de Computação - DECOM INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E 33 2015-2 1 AULA TEÓRICA 2

Leia mais

DESENVOLVIMENTO DE SOFTWARE DE VOTAÇÃO WEB UTILIZANDO TECNOLOGIA TOUCHSCREEN

DESENVOLVIMENTO DE SOFTWARE DE VOTAÇÃO WEB UTILIZANDO TECNOLOGIA TOUCHSCREEN DESENVOLVIMENTO DE SOFTWARE DE VOTAÇÃO WEB UTILIZANDO TECNOLOGIA TOUCHSCREEN José Agostinho Petry Filho 1 ; Rodrigo de Moraes 2 ; Silvio Regis da Silva Junior 3 ; Yuri Jean Fabris 4 ; Fernando Augusto

Leia mais

Como é o desenvolvimento de Software?

Como é o desenvolvimento de Software? Como é o desenvolvimento de Software? Fases do Desenvolvimento Modelo Cascata Define atividades seqüenciais Outras abordagens são baseadas nesta idéia Especificação de Requisitos Projeto Implementação

Leia mais

Programação com acesso a BD. Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br

Programação com acesso a BD. Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br Programação com acesso a BD Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br 1 Introdução BD desempenha papel crítico em todas as áreas em que computadores são utilizados: Banco: Depositar ou retirar

Leia mais

Semântica para Sharepoint. Busca semântica utilizando ontologias

Semântica para Sharepoint. Busca semântica utilizando ontologias Semântica para Sharepoint Busca semântica utilizando ontologias Índice 1 Introdução... 2 2 Arquitetura... 3 3 Componentes do Produto... 4 3.1 OntoBroker... 4 3.2 OntoStudio... 4 3.3 SemanticCore para SharePoint...

Leia mais

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 1 Prof. Cristóvão Cunha Objetivos de aprendizagem

Leia mais

Um Driver NDIS Para Interceptação de Datagramas IP

Um Driver NDIS Para Interceptação de Datagramas IP Um Driver NDIS Para Interceptação de Datagramas IP Paulo Fernando da Silva psilva@senior.com.br Sérgio Stringari stringari@furb.br Resumo. Este artigo apresenta o desenvolvimento de um driver NDIS 1 para

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Modelo Cliente-Servidor: Introdução aos tipos de servidores e clientes Prof. MSc. Hugo Souza Iniciando o módulo 03 da primeira unidade, iremos abordar sobre o Modelo Cliente-Servidor

Leia mais

Organização e Arquitetura de Computadores I. de Computadores

Organização e Arquitetura de Computadores I. de Computadores Universidade Federal de Campina Grande Unidade Acadêmica de Sistemas e Computação Curso de Bacharelado em Ciência da Computação Organização e Arquitetura de Computadores I Organização Básica B de Computadores

Leia mais

Banco de Dados de Músicas. Andre Lima Rocha Campos Osório Pereira Carvalho

Banco de Dados de Músicas. Andre Lima Rocha Campos Osório Pereira Carvalho Banco de Dados de Músicas Andre Lima Rocha Campos Osório Pereira Carvalho Definição Aplicação Web que oferece ao usuário um serviço de busca de músicas e informações relacionadas, como compositor, interprete,

Leia mais

UM NOVO CONCEITO EM AUTOMAÇÃO. Série Ponto

UM NOVO CONCEITO EM AUTOMAÇÃO. Série Ponto UM NOVO CONCEITO EM AUTOMAÇÃO Série Ponto POR QUE NOVO CONCEITO? O que é um WEBPLC? Um CP na WEB Por que usar INTERNET? Controle do processo de qualquer lugar WEBGATE = conexão INTERNET/ALNETII WEBPLC

Leia mais

SISTEMAS OPERACIONAIS. Prof. André Dutton

SISTEMAS OPERACIONAIS. Prof. André Dutton 1 SISTEMAS OPERACIONAIS Prof. André Dutton O OS esta ligado diretamente com o Hardware do Computador no qual ele é executado. CPU MEMORIA CONTROLAD OR DE VIDEO CONTROLAD OR DE TECLADO CONTROLAD OR DE DISCO

Leia mais

EMULADOR 3270 VIA WEB BROWSER

EMULADOR 3270 VIA WEB BROWSER EMULADOR 3270 VIA WEB BROWSER Host On-Demand - HOD Versão 6.0 Fev/2002 Suporte Técnico: Central de Atendimento SERPRO CAS 0800-782323 Gilson.Pereira@serpro.gov.br Marcio.Nunes@serpro.gov.br O que é o serviço

Leia mais

UNIVERSIDADE ESTADUAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE QUÍMICA CURSO DE LICENCIATURA EM QUÍMICA LINDOMÁRIO LIMA ROCHA

UNIVERSIDADE ESTADUAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE QUÍMICA CURSO DE LICENCIATURA EM QUÍMICA LINDOMÁRIO LIMA ROCHA UNIVERSIDADE ESTADUAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE QUÍMICA CURSO DE LICENCIATURA EM QUÍMICA LINDOMÁRIO LIMA ROCHA FACILITADOR VIRTUAL DA APRENDIZAGEM EM QUÍMICA Campina Grande-

Leia mais

4 Estrutura do Sistema Operacional. 4.1 - Kernel

4 Estrutura do Sistema Operacional. 4.1 - Kernel 1 4 Estrutura do Sistema Operacional 4.1 - Kernel O kernel é o núcleo do sistema operacional, sendo responsável direto por controlar tudo ao seu redor. Desde os dispositivos usuais, como unidades de disco,

Leia mais

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais Fundamentos de Sistemas Operacionais Professor: João Fábio de Oliveira jfabio@amprnet.org.br (41) 9911-3030 Objetivo: Apresentar o que são os Sistemas Operacionais, seu funcionamento, o que eles fazem,

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Gerência de processos Controle e descrição de processos Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Sumário Representação e controle de processos pelo SO Estrutura

Leia mais

Manual do Painel Administrativo

Manual do Painel Administrativo Manual do Painel Administrativo versão 1.0 Autores César A Miggiolaro Marcos J Lazarin Índice Índice... 2 Figuras... 3 Inicio... 5 Funcionalidades... 7 Analytics... 9 Cidades... 9 Conteúdo... 10 Referência...

Leia mais

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 1. Cursos de Computação

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 1. Cursos de Computação Cursos de Computação Sistemas Operacionais Prof. M.Sc. Sérgio Teixeira Aula 05 Estrutura e arquitetura do SO Parte 1 Referência: MACHADO, F.B. ; MAIA, L.P. Arquitetura de Sistemas Operacionais. 4.ed. LTC,

Leia mais

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR Novell Teaming - Guia de início rápido Novell Teaming 1.0 Julho de 2007 INTRODUÇÃO RÁPIDA www.novell.com Novell Teaming O termo Novell Teaming neste documento se aplica a todas as versões do Novell Teaming,

Leia mais

Arquitetura de Sistemas Operacionais Machado/Maia. Arquitetura de Sistemas

Arquitetura de Sistemas Operacionais Machado/Maia. Arquitetura de Sistemas Arquitetura de Sistemas Operacionais Capítulo 4 Estrutura do Sistema Operacional Cap. 4 Estrutura do Sistema 1 Sistemas Operacionais Pitágoras Fadom Divinópolis Material Utilizado na disciplina Sistemas

Leia mais

MÓDULO 11 ELEMENTOS QUE FAZEM PARTE DO PROJETO DO SISTEMA

MÓDULO 11 ELEMENTOS QUE FAZEM PARTE DO PROJETO DO SISTEMA MÓDULO 11 ELEMENTOS QUE FAZEM PARTE DO PROJETO DO SISTEMA Através dos elementos que fazem parte do projeto do sistema é que podemos determinar quais as partes do sistema que serão atribuídas às quais tipos

Leia mais

Introdução Dalvik Linux 2.6. Android. Diogo de Campos, João Paulo Pizani Flor, Maurício Oliveira Haensch, Pedro Covolan Bachiega

Introdução Dalvik Linux 2.6. Android. Diogo de Campos, João Paulo Pizani Flor, Maurício Oliveira Haensch, Pedro Covolan Bachiega Android Diogo de Campos, João Paulo Pizani Flor, Maurício Oliveira Haensch, Pedro Covolan Bachiega Universidade Federal de Santa Catarina November 18, 2008 Agenda 1 Introdução 2 Dalvik 3 Linux 2.6 Introdução

Leia mais

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert:

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert: BRAlarmExpert Software para Gerenciamento de Alarmes A TriSolutions conta com um produto diferenciado para gerenciamento de alarmes que é totalmente flexível e amigável. O software BRAlarmExpert é uma

Leia mais

Criando um script simples

Criando um script simples Criando um script simples As ferramentas de script Diferente de muitas linguagens de programação, você não precisará de quaisquer softwares especiais para criar scripts de JavaScript. A primeira coisa

Leia mais

Aspectos técnicos do desenvolvimento baseado em componentes

Aspectos técnicos do desenvolvimento baseado em componentes Aspectos técnicos do desenvolvimento baseado em componentes Um novo processo de desenvolvimento O uso de componentes traz mudanças no processo de desenvolvimento Além de desenvolver um produto, queremos

Leia mais