Você está na página 1de 101

Aula 10

Desenvolvimento de Software para Concursos - Curso Regular


Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

AULA 10

SUMÁRIO PÁGINA
Apresentação 01
- Sistemas Móveis 02
- Android 15
- iOS 30
- Segurança no Desenvolvimento 37
- Compiladores 55
- Interpretadores 63
Lista de Exercícios Comentados 83
Gabarito 99

Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção,


Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de
Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort.
Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura
de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE.
Conceitos Básicos. Plataforma Java. Compilação e Interpretação. Passagem por Valor e Referência.
Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos
Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos.
Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados.
Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading.
Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP.
Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript.
JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no
Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git.
Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual
16712855225

Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 1 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

SISTEMAS MÓVEIS

Pessoal, vamos falar sobre sistemas, arquitetura e aplicações de dispositivos móveis.


A popularização dos smartphones desencadeou uma revolução no mercado de
telefonia móvel. A evolução da tecnologia dos aparelhos celulares permitiu oferecer
ao usuário recursos que vão muito além da realização de uma chamada ou do envio
de uma mensagem.

As melhorias de hardware permitiram o desenvolvimento de sistemas operacionais


mais avançados. A partir disso, foi possível desenvolver aplicativos melhores com
cada vez mais recursos e serviços para os usuários. Os acessos, por exemplo, a
serviços de instituições financeiras e redes sociais podem ser facilitados pelo uso de
aplicativos que são executados em um aparelho celular.

Devido a esta evolução, os smartphones se transformaram em uma oportunidade


de entretenimento, de acesso à informação e de solução de problemas, integrando-
16712855225

se assim ao cotidiano das pessoas e facilitando diversas tarefas do dia a dia.


Motivado por estes resultados, o mercado de aplicativos para aparelhos celulares
apresenta anualmente uma absurda taxa de crescimento.

Este mercado é disputado por diferentes plataformas tecnológicas, incluindo


sistemas operacionais e plataformas de desenvolvimento, gerando uma variedade
enorme de soluções no mercado. Frente a este fato, um dos principais desafios
deste mercado é desenvolver aplicativos em um ambiente de tecnologia altamente
fragmentado e em rápida evolução.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 2 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

As limitações de plataforma para distribuição do aplicativo, tempo e custo para o


desenvolvimento, complexidade das tecnologias necessárias para a sua criação e
manutenção são pontos problemáticos em um projeto voltado ao desenvolvimento
deste tipo de aplicativo. Por que? De novo lembrem-se da variedade colossal de
dispositivos que existem atualmente.

Essas plataformas são compostas de diversas tecnologias, tais como: sistema


operacional, linguagens de programação e IDEs. O Sistema Operacional é
responsável por gerenciar diversos recursos do aparelho; as linguagens de
programação são utilizadas na programação do aplicativo; e a IDE fornece
ferramentas que auxiliam na criação do aplicativo.

16712855225

ém disso, no desenvolvimento de um aplicativo móvel, deve-se considerar, por


exemplo: resoluções dos dispositivos; as limitações de bateria, processamento,
memória e armazenamento; versão do sistema operacional utilizado; os diversos
tamanhos de tela; as possíveis questões de segurança de dados; acessibilidade;
entre outros. Vocês percebem agora como tudo isso pode ser complexo?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 3 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Galera, eu tenho alguns amigos de faculdade que enveredaram para a área de jogos
para dispositivos móveis Pensem em termos de marketing e dinheiro! É bom
comercialmente que um jogo funcione apenas no Galaxy S5, mas não no Galaxy S5
Mini? É bom comercialmente que um jogo não torre a bateria no iPhone 6, mas torre
no iPhone 6S? Evidente que não!

Vamos falar agora sobre as principais abordagens de desenvolvimento para


sistemas móveis. Peço a atenção de vocês, porque esse assunto é o que mais cai
em prova! Conforme a imagem acima, existem duas abordagens principais:
Desenvolvimento Nativo e Desenvolvimento Cross-Platform (sendo que esse último
16712855225

se divide em Desenvolvimento Web e Desenvolvimento Híbrido).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 4 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

DESENVOLVIMENTO NATIVO

O Desenvolvimento Nativo é quando o aplicativo é desenvolvido usando os recursos


da plataforma. No caso do iOS, utiliza-se a linguagem de programação Objective-
C, o framework de desenvolvimento CocoaTouch e a ferramenta Xcode. Para
Android, utiliza-se a linguagem Java com o Android Studio na ferramenta Eclipse. E,
no Windows Phone, a linguagem C#, Windows Phone SDK e Visual Studio.

Trata-se, portanto, da abordagem mais simples e direta: para cada plataforma, é


desenvolvida uma versão do aplicativo. Optar por desenvolvimento nativo é mais
caro, pois é necessário desenvolver um novo código para cada plataforma. No
entanto, o resultado final geralmente é melhor, pois o aplicativo funcionará mais
fluído e melhor integrado com os recursos de cada plataforma. Exemplo acima!
16712855225

Por falar nisso, através das APIs disponíveis das linguagens utilizadas em cada
plataforma, um aplicativo nativo pode acessar funcionalidades oferecidas p
recursos nativos do sistema operacional, tais como: GPS, SMS, E-Mail, Acelerômetro,
Bússola, Câmera Fotográfica, etc. Esses aplicativos nativos evidentemente podem
ser baixados, instalados e vendidos em lojas de aplicativos.

O desenvolvimento de um aplicativo nativo exige conhecimentos específicos a


respeito das tecnologias utilizadas pela plataforma na qual se deseja executá-lo.
principal desvantagem está justamente no fato de ser executado apenas na

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 5 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

plataforma para a qual foi desenvolvido, aumentando o tempo, custo e o esforço


para disponibilizar um mesmo aplicativo para mais de uma plataforma.

As diferenças entre as plataformas também são importantes, pois para cada uma há
diferentes ferramentas de desenvolvimento, bibliotecas e equipamentos com
diferentes capacidades. Desenvolver aplicativos nativos para diversos sistemas
operacionais requer uma equipe de trabalho com conhecimento em várias
tecnologias, visto que não há reaproveitamento de código. Vejam alguns exemplos:

PLATAFORMA CONHECIMENTOS NECESSÁRIOS

Apple IOS C, Object C


Google Android Java
RIM Blackberry Java (J2ME Flavored)
Symbian C, C++, Python, HTML, CSS, JS
Windows Mobile .Net
Windows 7 Phone .Net
HP Palm webOS HTML, CSS, JS
MeeGo C, C++, HTML, CSS, JS
Samsung bada C++

Aplicativos nativos são desenvolvidos de acordo com especificações fornecidas


pelo fabricante do sistema operacional. Esses fabricantes fornecem APIs que podem
ser utilizadas pelos desenvolvedores, garantindo certo nível de consistência entre
todos os aplicativos nativos. Em geral, oferecem ótima experiência de uso,
permitindo ao usuário uma navegação mais imersiva.

Com relação a sua interface, os componentes de um aplicativo nativo são iguais aos
do sistema operacional utilizado pelo sistema operacional do dispositivo, portanto
16712855225

é mais intuitivo ao usuário. Aplicativos desenvolvidos através do paradigma nativo


possuem ótimo desempenho. Por que, professor? Porque não é necessária qualquer
interpretação de código durante a execução.

Outro aspecto importante é a independência de comunidades responsáveis por


versões de frameworks de desenvolvimento de aplicativos, pois – em um aplicativo
nativo – as atualizações de API do próprio sistema operacional serão utilizadas no
desenvolvimento de novas funcionalidades do aplicativo nativo. O que você quer
dizer com isso, professor?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 6 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Eu quero dizer que, uma vez atualizada a plataforma, já é possível incorporar as


novidades existentes da plataforma para desenvolver para o aplicativo nativo, sem
a dependência da atualização de tecnologias adjacentes, como por exemplo, algum
framework particular. Bacana! Agora vamos falar um pouquinho sobre
Desenvolvimento Cross-Platform.

Vamos resumir nosso papo! Se você for criar uma aplicação nativa para Android,
você poderá executá-lo no iOs? Não, e vice-versa! Você terá que criar uma aplicação
para cada plataforma e provavelmente necessitará de duas equipes (cada uma
especializada em uma linguagem). Você terá acesso aos recursos do dispositivo e
poderá instalar em uma loja de aplicativos – obviamente, com mais segurança.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 7 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

DESENVOLVIMENTO CROSS-PLATFORM

Considerando um cenário com notável diferença entre sistemas operacionais e


plataformas de programação existentes, desenvolver um aplicativo uma vez e poder
utilizá-lo em várias plataformas é um dos maiores desafios da computação móvel.
Dito isso, temos o Desenvolvimento Cross-Platform, que é uma forma de
desenvolver aplicativos que poderão ser utilizados em diferentes plataformas.

Com o crescimento dos aplicativos cross-plataform, o mercado de aplicativos para


aparelhos celulares sofreu alterações importantes em seu modelo de negócio. Entre
as vantagens, destaca-se um maior Retorno sobre Investimento (ROI), pois uma vez
que o aplicativo é multiplataforma e pode ser empacotado como um aplicativo
nativo, é desenvolvido uma vez e comercializado em várias lojas de aplicativos.

Infelizmente, a experiência de usuário do aplicativo não terá a mesma fluidez;


realizar testes em aplicativos cross-platform é bem mais complexo; não há garantia
de poder aproveitar os recursos do dispositivo tão eficientemente como no
desenvolvimento nativo; pode haver dificuldades, na medida em que plataformas
possuem diferentes comportamentos e defeitos – dificultando a depuração. Enfim...

Como vimos anteriormente, ele se divide em Desenvolvimento Web (também


conhecido como Desenvolvimento Responsivo) e Desenvolvimento Híbrido.
Professor, qual a diferença entre essas abordagens? Bem, as aplicações web são
acessadas diretamente do navegador e são geralmente desenvolvidas em HTML5,
CSS3 e JavaScript.

O HTML5 incorporou uma série de elementos multimídia ao HTML comum, o que


fez com que ele rapidamente se tornasse uma excelente opção de desenvolvimento.
A grande vantagem é que ele pode ser lido em qualquer navegador (móvel ou não).
16712855225

No entanto, ele tem alguns problemas de performance – ademais, faltam à


linguagem alguns recursos mais avançados.

Além disso, essas aplicações precisam estar conectadas à internet para funcionar.
Como nem todos os usuários de smartphone possuem conexão à internet, e
algumas vezes essas conexões não são de boa qualidade, pode não ser uma boa
ideia confiar apenas nessas tecnologias. Deve-se avaliar o contexto de utilização e
nos objetivos do aplicativo.

Em suma, Desenvolvimento Web trata de aplicativos que rodam diretamente no


navegador do dispositivo. A Interface Gráfica é adaptada para dispositivos com telas

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 8 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

menores, utilizando conceitos de responsividade. Estas aplicações são hospedadas


em servidores web, utilizando tecnologias específicas para serem carregadas, em
geral, em máquinas de “baixo” processamento e velocidade de banda da rede.

A atualização/manutenção da aplicação é feita no servidor! Logo, todos os


dispositivos recebem a nova versão automaticamente, bastando atualizar a página
no browser – tudo independente de plataforma. Há alguns problemas com a
persistência de dados no dispositivo (Local Store). No entanto, há mecanismos para
manter informações em cache, simulando o armazenamento de dados.

Vamos só falar um pouquinho mais sobre responsividade. Trata-se de uma forma


de apresentar a informação da forma mais acessível e confortável para diversos
meios de acesso. Não achem que isso significa apenas apresentar uma página com
telas de diversos tamanhos – apesar de ser sua atividade principal! Recomenda-se
sempre desenhar a solução para mobile e depois para desktop.
16712855225

Um site responsivo é quando o site automaticamente se adapta em qualquer


dispositivo que o usuário esteja visualizando com base no tamanho da tela em que
o site é exibido, ou seja, não importa em qual tipo de dispositivo o site seja acessado
sejam eles computadores desktops, notebooks, smartphones, tablets, o site será
exibido da melhor maneira para aquele dispositivo.

E o Desenvolvimento Híbrido? Aplicações híbridas trazem a resposta para os


programadores que desejam desenvolver para muitas plataformas, sem grande
perda de desempenho. Essa abordagem permite ao desenvolvedor criar um núcleo

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 9 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

do programa de forma nativa, o que permite que haja um controle sobre as


funcionalidades e recursos do dispositivo.

Isso faz com que, em suma, a experiência do usuário que está utilizando a aplicação
em um iOS seja a mesma que um em um Windows Phone, por exemplo, o que é
muito importante em grande parte das aplicações. O aplicativo híbrido funciona
dentro do browser do sistema operacional. O browser implementa uma classe que
é capaz de exibir conteúdo web.

Diferente do aplicativo nativo, o híbrido não possui acesso direto às funcionalidades


do dispositivo, sendo necessário um framework que faça a comunicação entre o
aplicativo e o dispositivo. Em geral, o desenvolvimento híbrido é utilizado para
aplicativos menos robustos e mais simples. Nesse contexto, o desenvolvedor
consegue reaproveitar boa parte do seu código.

A aplicação híbrida nada mais é que uma aplicação web (HTML5, CSS3, etc)
envelopada em um contêiner nativo. Existem dezenas de ferramentas para gerar
esse contêiner nativo para cada plataforma, tais como Cordova, Sencha Touch, etc.
Para diferenciar todas essas abordagens, eu recomendo que façamos uma
comparação geral. Atenção no quadro abaixo:

Nativo Web Híbrido

Baixado a partir da Loja de Hospedado em um Servidor Baixado a partir da Loja de


Distribuição Aplicativos. Web na internet e acessado Aplicativos.
por meio de um navegador.
Pode acessar telas sem Pode acessar telas sem Pode acessar telas sem
Acesso
conexão com a internet. conexão com a internet. conexão com a internet.
Offline 16712855225

Cada aplicativo para uma Um aplicativo é desenvolvido Um aplicativo é construído e


plataforma específica. A para funcionar em todas as depois envolvido em um
lógica da aplicação é plataformas, porque a lógica contêiner para servir a uma
reconstruída para cada pode ser reutilizada. plataforma nativa
Desenvolvimento aplicação em cada Aplicativos parecem específica.
plataforma. É difícil idênticos em todos os
replicar aplicativos dispositivos e browsers, mas
precisamente em todas as requer muitos testes.
plataformas.
Atualizações devem ser Atualizações podem ser Atualizações podem ser
Releases baixadas e instaladas todas manipuladas remotamente e baixadas e instaladas todas
as vezes. Desenvolvimento são instantâneas. as vezes.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 10 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10
e ciclos de release são
maiores.
Resposta rápida. Um pouco de atraso, Mais rápido que o Web e
Desempenho especialmente com mais lenta que o Nativo.
conectividade pobre.
Interface de usuário Interface de usuário com Apelo visual maior que o
Design bastante rica. foco maior ênfase na Desenvolvimento Web, mas
funcionalidade. não tão rico como o Nativo.
Suporta integração com Suporta parcialmente a Suporta integração com
Integração recursos do dispositivo. integração com recursos do recursos do dispositivo, mas
dispositivo. com desempenho limitado.
SQLite. SQLite. SQLite.
Armazenamento
de Dados
Swipe, Pinch e Spread. Swipe Swipe, Pinch e Spread.
Touch
Mais caro de todos. Mais barato de todos. Barato, mas não tanto
Custo quanto o Desenvolvimento
Web.
Ênfase na interatividade e Ênfase na usabilidade. Ênfase na usabilidade.
Ênfase nos recursos.

Lento. Rápido. Médio.


Tempo de
Desenvolvimento
Complexa. Fácil. Moderada.
Manutenção

A imagem abaixo também auxilia a entender cada abordagem! Percebam que se


você deseja capacidade máxima em uma plataforma única com interações
avançadas, alta performance e distribuição segura em uma loja de aplicativos, vá de
Desenvolvimento Nativo! Se você deseja capacidade máxima, mas para múltiplas
16712855225

plataformas e exigindo habilidades do desenvolvedor.

Além disso, se você quiser também acesso a plataforma nativa e distribuição segura
em uma loja de aplicativos, vá de Desenvolvimento Híbrido. Por fim, se a alta
capacidade não é seu foco, mas a capacidade de rodar em diversas plataformas,
também exigindo habilidades do desenvolver, atualizações instantâneas e
automáticas e distribuição irrestrita, seu negócio é Desenvolvimento Web (HTML5).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 11 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 12 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE – 2014 – ANATEL – Analista de Sistemas) O desenvolvimento de


aplicações web e o de aplicações nativas são as principais formas de
desenvolvimento móvel.

Comentários:

Vamos falar agora sobre as principais abordagens de desenvolvimento para sistemas


móveis. Peço a atenção de vocês, porque esse assunto é o que mais cai em prova!
Conforme a imagem acima, existem duas abordagens principais: Desenvolvimento
Nativo e Desenvolvimento Cross-Platform (sendo que esse último se divide em
Desenvolvimento Web e Desenvolvimento Híbrido).

Conforme vimos em aula, a questão está perfeita! De modo geral, são essas duas
formas principais – o tipo híbrido é uma combinação dos anteriores.

Gabarito: C

(CESPE – 2013 – BACEN – Analista de Sistemas) No projeto de aplicações para


dispositivos móveis, devem ser considerados, entre outros aspectos, as
características dos dispositivos de hardware para os quais a aplicação está sendo
desenvolvida e o consumo de energia gerado por cada recurso do sistema,
visando-se a economia de bateria. 16712855225

