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

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

APLICAÇÕES EM SISTEMAS DISTRIBUÍDOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com

APLICAÇÕES EM SISTEMAS DISTRIBUÍDOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com - Aula 6 - ALGORÍTIMOS PARALELOS MPI - Parallel Virtual Machine e PVM - Parallel Virtual Machine 1. INTRODUÇÃO Inicialmente é necessário conceber alguns conceitos para entendimento dos algoritmos paralelos:

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 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

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

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

Estudo comparativo entre tecnologias Java: Applet e JWS.

Estudo comparativo entre tecnologias Java: Applet e JWS. Estudo comparativo entre tecnologias Java: Applet e JWS. Clara Aben-Athar B. Fernandes¹, Carlos Alberto P. Araújo¹ 1 Centro Universitário Luterano de Santarém Comunidade Evangélica Luterana (CEULS/ULBRA)

Leia mais

WWW - World Wide Web

WWW - World Wide Web WWW World Wide Web WWW Cap. 9.1 WWW - World Wide Web Idéia básica do WWW: Estratégia de acesso a uma teia (WEB) de documentos referenciados (linked) em computadores na Internet (ou Rede TCP/IP privada)

Leia mais

Processos (Threads,Virtualização e Migração de Código)

Processos (Threads,Virtualização e Migração de Código) Processos (Threads,Virtualização e Migração de Código) Roteiro Processos Threads Virtualização Migração de Código O que é um processo?! Processos são programas em execução. Processo Processo Processo tem

Leia mais

ESTUDO COMPARATIVO DE BIBLIOTECAS GRÁFICAS I TEGRADAS COM OPE GL

ESTUDO COMPARATIVO DE BIBLIOTECAS GRÁFICAS I TEGRADAS COM OPE GL ESTUDO COMPARATIVO DE BIBLIOTECAS GRÁFICAS I TEGRADAS COM OPE GL Francisco Tiago Avelar, Vitor Conrado F. Gomes, Cesar Tadeu Pozzer Universidade Federal de Santa Maria UFSM Curso de Ciência da Computação

Leia mais

Sistemas Operacionais Aula 03: Estruturas dos SOs. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com

Sistemas Operacionais Aula 03: Estruturas dos SOs. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com Sistemas Operacionais Aula 03: Estruturas dos SOs Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com OBJETIVOS Descrever os serviços que um sistema operacional oferece aos usuários e outros sistemas

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

Introdução à Tecnologia Web. Ferramentas e Tecnologias de Desenvolvimento Web. Profª MSc. Elizabete Munzlinger www.elizabete.com.

Introdução à Tecnologia Web. Ferramentas e Tecnologias de Desenvolvimento Web. Profª MSc. Elizabete Munzlinger www.elizabete.com. IntroduçãoàTecnologiaWeb FerramentaseTecnologiasde DesenvolvimentoWeb ProfªMSc.ElizabeteMunzlinger www.elizabete.com.br ProfªMSc.ElizabeteMunzlinger www.elizabete.com.br FerramentaseTecnologiasde DesenvolvimentoWeb

Leia mais

Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS

Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS Objetos distribuídos e invocação remota Introdução Comunicação entre objetos distribuídos Chamada de procedimento remoto Eventos e notificações Objetos

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

UMA ABORDAGEM COMPARATIVA ENTRE AS LINGUAGENS DE PROGRAMAÇÃO JAVA E C#

UMA ABORDAGEM COMPARATIVA ENTRE AS LINGUAGENS DE PROGRAMAÇÃO JAVA E C# UMA ABORDAGEM COMPARATIVA ENTRE AS LINGUAGENS DE PROGRAMAÇÃO JAVA E C# Robson Bartelli¹, Wyllian Fressatti¹. ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil robson_lpbartelli@yahoo.com.br,wyllian@unipar.br

Leia mais

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com Sistemas Operacionais 2014 Introdução Alexandre Augusto Giron alexandre.a.giron@gmail.com Roteiro Sistemas Operacionais Histórico Estrutura de SO Principais Funções do SO Interrupções Chamadas de Sistema

Leia mais

