Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Norte Lista de Exercícios para a Terceira Unidade Disciplina: PEOO Professor: Eberton da Silva Marinho e-mail: ebertonsm@gmail.com Data: 18/02/2019 Data de entrega: Exercícios Objetivos: - Apresentar conceitos básicos da computação - Introdução ao Java O que é um computador? O computador é um dispositivo capaz de realizar cálculos e tomar decisões lógicas a velocidades de milhões e até bilhões de vezes mais rápido que os seres humanos. Os computadores processam dados sob o controle de conjuntos de instruções chamadas programas de computador. Esses programas de computador orientam o computador por conjuntos ordenados de ações especificadas por pessoas chamadas programadores de computador. A ilustração 1 mostra como se dá a organização arquitetural dos computadores atuais. Ilustração 1. Organização da arquitetura de um computador moderno. CPU Memória ULA Entrada Saída Unidade de Entrada: Ela obtém as informações a partir de dispositivos de entrada e coloca essas informações à disposição de outras unidades de modo que possam ser processadas. Unidade de Saída: Ela pega as informações processadas pelo computador e coloca-as em vários dispositivos de saída de forma a tornar as informações disponíveis para serem utilizadas fora do computador. Unidade de Memória: É a seção de armazenamento de capacidade relativamente baixa e acesso rápido do computador. Ela retém informações inseridas na Unidade de Entrada, guarda as informações que serão reprocessadas pela CPU e as informações a serem disponibilizadas na Unidade de Saída. Comumente chamada de Memória Principal. Unidade Lógica e Aritmética (ULA): Responsável pelos cálculos lógicos e aritméticos do computador.
Unidade Central de Processamento (CPU): Coordenador do computador e responsável pela supervisão das operações das outras seções. A CPU diz à Unidade de Entrada quando as informações devem ser lidas na unidade de memória, à ULA quando as informações da Unidade de Memória devem ser utilizadas em cálculos e avisa a Unidade de Saída sobre quando enviar informações para certos dispositivos de saída. Linguagens de computação As linguagens de programação podem ser divididas em 3, se utilizarmos o nível de abstração das linguagens como critério de avaliação. Linguagem de máquina: Qualquer computador pode entender diretamente somente a sua própria linguagem de máquina, que é a linguagem natural de um computador específico. Ela é definida pelo projeto de hardware desse computador. Há várias famílias de microprocessadores: AMD FX; Phenom e Phenom II; Athlon 64; Sempron; Turion 64; Opteron; Core i7; Core i5; Core i3; Core 2 Duo; Core Duo; Atom; Pentium 4; Pentium D e Pentium EE; Pentium M; Celeron; Xeon; Qualcomm. E as arquiteturas mais conhecidas atualmente são a da Intel (x86 e x64), AMD e ARM. As linguagens de máquina consistem geralmente em sequências de números (0 s e 1 s) que instruem os computadores a realizar suas operações mais elementares uma de cada vez. A Figura 1 mostra um exemplo de código de máquina que exibe o texto Hello World! na cor verde na tela do computador. Figura 1. Código em linguagem de máquina que exibe o texto Hello World! na cor verde. Linguagem Assembly: São programas escritos com abreviações do inglês para representar operações elementares do computador. Programas tradutores chamados de montadores (Assembler) foram desenvolvidos para transformar tais programas Assembly em linguagem de máquina. Na Figura 2 vemos um exemplo de programa na linguagem Assembly que exibe o texto hello world na tela e na Figura 3 sua tradução para linguagem de máquina.
Figura 2. Programa na linguagem Assembly que exibe o texto hello world na tela. Figura 3. Programa em linguagem de máquina após tradução do código Assembly da Figura 2. Linguagens de alto nível: Ainda Assim, a linguagem Assembly se torna difícil para representar programas mais complexos. Para acelerar o processor de programação, foram desenvolvidas linguagens de alto nível em que instruções únicas poderiam ser escritas para realizar tarefas substanciais. Os programas tradutores que convertem linguagens de alto nível em linguagens de máquina são chamados de compiladores. Na Figura 4 é mostrado um exemplo de programa que mostra o texto Hello World na tela do computador escrito na linguagem C. Figura 4. Exemplo que mostra o texto Hello World escrito na linguagem C. Como cada código de programação escrito em uma linguagem de alto nível deve ser traduzido para a linguagem de máquina utilizando um programa chamado de compilador, um programa pode gerar diferentes códigos de máquina, um para cada arquitetura de máquina. Nesta perspectiva, as linguagens de programação podem ser classificadas como compiladas ou interpretadas. Compilar: Do latim compilare; reunir, ajuntar. Interpretar: Do latim interpretare; tornar claro o sentido de, explicar, traduzir, fazer juízo a respeito de. Linguagens Compiladas Quando a compilação do código se dá ainda em tempo de desenvolvimento, gerando o código de máquina antes da inicialização do programa. Linguagens como C e C++ realizam esse processo. Uma vantagem das linguagens compiladas é que elas costumam ser executadas mais rapidamente, já que a análise não precisa ser feita durante a execução, além do que, por analisar o código de forma integral, pode-se fazer otimizações. Algumas destas otimizações demoram para serem realizadas pelo compilador, mas como este trabalho de otimização não atrasará a execução ele pode ser feito confortavelmente.
Linguagens Interpretadas Quando a compilação se dá à medida em que o programa é executado, ou seja, em tempo de execução. Linguagens como Java, C# e Python são executadas desta forma. O programa é compilado para uma linguagem intermediária e em tempo de execução essa linguagem intermediária é transformada em código de máquina. Sendo assim, em tempo de execução, o código intermediário pode ser encarado como um "código fonte" que será compilado dinamicamente pelo interpretador da linguagem em código de máquina. Obviamente, ter este processo de compilação embutido na execução do programa tem um custo. E esse custo não é barato! Por isso, nos últimos anos muito foi investido para otimizar este processo, resultando em todas as técnicas de Just In Time Compiling e Ahead of Time Compiling que permitem as linguagens interpretadas alcançarem performance excepcionais. Finalmente, com base nestas definições, podemos dizer que C e C++ são linguagens compiladas. Enquanto Java, C# e Python, mesmo com as técnicas de JIT e AOT, são linguagens interpretadas, afinal, esta é uma definição da arquitetura da linguagem de programação. Uma vantagem de código interpretado é que ele pode ser executado em várias plataformas sem a necessidade do usuário recompilar o código para a arquitetura específica do processador onde o programa será executado. Introdução ao Java Características Orientada à Objetos: Java é uma linguagem puramente orientada à Objetos pois, com exceção de seus tipos primitivos de dados, tudo em Java são classes ou instâncias de uma classe. Java possui mecanismos de abstração, encapsulamento e hereditariedade. Ambiente de desenvolvimento composto pelo compilador, interpretador, gerador de documentação e etc. Independente de Plataforma: Os programas em Java são compilados para uma forma intermediária de código denominada bytecodes que utiliza instruções e tipos primitivos de tamanho fixo e um conjunto de bibliotecas de classe padronizadas. Os bytecodes é uma linguagem intermediária destinada a plataforma Java Virtual Machine (JVM), um interpretador de bytecodes. Desde que a JVM esteja disponível para uma determinada plataforma, o programa Java será executado. Ambiente de execução que pode ser qualquer máquina que possua Java Runtime Environment (JRE) instalado, uma máquina virtual Java (JVM); Independente de plataforma; Sem Ponteiros: Java não possui manipulação direta de ponteiros, ou seja, não se pode manipular diretamente endereços de memória e não exige que o programador crie ou destrua alocações de memória para os objetos. A JVM possui um mecanismo automático de gerenciamento de memória conhecido como garbage collector, que recupera a memória para objetos não referenciados pelo programa. Performance: Java foi projetado para ser compacto, independente de plataforma e para utilização em rede. Por ser uma linguagem interpretada, foram desenvolvidos mecanismos que otimizam a interpretação, tradução e execução do programa em tempo de execução (Just in Time). Segurança: Devido a aplicação Java ser executada na JVM e não haver a manipulação direta de endereçamentos de memória, Java se torna uma linguagem segura para criação de
aplicações. A JVM gerencia todo o processo de criação e liberação de memória para aplicações e não permite que uma interfira diretamente na outra, a não ser através de bibliotecas específicas para comunicação de dados. Permite Multithreading: Java oferece recursos para o desenvolvimento de aplicações capazes de executar rotinas concorrentemente e dispõe de elementos para a sincronização destas várias rotinas. Cada um destes fluxos de execução é o que se denomina thread, um importante recurso de programação de aplicações mais sofisticadas. Histórico A linguagem de programação Java foi criada em 1991 por James Gosling. Inicialmente a linguagem iria chamar-se Oak (Carvalho) em referência a árvore que era visível pela janela de James Gosling. A mudança de nome ocorreu pois já existia uma linguagem de programação com este nome, então a linguagem foi rebatizada para Java. Bibliotecas de classe Java Os programas Java consistem em partes chamadas classes, e estas possuem métodos que realizam tarefas e podem retornar informações ao completarem suas tarefas. Você pode programar cada pedaço parar formar um programa Java. Porém, é muito comum utilizarmos código que não foi criado por nós, seja ele fornecido na própria instalação Java, seja ele disponibilizado por terceiros. A esse conjunto de código damos o nome de biblioteca de classes ou em inglês Application Programing Interface (API). Realmente há duas partes a se aprender no mundo Java, aprender a própria linguagem de modo que você possa programar suas próprias classes, aprender a utilizar as classes das bibliotecas disponíveis no kit de desenvolvimento Java (Java Development Kit - JDK). A Figura 5 mostra o esquema de criação de um projeto Java. Figura 5. Fases de Execução de um Programa Java. Edição Compilação Interpretação Execução Edição: Quando o programa está sendo criado pelo programador a fim de resolver algum problema. Implementamos toda a lógica de negócio no arquivo com extensão.java. Compilação: Um tradutor transforma o programa com extensão.java para um arquivo de bytecodes com extensão.class. Antes de fazer a tradução, o compilador verifica a sintaxe e semântica do código a fim de encontrar erros no programa. Se houver um erro grave, o tradutor não gera o.class e avisa sobre o erro ao programador. Interpretação: A JVM interpreta os bytecode do arquivo.class e gera o código de máquina para ser executado na máquina corrente. Execução: A JVM e fazer com que o programa seja devidamente executado pela máquina.
Dica: Evite reinventar a roda. Utilize partes existente criadas para resolver problemas a seu favor. Isso se chama reutilização de código. Dica: Erros em tempo de compilação ou execução são comuns, sejam eles que causem a não execução ou interrupção do programa, sejam eles lógicos. Os últimos são bem mais difíceis de identificar. Dica: Escreva programas em Java de maneira simples e direta. Máquina Virtual Java Java Virtual Machine A máquina virtual java (JVM) é uma máquina imaginária que emula uma aplicação em uma máquina real. É a JVM que permite a portabilidade do código Java, isto ocorre porque todo código Java é compilada para um formato intermediário, bytecode, este formato é então interpretado pela JVM. Cada Sistema Operacional que tenha uma JVM instalada pode executar o código Java. Coletor de Lixo Garbage Collection Em muitas das linguagens de programação, inclusive C e C++, a responsabilidade pela liberação do espaço que não mais será utilizado é do programador nem sempre é fácil gerenciar o que está e o que não está sendo utilizado. A má gerência da memória ocasiona muitas vezes o estouro de pilha (stack overflow) entre outros problemas. Na linguagem de programação Java a responsabilidade pela gerência da memória é do Coletor de lixo (Garbage Collector). JRE e JDK JRE: O Java Runtime Environment contém tudo aquilo que um usuário comum precisa para executar uma aplicação Java (JVM e bibliotecas), como o próprio nome diz é o Ambiente de execução Java ; JDK: O Java Development Kit é composto pelo JRE e um conjunto de ferramentas úteis ao desenvolvedor Java. Exercícios Os computadores processam dados sob o controle de conjuntos de instruções chamados de. As seis unidades lógica-chave do computador são:. Podemos classificar as linguagens de programação em três tipos, levando em consideração o nível de abstração. Quais são elas e quais as características de cada uma?. Os programas que traduzem programas de linguagem de alto nível para linguagem de máquina são chamados de. Os programas fonte Java terminam com a extensão. Quando um programa Java é compilado, é gerado um arquivo com a extensão.
Porque você poderia querer escrever um programa em uma linguagem independente de máquina em vez de uma que dependa da máquina? Por que uma linguagem dependente de máquina talvez fosse mais apropriada para escrever certos tipos de programas?. Que tipo de linguagem de computador utiliza abreviações semelhantes ao inglês para instruções de linguagem de máquina?. Explique como se dá o fluxo de informação no computador explicando o que cada item de arquitetura faz e para que serve..