Comentários:

Além disso, no desenvolvimento de um aplicativo móvel, deve-se considerar, por


exemplo: resoluções dos dispositivos; as limitações de bateria, processamento,
memória e armazenamento; versão do sistema operacional utilizado; os diversos
tamanhos de tela; as possíveis questões de segurança de dados; acessibilidade; entre
outros. Vocês percebem agora como tudo isso pode ser complexo?

Conforme vimos em aula, a questão está perfeita! Deve haver uma preocupação
com as características de hardware do dispositivo.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 13 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Gabarito: C

ACERTEI ERREI

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 14 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

ANDROID

Android é um sistema operacional móvel pertencente ao Google! Apesar disso, ele


16712855225

continua tendo código aberto, mas com aplicações com software de código
fechado. Galera, quem aí tem um celular com Android? Vocês devem saber que é
possível trocar a ROM! Professor, o que é ROM? É como um firmware personalizado
do sistema operacional – pensem como uma customização do sistema operacional.

Por exemplo: quando eu tinha um Moto X, que eu usava o CyanogenMod. Por que
eu estou falando isso? Para enfatizar que o Google é agora dono do Android, mas
o código continua sendo aberto – permitindo que muitos desenvolvedores criem
personalizações. O Android surgiu a partir da Versão 2.6 do Kernel do Linux e
atualmente se baseia na Versão 3.x.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 15 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Professor, o que eu preciso para desenvolver? Você precisa do Android Studio, que
é um kit de ferramentas para desenvolvimento Android; e você precisa do SQLite,
que é uma biblioteca para implementar um banco de dados e armazenar dados.
Uma curiosidade engraçada também é que cada versão do sistema operacional
possui o nome de uma sobremesa – a versão atual é a Marshmallow 6.0.

A imagem acima apresenta três peculiaridades: primeiro, ela infelizmente não


mostra as duas últimas versões: Lollipop e Marshmallow; segundo, a versão
Honeycomb foi lançada, a princípio, para tablets; e terceiro, a partir da versão
IceCream Sandwich 4.0, o Android passou-se a se basear no kernel 3.x e, não mais,
no kernel 2.6 do Linux. Vamos agora ver o slogan de cada versão:

16712855225

VERSÃO SLOGAN

Android 1.6 A informação do mundo está ao seu alcance: pesquisar na Web,


Donut receber rotas de trânsito... ou apenas assistir a vídeos de gatos.
Android 2.0 Sua tela inicial do jeito que quiser. Organize apps e widgets em várias
Eclair telas e pastas. Planos de fundo interativos respondem ao toque.
Android 2.2 A Digitação por voz escreve o texto por você e as Ações de voz
Froyo permitem que você controle seu smartphone sem precisar digitar.
Android 2.3 Novos sensores fazem do Android uma ótima plataforma para jogos.
Gingerbread Assim você pode tocar, inclinar e se divertir.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 16 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Android 3.0 Otimizada para tablets, esta versão abre novos horizontes onde quer
Honeycomb que você esteja.
Android 4.0 O Android atinge a maioridade com um design novo e refinado.
IceCream Sandwich Simples, bonito e muito inteligente.
Android 4.1 O Android fica mais rápido, suave e com um visual incrível. Com o
Jelly Bean Google Now, você tem a informação certa na hora certa.
Android 4.4 Inteligente, simples e totalmente seu. Um design mais refinado,
Kitkat melhor desempenho e novos recursos.
Android 5.0 Mais doce novidade do Android. Tenha a elegância do Android em
Lollypop telas grandes e pequenas, com informação certa no momento certo.
Android 6.0 O Android Marshmallow chega para adocicar a experiência do
Marshmellow sistema da Google com diversos retoques em vários aspectos.

O Android roda sobre uma máquina virtual chamada Dalvik VM! Trata-se de uma
máquina virtual otimizada para requerer pouca memória e processamento, e
projetada para permitir que múltiplas instâncias da máquina virtual rodem ao
mesmo tempo, deixando para o sistema operacional o isolamento de processos, o
gerenciamento de memória e o suporte a threading.

Uma máquina virtual é uma aplicação de software que se comporta como se fosse
um dispositivo independente com seu próprio sistema operacional. Quem aí já
instalou VMWare? Vocês sabem, então, que podem rodar uma máquina virtual em
um computador que opera com um sistema operacional completamente diferente
do sistema operacional da máquina física.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 17 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Eu, por exemplo, tenho um MacBook, no entanto eu instalei uma máquina virtual
que roda Windows! Então é possível rodar um Windows no Macbook? Sim, por meio
de uma máquina virtual. A Dalvik é frequentemente referenciada como uma
Máquina Virtual Java, mas isso não é estritamente exato, porque o bytecode que ela
opera não é o bytecode da JVM.

Em vez disso, uma ferramenta de conversão chamada dx, incluída no SDK Android,
converte os arquivos .class de uma classe compilada por um compilador Java
comum para a JVM em outro formato especifico de classe (.dex). Vejam a imagem
abaixo! Observem que o Android não roda diretamente sobre a JVM! Apesar de ser
escrito em Java, ele roda diretamente sobre o Dalvik VM.

Vamos bater um papo agora sobre a Arquitetura Android! O Google geralmente se


refere ao Android como uma pilha de softwares. Cada camada da pilha agrupa
vários programas que suportam funções específicas do sistema operacional.
Conforme mostra a imagem, a base da pilha é a Camada de Linux Kernel, que inclui
algumas funcionalidades. Quais, professor?

Gerenciador de memória, configurações de segurança, gerenciador de energia e


vários drivers de hardware (Audio, Bluetooth, Câmera, entre outros). Para quem não
sabe, drivers são programas que controlam os dispositivos de hardware. Exemplo:
Meu Moto X tinha uma câmera! O Kernel do Android contém um driver que permite
ao usuário enviar comandos ao hardware da câmera.

Percebam, pela imagem, que a câmera do celular está na camada de Abstração de


Hardware, onde se encontram os recursos de hardware. Acima temos a Camada de
Bibliotecas! Pode-se pensar em bibliotecas como um conjunto de instruções que
dizem ao dispositivo como lidar com diferentes tipos de dados. Falou em biblioteca,
16712855225

deve-se lembrar de multimídia, Webkit (Renderizador de Browsers), SQLite (BD), etc.

Outras bibliotecas incluem aceleração tridimensional (para dispositivos com


acelerômetros) e um biblioteca de navegadores Web. No mesmo nível da camada
de bibliotecas, a Camada de Runtime inclui um conjunto de bibliotecas do núcleo
Java – lembrando que programadores de aplicações Android constroem suas
aplicações em Java. Ele também inclui a Máquina Virtual Dalvik (DVM).

A Camada Framework de Aplicações apresenta programas que gerenciam as


funções básicas do telefone, como alocação de recursos, aplicações de telefone,
mudança entre processos ou programas, e softwares de localização física do

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 18 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

aparelho. Os desenvolvedores de aplicações têm acesso total ao Framework de


Aplicações do Android.

Isso possibilita que os desenvolvedores tirem vantagem das capacidades de


processamento do Android e suportem recursos quando estão construindo suas
aplicações móveis. O framework de aplicações é como um conjunto de ferramentas
básicas com as quais um desenvolvedor pode construir aplicações e ferramentas
muito mais complexas.

Ela fornece todas as funcionalidades necessárias para a construção de aplicativos,


por meio de bibliotecas nativas. Se a prova perguntar qual camada contém as
16712855225

funcionalidades que auxiliam o desenvolvedor na criação de aplicativos, o que vocês


respondem? Tem que ser automático: Framework de Aplicação. Vejam que existem
vários gerenciadores (de atividade, janela, conteúdo, notificação, entre outros).

No topo da pilha está a Camada de Aplicações! Encontram-se funções básicas do


dispositivo, chamadas telefônicas, acesso ao navegador ou acesso à lista de
contatos. Sabe aqueles aplicativos que você instala no seu celular? Estão aqui
também! Whatsapp, Facebook, Tinder, Instagram... estão todos aqui! Se você é um
usuário comum, esta é a camada que você mais usará.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 19 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Em geral, apenas os programadores do Google, os desenvolvedores de aplicação e


os fabricantes de hardware acessam as camadas mais baixas. Vamos resumir em
palavras-chave? Camada de Kernel: drivers; Camada de Abstração de Hardware:
recursos de hardware; Camada de Bibliotecas: bibliotecas mesmo; Camada de
Runtime: DVM;

Camada de Framework de Aplicação: Gerenciadores para desenvolvedores;


Camada de Aplicações: apps do dispositivo. Algumas observações: alguns
consideram a Camada de Runtime como uma camada separada e outros
consideram-na como parte da Camada de Bibliotecas. Ademais, alguns consideram
a Camada de Abstração de Hardware como parte da Camada de Bibliotecas.

Vamos ver agora um pouco sobre os componentes de um aplicativo! O que é isso,


professor? Os componentes de aplicativo são os blocos de construção fundamentais
de um aplicativo do Android. Cada componente é um ponto diferente pelo qual o
sistema pode entrar no aplicativo. Nem todos os componentes são pontos de
entrada reais para o usuário e alguns dependem uns dos outros.

No entanto, cada um existe como uma entidade independente e desempenha uma


função específica – cada um é um bloco de construção exclusivo que ajuda a definir
o comportamento geral do aplicativo. Há quatro tipos diferentes de componentes
de aplicativo. Cada tipo tem uma finalidade distinta e tem um ciclo de vida específico
que define a forma pela qual o componente é criado e destruído.

A seguir apresentam-se os quatro tipos de componentes de aplicativos:

 Atividades (Activities):

As atividades representam uma tela única com uma interface do usuário. Por
16712855225

exemplo: um aplicativo de e-mails pode ter uma atividade para mostrar uma lista
de novos e-mails, outra atividade para escrever um e-mail e outra para ler e-mails.
Embora essas atividades funcionem juntas para formar uma experiência de usuário
coesa no aplicativo de e-mails, elas são independentes entre si.

Dessa forma, um outro aplicativo pode iniciar qualquer uma dessas atividades (se o
aplicativo de e-mails permitir). Por exemplo: um aplicativo de câmera pode iniciar a
atividade no aplicativo de e-mail. Vocês já tiraram uma foto no celular e a enviaram
por e-mail? Pois é! Você pode iniciar a atividade de escrita de e-mail lá no aplicativo
da câmera. Bacana?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 20 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Em suma, o Componente de Atividade é um componente que representa cada tela


da aplicação. Pegue seu smartphone agora, abra algum aplicativo (Ex: Facebook) e
vá interagindo e trocando de telas – cada tela será uma atividade. As atividades são
classes Java compostas por subcomponentes chamados de Visão (View). O que é
isso, professor?

É uma classe que representa o bloco de construção básico de um Componente de


UI. Galera, é a telinha retangular da tela do seu dispositivo – ela é responsável por
realizar desenhos e tratamento de eventos. Bacana, então as atividades são
compostas de visões e representam uma tela única da interface do usuário. Agora
nós vamos conhecer as Intenções.

 Intenções (Intents

Uma Intenção (Intent) é uma descrição abstrata de uma operação a ser executada.
Ela pode ser utilizada para iniciar uma Atividade, para ativar um broadcast, para
enviar uma mensagem para uma aplicação que roda em outro processo, entre
outros. Podemos dizer que ele envia uma solicitação para o que Android realize
alguma ação.

Por exemplo: para que o sistema saia de uma atividade para outra, dispara-se uma
intenção. A documentação oficial afirma que seu uso mais significativo ocorre
quando da inicialização de uma Atividade, e que também podemos imaginá-lo
como uma cola entre atividades. É uma estrutura de dados que armazena uma ação
a ser executada. Certinho?

 Serviços (Services

Os serviços são componentes executados em segundo plano para realizar


16712855225

operações de execução longa ou para realizar trabalho para processos remotos.


Eles não apresentam uma interface do usuário. Por exemplo: um serviço pode tocar
música em segundo plano enquanto o usuário está em um aplicativo diferente ou
buscar dados na rede sem bloquear a interação do usuário com uma atividade.

Outro componente, como uma atividade, pode iniciar o serviço e deixá-lo executar
ou vincular-se a ele para interagir. Deve-se atentar ao fato de que eles não são um
processo separado. Eles rodam na thread principal do processo corrente e possuem
seu próprio ciclo de vida. Os serviços devem estar declarados no AndroidManifest.xml –
não confundir com o arquivo principal do projeto AndroidManifet.xml.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 21 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

 Receptores de Broadcast (Broadcast Receivers):

Os Receptores de Broadcast são componentes que respondem a anúncios de


broadcast por todo o sistema. Muitos broadcasts se originam do sistema - por
exemplo, um broadcast que anuncia que uma tela foi desligada, que a bateria está
baixa ou que uma tela foi capturada. Uma pequena pausa: um broadcast é a
transmissão de uma mensagem.

Os aplicativos também podem iniciar transmissões — por exemplo, para comunicar


a outros dispositivos que alguns dados foram baixados no dispositivo e estão
disponíveis para uso. Embora os Receptores de Broadcast não exibam nenhuma
interface do usuário, eles podem criar uma notificação na barra de status para alertar
ao usuário quando ocorre uma transmissão.

Mais comumente, no entanto, um receptor de transmissão é somente um "portal"


para outros componentes e realiza uma quantidade mínima de trabalho. Por
exemplo: ele pode iniciar um serviço para executar um trabalho baseado no evento.
Então, os receptores de broadcast simplesmente respondem a mensagens de
broadcast de outras aplicações ou do próprio sistema.

 Provedores de Conteúdo (Content Provider

Os provedores de conteúdo gerenciam um conjunto compartilhado de dados do


aplicativo. É possível armazenar os dados no sistema de arquivos, em um banco de
dados SQLite ou em qualquer local de armazenamento persistente que o aplicativo
possa acessar. Por meio do provedor de conteúdo, outros aplicativos podem
consultar ou até modificar os dados (se o provedor de conteúdo permitir).

Por exemplo: o Android oferece um provedor de conteúdo que gerencia as


16712855225

informações de contato do usuário. Assim, qualquer aplicativo com as permissões


adequadas pode consultar parte do provedor de conteúdo para ler e gravar
informações sobre uma pessoa específica. Os provedores de conteúdo são úteis
para ler e gravar dados privados no aplicativo e não compartilhados.

As aplicações poderiam muito bem acessar diretamente um banco de dados, por


exemplo. Porém, é uma boa prática tornar o modo como os dados são gravados
transparente à aplicação. Dessa forma, a aplicação pode manter o foco nas
interações com o usuário. Por exemplo: o Provedor de Conteúdo de SMS permite
a qualquer aplicação ler as mensagens recebidas por um telefone celular.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 22 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE – 2012 – DPF – Analista de Sistemas) O sistema Android 4.0 foi


desenvolvido com base no kernel Linux versão 2.6 e é voltado para dispositivos
móveis controlando os serviços do sistema, como gerenciamento de memória e
de tarefas, diretivas de segurança e drivers.

Comentários:

A imagem acima apresenta três peculiaridades: primeiro, ela infelizmente não mostra
as duas últimas versões: Lollipop e Marshmallow; segundo, a versão Honeycomb foi
lançada, a princípio, para tablets; e terceiro, a partir da versão IceCream Sandwich
4.0, o Android passou-se a se basear no kernel 3.x e, não mais, no kernel 2.6 do Linux.
Vamos agora ver o slogan de cada versão:

Conforme vimos em aula, a partir da versão IceCream Sandwich 4.0, o Android


passou a ser baseado no kernel 3.x e, não, 2.6.

Gabarito: E

(CESPE – 2013 – ANTT – Analista de Sistemas) Com o uso do banco de dados


SQLite, incluso no Android, é possível desenvolver um provedor de conteúdo,
bem como um servidor de banco de dados, que necessita gerenciar o acesso
aos dados com persistência. No entanto, não se justifica a utilização de um
16712855225

provedor de conteúdo para disponibilizarem-se dados para várias atividades ou


aplicativos distintos.

Comentários:

Os provedores de conteúdo gerenciam um conjunto compartilhado de dados do


aplicativo. É possível armazenar os dados no sistema de arquivos, em um banco de
dados SQLite ou em qualquer local de armazenamento persistente que o aplicativo
possa acessar. Por meio do provedor de conteúdo, outros aplicativos podem consultar
ou até modificar os dados (se o provedor de conteúdo permitir).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 23 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Conforme vimos em aula, o provedor de conteúdo é como uma base de dados que
provê conteúdo! Ora, se essa é a função dele, não faz sentido dizer que não se
justifica sua utilização para disponibilizar dados para várias atividades ou aplicativos
distintos. Como não? Essa é a função dele!

Gabarito: E

(CESPE – 2015 – TCU – Analista de Sistemas) No desenvolvimento de aplicação


para dispositivos móveis, em vez de se utilizar uma plataforma específica ou um
ambiente cross-platform, pode-se optar por um tipo híbrido, como, por
exemplo, um componente HTML 5 envelopado em containers para acessar
recursos específicos de cada plataforma.

Comentários:

A aplicação híbrida nada mais é que uma aplicação web (HTML5, CSS3, etc)
envelopada em um contêiner nativo. Existem dezenas de ferramentas para gerar esse
contêiner nativo para cada plataforma, tais como Cordova, Sencha Touch, etc. Para
diferenciar todas essas abordagens, eu recomendo que façamos uma comparação
geral. Atenção no quadro abaixo:

Conforme vimos em aula, a aplicação híbrida envelopa uma aplicação web comum
(Ex: HTML5) com o auxílio de uma ferramenta (Ex: Cordova) – simulando uma
aplicação nativa – e, dessa forma, ele se torna capaz de acessar recursos específicos
de cada plataforma. No entanto, o examinador cometeu um vacilo: o início da
questão dá a entender que um tipo híbrido não é um ambiente cross-platform. Bem,
basta ver a imagem hierárquica colocada em aula para perceber que isso não faz
sentido, mas a questão infelizmente não foi anulada.
16712855225

Gabarito: C

(CESPE – 2013 – ANTT – Analista de Sistemas) Com base no kernel Linux, o


ambiente operacional Android, utilizado para o desenvolvimento de aplicações
móveis e não móveis, inclui um navegador incorporável baseado em WebKit,
com muitas opções de conectividade (wifi, bluetooth, dados wireless através de
conexão celular, como GPRS, EDGE e 3G). Os aplicativos Android são gravados
na linguagem Java e executados em uma máquina virtual JVM.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 24 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

O Android roda sobre uma máquina virtual chamada Dalvik VM! Trata-se de uma
máquina virtual otimizada para requerer pouca memória e processamento, e
projetada para permitir que múltiplas instâncias da máquina virtual rodem ao mesmo
tempo, deixando para o sistema operacional o isolamento de processos, o
gerenciamento de memória e o suporte a threading.

Conforme vimos em aula, os aplicativos são escritos em Java, mas rodam em uma
Dalvik VM e, não, Java VM.

Gabarito: E

(CESPE – 2013 – TCE/RO – Analista de Sistemas) No Android, os componentes


Intents são criados a partir de ações do usuário e representam a intenção de se
realizar alguma atividade, como iniciar o aplicativo de correio eletrônico ou abrir
uma página, utilizando-se do navegador que acompanha o Android. O código
mostrado a seguir apresenta corretamente um exemplo de utilização desse
componente.

Uri uri = Uri.parse("http://www.cespe.unb.br");


Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Comentários:

Uma Intenção (Intent) é uma descrição abstrata de uma operação a ser executada.
Ela pode ser utilizada para iniciar uma Atividade, para ativar um broadcast, para
enviar uma mensagem para uma aplicação que roda em outro processo, entre
outros. Podemos dizer que ele envia uma solicitação para o que Android realize
alguma ação.
16712855225

Conforme vimos em aula, a questão está perfeita! Ela exagerou, colocando código
de programação, mas esse código está apenas criando uma intenção de visualizar
a página http://www.cespe.unb.br.

Gabarito: C

(CESPE – 2013 – FUB – Analista de Sistemas) O Android pode ser executado


sobre qualquer sistema operacional, pois os aplicativos Android são escritos na
linguagem de programação Java e executados em uma máquina virtual Java.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 25 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

O Android roda sobre uma máquina virtual chamada Dalvik VM! Trata-se de uma
máquina virtual otimizada para requerer pouca memória e processamento, e
projetada para permitir que múltiplas instâncias da máquina virtual rodem ao mesmo
tempo, deixando para o sistema operacional o isolamento de processos, o
gerenciamento de memória e o suporte a threading.

Conforme vimos em aula, Android é executado na Dalvik VM e, não, Java VM.

Gabarito: E

(IBFC – 2013 – PC – Analista de Sistemas) É uma plataforma de software que está


revolucionando o mercado global de aplicativos para celulares. É a primeira
plataforma de aplicativos para telefones celulares de código aberto que se fez
notar pelos maiores mercados mundiais de telefonia celular. Estamos falando do:

a) Unix.
b) Linux.
c) Android.
d) Mac OS X.
e) Windows.