16/09/2012. Agenda. Introdução. Introdução. Tipos de Software (Básico) Tipos de Software. Curso Conexão Noções de Informática

16/09/2012. Agenda. Introdução. Introdução. Tipos de Software (Básico) Tipos de Software. Curso Conexão Noções de Informática Curso Conexão Noções de Informática Aula 2 Arquitetura de Computadores (Software) Agenda Introdução; Tipos de Software; Básico; Aplicativo; Livre; Proprietário. Pirataria de Software; Demos, Freewares

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

A INTERNET COMO FERRAMENTA AUXILIAR NO ENSINO DE MECÂNICA COMPUTACIONAL

A INTERNET COMO FERRAMENTA AUXILIAR NO ENSINO DE MECÂNICA COMPUTACIONAL A INTERNET COMO FERRAMENTA AUXILIAR NO ENSINO DE MECÂNICA COMPUTACIONAL Manoel Theodoro Fagundes Cunha Sergio Scheer Universidade Federal do Paraná, Setor de Tecnologia, Centro de Estudos de Engenharia

Leia mais

Python. Introdução à Programação SI1 - BSI

Python. Introdução à Programação SI1 - BSI Python Introdução à Programação SI1 - BSI Conteúdo História Instalação Apresentação da Interface Comandos Básicos Exercícios 07/06/2013 2 História Criada em 1989 pelo holandês Guido van Rossum no Centrum

Leia mais

Introdução à Linguagem Java. Departamento de Informática Prof. Anselmo C. de Paiva

Introdução à Linguagem Java. Departamento de Informática Prof. Anselmo C. de Paiva Introdução à Linguagem Java Departamento de Informática Prof. Anselmo C. de Paiva Breve Histórico Sun Microsystems, 90/91: projeto de uma linguagem de programação pequena que pudesse ser usada em dispositivos

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

História e Evolução da Web. Aécio Costa

História e Evolução da Web. Aécio Costa Aécio Costa A História da Web O que estamos estudando? Período em anos que a tecnologia demorou para atingir 50 milhões de usuários 3 As dez tecnologias mais promissoras 4 A evolução da Web Web 1.0- Passado

Leia mais

Navegador ou browser, é um programa de computador que permite a seus usuários a interagirem com documentos virtuais da Internet.

Navegador ou browser, é um programa de computador que permite a seus usuários a interagirem com documentos virtuais da Internet. TERMINOLOGIA Navegador ou Browser Navegador ou browser, é um programa de computador que permite a seus usuários a interagirem com documentos virtuais da Internet. Os Browsers se comunicam com servidores

Leia mais

SO Sistemas Operacionais

SO Sistemas Operacionais GOVERNO DO ESTADO DO RIO DE JANEIRO FUNDAÇÃO DE APOIO A ESCOLA TÉCNICA ESCOLA TÉCNICA ESTADUAL REPÚBLICA SO Sistemas Operacionais Curso de Informática ETE REPÚBLICA - Rua Clarimundo de Melo, 847, Quintino

Leia mais

Introdução à Ciência da Computação

Introdução à Ciência da Computação Faculdade de Ciências e Tecnologia Departamento de Matemática e Computação Bacharelado em Ciência da Computação Introdução à Ciência da Computação Aula 05 Rogério Eduardo Garcia (rogerio@fct.unesp.br)

Leia mais

UFRPE Prof. Gustavo Callou gcallou@gmail.com

UFRPE Prof. Gustavo Callou gcallou@gmail.com UFRPE Prof. Gustavo Callou gcallou@gmail.com 1 Algoritmos Representação Exercícios Linguagens de Programação Compilador Interpretador Ambiente de Desenvolvimento Python Característica Para que serve Onde

Leia mais

Aula 1 - Introdução e configuração de ambiente de desenvolvimento

Aula 1 - Introdução e configuração de ambiente de desenvolvimento Aula 1 - Introdução e configuração de ambiente de desenvolvimento Olá, seja bem-vindo à primeira aula do curso para desenvolvedor de Android, neste curso você irá aprender a criar aplicativos para dispositivos