Comentários:

Galera, somente uma opção trata de um sistema operacional móvel: Android.

Gabarito: C

(CESPE – 2014 – ANATEL – Analista de Sistemas) A arquitetura do Android


16712855225

disponibiliza o módulo denominado OOM handling, que permite às aplicações


o gerenciamento do mecanismo de baixo consumo de energia do aparelho; por
exemplo, se um processo necessitar ser executado em segundo plano, o referido
módulo possibilitará a desativação temporária desse mecanismo até a finalização
do processo em execução.

Comentários:

Essa era uma questão para ninjas! Deseja-se avaliar na questão se o aluno conhece
os módulos específicos de cada funcionalidade – eu acho ridículo cobrar isso, mas
vamos lá! O Módulo OOM Handling (Out Of Memory) trata do gerenciamento de

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 26 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

memória, sendo que quem trata do gerenciamento de energia é o Módulo


Wakelocks, logo a questão está errada!

Gabarito: E

(FCC – 2011 – TRE/PE – Analista de Sistemas) A versão do Android feita, a


princípio, apenas para tablets, que apresenta melhorias nos recursos multitarefa
e nos widgets, é considerada como:

a) Cupcake
b) Frozen Yogurt
c) Gingerbread.
d) Honeycomb.
e) Ice Cream.

Comentários:

A imagem acima apresenta três peculiaridades: primeiro, ela infelizmente não mostra
as duas últimas versões: Lollipop e Marshmallow; segundo, a versão Honeycomb foi
lançada, a princípio, para tablets; e terceiro, a partir da versão IceCream Sandwich
4.0, o Android passou-se a se basear no kernel 3.x e, não mais, no kernel 2.6 do Linux.
Vamos agora ver o slogan de cada versão:

Conforme vimos em aula, trata-se da versão Honeycomb.

Gabarito: D

10. (CESPE – 2013 – SERPRO – Analista de Sistemas) Em uma aplicação desenvolvida


para Android, os serviços que forem executados em background serão
16712855225

implementados como componentes do tipo service e permanecerão em


execução até que a aplicação que os instanciar seja encerrada.

Comentários:

Outro componente, como uma atividade, pode iniciar o serviço e deixá-lo executar
ou vincular-se a ele para interagir. Deve-se atentar ao fato de que eles não são um
processo separado. Eles rodam na thread principal do processo corrente e possuem
seu próprio ciclo de vida. Os serviços devem estar declarados no AndroidManifest.xml –
não confundir com o arquivo principal do projeto AndroidManifet.xml.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 27 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Conforme vimos em aula, os services são realmente executados em background,


mas não permanecem em execução até que a aplicação que os instanciar seja
encerrada – cada aplicação tem seu próprio ciclo de vida independente.

Gabarito: E

11. (QUADRIX – 2013 – CREFONO – Analista de Sistemas) Como o software Android,


da empresa Google, pode ser classificado?

a) Um aplicativo para celulares.


b) Um aplicativo para celulares e tablets.
c) Um sistema operacional para celulares e tablets.
d) Um hardware para celulares e tablets.
e) Um tipo de celular.

Comentários:

Android é um sistema operacional móvel pertencente ao Google! Apesar disso, ele


continua tendo código aberto, mas com aplicações com software de código fechado.
Galera, quem aí tem um celular com Android? Vocês devem saber que é possível
trocar a ROM! Professor, o que é ROM? É como um firmware personalizado do
sistema operacional – pensem como uma customização do sistema operacional.

Conforme vimos em aula, trata-se de um sistema operacional para celulares e


tablets (e outros).

Gabarito: C

12. (FUMARC – 2014 – AL/MG – Analista de Sistemas) Em relação aos principais


16712855225

componentes de um aplicativo Android, analise os itens a seguir, marcando com


(V) a assertiva verdadeira e com (F) a assertiva falsa.

( ) Uma “atividade” do Android é tanto uma unidade de interação do usuário


quanto uma unidade de execução.
( ) Um programa Android interativo é iniciado pela criação de subclasses da
classe Activity.
( ) A classe ContentProvider do Android é utilizada em tarefas de segundo plano,
que podem estar ativas, mas não visíveis na tela.
( ) A classe Service do Android possui o quarteto de atividades básicas para
inserção, consulta, atualização e exclusão.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 28 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

A sequência CORRETA, de cima para baixo, é:

a) V, F, F, V.
b) F, V, F, V.
c) F, V, V, F.
d) V, V, F, F.

Comentários:

Conforme vimos em aula, a atividade é realmente uma unidade de interação, na


medida que é uma visão, e ela é também uma unidade de execução (o nome já dá
a dica); o segundo item também está perfeito, visto que se deve herdar de Activity
para iniciar uma interação; os dois últimos itens foram invertidos.

Gabarito: D

13. (CESPE – 2014 – ANATEL – Analista de Sistemas) O sistema operacional Android


tem o Linux como base, o que permite a utilização simultânea de aplicações que
podem ser executadas em segundo plano, de forma transparente para o usuário.

Comentários:

Os serviços são componentes executados em segundo plano para realizar operações


de execução longa ou para realizar trabalho para processos remotos. Eles não
apresentam uma interface do usuário. Por exemplo: um serviço pode tocar música
em segundo plano enquanto o usuário está em um aplicativo diferente ou buscar
dados na rede sem bloquear a interação do usuário com uma atividade.
16712855225

Conforme vimos em aula, temos os services (que rodam em segundo plano).

Gabarito: C

ACERTEI ERREI

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 29 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

iOS

O iOS, que antes era chamado de iPhoneOS, é um sistema operacional móvel


16712855225

pertencente à Apple! Lançado em 2007, roda no iPhone, iPod, iPad e Apple TV. Ele
é derivado do sistema operacional dos desktops, chamado MacOS X. Novas versões
são lançadas anualmente geralmente em junho. O número de usuários que utiliza
iPhone/iPad tem aumentado bastante.

Isso cria a oportunidade para os desenvolvedores ganharem dinheiro com a criação


de aplicativos para iPhone e iPad na Apple Store. Professor, o código é aberto? Não,
diferentemente do Android, o código é fechado. Professor, as aplicações nativas
devem ser desenvolvidas em Java? Não, diferentemente do Android, é Objective-C.
Vamos ver agora um pouco da Arquitetura do iOS.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 30 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

No mais alto nível, o iOS atua como um intermediário entre o hardware subjacente
e os aplicativos – ora, aplicativos não conversam com o hardware diretamente. Em
vez disso, se comunicam com o hardware através de um conjunto de interfaces bem
definidas. Essas interfaces tornam mais fácil a criação de aplicativos que funcionam
consistentemente em dispositivos com diferentes capacidades de hardware.

A Arquitetura iOS é dividida em quatro camadas! As inferiores apresentam serviços


e tecnologias fundamentais; as superiores, serviços e tecnologias mais sofisticados.
A Camada Cocoa Touch contém os principais frameworks para construir aplicativos.
16712855225

Esses frameworks definem a aparência do aplicativo e fornecem a infraestrutura e


suporte básicos para tecnologias como: multitarefa, entrada por toque, etc.

OBSERVAÇÃO

O Cocoa Touch define uma arquitetura básica (MVC) para criação de aplicativos:

“MVC is central to a good design for a Cocoa application. The benefits of adopting this pattern
are numerous. Many objects in these applications tend to be more reusable, and their
interfaces tend to be better defined. Applications having an MVC design are also more easily
extensible than other applications. Moreover, many Cocoa technologies and architectures
are based on MVC and require that your custom objects play one of the MVC roles”.
Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 31 de 100
Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Ao desenhar aplicativos, deve-se investigar as tecnologias dessa camada para ver


se elas satisfazem suas necessidades. Existem dois frameworks principais: UIKit, que
fornece ferramentas básicas para implementar aplicações gráficas e orientadas a
eventos; e Foundation, que fornece funcionalidades nucleares e essenciais
necessárias para a criação de um aplicativo.

A Camada Media contém os frameworks que contém as tecnologias de criações de


gráfico, áudio e vídeos que você pode utilizar para implementar multimídia em seus
aplicativos. A Camada Core Services contém os frameworks que fornecem serviços
essenciais para as aplicações e para as camadas superiores. Os principais
frameworks são: Core Foundation e Foundation.

Esses frameworks definem tipos básicos utilizados por todos os aplicativos. Essa
camada também contém tecnologias individuais para suportar características como:
Location, iCloud, Social Media e Networking. Detalhe importante: o Foundation faz
parte da Camada Cocoa Touch e Core Services. Por fim, a Camada Core OS trata de
funcionalidades de mais baixo nível.

Mesmo que você não utilize essas tecnologias diretamente em seus aplicativos,
provavelmente eles estão sendo utilizados por outros frameworks. Nessa camada,
trata-se de gerenciamento de memória, threads, processamento, drivers, entre
outros recursos. Por fim, o iOS não implementa um Garbage Collector, mas o
Objective-C possui um Automatic Reference Counting (ARC) para liberar a memória.

Dessa forma, o programador não tem que ficar preocupado em liberar referências.
Para acabar, o ambiente nativo para desenvolvimento de aplicativos para o iOS é o
XCode! Ele suporta por padrão Objective-C e AppleScript. Além disso, ele possui
ferramentas para criação, design e debug de aplicações iOS. Da mesma forma que
16712855225

é comum usar o Eclipse para o Android, é comum usar o XCode para o iOS.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 32 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE – 2012 – DPF – Analista de Sistemas) A arquitetura do iOS possui quatro


camadas (layers) que funcionam como interface entre a aplicação e o hardware.
Essas camadas, listadas da mais baixa para a mais alta, são: Core OS, Core
Services, Media e CoCoa Touch.

Comentários:

16712855225

Conforme vimos em aula, a questão está perfeita!

Gabarito: C

(CESPE – 2013 – SERPRO – Analista de Sistemas) Como o iOS não implementa


um sistema de garbage collection, o Objective-C mantém um contador de

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 33 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

referência para os objetos de forma a viabilizar a liberação de memória de tal


objeto.

Comentários:

Mesmo que você não utilize essas tecnologias diretamente em seus aplicativos,
provavelmente eles estão sendo utilizados por outros frameworks. Nessa camada,
trata-se de gerenciamento de memória, threads, processamento, drivers, entre outros
recursos. Por fim, o iOS não implementa um Garbage Collector, mas o Objective-C
possui um Automatic Reference Counting (ARC) para liberar a memória.

Conforme vimos em aula, a questão está perfeita!

Gabarito: C

(FUMARC – 2014 – AL/MG – Analista de Sistemas) Analise as seguintes afirmativas


sobre fundamentos para desenvolvimento de aplicações móveis para iOS.

I. Xcode é o ambiente nativo da Apple para desenvolvimento de aplicativos para


iOS.
II. Objective-C é a linguagem de desenvolvimento de aplicativos para iOS.
III. A classe NSObject é a classe raiz das principais hierarquias de classes em
Objective-C.

Estão CORRETAS as afirmativas:

a) I, II e III.
b) I e II, apenas.
c) I e III, apenas. 16712855225

d) II e III, apenas.

Comentários:

Dessa forma, o programador não tem que ficar preocupado em liberar referências.
Para acabar, o ambiente nativo para desenvolvimento de aplicativos para o iOS é o
XCode! Ele suporta por padrão Objective-C e AppleScript. Além disso, ele possui
ferramentas para criação, design e debug de aplicações iOS. Da mesma forma que é
comum usar o Eclipse para o Android, é comum usar o XCode para o iOS.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 34 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Conforme vimos em aula, o ambiente para desenvolvimento de aplicativos é o


XCode; a linguagem para criação de aplicativos é o Objective-C; quem conhece Java
sabe que todas as classes descendem de Object – no Objective-C, as principais
classes descendem de NSObject.

Gabarito: A

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) Para que os programas


aplicativos sejam executados no Android e no iOS, é necessário uma máquina
virtual própria, cujas responsabilidades são, entre outras, gerenciar a
comunicação entre o aplicativo e as bibliotecas nativas, prover segurança e
permitir que os aplicativos possam gravar dados privados, incluindo bancos de
dados. No Android 4.3, a máquina virtual é a Dalvik; no iOS 7, é a XCode.

Comentários:

Dessa forma, o programador não tem que ficar preocupado em liberar referências.
Para acabar, o ambiente nativo para desenvolvimento de aplicativos para o iOS é o
XCode! Ele suporta por padrão Objective-C e AppleScript. Além disso, ele possui
ferramentas para criação, design e debug de aplicações iOS. Da mesma forma que é
comum usar o Eclipse para o Android, é comum usar o XCode para o iOS.

Conforme vimos em aula, XCode é um ambiente de desenvolvimento e, não, uma


máquina virtual.

Gabarito: E

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) No iOS 7, os frameworks são


diretórios que contêm biblioteca compartilhada dinâmica com recursos como
16712855225

arquivos de cabeçalho, imagens e aplicativos auxiliares a serem utilizados no


desenvolvimento dos aplicativos.

Comentários:

Perfeito! Esses frameworks são diretórios que contém um conjunto de bibliotecas


compartilhadas e dinâmicas com diversos recursos e serviços que auxiliam, direta
ou indiretamente, no desenvolvimento de aplicativos.

Gabarito: C

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 35 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) O iOS 7 possui as camadas


Cocoa Touch, Media, Core Services e Core OS; esta última, que é a camada mais
baixa, suporta aplicativos desenvolvidos em 64 bits no modelo LP64.

Comentários:

Conforme vimos em aula, as quatro camadas estão corretas e a última suporta


aplicativos 64 bits. Professor, o que é modelo LP64? É um modelo de tamanho dos
dados. Então, sim, a questão está perfeita!
16712855225

Gabarito: C

ACERTEI ERREI

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 36 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

SEGURANÇA NO DESENVOLVIMENTO

Software é um componente fundamental na automação dos processos de sistemas


de informação e processos da infraestrutura computacional. Se esses processos
falham, seja por causas acidentais, como erros de um operador humano ou erros
na programação do software, seja por causas intencionais, como ataques por
hackers, vários são os problemas que podem ser gerados.

De fato, pode-se dizer que, de forma complementar aos incidentes de segurança


decorrentes de falhas ou ataques do componente humano no trato da informação,
a grande maioria dos demais incidentes de segurança da informação tem sua
origem nas vulnerabilidades presentes no software, isto é, o software é
intrinsecamente suscetível a falhas.

Uma das causas dessas vulnerabilidades é a codificação ingênua por um


programador, quando ele considera apenas os cenários positivos, sem se preocupar
com o caso de usuários maliciosos. Os incidentes decorrentes da exploração dessas
vulnerabilidades são geralmente relacionados com a indisponibilidade, a divulgação
indevida e a perda de integridade da informação.

A Microsoft usa o acrônimo STRIDE para classificar os efeitos que podem ser
provocados em decorrência de falhas de segurança em uma aplicação, sendo:

S - Spoofing: falsificação de identidade de um usuário;


T - Tampering: adulteração de integridade da informação ou do sistema;
R - Repudiation: negação da execução de ato cometido por um usuário;
I - Information Disclosure: divulgação indevida de informação;
16712855225

D - Denial of Service: negação de serviço;


E - Elevation of Privilege: elevação de privilégios indevidos por um usuário.

Esses efeitos podem produzir impactos de baixo a alto valor, dependendo do tipo
de aplicação ou sistema computacional no qual o software está executando. Podem
gerar incidentes simples (Ex: Reinstalar um aplicativo em uma máquina de uso
pessoal), bem como incidentes que impactam vidas humanas (Ex: Perda de controle
de um sistema de defesa, de transportes, médico-hospitalares, etc).

A segurança da informação em ambientes tecnológicos depende da adoção de


segurança para a aquisição e desenvolvimento de software. Ocorre que os modelos

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 37 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

de processo de software anteriores à disseminação da Internet (Ex: Cascata) foram


concebidos em um momento em que ainda não havia grande preocupação com os
problemas de segurança decorrentes da exposição das aplicações às redes abertas.

A exposição de uma aplicação à Internet aumenta enormemente as possibilidades


de ataques e exploração de vulnerabilidades nessa aplicação. Em resposta a essa
situação recente, o desenvolvimento de software tem evoluído nos últimos anos
visando incorporar de forma mais explícita o trato de questões de segurança da
informação durante seu desenvolvimento.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 38 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

RISCOS DE SEGURANÇA EM APLICAÇÕES WEB

O software inseguro está debilitando nossa infraestrutura financeira, de saúde, de


defesa, de energia e outras infraestruturas críticas. À medida que nossa
infraestrutura digital fica cada vez mais complexa e interligada, a dificuldade em
obter segurança em aplicações aumenta exponencialmente. Para tal, o OWASP
listou dez riscos de segurança mais críticos em aplicações web.

Ele tem como objetivo primário a sensibilização sobre segurança em aplicações


através da identificação de alguns dos riscos mais críticos enfrentados pelas
organizações. De acordo com a especificação, atacantes podem, potencialmente,
usar vários caminhos diferentes através da sua aplicação para causar danos ao seu
negócio ou a sua organização.

É importante lembrar que cada um desses caminhos representa um risco que pode,
ou não, ser grave o suficiente para justificar a sua atenção. Às vezes, esses caminhos
são triviais para encontrar e explorar, e em outras, são extremamente difíceis. Da
mesma forma, o dano causado pode ter nenhuma consequência, ou pode acabar
com o seu negócio.

Para determinar o risco para a sua organização, você pode avaliar a probabilidade
associada a cada agente de ameaça, vetor de ataque, vulnerabilidade de segurança
e combiná-la com uma estimativa dos impactos técnico e no negócio da sua
empresa. Juntos, esses fatores determinam o risco total! O foco é na identificação
dos riscos mais graves para uma ampla gama de organizações.

RISCO DESCRIÇÃO
16712855225

As falhas de Injeção, tais como Injeção de SQL (SQL Injection), de


Sistema Operacional e de LDAP, ocorrem quando dados não confiáveis
são enviados para um interpretador como parte de um comando ou
Injeção consulta. Os dados manipulados pelo atacante podem iludir o
interpretador para que este execute comandos indesejados ou permita
o acesso a dados não autorizados.

As funções da aplicação relacionadas com autenticação e


Quebra de
gerenciamento de sessão geralmente são implementadas de forma
Autenticação e
incorreta, permitindo que os atacantes comprometam senhas, chaves

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 39 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Gerenciamento de e tokens de sessão ou, ainda, explorem outra falha da implementação


Sessão para assumir a identidade de outros usuários.

Falhas XSS ocorrem sempre que uma aplicação recebe dados não
confiáveis e os envia ao navegador sem validação ou filtro adequados.
XSS permite aos atacantes executarem scripts no navegador da vítima
Cross-Site
que podem “sequestrar” sessões do usuário, desfigurar sites, ou
Scripting (XSS)
redirecionar o usuário para sites maliciosos.

Uma referência insegura e direta a um objeto ocorre quando um


programador expõe uma referência à implementação interna de um
Referência objeto, como um arquivo, diretório, ou registro da base de dados. Sem
Insegura e Direta a a verificação do controle de acesso ou outra proteção, os atacantes
Objetos podem manipular estas referências para acessar dados não-
autorizados.

Uma boa segurança exige a definição de uma configuração segura e


implementada na aplicação, frameworks, servidor de aplicação,
Configuração servidor web, banco de dados e plataforma. Todas essas configurações
Incorreta de devem ser definidas, implementadas e mantidas, já que geralmente a
Segurança configuração padrão é insegura. Adicionalmente, o software deve ser
mantido atualizado.

Muitas aplicações web não protegem devidamente os dados sensíveis,


tais como cartões de crédito, IDs fiscais e credenciais de autenticação.
Os atacantes podem roubar ou modificar esses dados desprotegidos
Exposição de
16712855225

com o propósito de realizar fraudes de cartões de crédito, roubo de


Dados Sensíveis
identidade, ou outros crimes. Os dados sensíveis merecem proteção
extra como criptografia no armazenamento ou em trânsito, bem como
precauções especiais quando trafegadas pelo navegador.
A maioria das aplicações web verificam os direitos de acesso em nível
de função antes de tornar essa funcionalidade visível na interface do
Falta de
usuário. No entanto, as aplicações precisam executar as mesmas
Função para
verificações de controle de acesso no servidor quando cada função é
Controle do Nível
invocada. Se estas requisições não forem verificadas, os atacantes
de Acesso
serão capazes de forjar as requisições, com o propósito de acessar a
funcionalidade sem autorização adequada.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 40 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Um ataque CSRF força a vítima que possui uma sessão ativa em um


navegador a enviar uma requisição HTTP forjada, incluindo o cookie da
Cross-Site sessão da vítima e qualquer outra informação de autenticação incluída
Request Forgery na sessão, a uma aplicação web vulnerável. Esta falha permite ao
(CSRF) atacante forçar o navegador da vítima a criar requisições que a
aplicação vulnerável aceite como requisições legítimas realizadas pela
vítima.
Componentes, tais como bibliotecas, frameworks, e outros módulos de
software quase sempre são executados com privilégios elevados. Se
Utilização de
um componente vulnerável é explorado, um ataque pode causar sérias
Componentes
perdas de dados ou o comprometimento do servidor. As aplicações que
Vulneráveis
utilizam componentes com vulnerabilidades conhecidas podem minar
Conhecidos
as suas defesas e permitir uma gama de possíveis ataques e impactos.

Aplicações web frequentemente redirecionam e encaminham usuários


para outras páginas e sites, e usam dados não confiáveis para
Redirecionamentos
determinar as páginas de destino. Sem uma validação adequada, os
e
atacantes podem redirecionar as vítimas para sites de phishing ou
Encaminhamentos
malware, ou usar encaminhamentos para acessar páginas não
Inválidos
autorizadas.

O SQL Injection exige um pouco mais da nossa atenção! De acordo com Navathe,
em um ataque de Injeção de SQL, o atacante injeta uma entrada de cadeia de
caracteres pela aplicação, que muda ou manipula a instrução SQL para o proveito
do atacante. Em suma, eles buscam acessar maliciosamente dados sensíveis de
bancos de dados – eles podem destruir tudo!
16712855225

Ela ocorre quando o atacante consegue inserir uma série de Instruções SQL dentro
de uma consulta através da manipulação das entradas de dados e se aproveita de
vulnerabilidades para consultar tabelas do banco de dados para roubar informação
ou inserir código malicioso. Qualquer site que monte páginas com base no
conteúdo de um banco de dados (Ex: gerenciadores de conteúdo) corre esse risco.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 41 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

PRÁTICAS DE PROGRAMAÇÃO SEGURA

Galera, o que seria um software seguro? Trata-se de um software livre de


vulnerabilidades, que funciona da maneira pretendida e que não compromete a
segurança de outras propriedades requeridas do software, seu ambiente e as
informações manipuladas por ele. Braz (2008) determina cinco propriedades de um
software seguro:

 Disponibilidade: o software deve estar sempre operacional e acessível para os


usuários autorizados sempre que necessário.

 Integridade: o software deve estar sempre protegido contra modificações não


autorizadas.

 Confidencialidade: no contexto da segurança do software, confidencialidade se


aplica para o próprio software e para os dados que ele manipula.

 Responsabilização: toda ação relevante de segurança de um software-as-user1


deve ser registrada e acompanhada, com atribuição de responsabilidade.

 Não-Repúdio: a habilidade de prevenir o software-como-usuário de negar


responsabilidade sobre ações desempenhadas.

Devido ao foco inicial do desenvolvimento de software ser fundamentalmente no


atendimento aos requisitos de funcionamento que satisfazem as necessidades
evidentes e contratuais dos clientes e usuários, critérios de segurança para tornar
um software seguro muitas vezes só são realizados tardiamente, durante os testes
e validação final do software.
16712855225

Isso porque nem os clientes nem os desenvolvedores estão preparados para tratar
previamente da questão. Satisfazer necessidades de segurança em uma fase tardia
do desenvolvimento produz elevado impacto negativo sobre o projeto, resultando
muitas vezes na produção e implantação de software inseguro, que contém um
significativo número de vulnerabilidades capazes de serem exploradas por hackers.

Com a frequência crescente de ataques desferidos contra as aplicações, tornam-se


comuns os problemas de segurança em sistemas de informação na internet, como
indisponibilidade, perda de integridade, perda de confidencialidade, etc. Em função

1
Entidades de software que agem como usuário, como agentes proxies e webservices.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 42 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

dessa realidade é muito importante que os requisitos de segurança sejam


declarados desde o início de concepção do software.

O OWASP (Open Web Application Security Project) apresenta Princípios de


Segurança de Aplicativos, que podem ser considerados como coleções de
propriedades desejáveis de aplicação, comportamentos, modelos e práticas de
implementação que tentam reduzir a probabilidade de concretização de ameaças
e, caso ocorram, a minimização de impacto. Entendido?

Os princípios são primitivas arquitetonicamente neutras e independentes de


linguagem que podem ser aproveitadas dentro da maioria das metodologias de
desenvolvimento de software para projetar e construir aplicações. Eles são
importantes porque nos ajudam a tomar decisões de segurança em situações novas
com as mesmas ideias básicas.

Ao considerar cada um desses princípios, podemos derivar os requisitos de


segurança, fazer arquitetura e implementação de decisões, e identificar possíveis
deficiências nos sistemas. O mais importante a se lembrar é que, para ser útil, os
princípios devem ser avaliados, interpretados e aplicados para resolver um
problema específico.

Apesar de os princípios poderem servir como diretrizes gerais, simplesmente dizer


ao desenvolvedor de software que o software dele deve "falhar com segurança", ou
que eles devem fazer uma "defesa em profundidade" não vai significar muita coisa.
Enfim, é importante conhecer esses princípios! São apenas dez e eles são bastante
intuitivos, logo... vamos lá:

PRINCÍPIOS DE SEGURANÇA DE APLICAÇÕES


APLICAR DEFESA EM PROFUNDIDADE UTILIZAR UM MODELO DE SEGURANÇA
16712855225

POSITIVA
FALHAR COM SEGURANÇA EXECUTAR COM MENOS PRIVILÉGIOS

EVITAR SEGURANÇA POR OBSCURIDADE MANTER A SEGURANÇA SIMPLES

DETECTAR INTRUSÕES NÃO CONFIAR NA INFRAESTRUTURA

NÃO CONFIAR NOS SERVIÇOS ESTABELECER PADRÕES DE SEGURANÇA

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 43 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Podemos utilizar dois famosos modelos de processo de desenvolvimento de


software seguro apresentados a seguir:

 Security Development Lifecycle (SDL)


 Comprehensive, Lightweight Application Security Process (CLASP)

O SDL lista uma série de atividades que devem ser realizadas em cada fase do
processo. As fases são: Treinamento, Requisitos, Design, Implementação,
Verificação, Lançamento e Resposta. Ele é um processo de desenvolvimento de
software que ajuda os desenvolvedores na construção de softwares mais seguros e
na conformidade com requisitos de segurança, ao mesmo tempo que reduz custos.

Adotado pela Microsoft para o desenvolvimento de softwares que precisem resistir


a ataques mal-intencionados, o processo engloba a adição de uma série de
atividades e produtos concentrados na segurança em cada fase do processo de
desenvolvimento. Essas atividades e esses produtos incluem o desenvolvimento de
modelos de ameaças durante o design do software.

Além disso, engloba o uso de ferramentas de verificação de código de análise


estática durante a implementação e a realização de revisões de código e testes de
segurança durante um "esforço de segurança" direcionado. Antes que o software
sujeito ao SDL possa ser lançado, ele deve passar por uma revisão final de segurança
feita por uma equipe independente de seu grupo de desenvolvimento.
16712855225

Por fim, cabe salientar que o Secure Development Lifecycle (SDL) apreseta dois
documentos principais! O primeiro é simplesmente uma versão mais resumida do
segundo, que traz conceitos mais aprofundados. Não há qualquer diferença entre
eles, a não ser pela profundidade de seus conteúdos. Ferramentas e técnicas são
aplicáveis a qualquer um dos dois!

Agora é o CLASP! Trata-se de um conjunto de componentes de processo dirigido


por atividade e baseado em regras que articula práticas para construção de software
seguro, permitindo o ciclo de vida de desenvolvido do software de maneira
estruturada, com repetição e mensuração. Ele é um conjunto de pedaços de
processos que pode ser integrado a qualquer processo de desenvolvimento.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 44 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Foi projetado para ser de fácil utilização. Tem um enfoque prescritivo,


documentando as atividades que as organizações devem realizar, proporcionando
uma ampla riqueza de recursos de segurança que facilitam a implementação dessas
atividades. O CLASP traz um conjunto de vulnerabilidades e suas raízes, organizadas
em categorias divididas por temas que se referem a um grupo de vulnerabilidades.

Os problemas de segurança podem ser categorizados de acordo com diferentes


critérios, o principal é relacionado a origem do problema. Os tipos de problemas
(que podem ser verificados por meio de ferramentas automáticas de análise estática)
são: erros de intervalo e de tipos de dados; erros de lógica; problemas de ambiente;
erros de sincronização e timing; erros de protocolo; e malware.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 45 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

REVISÃO DE CÓDIGO

A revisão do código fonte é particularmente útil para verificar se os mecanismos de


segurança da aplicação são robustos, assim como para encontrar problemas difíceis
de identificar simplesmente examinando os resultados da aplicação. Testar a
aplicação é particularmente útil para provar que as falhas são de fato exploráveis.
Esses métodos são complementares e até redundantes em algumas áreas.

A revisão de código é provavelmente a técnica mais eficaz para identificar falhas de


segurança no início do ciclo de vida de desenvolvimento do sistema. Quando usado
em conjunto com ferramentas automatizadas e testes de penetração manuais, ela
pode aumentar significativamente a eficácia de custo de um esforço de verificação
de segurança do aplicativo.

A revisão manual de código de segurança fornece insights sobre o "risco real"


associado a um código inseguro. Este é o valor mais importante a partir de uma
abordagem manual. Um colaborador humano pode compreender o contexto de
um bug ou vulnerabilidade no código; o contexto requer compreensão humana do
que está sendo avaliado.

Com contexto apropriado, podemos fazer uma estimativa de risco grave, que
representa tanto a probabilidade de ataque quanto o impacto nos negócios de uma
violação. Categorização correta das vulnerabilidades ajuda com prioridade de
remediação e fixa as coisas certas em oposição a perder tempo, que fixa tudo. Bem,
temos uma lista de práticas de revisão de código que podem nos ajudar:

 Revise menos que 200-400 linhas por vez – mais que isso, a habilidade de
encontrar defeitos cai drasticamente;
16712855225

 Busque uma taxa de inspeção menor que 300-500 Linhas de Código por Hora –
revisar rápido não é revisar bem;

 Reserve tempo para uma revisão apropriada e lenta, mas não mais de 60-90
minutos;

 Tenha certeza de que os autores anotaram o código-fonte antes de iniciar a


revisão do código;

 Estabeleça objetivos quantificáveis para a revisão de código e capture métricas


a fim melhorar o processo de revisão;

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 46 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

 Utilize checklists, pois elas melhoram substancialmente os resultados para ambos