Leia mais

Principais características

Principais características .Net Framework O que é.net? Proprietário da Microsoft Versão simplificada para Linux Versão compacta para dispositivos móveis Plataforma de desenvolvimento e execução Interface com usuário, conectividade

Leia mais

Estrutura de S.O. Roteiro. BC1518 - Sistemas Operacionais. Prof. Marcelo Z. do Nascimento. Aula 02 2 Quadrimestre. de 2010

Estrutura de S.O. Roteiro. BC1518 - Sistemas Operacionais. Prof. Marcelo Z. do Nascimento. Aula 02 2 Quadrimestre. de 2010 BC1518 - Sistemas Operacionais Estrutura de S.O. Aula 02 2 Quadrimestre de 2010 Prof. Marcelo Z. do Nascimento Email: marcelo.nascimento@ufabc.edu.br Roteiro Serviço do sistema operacional Interface Chamadas

Leia mais

Ambientes Visuais. Ambientes Visuais

Ambientes Visuais. Ambientes Visuais Ambientes Visuais Inicialmente, apenas especialistas utilizavam os computadores, sendo que os primeiros desenvolvidos ocupavam grandes áreas e tinham um poder de processamento reduzido. Porém, a contínua

Leia mais

Conceitos Web. Prof. Msc. Juliano Gomes Weber (jgw@unijui.edu.br) Notas de Aula Aula 13 1º Semestre - 2011. UNIJUÍ DETEC Ciência da Computação

Conceitos Web. Prof. Msc. Juliano Gomes Weber (jgw@unijui.edu.br) Notas de Aula Aula 13 1º Semestre - 2011. UNIJUÍ DETEC Ciência da Computação UNIJUÍ DETEC Ciência da Computação Prof. Msc. Juliano Gomes Weber (jgw@unijui.edu.br) Conceitos Web Notas de Aula Aula 13 1º Semestre - 2011 Tecnologias Web jgw@unijui.edu.br Conceitos Básicos Sistema

Leia mais

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

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

Programação I. Departamento de Engenharia Rural Centro de Ciências Agrárias

Programação I. Departamento de Engenharia Rural Centro de Ciências Agrárias Departamento de Engenharia Rural Centro de Ciências Agrárias Programação I Prof. Bruno Vilela Oliveira bruno@cca.ufes.br http://www.brunovilela.webnode.com.br Programas e Linguagens Para executar uma tarefa

Leia mais

Cogent DataHub v7.0. A próxima geração em soluções para troca de dados em tempo real

Cogent DataHub v7.0. A próxima geração em soluções para troca de dados em tempo real Cogent DataHub v7.0 A próxima geração em soluções para troca de dados em tempo real Cogent é reconhecida como uma líder no segmento de soluções de middleware no domínio do tempo real. E, com a introdução

Leia mais

Linguagem de Programação JAVA

Linguagem de Programação JAVA Linguagem de Programação JAVA Curso Técnico em Informática Modalida Integrado Instituto Federal do Sul de Minas, Câmpus Pouso Alegre Professora: Michelle Nery Agenda JAVA Histórico Aplicações Pós e Contras

Leia mais

Tecnologias para Web Design

Tecnologias para Web Design Tecnologias para Web Design Introdução Conceitos básicos World Wide Web (Web) Ampla rede mundial de recursos de informação e serviços Aplicação do modelo de hipertexto na Web Site Um conjunto de informações

Leia mais

Introdução. Nível do Sistema Operacional. Introdução. Um Sistema Operacional... Introdução a Sistemas Operacionais

Introdução. Nível do Sistema Operacional. Introdução. Um Sistema Operacional... Introdução a Sistemas Operacionais Introdução Nível do Sistema Operacional (Aula 14) Introdução a Sistemas Operacionais Hardware Provê os recursos básicos de computação (CPU, memória, E/S,etc.) Programas (aplicações) Definem as maneiras

Leia mais

Programação Orientada a Objetos

Programação Orientada a Objetos Programação Orientada a Objetos Universidade Católica de Pernambuco Ciência da Computação Prof. Márcio Bueno poonoite@marciobueno.com Fonte: Material da Profª Karina Oliveira Introdução ao Paradigma OO

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