– autores e revisores;

 Verifique se os defeitos são de fato resolvidos – pode parecer evidente, mas é


comum se enganar;

 Promova uma boa cultura de revisão de código em que defeitos encontrados


são vistos positivamente;

 Cuidado com o efeito Big Brother – em outras palavras, não fique paranoico
achando que está sendo observado pelos seus pares;

 Revise ao menos parte do código, mesmo que não possa fazer tudo, para se
beneficiar do Efeito Ego;

 Adote revisões de código leves e com auxílio de ferramentas – existem diversas


no mercado, inclusive automatizadas.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 47 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

CONTROLES E TESTES DE SEGURANÇA DE APLICAÇÕES WEB E WEBSERVICES

Vocês sabem o que é um Teste de Penetração? Trata-se de um método de avaliação


de segurança de um sistema computacional ou de uma rede ao simular um ataque.
Esse teste se concentra apenas em avaliar a segurança de uma aplicação web. O
processo envolve uma análise ativa da aplicação para cada fraqueza, falhas técnicas
ou vulnerabilidades.

Todas os problemas de segurança que são encontradas são apresentadas ao


proprietário do sistema juntamente com uma avaliação do seu impacto e muitas
vezes com uma proposta de mitigação ou uma solução técnica. Ocorre que o Teste
de Penetração nunca será uma ciência exata, em que uma lista completa de todos
os possíveis problemas que deveriam ser testados pode ser definida.

O Teste de Penetração é apenas uma técnica apropriada para testar a segurança de


aplicações web em determinadas circunstâncias. O OWASP (Open Web Application
Security Project) é uma comunidade online dedicada à segurança de aplicações. Ele
divide o conjunto de testes ativos em nove categorias para um total de 66 controles
– vejamos essas categorias:

CATEGORIAS DE TESTES
TESTE DE GERENCIAMENTO DE TESTE DE LÓGICA DE NEGÓCIO;
CONFIGURAÇÃO;
TESTE DE AUTENTICAÇÃO; TESTE DE AUTORIZAÇÃO;

TESTE DE GERENCIAMENTO DE SESSÃO; TESTE DE VALIDAÇÃO DE DADOS;

TESTE DE NEGAÇÃO DE SERVIÇOS; 16712855225


TESTE DE SERVIÇOS WEB;

TESTE DE AJAX; -

Pessoal, não vale a pena estudar os controles! Essa disciplina já cai pouquíssimo –
custo-benefício é baixíssimo! A Categoria de Gerenciamento de Sessão, por
exemplo, possui controles como: Teste de Cookies e Atributos; Teste de Variáveis
de Sessão Expostas; Testes de Esquema de Gerenciamento de Sessão; Testes de
Fixação de Sessão; entre outros.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 48 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

As vulnerabilidades de web services são similares a outras vulnerabilidades (Ex: SQL


Injection, Divulgação Indevida de Informação e Vazamento). O primeiro passo para
executar um Teste de Web Service é determinar os pontos de entrada e o esquema
de comunicação – ambos descritos WSDL. Uma vez identificados, testam-se os
pontos de entrada.

A seguir, testa-se se os arquivos XML são bem-formados e buscam-se ataques em


nível de conteúdo. Acontecem, então, os testes de parâmetros do Método GET e
do REST! Em suma, é isso! Encontrei pouquíssimas questões sobre esse tema. Se
alguém encontrar alguma outra questão em concurso, por favor me envie para que
eu possa comentar e inserir na aula :-)

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 49 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE - 2014 – TC/DF – Analista de Sistemas) SQL Injection é uma técnica usada
para executar um código no espaço de outro programa, o que, normalmente,
força o programa a carregar a DLL (Dynamic-Link Library), que assume o espaço
de memória do programa em execução.

Comentários:

O SQL Injection exige um pouco mais da nossa atenção! De acordo com Navathe,
em um ataque de Injeção de SQL, o atacante injeta uma entrada de cadeia de
caracteres pela aplicação, que muda ou manipula a instrução SQL para o proveito do
atacante. Em suma, eles buscam acessar maliciosamente dados sensíveis de bancos
de dados – eles podem destruir tudo!

Ela ocorre quando o atacante consegue inserir uma série de Instruções SQL dentro de
uma consulta através da manipulação das entradas de dados e se aproveita de
vulnerabilidades para consultar tabelas do banco de dados para roubar informação
ou inserir código malicioso. Qualquer site que monte páginas com base no conteúdo
de um banco de dados (Ex: gerenciadores de conteúdo) corre esse risco.

Conforme vimos em aula, não é nada disso! Não há nenhuma relação com DLL!

16712855225
Gabarito: E

(CESPE - 2013 – CNJ – Analista de Sistemas) O SDL é um processo de


desenvolvimento de software seguro, que envolve a adição de produtos e
atividades, como o desenvolvimento de modelos de ameaças.

Comentários:

Adotado pela Microsoft para o desenvolvimento de softwares que precisem resistir a


ataques mal-intencionados, o processo engloba a adição de uma série de atividades
e produtos concentrados na segurança em cada fase do processo de

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 50 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

desenvolvimento. Essas atividades e esses produtos incluem o desenvolvimento de


modelos de ameaças durante o design do software.

Conforme vimos em aula, a questão está perfeita! O SDL afirma:

“As part of the design phase of the SDL, threat modeling allows software architects to identify and mitigate
potential security issues early, when they are relatively easy and cost-effective to resolve. Therefore, it helps
reduce the total cost of development.”

Gabarito: C

(FCC - 2 – TJ/PE – Analista de Sistemas) São práticas eficientes para revisão


de código, EXCETO:

a) Revisar código por, no máximo, 90 minutos por vez.


b) Revisar até 500 linhas de código por hora.
c) Adotar revisões de código com auxílio de ferramentas.
d) Revisar até 1000 linhas de código por vez.
e) Decidir antecipadamente os objetivos do processo de revisão de código e
como medir sua efetividade.

Comentários:
Com contexto apropriado, podemos fazer uma estimativa de risco grave, que
representa tanto a probabilidade de ataque quanto o impacto nos negócios de uma
violação. Categorização correta das vulnerabilidades ajuda com prioridade de
remediação e fixa as coisas certas em oposição a perder tempo, que fixa tudo. Bem,
temos uma lista de práticas de revisão de código que podem nos ajudar:

 Revise menos que 200-400 linhas por vez – mais que isso, a habilidade de
16712855225

encontrar defeitos cai drasticamente;

Conforme vimos em aula, é no máximo 400 linhas de código por vez e, não, 1000!

Gabarito: D

(CESPE - – PCF – Analista de Sistemas) No que se refere a processos de


desenvolvimento seguro de aplicações, julgue o item subsecutivo.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 51 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10
O processo SDL (Secure Development Lifecycle) tem sido adotado pela Microsoft no desenvolvimento de
alguns de seus produtos, como Windows Server, SQL Server e Exchange Server, reduzindo o número de
vulnerabilidades encontradas nesses produtos em versões desenvolvidas sem o uso do SDL.

Uma das características desse processo é que ele provê dois roteiros, sendo um
com foco no suporte a desenvolvimento de novos sistemas com base em um
processo iterativo, e outro que enfoca a manutenção de sistemas já existentes.

Comentários:

Por fim, cabe salientar que o Secure Development Lifecycle (SDL) apreseta dois
documentos principais! O primeiro é simplesmente uma versão mais resumida do
segundo, que traz conceitos mais aprofundados. Não há qualquer diferença entre
eles, a não ser pela profundidade de seus conteúdos. Ferramentas e técnicas são
aplicáveis a qualquer um dos dois!

Conforme vimos em aula, não existe essa diferença de foco – ambos falam as
mesmas coisas, porém com profundidades distintas.

Gabarito: E

(CESPE - – PCF – Analista de Sistemas) O CLASP (Comprehensive,


Lightweight Application Security Process) fornece uma taxonomia de
vulnerabilidades que podem ocorrer no código-fonte e que podem ser
verificadas com o uso de ferramentas automatizadas para análise estática de
código.

Comentários:
16712855225

Os problemas de segurança podem ser categorizados de acordo com diferentes


critérios, o principal é relacionado a origem do problema. Os tipos de problemas (que
podem ser verificados por meio de ferramentas automáticas de análise estática) são:
erros de intervalo e de tipos de dados; erros de lógica; problemas de ambiente; erros
de sincronização e timing; erros de protocolo; malware.

Conforme vimos em aula, ele possui uma taxonomia de vulnerabilidades que podem
ocorrer em um código fonte – são seis tipos de problemas identificados.

Gabarito: C

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 52 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(FCC - – TJ/PE – Analista de Sistemas) Em relação a princípios de segurança


de aplicações, conforme definição da OWASP, é INCORRETO afirmar:

a) São coleções desejáveis de propriedades de aplicações, comportamentos,


arquiteturas e práticas de implementação.

b) Para que sejam úteis, os princípios devem ser avaliados, interpretados e


aplicados para resolver um problema específico.

c) Visam a garantir a segurança de aplicações e programas, utilizando técnicas


para proteção do sigilo do código fonte.

d) É um conjunto de tarefas que tenta reduzir a possibilidade de ocorrência de


ataques e o impacto destes ataques, caso ocorram.

e) Utilizam primitivas de arquitetura neutra e de linguagem independente, que


podem ser utilizadas na maioria dos métodos de desenvolvimento de software.

Comentários:

O OWASP (Open Web Application Security Project) apresenta Princípios de Segurança


de Aplicativos, que podem ser considerados como coleções de propriedades desejáveis
de aplicação, comportamentos, modelos e práticas de implementação que tentam
reduzir a probabilidade de concretização de ameaças e, caso ocorram, a minimização
de impacto. Entendido?

(a) Conforme vimos em aula, o item está perfeito!

Ao considerar cada um desses princípios, podemos derivar os requisitos de


16712855225

segurança, fazer arquitetura e implementação de decisões, e identificar possíveis


deficiências nos sistemas. O mais importante a se lembrar é que, para ser útil, os
princípios devem ser avaliados, interpretados e aplicados para resolver um problema
específico.

(b) Conforme vimos em aula, o item está perfeito!

(c) Proteção do sigilo? Do código-fonte? Não faz o menor sentido!

O OWASP (Open Web Application Security Project) apresenta Princípios de Segurança


de Aplicativos, que podem ser considerados como coleções de propriedades desejáveis

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 53 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

de aplicação, comportamentos, modelos e práticas de implementação que tentam


reduzir a probabilidade de concretização de ameaças e, caso ocorram, a minimização
de impacto. Entendido?

(d) Conforme vimos em aula, o item está perfeito!

Os princípios são primitivas arquitetonicamente neutras e independentes de


linguagem que podem ser aproveitadas dentro da maioria das metodologias de
desenvolvimento de software para projetar e construir aplicações. Eles são
importantes porque nos ajudam a tomar decisões de segurança em situações novas
com as mesmas ideias básicas.

(e) Conforme vimos em aula, o item está perfeito!

Gabarito: C

ACERTEI ERREI

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 54 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

COMPILADORES

Vamos ser bem objetivos? Compiladores são programas de computador! Isso


mesmo, você pode baixar um compilador aí para a sua máquina. Só isso? Não, ele
é um programa de computador capaz de traduzir um código-fonte escrito em uma
linguagem de programação de alto nível para uma linguagem de programação de
baixo nível (linguagem de montagem). Vamos ver algumas definições abaixo:

CÓDIGO-FONTE (SOURCE CODE)

O código-fonte é um conjunto de palavras ou símbolos escritos de forma ordenada,


contendo instruções em uma das linguagens de programação existentes, de
maneira lógica. Atualmente, com a diversificação de linguagens, o código pode ser
escrito de forma totalmente modular, podendo um mesmo conjunto de códigos ser
compartilhado por diversos programas e, até mesmo, linguagens.

Ex: helloWorld.c – código fonte escrito na Linguagem de Programação C;

PRÉ-PROCESSADOR (PREPROCESSOR)

O pré-processador é um programa que recebe um texto e efetua conversões


léxicas, tais como substituição de macros, inclusão condicional, inclusão de ficheiros
e exclusão de comentários. É baseado em Diretivas de Compilação (Ex: #define,
#include, etc), que são comandos que não são compilados, dirigidos ao pré-
processador e executado pelo compilador antes do processo de compilação em si.

Normalmente ele é responsável por mudanças no código fonte destinadas de


16712855225

acordo com decisões tomadas em tempo de compilação. Por exemplo, um


programa em C permite instruções condicionais para o pré-processador que podem
incluir ou não parte do código caso uma assertiva lógica seja verdadeira ou falsa,
ou simplesmente um termo esteja definido ou não.

O uso de pré-processadores tem vindo a ser cada vez menos comum à medida que
as linguagens recentes fornecem características mais abstratas em vez de
características orientadas lexicalmente. Há também linguagens recentes que tem
pouca ou nenhuma funcionalidade, como por exemplo a linguagem Java, que não
possui um pré-processador.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 55 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

COMPILADOR (COMPILER)

O compilador é um programa de computador que lê um código-fonte escrito em


uma linguagem de alto nível e o traduz para uma linguagem de baixo nível.
processo de compilação é dividido em duas fases: Análise ou Front-End (Análise
Léxica, Sintática, Semântica Geração de Código Intermediário) e Síntese ou Back-
end timização de Código Intermediário e Geração de Código Final).

 Análise Léxica: nesta fase, um analisador léxico (ou scanner) lê o código-fonte,


caractere por caractere e divide o código escrito em símbolos léxicos chamados
tokens, guardados em uma tabela de símbolos. Ele descarta comentários,
espaços em branco, marcas de formatação e produz uma sequência de palavras-
chaves, pontuações e nomes. Terminada essa fase, vamos para a próxima!

Ex: Eu vou passar nesse concurso! Os tokens obtidos foram: “Eu”; “vou”; “passar”;
“nesse”; “concurso”; “!”.

 Análise Sintática: também conhecida como Análise Gramatical ou Parsing, analisa


uma sequência de entrada para determinar sua estrutura gramatical, segundo
uma determinada gramática formal. Ela pega os tokens resultantes do processo
de análise léxica e joga em uma estrutura hierárquica, como uma árvore. Assim
como no português, verifica-se a estrutura do texto2.

Ex: string nome = “Diego’; ora, se eu declarar um valor com aspas-duplas, preciso
fechá-lo com aspas duplas e, não, simples.

 Análise Semântica: nesta fase, verificam-se erros semânticos, i.e., erros de


sentido. Entre as principais atividades, estão a checagem de tipos, verificação de
fluxos de controle e verificação de unicidade de declaração de variáveis. Essa
16712855225

fase também é encarregada de analisar a utilização dos identificadores e de ligar


cada uma delas a sua declaração.

Ex: int x = “Diego”; ora, eu não posso declarar uma variável do tipo inteiro e
atribuir um valor textual.

 Geração de Código Intermediário nesta fase, ocorre a transformação da árvore


sintática em uma representação intermediária do código fonte. Esta linguagem
intermediária é mais próxima da linguagem objeto do que o código fonte, mas
2
Uma árvore de análise sintática de uma gramática de atributos é a árvore de análise sintática baseada em sua
gramática BNF associada, com um conjunto possivelmente vazio de valores de atributos anexado a cada nó.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 56 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

ainda permite uma manipulação mais fácil do que se o código Assembly ou


código de máquina fosse utilizado.

 Otimização de Código Intermediário nesta fase, examina-se o código


intermediário produzido durante a fase anterior com objetivo de produzir,
através de algumas técnicas, um código que execute com bastante eficiência o
programa. Utilizam-se técnicas que detectam padrões dentro do código
produzido e os substitui por códigos mais eficientes. Simples assim.

 Geração de Código Final chegamos à última fase do processo de compilação


com a geração do código de montagem (em sentido estrito) ou em um código-
objeto (em sentido amplo), porque – na prática - muitos compiladores já
realizam a montagem. Um código-objeto não é imediatamente executável, visto
que ainda há código binário a ser incluído no programa, tais como bibliotecas3.

MONTADOR (ASSEMBLER)

Existe uma maneira de efetuar tradução de forma mais rápida e simples, por meio
de um Montador. O processo de Montagem traduz um programa escrito em
linguagem de montagem (Ex: Assembly) em um programa equivalente em
linguagem de máquina (0 e 1). Galera, não confundam Assembler, que é um
montador, com Assembly, que é uma linguagem de programação de baixo nível.

 Cross-assembler: é executado em um computador com um processador


diferente daquele para o qual se está gerando código.

 Macro-assembler: dispõe de recursos de macro, efetuando a expansão do


código cada vez que uma macro for encontrada.
16712855225

 Micro-assembler: permite a escrita de micro-instruções, definindo-se assim um


conjunto de instruções de um processador microprogramável.

 Meta-assembler: é um assembler que pode montar programas para vários


processadores diferentes.

 Assembler de um passo: varre o programa-fonte apenas uma vez, gerando o


código (deve existir alguma forma de se revolver as referências adiante).

3
Essa é a única fase da síntese que é obrigatória; as duas anteriores são opcionais. Além disso, lembrem-se que
o código-objeto é muito parecido com um código de montagem, porém com referências utilizadas pelo Ligador.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 57 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

 Assembler de dois passo varre o programa-fonte duas vezes para gerar o


código, podendo assim resolver automaticamente as referências adiante.

A Linguagem de Montagem é traduzida para uma Linguagem de Máquina. Ambas


são dependentes do hardware! Como assim, professor? Assembly é uma linguagem
de programação, todavia cada família de processadores possui sua própria
linguagem de montagem particular (Ex: INTEL, x86, MIPS, ARM, SPARC). Por essa
razão, não se trata de uma linguagem portável.

16712855225

A Montagem é um tipo de tradução, assim como a compilação ou a interpretação.


Logo, ela pode existir por si só sem que haja compilação alguma. Eu vos-pergunto:
um compilador traduz um código-fonte em um código-objeto? Depende! Regra
geral, ele traduz um código-fonte em um código de montagem, que depois vai à
um montador para se transformar em código-objeto.

Em outras palavras, alguns compiladores produzem um código de montagem, que


é passado a um montador para processamento posterior. No entanto, alguns
compiladores realizam a tarefa do montador, produzindo um código de máquina

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 58 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

relocável, que pode ser passado diretamente para um ligador e/ou carregador, i.e.,
já entregam um código-objeto!

LIGADOR (LINKER OU LINK-EDITOR)

Ligadores são programas que recebem como entrada um conjunto de arquivos-


objeto, bibliotecas padrão, arquivos de controle, parâmetros diversos e bibliotecas
compartilhadas e os unem em um módulo, denominado Módulo de Carga, que é
posteriormente carregado em memória (eventualmente, pode ser mais de um
módulo). Ele é responsável por resolver referências internas e externas.

CARREGADOR (LOADER)

São programas que transferem o código de máquina de um módulo objeto para a


memória e encaminham o início de sua execução. Eles recebem o módulo de carga
como entrada, transferem seu código para a memória e realizam apenas os ajustes
de realocação de acordo com o endereço base de memória. Um programa pode
ser composto por partes independentemente carregadas e realocadas.

Existem dois tipos básicos de carregador: carregadores binários e realocáveis. Os


carregadores binários (ou carregadores absolutos) são mais simples e apenas
copiam o arquivo em formato binário para a memória, de tal forma que o arquivo
executável é simplesmente uma imagem binária do programa em execução na
memória.

Um programa que usa carregadores absolutos é associado com localizações


específicas de memória, e por isso deve sempre ser carregado na mesma área de
memória para serem executados corretamente (Ex: programas com extensão
.COM). O carregador realocável pode ser colocado em qualquer local da memória
16712855225

para execução.

O programa executável realocável é semelhante ao programa executável absoluto,


exceto que os endereços são todos relativos a zero (não são absolutos) e a
informação de quais endereços relativos devem ser alterados quando o programa
for colocado em execução estão junto com o arquivo executável (Ex: programas
com extensão .EXE)4.

BIBLIOTECAS

4
Atualmente também existem Carregadores que fazem a ligação de partes do programa em tempo de execução.
Estes são chamados Carregadores-Ligadores.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 59 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Bibliotecas são uma coleção de funções e definições utilizadas no desenvolvimento


de software para algum propósito específico. Elas provêm serviços a programas
independentes, o que permite o compartilhamento e a alteração de código e dados
de forma modular. O Ligador é o responsável, em geral, por fazer referências entre
os executáveis e as bibliotecas.

É muito comum, ao precisar resolver determinado problema, utilizar-se de uma


biblioteca escrita por outro programador. Isso pode ser vantajoso, pois reduz a
necessidade de criar códigos, mas também pode ser perigoso, visto que pode-se
optar por uma biblioteca mal implementada (ou até mesmo maliciosa) e acabar
tendo grandes dores de cabeça.

Existem basicamente dois tipos de bibliotecas, as bibliotecas estáticas e as


bibliotecas dinâmicas (ou compartilhadas). Ao compilar um programa que chama
uma biblioteca estática, todo o código da biblioteca é copiado e inserido dentro do
binário final. O termo "estática" se deve ao fato da linguagem se tornar uma parte
estática do binário, não podendo ser compartilhada por outros programas.

Dessa forma, mesmo quando a biblioteca presente no seu sistema mude, seja
removida ou corrompida, o programa continuará funcionando. Porém além do seu
binário final ocupar mais espaço em disco e memória (já que ele inclui a biblioteca
estática), o seu programa não poderá usufruir de qualquer otimização que venha a
ocorrer nesta biblioteca, a não ser que ele seja recompilado/reinstalado.

Ao contrário das bibliotecas estáticas, as bibliotecas dinâmicas ou compartilhadas


não são inseridas em sua totalidade, elas são apenas referenciadas no binário final.
O termo “compartilhada” expressa exatamente a característica de um ou mais
programas poderem utilizar a mesma biblioteca, ocupando assim menos espaço em
16712855225

disco e na memória.

Além disso, a característica dinâmica da biblioteca compartilhada confere ao seu


programa a possibilidade de usufruir de atualizações nas bibliotecas sem a
necessidade de uma nova compilação/instalação. Entretanto pode acontecer de o
programa não executar corretamente, seja por não encontrar a biblioteca ou (após
uma atualização) pela biblioteca não ser mais compatível com seu programa.

O último ponto negativo da biblioteca compartilhada é que, devido a seu tempo de


carregamento, é adicionada uma pequena latência nas chamadas a esta biblioteca,
consequentemente seu programa será ligeiramente mais lento que o mesmo

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 60 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

utilizando bibliotecas estáticas. No Windows, temos as .DLL (Dynamic-Link Libraries)


e no Unix, temos as .LIB.

PROCESSO GENÉRICO DE COMPILAÇÃO

Um programador escreve módulos de código-fonte em uma linguagem de


programação de alto nível (ex: C). Esse código-fonte passa por um pré-processador
que manipula diretivas, macros, comentários, etc. Começa, então, de fato o
processo de compilação por meio de uma análise léxica (tokenização e tabela de
16712855225

símbolos), seguida de uma análise sintática (parsing e estrutura de árvore).

Avança-se à análise semântica (checagem de tipos e verificação de variáveis), depois


à geração do código intermediário, sua otimização e, por fim, a geração do código
final, que em geral é um programa em linguagem de montagem (Assembly). Porém,
agora, nós temos diversos módulos em linguagem de programação de baixo nível,
que os computadores ainda não conseguem entender.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 61 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Precisamos, então, do Montador5! Ele traduzirá cada modulo da linguagem de


montagem para um código-objeto em linguagem de máquina (0 e 1), que ainda
não pode ser executado6. O Ligador combinará todos esses módulos-objeto em um
módulo de carga, com diversas rotinas de bibliotecas para resolver as referências
internas e externas.

Por fim, o carregador coloca o código de máquina nos locais apropriados da


memória para ser executado pelo processador. Para agilizar o processo de
tradução, algumas etapas são puladas ou combinadas. Alguns compiladores
produzem módulos-objeto diretamente, e alguns sistemas utilizam Carregadores-
Ligadores, que realizam as duas últimas etapas.

16712855225

5
Como já foi dito anteriormente, alguns compiladores fazem também o papel de montador e já entregam um
código-objeto.
6
O arquivo-objeto é uma combinação de instruções de linguagem de máquina, dados e informações necessárias
para colocar as instruções corretamente na memória.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 62 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

INTERPRETADORES

Interpretadores também são programas de computador capazes de traduzir um


código-fonte escrito em uma linguagem de programação de alto nível para um
código executável. Em geral, pode ser implementado de duas formas: leitura,
tradução e execução do código-objeto linha a linha ou tradução do código-fonte
integralmente e posterior execução.

Comparando com o processo de compilação, os interpretadores realizam somente


a fase de análise, mas não de síntese. Eles realizam a tradução de forma mais veloz
que os compiladores; no entanto, programas compilados são executados mais
rapidamente que programas interpretados. Correções e alterações são mais rápidas
de serem realizadas.

Além disso, o código não precisa ser compilado para serem executados e
consomem menos memória do que um compilador. Por outro lado, é necessário
ler o código-fonte original toda vez que se quiser executar o programa. Exemplos
comuns de linguagens de programação interpretadas são Basic, Prolog e Python,
além do Java, que é uma linguagem híbrida: compilada e interpretada.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 63 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE - – DATAPREV - Analista de Sistemas) Uma diferença fundamental


entre um compilador e um montador é que o compilador gera um arquivo
executável a partir de um arquivo texto com o programa, enquanto o montador
executa diretamente a descrição assembler, sem gerar arquivo na saída.

Comentários:

Voltemos à teoria:

16712855225

Vejam a figura: um compilador não gera um executável por si só; ademais, um


montador gera um arquivo de saída, sim – o código-objeto!

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 64 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE - – DATAPREV - Analista de Sistemas) O compilador é parte


integrante do kernel de sistemas operacionais.

Comentários:

Não, isso não faz sentido! Compiladores são softwares comuns.

Gabarito: E

(CESPE - – ANATEL - Analista de Sistemas) A compilação é o processo de


análise de um programa escrito em linguagem de alto nível, dominando
programa-fonte, e sua conversão em um programa equivalente, escrito em
linguagem binária de máquina, denominado programa-objeto.

Comentários:

Voltemos à teoria:

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 65 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Observem que um compilador sempre parte de um código-fonte e pode gerar um


código assembly ou gerar um código-objeto binário diretamente.

Gabarito: C

(CESPE - 2011 – ECT - Analista de Sistemas) Instruções em linguagem de máquina


são apresentadas na forma de padrões de bits utilizados para representar as
operações internas ao computador. A linguagem de montagem constitui uma
versão da linguagem de máquina; cada instrução é representada por uma cadeia
de texto que descreve o que a instrução faz. Nesse processo, o montador é o
elemento que converte instruções em linguagem de montagem para linguagem
de máquina.

Comentários:

Perfeito, é exatamente isso! Transforma linguagem de montagem em linguagem de


máquina.

Gabarito: C

(CESPE - 7 – TCU - Analista de Sistemas) Uma das principais tarefas do


ligador, programa responsável por unir módulos-objeto em um único módulo,
denominado módulo de carga, é resolver referências internas e externas.

Comentários:

Essa questão foi anulada! O item sugere que o arquivo de saída do Ligador seja um
módulo pronto a ser executado, e, em algumas situações, isso não ocorre.
16712855225

Gabarito: X

(CESPE - 2007 – TCU - Analista de Sistemas) Um interpretador pode ser


considerado como um programa que lê um conjunto de instruções e as executa
passo a passo. Programas interpretados são, em geral, menores e mais
facilmente mantidos, embora sejam mais lentos que os programas compilados.

Comentários:

Perfeito, é exatamente isso!

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 66 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Gabarito: C

(CESPE - 2007 – TCU - Analista de Sistemas) A análise semântica — responsável


por verificar se a estrutura gramatical do programa está correta, ou seja, se essa
estrutura foi formada de acordo com as regras gramaticais da linguagem — é
uma das tarefas realizadas pelo compilador.

Comentários:

Não, quem verifica estrutura gramatical é a Análise Sintática!

Gabarito: E

(CESPE - 2007 – TSE - Analista de Sistemas – A) Um programa pode ser


composto por partes independentemente carregadas e realocadas. Um ligador
pode ser usado para resolver as referências aos símbolos externos às partes e
para produzir um código executável.

Comentários:

Perfeito, é exatamente isso!

Gabarito: C

(CESPE - 2007 – TSE - Analista de Sistemas – B) Um carregador transfere para a


memória códigos a serem executados. Se for transferido um código objeto, tem
que ser armazenado nos endereços definidos quando foi gerado, pois um
código objeto não pode ser realocado.
16712855225

Comentários:

Não! Um código-objeto pode ser realocado por meio da utilização de carregadores


realocáveis, i.e., pode alocar o programa em partes não-fixas da memória.

Gabarito: E

10. (CESPE - 2007 – TSE - Analista de Sistemas – C Para gerar um código objeto,
um compilador precisa fazer a análise sintática e semântica de um programa.
Para isso ser possível, a semântica da linguagem, mas não a sintaxe, é descrita
na notação Backus-Naur Form (BNF).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 67 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Comentários:

Não, a Notação BNF é utilizada para descrever a Sintaxe!

Gabarito: E

11. (CESPE - 2007 – TSE - Analista de Sistemas – D Os interpretadores não analisam


sintaticamente os códigos fonte uma vez que os traduzem para um formato
interno. Por isso, um interpretador traduz um código em menos tempo que um
compilador.

Comentários:

Os interpretadores realizam tradução mais rápida que compiladores; no entanto,


programas compilados são executados mais rapidamente que programas
interpretados. O item está incorreto porque interpretadores analisam sintaticamente
os códigos fontes (eles realizam toda a fase de análise, mas não de síntese).

Gabarito: E

12. (CESPE - – FUB - Analista de Sistemas) O compilador pode ser visto como
um tradutor, uma vez que o mesmo transforma um programa de linguagem de
alto nível para linguagem de baixo nível.

Comentários:

Perfeito, é exatamente isso!


16712855225

Gabarito: C

13. (CESPE - – TRT/5 - Analista de Sistemas) As definições de variáveis no


código de um programa não interferem na geração de um código-objeto
porque as variáveis não possuem relação direta com a entrada e a saída de
dados em um programa.

Comentários:

Como não? Claro que interferem! Entradas e Saídas de dados geralmente são
armazenadas em uma variável.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 68 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Gabarito: E

14. (CESPE - 2008 – ANAC - Analista de Sistemas) O compilador, em contraste com


o montador, opera sobre uma linguagem de alto nível, enquanto o montador
opera sobre uma linguagem de montagem.

Comentários:

Perfeito, é exatamente isso! Compilador opera sobre uma linguagem de alto nível
(entre outras) para traduzir para uma linguagem de máquina, já o Montador opera
sobre uma linguagem de montagem (Assembly) para traduzir também para uma
linguagem de máquina.

Gabarito: C

15. (CESPE - – ANAC - Analista de Sistemas) A criação da tabela de símbolos


constitui tarefa realizada pelo ligador.

Comentários:

Não, a tabela de símbolos é criada por compiladores durante a Análise Léxica.

Gabarito: E

16. (CESPE - – FINEP - Analista de Sistemas – A Um código escrito em


linguagem de máquina (Assembly) deve ser compilado e ligado antes de ser
executado.
16712855225

Comentários:

Assembly é uma linguagem de montagem e, não, de máquina. Além disso, ela não
é compilada, mas montada.

Gabarito: E

17. (CESPE - – FINEP - Analista de Sistemas – B) A análise semântica é uma


tarefa normalmente realizada pelo link-editor.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 69 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Não! Link-Editor realiza a ligação; compiladores/interpretadores realizam a análise


semântica.

Gabarito: E

18. (CESPE - – FINEP - Analista de Sistemas – C) A otimização de código, feita


durante a fase de análise, é uma das tarefas do compilador.

Comentários:

Não! De fato, a otimização de código é uma das tarefas do compilador. No entanto,


ela é realizada na fase de síntese e, não, de análise.

Gabarito: E

19. (CESPE - – FINEP - Analista de Sistemas – D) Um interpretador é classificado


como um tradutor, uma vez que analisa e executa o código. O compilador, por
realizar análise e síntese do código, não é considerado um tradutor.

Comentários:

Não, ambos são tradutores.

Gabarito: E

(CESPE - – FINEP - Analista de Sistemas – E) A construção da tabela de


símbolos é atividade que pode ser iniciada durante a análise léxica.
16712855225

Comentários:

Perfeito, é exatamente isso!

Gabarito: C

21. (CESPE - 2010 – INMETRO - Analista de Sistemas – B) Todo compilador de


linguagem de programação de alto nível tem a responsabilidade de analisar o
código fonte até a geração de código executável.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 70 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

A geração do código executável é feita na síntese, portanto ele tem a


responsabilidade de analisar o código-fonte até antes da geração do código
intermediário.

Gabarito: E

(CESPE - 2010 – METRO - Analista de Sistemas – C Carregadores são


programas usados exclusivamente por linguagens de programação de alto nível,
com o objetivo de transferir um módulo de carga para a memória.

Comentários:

Não, eles não são usados exclusivamente por linguagens de programação de alto
nível.

Gabarito: E

(CESPE - 2010 – INMETRO - Analista de Sistemas – D) A declaração de variável


“int 7g;” em um programa escrito na linguagem Java, leva a um erro de
compilação detectado durante a análise sintática.

Comentários:

Não, o erro é detectado na Análise Léxica. Lembrm-se que na Análise Léxica que se
lê o código-fonte, caractere por caractere, e divide o código escrito em símbolos
léxicos chamados tokens, guardados em uma tabela de símbolos. Quando começar
a compilação e for realizada a análise léxica vai separar “int” e “7g”, mas não existe
“7g”. No entanto, esse token não pode existir, uma variável não pode começar com
16712855225

número em Java, logo o compilador indicará um erro.

Gabarito: E

24. (CESPE - 2010 – INMETRO - Analista de Sistemas – E Em programas que usam


funções disponíveis em bibliotecas, as referências a estas funções serão
resolvidas pelo ligador. No caso de bibliotecas estáticas, o código objeto das
funções é integrado ao módulo executável durante o processo de ligação.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 71 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Perfeito! Executáveis e Bibliotecas fazem referências mútuas conhecidas como


ligações, tarefa tipicamente realizada por um ligador. Lembrando que Bibliotecas
Dinâmicas são aquelas que podem ser compartilhadas com vários programas e
Bibliotecas Estáticas são aquelas que podem ser ligadas somente a um programa
individualmente.

Gabarito: C

(CESPE - 2010 – INMETRO - Analista de Sistemas) A análise léxica/sintática de


uma linguagem que tem palavras reservadas tende a ser mais complexa que a
de linguagens que têm apenas palavras-chave usadas também como
identificadores.

Comentários:

Não, isso não interfere na complexidade da análise léxica/sintática.

Gabarito: E

(CESPE - 2010 – TRE/MT - Analista de Sistemas) Durante a compilação de um


código-fonte, a fase do compilador que é responsável por produzir uma
sequência de tokens é a:

a) análise léxica.
b) análise semântica.
c) análise sintática.
d) geração de código executável.
e) verificação de tipos.
16712855225