Estudo comparativo de diferentes linguagens de interfaces baseadas em XML

Estudo comparativo de diferentes linguagens de interfaces baseadas em XML Estudo comparativo de diferentes linguagens de interfaces baseadas em XML Ricardo Alexandre G. C. Martins, José Carlos Ramalho, and Pedro Rangel Henriques \{ram,jcr,prh\}@di.uminho.pt Departamento de Informática

Leia mais

Softwares de Sistemas e de Aplicação

Softwares de Sistemas e de Aplicação Fundamentos dos Sistemas de Informação Softwares de Sistemas e de Aplicação Profª. Esp. Milena Resende - milenaresende@fimes.edu.br Visão Geral de Software O que é um software? Qual a função do software?

Leia mais

Introdução à Informática

Introdução à Informática Introdução à Informática Aula 23 http://www.ic.uff.br/~bianca/introinfo/ Aula 23-07/12/2007 1 Histórico da Internet Início dos anos 60 Um professor do MIT (J.C.R. Licklider) propõe a idéia de uma Rede

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

Software de sistema Software aplicativo

Software de sistema Software aplicativo SOFTWARE O que é Software? Software, logicial ou programa de computador é uma sequência de instruções a serem seguidas e/ou executadas, na manipulação, redireccionamento ou modificação de um dado/informação

Leia mais

Informática I. Aula 19. http://www.ic.uff.br/~bianca/informatica1/ Aula 19-20/11/06 1

Informática I. Aula 19. http://www.ic.uff.br/~bianca/informatica1/ Aula 19-20/11/06 1 Informática I Aula 19 http://www.ic.uff.br/~bianca/informatica1/ Aula 19-20/11/06 1 Ementa Histórico dos Computadores Noções de Hardware e Software Microprocessadores Sistemas Numéricos e Representação

Leia mais

6 - Gerência de Dispositivos

6 - Gerência de Dispositivos 1 6 - Gerência de Dispositivos 6.1 Introdução A gerência de dispositivos de entrada/saída é uma das principais e mais complexas funções do sistema operacional. Sua implementação é estruturada através de

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

Tecnólogo em Análise e Desenvolvimento de Sistemas

Tecnólogo em Análise e Desenvolvimento de Sistemas Tecnólogo em Análise e Desenvolvimento de Sistemas O conteúdo deste documento tem como objetivos geral introduzir conceitos mínimos sobre sistemas operacionais e máquinas virtuais para posteriormente utilizar

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Evolução Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Sumário Introdução Componentes de um sistema computacional Conceituação Características desejáveis Organização

Leia mais

Programação Concorrente Processos e Threads

Programação Concorrente Processos e Threads Programação Concorrente Processos e Threads Prof. Eduardo Alchieri Processos O conceito mais central em qualquer sistema operacional é o processo Uma abstração de um programa em execução Um programa por

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

Capítulo 1. Introdução. 1.1 Linguagens. OBJETIVOS DO CAPÍTULO Ao final deste capítulo você deverá ser capaz de:

Capítulo 1. Introdução. 1.1 Linguagens. OBJETIVOS DO CAPÍTULO Ao final deste capítulo você deverá ser capaz de: i Sumário 1 Introdução 1 1.1 Linguagens....................................... 1 1.2 O que é um Compilador?................................ 2 1.3 Processadores de Programas: Compiladores, Interpretadores

Leia mais

Usuários. Aplicativos e programas dos usuários. Kernel gerenciamento de processos, memória, sistema de arquivos, I/O, etc.

Usuários. Aplicativos e programas dos usuários. Kernel gerenciamento de processos, memória, sistema de arquivos, I/O, etc. 1 1.0 Kernel O kernel (núcleo) representa o coração do Sistema Operacional. Atribuições do kernel: - gerenciamento dos arquivos em disco; - inicializar programas e executá-los; - alocar e gerenciar memória