Comentários:

A tokenização ocorre na Análise Léxica!

Gabarito: A

27. (CESPE - 2010 – TRE/MT - Analista de Sistemas – A Compiladores são projetados


para um tipo específico de hardware e de sistema operacional.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 72 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Não, compiladores não dependem em nada do hardware.

Gabarito: E

(CESPE - 2010 – TRE/MT - Analista de Sistemas – B A interpretação nada mais é


do que uma compilação cruzada.

Comentários:

A compilação cruzada é aquela capaz de produzir código executável em uma


plataforma diferente da qual o compilador está sendo executado. Interpretadores
não podem ser definidos como uma compilação cruzada.

Gabarito: E

(CESPE - 1 – FUB - Analista de Sistemas) Na programação empregando uma


linguagem de alto nível, a utilização de um compilador implica o uso de um
ligador e de um carregador para a correta execução do programa; por outro
lado, a utilização de um interpretador, que simula a existência de um
processador cujas instruções são aquelas da linguagem de alto nível empregada,
torna desnecessárias as etapas de ligação e carga.

Comentários:

Perfeito, é exatamente isso!

Gabarito: C
16712855225

(CESPE - 2011 – TJ/ES - Analista de Sistemas) Em programa escrito em linguagem


de alto nível e traduzido por compilador, alguns comandos que fazem parte
desse código são instruções da linguagem de programação, enquanto outros
comandos são instruções típicas do compilador denominadas diretivas.

Comentários:

Perfeito. Lembram-se das diretivas de compilação? Elas não são compiladas, são
pré-processadas antes do processo de compilação em si.

Gabarito: C

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 73 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

31. (CESPE - 2011 – TJ/ES - Analista de Sistemas) Durante a execução de um


programa que utiliza funções em uma biblioteca dinâmica, esta deve ser
carregada em memória e ligada ao processo em tempo de execução.

Comentários:

Perfeito, bibliotecas dinâmicas são ligadas em tempo de execução.

Gabarito: C

(CESPE - 2011 – TRE/ES - Analista de Sistemas) O link-editor tem a função de


vincular os dados de um programa aos programas de sistema e a outros
programas de usuário.

Comentários:

Perfeito, é exatamente isso!

Gabari : C

(CESPE - 2010 – TRF/4 - Analista de Sistemas - A Interpretadores são programas


que convertem códigos escritos em linguagem de alto nível para programas em
linguagem de máquina.

Comentários:

Na verdade, esse é o compilador! Interpretadores convertem em código executável.


16712855225

Gabarito: E

34. (CESPE - 2010 – TRF/4 - Analista de Sistemas - B Linguagens de alto nível


cumprem tarefas mais substanciais com um número menor de comandos, mas
exigem programas tradutores denominados compiladores para converter
programas em linguagem de alto nível para linguagem de máquina.

Comentários:

Perfeito! Linguagens de alto nível, em geral, necessita de menos comandos para


realizar uma mesma tarefa que uma linguagem de baixo nível. Além disso, para

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 74 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

converter programas em linguagens de alto nível para linguagem de máquina, é


necessário um compilador.

Gabarito: C

(CESPE - 2010 – TRF/4 - Analista de Sistemas - C Um computador pode entender


qualquer linguagem de máquina, pois a linguagem de máquina não é definida
pelo projeto de hardware do computador.

Comentários:

Não! A Linguagem de Montagem é traduzida para uma Linguagem de Máquina (0


e 1) específica de cada processador. Apesar de ser um código binário, há diversas
maneiras de interpretá-lo de acordo com o processador (hardware) para o qual ele
foi escrito.

Gabarito: E

(CESPE - 2010 – TRF/4 - Analista de Sistemas - D Programadores podem


escrever instruções em várias linguagens de programação e todas são
entendidas diretamente pelos computadores sem a necessidade de tradução.

Comentários:

Claro que não! Elas precisam ser traduzidas, porque computadores só entendem 0
e 1 (0V e 5V).

Gabarito: E
16712855225

37. (CESPE - 2010 – TRF/4 - Analista de Sistemas - E Softwares escritos em


linguagens de máquina são portáveis.

Comentários:

Não, eles dependem da arquitetura do processador.

Gabarito: E

(CESPE - 2010 – BASA - Analista de Sistemas) Um interpretador é um programa


que lê um código escrito em uma linguagem e o converte em um código

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 75 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

equivalente em outra linguagem. No processo de conversão, o interpretador


relata a presença de erros no código original.

Comentários:

Não, quem relata problemas é o Compilador!

Gabarito: E

(CESPE - 2010 – INMETRO - Analista de Sistemas) Um interpretador traduz um


programa descrito no nível da linguagem para o nível da máquina, enquanto o
compilador eleva a máquina ao nível da linguagem, para que o programa
execute a partir da fonte.

Comentários:

Não! Compiladores traduzem do nível da linguagem para o nível da máquina, para


que o programa execute a partir da fonte.

Gabarito: E

40. (CESPE - 2011 – ECT - Analista de Sistemas) No programa em linguagem de alto


nível, os interpretadores executam os passos definidos para cada instrução e
produzem o mesmo resultado que o do programa compilado. Entretanto, a
execução de um programa em linguagem de alto nível com o uso de
interpretadores é mais lenta que a execução de um programa compilado, uma
vez que precisa examinar cada instrução no programa-fonte, à medida que ela
ocorre, e desviar para a rotina que executa a instrução.
16712855225

Comentários:

Perfeito, essa é uma questão para decorar! Muito bem escrita e boa para sedimentar
alguns conceitos!

Gabarito: C

41. (CESPE - – TCE/AC - Analista de Sistemas - A) Os programas escritos em


linguagem de programação de alto nível precisam ser convertidos em
programas de máquina, sendo o linker um tipo de software básico que efetua
essa tradução.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 76 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Comentários:

Não! O Linker (Ligador) não efetua tradução alguma! Quem faz isso é o Compilador!

Gabarito: E

42. (CESPE - 2007 – TCU - Analista de Sistemas) Um montador é considerado um


software de sistema, responsável pela tradução de uma linguagem de alto nível
para uma linguagem de baixo nível (linguagem simbólica).

Comentários:

Não, Montadores não são softwares de sistema e não realizam a tradução de


linguagens de alto nível para uma linguagem de baixo nível. Na verdade, ele traduz
linguagens de baixo nível para linguagem de máquina.

Gabarito: E

43. (CESPE - 2008 – FUB - Analista de Sistemas) O montador realiza a tarefa de


combinar módulos objetos em um módulo de carga.

Comentários:

Não, é o Ligador que é responsável por receber como entrada os diversos módulos
e conectá-los, gerando como saída um único módulo de carga.

Gabarito: E
16712855225

44. (CESPE - – FUB - Analista de Sistemas – C Para que um programa possa


ser executado, seu código de máquina deve estar presente na memória. O
ligador é o programa do sistema responsável por transferir o código de máquina
de um módulo objeto para a memória e encaminhar o início de sua execução.

Comentário

Não! O Ligador é o responsável por interligar os diversos módulos de um programa


para gerar o programa que será posteriormente carregado para a memória. O
carregador é responsável por transferir o código de máquina de um módulo objeto
para a memória e encaminhar o início de sua execução.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 77 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Gabarito: E

45. (CESPE - – DETRAN - Analista de Sistemas - D) O termo linguagem de


máquina é usado para denominar linguagens do tipo assembler ou C++.

Comentários:

Não, Linguagem de Máquina é código binário (0 e 1). Assembler não é linguagem,


é um programa chamado Montador. Assembly é uma linguagem de montagem e
C++ é uma linguagem de alto nível orientada a objetos.

Gabarito: E

ACERTEI ERREI

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 78 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(FGV – 2014 – SUSAM – Analista de Sistemas) Programa destinado a


transformar um código escrito em linguagem de alto nível em uma linguagem
Assembly é o:

a) debugger.
b) compilador.
c) montador.
d) fortran.
e) otimizador.

Comentários:

16712855225

Conforme vimos em aula, trata-se do compilador.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 79 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

barito: B

(FGV – 2015 – TCE/SE – Analista de Sistemas) O módulo de análise léxica de um


compilador tem por objetivo:

a) verificar se o programa fonte obedece às regras da gramática da linguagem;


b) agrupar os caracteres do programa fonte em unidades denominadas tokens;
c) gerar o código objeto correspondente à tradução do programa fonte para
alguma forma intermediária de representação;
d) construir as árvores sintáticas dos diversos comandos do programa fonte;
e) eliminar comandos supérfluos do programa fonte.

Comentários:

 Análise Léxica: nesta fase, um analisador léxico (ou scanner) lê o código-fonte,


caractere por caractere e divide o código escrito em símbolos léxicos chamados
tokens, guardados em uma tabela de símbolos. Ele descarta comentários, espaços
em branco, marcas de formatação e produz uma sequência de palavras-chaves,
pontuações e nomes. Terminada essa fase, vamos para a próxima!

Conforme vimos em aula, trata-se do agrupamento de unidades em tokens.

Gabarito: B

(FGV – 2010 – DETRAN/RN – alista de Sistemas) As etapas realizadas durante


a programação em uma linguagem de alto nível, para se gerar um código
executável, são:
16712855225

a) Programa fonte, compilação, interpretação, ligação, código executável.


b) Programa fonte, compilação, código-objeto, ligação, código executável.
c) Programa fonte, interpretação, código-objeto, ligação, código executável.
d) Programa fonte, montagem, compilação, código-objeto, código executável.
e) Programa fonte, montagem, código-objeto, ligação, interpretação.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 80 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

Conforme eu disse em aula, a maioria dos compiladores contém um montador.


Dessa forma, podemos afirmar que ordem é: programa fonte (código-fonte) 
compilação  código-objeto  ligação  código executável.

Gabarito: B

(FGV – 2010 – DETRAN/RN – Analista de Sistemas) São funções realizadas pelo


módulo front-end de um compilador: 16712855225

a) Análise léxica e análise lógica.


b) Análise sintática, análise léxica e análise lógica.
c) Análise sintática e análise lógica.
d) Análise semântica, análise léxica e análise sintática.
e) Análise semântica e análise lógica.

Comentários:

O compilador é um programa de computador que lê um código-fonte escrito em uma


linguagem de alto nível e o traduz para uma linguagem de baixo nível. O processo

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 81 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

de compilação é dividido em duas fases: Análise ou Front-End (Análise Léxica,


Sintática, Semântica e Geração de Código Intermediário) e Síntese ou Back-end
(Otimização de Código Intermediário e Geração de Código Final).
Conforme vimos em aula, o front-end inclui análise semântica, léxica e sintática.
Gabarito: D

ACERTEI ERREI

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 82 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


SISTEMAS MÓVEIS

(CESPE – 2014 – ANATEL – Analista de Sistemas) O desenvolvimento de


aplicações web e o de aplicações nativas são as principais formas de
desenvolvimento móvel.

(CESPE – 2013 – BACEN – Analista de Sistemas) No projeto de aplicações para


dispositivos móveis, devem ser considerados, entre outros aspectos, as
características dos dispositivos de hardware para os quais a aplicação está sendo
desenvolvida e o consumo de energia gerado por cada recurso do sistema,
visando-se a economia de bateria.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 83 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


ANDROID
(CESPE – 2012 – DPF – Analista de Sistemas) O sistema Android 4.0 foi
desenvolvido com base no kernel Linux versão 2.6 e é voltado para dispositivos
móveis controlando os serviços do sistema, como gerenciamento de memória e
de tarefas, diretivas de segurança e drivers.

(CESPE – 2013 – ANTT – Analista de Sistemas) Com o uso do banco de dados


SQLite, incluso no Android, é possível desenvolver um provedor de conteúdo,
bem como um servidor de banco de dados, que necessita gerenciar o acesso
aos dados com persistência. No entanto, não se justifica a utilização de um
provedor de conteúdo para disponibilizarem-se dados para várias atividades ou
aplicativos distintos.

(CESPE – 2015 – TCU – Analista de Sistemas) No desenvolvimento de aplicação


para dispositivos móveis, em vez de se utilizar uma plataforma específica ou um
ambiente cross-platform, pode-se optar por um tipo híbrido, como, por
exemplo, um componente HTML 5 envelopado em containers para acessar
recursos específicos de cada plataforma.

(CESPE – 2013 – ANTT – Analista de Sistemas) Com base no kernel Linux, o


ambiente operacional Android, utilizado para o desenvolvimento de aplicações
móveis e não móveis, inclui um navegador incorporável baseado em WebKit,
com muitas opções de conectividade (wifi, bluetooth, dados wireless através de
conexão celular, como GPRS, EDGE e 3G). Os aplicativos Android são gravados
na linguagem Java e executados em uma máquina virtual JVM.
16712855225

(CESPE – 2013 – TCE/RO – Analista de Sistemas) No Android, os componentes


Intents são criados a partir de ações do usuário e representam a intenção de se
realizar alguma atividade, como iniciar o aplicativo de correio eletrônico ou abrir
uma página, utilizando-se do navegador que acompanha o Android. O código
mostrado a seguir apresenta corretamente um exemplo de utilização desse
componente.

Uri uri = Uri.parse("http://www.cespe.unb.br");


Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 84 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE – 2013 – FUB – Analista de Sistemas) O Android pode ser executado


sobre qualquer sistema operacional, pois os aplicativos Android são escritos na
linguagem de programação Java e executados em uma máquina virtual Java.

(IBFC – 2013 – PC – Analista de Sistemas) É uma plataforma de software que está


revolucionando o mercado global de aplicativos para celulares. É a primeira
plataforma de aplicativos para telefones celulares de código aberto que se fez
notar pelos maiores mercados mundiais de telefonia celular. Estamos falando do:

a) Unix.
b) Linux.
c) Android.
d) Mac OS X.
e) Windows.

(CESPE – 2014 – ANATEL – Analista de Sistemas) A arquitetura do Android


disponibiliza o módulo denominado OOM handling, que permite às aplicações
o gerenciamento do mecanismo de baixo consumo de energia do aparelho; por
exemplo, se um processo necessitar ser executado em segundo plano, o referido
módulo possibilitará a desativação temporária desse mecanismo até a finalização
do processo em execução.

(FCC – 2011 – TRE/PE – Analista de Sistemas) A versão do Android feita, a


princípio, apenas para tablets, que apresenta melhorias nos recursos multitarefa
e nos widgets, é considerada como:

a) Cupcake
b) Frozen Yogurt
c) Gingerbread. 16712855225

d) Honeycomb.
e) Ice Cream.

10. (CESPE – 2013 – SERPRO – Analista de Sistemas) Em uma aplicação desenvolvida


para Android, os serviços que forem executados em background serão
implementados como componentes do tipo service e permanecerão em
execução até que a aplicação que os instanciar seja encerrada.

11. (QUADRIX – 2013 – CREFONO – Analista de Sistemas) Como o software Android,


da empresa Google, pode ser classificado?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 85 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

a) Um aplicativo para celulares.


b) Um aplicativo para celulares e tablets.
c) Um sistema operacional para celulares e tablets.
d) Um hardware para celulares e tablets.
e) Um tipo de celular.

12. (FUMARC – 2014 – AL/MG – Analista de Sistemas) Em relação aos principais


componentes de um aplicativo Android, analise os itens a seguir, marcando com
(V) a assertiva verdadeira e com (F) a assertiva falsa.

( ) Uma “atividade” do Android é tanto uma unidade de interação do usuário


quanto uma unidade de execução.
( ) Um programa Android interativo é iniciado pela criação de subclasses da
classe Activity.
( ) A classe ContentProvider do Android é utilizada em tarefas de segundo plano,
que podem estar ativas, mas não visíveis na tela.
( ) A classe Service do Android possui o quarteto de atividades básicas para
inserção, consulta, atualização e exclusão.

A sequência CORRETA, de cima para baixo, é:

a) V, F, F, V.
b) F, V, F, V.
c) F, V, V, F.
d) V, V, F, F.

13. (CESPE – 2014 – ANATEL – Analista de Sistemas) O sistema operacional Android


tem o Linux como base, o que permite a utilização simultânea de aplicações que
podem ser executadas em segundo plano, de forma transparente para o usuário.
16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 86 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


iOS

(CESPE – 2012 – DPF – Analista de Sistemas) A arquitetura do iOS possui quatro


camadas (layers) que funcionam como interface entre a aplicação e o hardware.
Essas camadas, listadas da mais baixa para a mais alta, são: Core OS, Core
Services, Media e CoCoa Touch.

(CESPE – 2013 – SERPRO – Analista de Sistemas) Como o iOS não implementa


um sistema de garbage collection, o Objective-C mantém um contador de
referência para os objetos de forma a viabilizar a liberação de memória de tal
objeto.

(FUMARC – – AL/MG – Analista de Sistemas) Analise as seguintes afirmativas


sobre fundamentos para desenvolvimento de aplicações móveis para iOS.

I. Xcode é o ambiente nativo da Apple para desenvolvimento de aplicativos para


iOS.
II. Objective-C é a linguagem de desenvolvimento de aplicativos para iOS.
III. A classe NSObject é a classe raiz das principais hierarquias de classes em
Objective-C.

Estão CORRETAS as afirmativas:

a) I, II e III.
b) I e II, apenas.
c) I e III, apenas. 16712855225

d) II e III, apenas.

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) Para que os programas


aplicativos sejam executados no Android e no iOS, é necessário uma máquina
virtual própria, cujas responsabilidades são, entre outras, gerenciar a
comunicação entre o aplicativo e as bibliotecas nativas, prover segurança e
permitir que os aplicativos possam gravar dados privados, incluindo bancos de
dados. No Android 4.3, a máquina virtual é a Dalvik; no iOS 7, é a XCode.

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) No iOS 7, os frameworks são


diretórios que contêm biblioteca compartilhada dinâmica com recursos como

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 87 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

arquivos de cabeçalho, imagens e aplicativos auxiliares a serem utilizados no


desenvolvimento dos aplicativos.

(CESPE – 2014 – SUFRAMA – Analista de Sistemas) O iOS 7 possui as camadas


Cocoa Touch, Media, Core Services e Core OS; esta última, que é a camada mais
baixa, suporta aplicativos desenvolvidos em 64 bits no modelo LP64.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 88 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


SEGURANÇA NO DESENVOLVIMENTO

(CESPE - 2014 – TC/DF – Analista de Sistemas) SQL Injection é uma técnica usada
para executar um código no espaço de outro programa, o que, normalmente,
força o programa a carregar a DLL (Dynamic-Link Library), que assume o espaço
de memória do programa em execução.

(CESPE - 2013 – CNJ – Analista de Sistemas) O SDL é um processo de


desenvolvimento de software seguro, que envolve a adição de produtos e
atividades, como o desenvolvimento de modelos de ameaças.

(FCC - 2 – TJ/PE – Analista de Sistemas) São práticas eficientes para revisão


de código, EXCETO:

a) Revisar código por, no máximo, 90 minutos por vez.


b) Revisar até 500 linhas de código por hora.
c) Adotar revisões de código com auxílio de ferramentas.
d) Revisar até 1000 linhas de código por vez.
e) Decidir antecipadamente os objetivos do processo de revisão de código e
como medir sua efetividade.

(CESPE - – PCF – Analista de Sistemas) No que se refere a processos de


desenvolvimento seguro de aplicações, julgue o item subsecutivo.

O processo SDL (Secure Development Lifecycle) tem sido adotado pela Microsoft no desenvolvimento de
alguns de seus produtos, como Windows Server, SQL Server e Exchange Server, reduzindo o número de
vulnerabilidades encontradas nesses produtos em versões desenvolvidas sem o uso do SDL.
16712855225

Uma das características desse processo é que ele provê dois roteiros, sendo um
com foco no suporte a desenvolvimento de novos sistemas com base em um
processo iterativo, e outro que enfoca a manutenção de sistemas já existentes.

(CESPE - – PCF – Analista de Sistemas) O CLASP (Comprehensive,


Lightweight Application Security Process) fornece uma taxonomia de
vulnerabilidades que podem ocorrer no código-fonte e que podem ser
verificadas com o uso de ferramentas automatizadas para análise estática de
código.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 89 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(FCC - – TJ/PE – Analista de Sistemas) Em relação a princípios de segurança


de aplicações, conforme definição da OWASP, é INCORRETO afirmar:

a) São coleções desejáveis de propriedades de aplicações, comportamentos,


arquiteturas e práticas de implementação.

b) Para que sejam úteis, os princípios devem ser avaliados, interpretados e


aplicados para resolver um problema específico.

c) Visam a garantir a segurança de aplicações e programas, utilizando técnicas


para proteção do sigilo do código fonte.

d) É um conjunto de tarefas que tenta reduzir a possibilidade de ocorrência de


ataques e o impacto destes ataques, caso ocorram.

e) Utilizam primitivas de arquitetura neutra e de linguagem independente, que


podem ser utilizadas na maioria dos métodos de desenvolvimento de software.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 90 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (CESPE)


COMPILADORES E INTERPRETADORES

(CESPE - – DATAPREV - Analista de Sistemas) Uma diferença fundamental


entre um compilador e um montador é que o compilador gera um arquivo
executável a partir de um arquivo texto com o programa, enquanto o montador
executa diretamente a descrição assembler, sem gerar arquivo na saída.

(CESPE - – DATAPREV - Analista de Sistemas) O compilador é parte


integrante do kernel de sistemas operacionais.

(CESPE - – ANATEL - Analista de Sistemas) A compilação é o processo de


análise de um programa escrito em linguagem de alto nível, dominando
programa-fonte, e sua conversão em um programa equivalente, escrito em
linguagem binária de máquina, denominado programa-objeto.

(CESPE - 2011 – ECT - Analista de Sistemas) Instruções em linguagem de máquina


são apresentadas na forma de padrões de bits utilizados para representar as
operações internas ao computador. A linguagem de montagem constitui uma
versão da linguagem de máquina; cada instrução é representada por uma cadeia
de texto que descreve o que a instrução faz. Nesse processo, o montador é o
elemento que converte instruções em linguagem de montagem para linguagem
de máquina.

(CESPE - 7 – TCU - Analista de Sistemas) Uma das principais tarefas do


ligador, programa responsável por unir módulos-objeto em um único módulo,
denominado módulo de carga, é resolver referências internas e externas.
16712855225

(CESPE - 2007 – TCU - Analista de Sistemas) Um interpretador pode ser


considerado como um programa que lê um conjunto de instruções e as executa
passo a passo. Programas interpretados são, em geral, menores e mais
facilmente mantidos, embora sejam mais lentos que os programas compilados.

(CESPE - 2007 – TCU - Analista de Sistemas) A análise semântica — responsável


por verificar se a estrutura gramatical do programa está correta, ou seja, se essa
estrutura foi formada de acordo com as regras gramaticais da linguagem — é
uma das tarefas realizadas pelo compilador.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 91 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE - 2007 – TSE - Analista de Sistemas – A) Um programa pode ser


composto por partes independentemente carregadas e realocadas. Um ligador
pode ser usado para resolver as referências aos símbolos externos às partes e
para produzir um código executável.

(CESPE - 2007 – TSE - Analista de Sistemas – B) Um carregador transfere para a


memória códigos a serem executados. Se for transferido um código objeto, tem
que ser armazenado nos endereços definidos quando foi gerado, pois um
código objeto não pode ser realocado.

10. (CESPE - 2007 – TSE - Analista de Sistemas – C Para gerar um código objeto,
um compilador precisa fazer a análise sintática e semântica de um programa.
Para isso ser possível, a semântica da linguagem, mas não a sintaxe, é descrita
na notação Backus-Naur Form (BNF).

11. (CESPE - 2007 – TSE - Analista de Sistemas – D Os interpretadores não analisam


sintaticamente os códigos fonte uma vez que os traduzem para um formato
interno. Por isso, um interpretador traduz um código em menos tempo que um
compilador.

12. (CESPE - – FUB - Analista de Sistemas) O compilador pode ser visto como
um tradutor, uma vez que o mesmo transforma um programa de linguagem de
alto nível para linguagem de baixo nível.

13. (CESPE - – TRT/5 - Analista de Sistemas) As definições de variáveis no


código de um programa não interferem na geração de um código-objeto
porque as variáveis não possuem relação direta com a entrada e a saída de
dados em um programa.
16712855225

14. (CESPE - 2008 – ANAC - Analista de Sistemas) O compilador, em contraste com


o montador, opera sobre uma linguagem de alto nível, enquanto o montador
opera sobre uma linguagem de montagem.

15. (CESPE - – ANAC - Analista de Sistemas) A criação da tabela de símbolos


constitui tarefa realizada pelo ligador.

16. (CESPE - – FINEP - Analista de Sistemas – A Um código escrito em


linguagem de máquina (Assembly) deve ser compilado e ligado antes de ser
executado.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 92 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

17. (CESPE - – FINEP - Analista de Sistemas – B) A análise semântica é uma


tarefa normalmente realizada pelo link-editor.

18. (CESPE - – FINEP - Analista de Sistemas – C) A otimização de código, feita


durante a fase de análise, é uma das tarefas do compilador.

19. (CESPE - – FINEP - Analista de Sistemas – D) Um interpretador é classificado


como um tradutor, uma vez que analisa e executa o código. O compilador, por
realizar análise e síntese do código, não é considerado um tradutor.

(CESPE - – FINEP - Analista de Sistemas – E) A construção da tabela de


símbolos é atividade que pode ser iniciada durante a análise léxica.

21. (CESPE - 2010 – INMETRO - Analista de Sistemas – B) Todo compilador de


linguagem de programação de alto nível tem a responsabilidade de analisar o
código fonte até a geração de código executável.

(CESPE - 2010 – INMETRO - Analista de Sistemas – C Carregadores são


programas usados exclusivamente por linguagens de programação de alto nível,
com o objetivo de transferir um módulo de carga para a memória.

(CESPE - 2010 – INMETRO - Analista de Sistemas – D) A declaração de variável


“int 7g;” em um programa escrito na linguagem Java, leva a um erro de
compilação detectado durante a análise sintática.

24. (CESPE - 2010 – INMETRO - Analista de Sistemas – E Em programas que usam


funções disponíveis em bibliotecas, as referências a estas funções serão
resolvidas pelo ligador. No caso de bibliotecas estáticas, o código objeto das
funções é integrado ao módulo executável durante o processo de ligação.
16712855225

(CESPE - 2010 – INMETRO - Analista de Sistemas) A análise léxica/sintática de


uma linguagem que tem palavras reservadas tende a ser mais complexa que a
de linguagens que têm apenas palavras-chave usadas também como
identificadores.

(CESPE - 2010 – TRE/MT - Analista de Sistemas) Durante a compilação de um


código-fonte, a fase do compilador que é responsável por produzir uma
sequência de tokens é a:

a) análise léxica.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 93 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

b) análise semântica.
c) análise sintática.
d) geração de código executável.
e) verificação de tipos.

27. (CESPE - 2010 – TRE/MT - Analista de Sistemas – A Compiladores são projetados


para um tipo específico de hardware e de sistema operacional.

(CESPE - 2010 – TRE/MT - Analista de Sistemas – B A interpretação nada mais é


do que uma compilação cruzada.

(CESPE - 1 – FUB - Analista de Sistemas) Na programação empregando uma


linguagem de alto nível, a utilização de um compilador implica o uso de um
ligador e de um carregador para a correta execução do programa; por outro
lado, a utilização de um interpretador, que simula a existência de um
processador cujas instruções são aquelas da linguagem de alto nível empregada,
torna desnecessárias as etapas de ligação e carga.

(CESPE - 2011 – TJ/ES - Analista de Sistemas) Em programa escrito em linguagem


de alto nível e traduzido por compilador, alguns comandos que fazem parte
desse código são instruções da linguagem de programação, enquanto outros
comandos são instruções típicas do compilador denominadas diretivas.

31. (CESPE - 2011 – TJ/ES - Analista de Sistemas) Durante a execução de um


programa que utiliza funções em uma biblioteca dinâmica, esta deve ser
carregada em memória e ligada ao processo em tempo de execução.

(CESPE - 2011 – TRE/ES - Analista de Sistemas) O link-editor tem a função de


vincular os dados de um programa aos programas de sistema e a outros
16712855225

programas de usuário.

(CESPE - 2010 – TRF/4 - Analista de Sistemas - A Interpretadores são programas


que convertem códigos escritos em linguagem de alto nível para programas em
linguagem de máquina.

34. (CESPE - 2010 – TRF/4 - Analista de Sistemas - B Linguagens de alto nível


cumprem tarefas mais substanciais com um número menor de comandos, mas
exigem programas tradutores denominados compiladores para converter
programas em linguagem de alto nível para linguagem de máquina.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 94 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

(CESPE - 2010 – TRF/4 - Analista de Sistemas - C Um computador pode entender


qualquer linguagem de máquina, pois a linguagem de máquina não é definida
pelo projeto de hardware do computador.

(CESPE - 2010 – TRF/4 - Analista de Sistemas - D Programadores podem


escrever instruções em várias linguagens de programação e todas são
entendidas diretamente pelos computadores sem a necessidade de tradução.

37. (CESPE - 2010 – TRF/4 - Analista de Sistemas - E Softwares escritos em


linguagens de máquina são portáveis.

(CESPE - 2010 – BASA - Analista de Sistemas) Um interpretador é um programa


que lê um código escrito em uma linguagem e o converte em um código
equivalente em outra linguagem. No processo de conversão, o interpretador
relata a presença de erros no código original.

(CESPE - 2010 – INMETRO - Analista de Sistemas) Um interpretador traduz um


programa descrito no nível da linguagem para o nível da máquina, enquanto o
compilador eleva a máquina ao nível da linguagem, para que o programa
execute a partir da fonte.

40. (CESPE - 2011 – ECT - Analista de Sistemas) No programa em linguagem de alto


nível, os interpretadores executam os passos definidos para cada instrução e
produzem o mesmo resultado que o do programa compilado. Entretanto, a
execução de um programa em linguagem de alto nível com o uso de
interpretadores é mais lenta que a execução de um programa compilado, uma
vez que precisa examinar cada instrução no programa-fonte, à medida que ela
ocorre, e desviar para a rotina que executa a instrução.
16712855225

41. (CESPE - – TCE/AC - Analista de Sistemas - A) Os programas escritos em


linguagem de programação de alto nível precisam ser convertidos em
programas de máquina, sendo o linker um tipo de software básico que efetua
essa tradução.

42. (CESPE - 2007 – TCU - Analista de Sistemas) Um montador é considerado um


software de sistema, responsável pela tradução de uma linguagem de alto nível
para uma linguagem de baixo nível (linguagem simbólica).

43. (CESPE - 2008 – FUB - Analista de Sistemas) O montador realiza a tarefa de


combinar módulos objetos em um módulo de carga.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 95 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

44. (CESPE - – FUB - Analista de Sistemas – C Para que um programa possa


ser executado, seu código de máquina deve estar presente na memória. O
ligador é o programa do sistema responsável por transferir o código de máquina
de um módulo objeto para a memória e encaminhar o início de sua execução.

45. (CESPE - – DETRAN - Analista de Sistemas - D) O termo linguagem de


máquina é usado para denominar linguagens do tipo assembler ou C++.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 96 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

LISTA DE EXERCÍCIOS COMENTADOS (FGV)


COMPILADORES E INTERPRETADORES

(FGV – 2014 – SUSAM – Analista de Sistemas) Programa destinado a


transformar um código escrito em linguagem de alto nível em uma linguagem
Assembly é o:

a) debugger.
b) compilador.
c) montador.
d) fortran.
e) otimizador.

(FGV – 2015 – TCE/SE – Analista de Sistemas) O módulo de análise léxica de um


compilador tem por objetivo:

a) verificar se o programa fonte obedece às regras da gramática da linguagem;


b) agrupar os caracteres do programa fonte em unidades denominadas tokens;
c) gerar o código objeto correspondente à tradução do programa fonte para
alguma forma intermediária de representação;
d) construir as árvores sintáticas dos diversos comandos do programa fonte;
e) eliminar comandos supérfluos do programa fonte.

(FGV – 2010 – DETRAN/RN – Analista de Sistemas) As etapas realizadas durante


a programação em uma linguagem de alto nível, para se gerar um código
executável, são:
16712855225

a) Programa fonte, compilação, interpretação, ligação, código executável.


b) Programa fonte, compilação, código-objeto, ligação, código executável.
c) Programa fonte, interpretação, código-objeto, ligação, código executável.
d) Programa fonte, montagem, compilação, código-objeto, código executável.
e) Programa fonte, montagem, código-objeto, ligação, interpretação.

(FGV – 2010 – DETRAN/RN – Analista de Sistemas) São funções realizadas pelo


módulo front-end de um compilador:

a) Análise léxica e análise lógica.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 97 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

b) Análise sintática, análise léxica e análise lógica.


c) Análise sintática e análise lógica.
d) Análise semântica, análise léxica e análise sintática.
e) Análise semântica e análise lógica.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 98 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


SISTEMAS MÓVEIS

1 2 3 4 5 6 7 8 9 10
C C

GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


ANDROID

1 2 3 4 5 6 7 8 9 10
E E C E C E C E D E
11 12 13 14 15 16 17 18 19 20
C D C

GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


iOS

1 2 3 4 5 6 7 8 9 10
C C A E C C

GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


16712855225

SEGURANÇA NO DESENVOLVIMENTO

1 2 3 4 5 6 7 8 9 10
E C D E C C

GABARITO DOS EXERCÍCIOS COMENTADOS (CESPE)


COMPILADORES E INTERPRETADORES

1 2 3 4 5 6 7 8 9 10

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 99 de 100


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 10

E E C C X C E C E E
11 12 13 14 15 16 17 18 19 20
E C E C E E E E E C
21 22 23 24 25 26 27 28 29 30
E E E C E A E E C C
31 32 33 34 35 36 37 38 39 40
C C E C E E E E E C
41 42 43 44 45 46 47 48 49 50
E E E E E

GABARITO DOS EXERCÍCIOS COMENTADOS (FGV)


COMPILADORES E INTERPRETADORES

1 2 3 4 5 6 7 8 9 10
B B B D

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 100 de 100

Você também pode gostar