Leia mais

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional Sistemas Operacionais Prof. Pedro Luís Antonelli Anhanguera Educacional INTRODUÇÃO Sistema Operacional (S.O.) Aplicativos Formado por um conjunto de rotinas que oferecem serviços aos usuários, às aplicações

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

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

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

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

FERRAMENTAS PARA DESENVOLVIMENTO EM C#

FERRAMENTAS PARA DESENVOLVIMENTO EM C# FERRAMENTAS PARA DESENVOLVIMENTO EM C# Camila Sanches Navarro 1,2, Wyllian Fressatti 2 ¹Universidade paranaense (Unipar) Paranavaí PR Brasil sanchesnavarro@gmail.com wyllian@unipar.br Resumo. Este artigo

Leia mais

Introdução à Programação de Computadores

Introdução à Programação de Computadores 1. Objetivos Introdução à Programação de Computadores Nesta seção, vamos discutir os componentes básicos de um computador, tanto em relação a hardware como a software. Também veremos uma pequena introdução

Leia mais

Ferramentas Web para controle e supervisão: o que está por vir

Ferramentas Web para controle e supervisão: o que está por vir Artigos Técnicos Ferramentas Web para controle e supervisão: o que está por vir Marcelo Salvador, Diretor de Negócios da Elipse Software Ltda. Já faz algum tempo que ouvimos falar do controle e supervisão

Leia mais

Manual do Cantor. Alexander Rieder Tradução: Marcus Gama

Manual do Cantor. Alexander Rieder Tradução: Marcus Gama Alexander Rieder Tradução: Marcus Gama 2 Conteúdo 1 Introdução 5 2 Usando o Cantor 6 2.1 Recursos do Cantor..................................... 6 2.2 As infraestruturas do Cantor...............................

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

FERRAMENTAS NECESSÁRIAS PARA O DESENVOLVIMENTO EM C#

FERRAMENTAS NECESSÁRIAS PARA O DESENVOLVIMENTO EM C# FERRAMENTAS NECESSÁRIAS PARA O DESENVOLVIMENTO EM C# Camila Sanches Navarro 1,2, Willian Magalhães 2 ¹Universidade paranaense (Unipar) Paranavaí PR Brasil sanchesnavarro@gmail.com wmagalhaes@unipar.br

Leia mais

IBM Tivoli Directory Server Versão 5.2 Leia-me do Cliente

IBM Tivoli Directory Server Versão 5.2 Leia-me do Cliente IBM Tivoli Directory Server Versão 5.2 Leia-me do Cliente Nota Antes de utilizar estas informações e o produto suportado por elas, leia as informações gerais em Avisos, na página 7. Prefácio Este Leia-me

Leia mais

leitejuniorbr@yahoo.com.br 1 GESTOR AMBIENTAL - FUNCAB

leitejuniorbr@yahoo.com.br 1 GESTOR AMBIENTAL - FUNCAB CONCURSO: SEMACE CARGO: GESTOR AMBIENTAL G01 - X DATA: 29/11/2009 QUESTÃO 11 - Qual das alternativas a seguir contém a sigla de uma tecnologia de transmissão digital de dados que permite conectar um computador

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

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

EIMOBILE INSTITUIÇÕES DE ENSINO MOBILE

EIMOBILE INSTITUIÇÕES DE ENSINO MOBILE UNIVERSIDADE CATÓLICA DE PELOTAS CENTRO POLITÉCNICO TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS EIMOBILE INSTITUIÇÕES DE ENSINO MOBILE por Miguel Aguiar Barbosa Trabalho de curso II submetido como

Leia mais

Programando em C# Orientado a Objetos. By: Maromo

Programando em C# Orientado a Objetos. By: Maromo Programando em C# Orientado a Objetos By: Maromo Agenda Módulo 1 Plataforma.Net. Linguagem de Programação C#. Tipos primitivos, comandos de controle. Exercícios de Fixação. Introdução O modelo de programação

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

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

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064 Sistemas Distribuídos Professora: Ana Paula Couto DCC 064 Questões Em uma rede de sobreposição (overlay), mensagens são roteadas de acordo com a topologia da sobreposição. Qual uma importante desvantagem

Leia mais

Tópicos de Ambiente Web Conceitos Fundamentais Redes de Dados

Tópicos de Ambiente Web Conceitos Fundamentais Redes de Dados Tópicos de Ambiente Web Conceitos Fundamentais Redes de Dados Professora: Sheila Cáceres Computador Dispositivo eletrônico usado para processar guardar e tornar acessível informação. Tópicos de Ambiente

Leia mais

Desenvolvimento Web. Saymon Yury C. Silva Analista de Sistemas. http://www.saymonyury.com.br

Desenvolvimento Web. Saymon Yury C. Silva Analista de Sistemas. http://www.saymonyury.com.br Desenvolvimento Web Saymon Yury C. Silva Analista de Sistemas http://www.saymonyury.com.br Vantagens Informação em qualquer hora e lugar; Rápidos resultados; Portabilidade absoluta; Manutenção facilitada

Leia mais

Sistemas Operacionais I Parte III Estrutura dos SOs. Prof. Gregorio Perez gregorio@uninove.br 2007. Roteiro. Componentes do Sistema

Sistemas Operacionais I Parte III Estrutura dos SOs. Prof. Gregorio Perez gregorio@uninove.br 2007. Roteiro. Componentes do Sistema Sistemas Operacionais I Parte III Estrutura dos SOs Prof. Gregorio Perez gregorio@uninove.br 2007 Roteiro Serviços Estrutura dos Sistemas Operacionais Funções do Sistema Operacional Chamadas do Sistema

Leia mais

Microsoft.NET. Desenvolvimento Baseado em Componentes

Microsoft.NET. Desenvolvimento Baseado em Componentes Microsoft.NET Lirisnei Gomes de Sousa lirisnei@hotmail.com Jair C Leite jair@dimap.ufrn.br Desenvolvimento Baseado em Componentes Resolução de problemas específicos, mas que podem ser re-utilizados em

Leia mais

JAVA VIRTUAL MACHINE (JVM)

JAVA VIRTUAL MACHINE (JVM) JAVA VIRTUAL MACHINE (JVM) Por Leandro Baptista, Marlon Palangani e Tiago Deoldoto, 11 de Abril de 2009 A linguagem de programação Java proporciona o desenvolvimento aplicações que podem ser executadas

Leia mais

Fundament n os s da platafo f rm r a. NE N T André Menegassi

Fundament n os s da platafo f rm r a. NE N T André Menegassi Fundamentos da plataforma.net André Menegassi O que é o.net Framework?.NET é uma plataforma de software para desenvolvimento de aplicações que conecta informações, sistemas, pessoas e dispositivos através

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

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

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 13 Web Services Web Services

Leia mais

Sistemas de Lotes (2) Sistemas de Lotes (3) Layout da MP em Sistemas de Lotes. Minimizar o tempo de resposta

Sistemas de Lotes (2) Sistemas de Lotes (3) Layout da MP em Sistemas de Lotes. Minimizar o tempo de resposta 1 Mono e multiprogramação Introdução Classificação (Aula 2) Recap Sistemas Máquina Profa. Patrícia Gerenciador D. CostaLPRM/DI/UFES Provê Fornece Compartilhamento programador máquina justa recursos Operacionais

Leia mais

PRnet/2013. Linguagem de Programação Web

PRnet/2013. Linguagem de Programação Web Linguagem de Programação Web Linguagem de Programação Web Prnet/2013 Linguagem de Programação Web» Programas navegadores» Tipos de URL» Protocolos: HTTP, TCP/IP» Hipertextos (páginas WEB)» HTML, XHTML»

Leia mais

Sistemas Distribuídos: Conceitos e Projeto Threads e Migração de Processos

Sistemas Distribuídos: Conceitos e Projeto Threads e Migração de Processos Sistemas Distribuídos: Conceitos e Projeto Threads e Migração de Processos Francisco José da Silva e Silva Laboratório de Sistemas Distribuídos (LSD) Departamento de Informática / UFMA http://www.lsd.deinf.ufma.br

Leia mais

Sistemas Operacionais. Andrique Amorim www.andrix.com.br professor@andrix.com.br. Gerência de Arquivos

Sistemas Operacionais. Andrique Amorim www.andrix.com.br professor@andrix.com.br. Gerência de Arquivos Andrique Amorim www.andrix.com.br professor@andrix.com.br Gerência de Arquivos Gerência de Arquivos Um sistema operacional tem por finalidade permitir que o usuários do computador executem aplicações,

Leia mais

Google Web Toolkit* Clério Damasceno Soares, Daniel da Silva Filgueiras e Fábio Figueiredo da Silva

Google Web Toolkit* Clério Damasceno Soares, Daniel da Silva Filgueiras e Fábio Figueiredo da Silva Google Web Toolkit* Clério Damasceno Soares, Daniel da Silva Filgueiras e Fábio Figueiredo da Silva Universidade Federal de Juiz de Fora UFJF-MG Campo Universitário Bairro Marmelos Juiz de Fora MG Brasil

Leia mais

Introdução ao C# . Visão geral do.net Framework

Introdução ao C# . Visão geral do.net Framework Introdução ao C# Microsoft.NET (comumente conhecido por.net Framework - em inglês: dotnet) é uma iniciativa da empresa Microsoft, que visa uma plataforma única para desenvolvimento e execução de sistemas

Leia mais

Técnicas para Animação de Imagens em Jogos 2D Utilizando Java

Técnicas para Animação de Imagens em Jogos 2D Utilizando Java Técnicas para Animação de Imagens em Jogos 2D Utilizando Java Silvano Maneck Malfatti 1 1 Faculdade Católica do Tocantins (FACTO) Palmas TO Brasil Malfatti@catolica-to.edu.br Resumo. Um dos recursos que

Leia mais

Microsoft Visual Studio Express 2012 for Windows Desktop

Microsoft Visual Studio Express 2012 for Windows Desktop Microsoft Visual Studio Express 2012 for Windows Desktop Apresentação da ferramenta Professor: Danilo Giacobo Página pessoal: www.danilogiacobo.eti.br E-mail: danilogiacobo@gmail.com 1 Introdução Visual

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

Capítulo 2. Charm++ 16

Capítulo 2. Charm++ 16 2 Charm++ O Charm++ é uma linguagem orientada a objetos para programação paralela baseada em C++ (34). Ela possui uma biblioteca de execução para suporte a computação paralela que se chama Kernel do Charm

Leia mais

Projeto de Sistemas Distribuídos. Prof. Andrêza Leite andreza.lba@gmail.com

Projeto de Sistemas Distribuídos. Prof. Andrêza Leite andreza.lba@gmail.com Projeto de Sistemas Distribuídos Prof. Andrêza Leite andreza.lba@gmail.com Exemplos de SD Quais podem ser? Ex. de SD: Internet Internet é um conjunto de redes de computadores, de muitos tipos diferentes,

Leia mais

4.0 SP2 (4.0.2.0) maio 2015 708P90911. Xerox FreeFlow Core Guia de Instalação: Windows 8.1 Update

4.0 SP2 (4.0.2.0) maio 2015 708P90911. Xerox FreeFlow Core Guia de Instalação: Windows 8.1 Update 4.0 SP2 (4.0.2.0) maio 2015 708P90911 2015 Xerox Corporation. Todos os direitos reservados. Xerox, Xerox com a marca figurativa e FreeFlow são marcas da Xerox Corporation nos Estados Unidos e/ou em outros

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

MINICURSO WINDOWS SERVER 2008 UTILIZANDO O VMWARE PLAYER

MINICURSO WINDOWS SERVER 2008 UTILIZANDO O VMWARE PLAYER MINICURSO WINDOWS SERVER 2008 UTILIZANDO O VMWARE PLAYER TÁSSIO JOSÉ GONÇALVES GOMES tassiogoncalvesg@gmail.com MINICURSO WINDOWS SERVER 2008 TÁSSIO GONÇALVES - TASSIOGONCALVESG@GMAIL.COM 1 CONTEÚDO Arquitetura

Leia mais