XXXX
XXXX
XXXX
Autor:
Equipe Informática e TI, Evandro
Dalla Vecchia Pereira
01 de Julho de 2022
Índice
1) Introdução ao Estudo de SO e Arquitetura de Computadores
..............................................................................................................................................................................................3
5) SO - Hardware x Software
..............................................................................................................................................................................................
20
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Considerações Iniciais
Na aula de hoje vamos estudar assuntos iniciais, que vão desde a diferença entre organização e arquitetura
de computadores, as arquiteturas clássicas de computadores e as arquiteturas clássicas de processadores.
Na sequência veremos o que são os conjuntos e os ciclos de instruções, e começaremos a "subir" o nível, ou
seja, veremos onde "entra" o software, os algoritmos e linguagens de programação e as linguagens de
máquina e de montagem. Por fim, veremos as diferenças entre tradução, compilação e interpretação. Boa
aula!
Quando se estuda um computador, há dois pontos de vista a serem analisados: o da organização (ou
implementação) e o da arquitetura de um computador.
A organização de um computador é a parte do estudo da ciência da computação que trata dos aspectos
relativos à parte do computador mais conhecida por quem o construiu (detalhes físicos). Tais entendimentos
são desnecessários ao programador que já recebe a máquina pronta, entende a linguagem de programação
a ser realizada e utiliza um compilador ou montador para gerar o executável. Alguns exemplos dos aspectos
relativos aos componentes físicos são:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Para deixar mais claro, vamos falar da “família” de processadores x86. A Intel (fabricante) definiu elementos
característicos dessa arquitetura (x86), sendo que cada modelo de processador possui sua organização.
Dessa forma, se um programa foi feito para ser executado em um antigo 80386 (fui longe agora, né? ), o
mesmo pode ser executado em processadores sucessores (80486, Pentium e posteriores), sem precisar de
alterações! Isso ocorre porque são processadores da mesma “família”, logo possuem a mesma arquitetura
(e isso interessa aos programadores!).
==13ab2a==
Arquiteturas Clássicas
Um sistema de computação é um conjunto de componentes que são integrados para funcionar como se
fosse um único elemento, tendo como objetivo realizar o processamento de dados e obter resultados. Os
primeiros computadores surgiram com dispositivos de entrada (ex.: teclado), processador (também
conhecido como CPU – Unidade Central de Processamento) e dispositivos de saída (ex.: monitor de vídeo).
Em seguida, John von Neumann melhorou a arquitetura inicial, acrescentando a memória (principal e
secundária) para armazenar programas e dados, tornando o processamento muito mais rápido e eficaz. Tal
arquitetura, embora tenha tido ajuda de outras pessoas, recebeu o nome de Arquitetura de von Neumann
(figura abaixo). Essa arquitetura tem se mantido ao longo do tempo, com um grande aumento de velocidade
(Obs.: a memória secundária não costuma aparecer em figuras da Arquitetura de von Neumann, geralmente
aparece apenas “Memória” de forma genérica).
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Com essa separação de dados e instruções em memórias e barramentos separados, o processador consegue
acessar as duas simultaneamente, obtendo um desempenho melhor do que o da Arquitetura de von
Neumann, pois pode buscar uma nova instrução enquanto executa outra.
Obviamente que podem existir outras arquiteturas, mas essas duas são as mais utilizadas até hoje e, o mais
importante, são cobradas em provas de concurso!
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
QUESTÕES COMENTADAS
1. (FUNIVERSA/IPHAN - 2009) Um sistema de processamento de dados é composto, basicamente, por
três etapas: (1) entrada de dados, (2) processamento ou tratamento da informação e (3) saída. Em um
computador, essas tarefas são realizadas por partes diversas que o compõem, como teclado, mouse,
microprocessador, memória etc. Levando-se em conta as tarefas de processamento de dados
realizadas por um computador, é correto afirmar que
A) dispositivos de hardware como teclado e mouse são responsáveis pela saída de dados, uma vez que
escrevem ou apontam o resultado esperado em uma operação realizada pelo computador.
B) acessórios modernos como webcams, bluetooth e leitores biométricos são dispositivos de saída de dados
incorporados a alguns computadores como acessórios de fábrica.
C) a tela (ou monitor) de um computador comporta-se como um dispositivo de entrada de dados, quando se
trabalha em sistemas de janelas, com botões a serem “clicados” pelo usuário.
D) as impressoras multifuncionais são dispositivos mistos, de entrada, processamento e saída de dados, pois
podem ler (scanner), processar (memória interna) e imprimir informações.
E) a entrada de dados é tarefa realizada pela pessoa (ou por um programa de computador) responsável por
alimentar o sistema com dados necessários para atingir o resultado esperado.
Comentários:
(A) Teclado e mouse são dispositivos de entrada de dados (do ponto de vista do computador, recebem
dados); (B) Webcams e leitores biométricos também são dispositivos de entrada e bluetooh é um padrão de
rede sem fio com curta distância; (C) O monitor é um dispositivo de saída, pois mostra dados (imagem) e não
recebe; (D) São dispositivos de E/S (a função de scanner é de entrada, a função de impressora é de saída),
não há processamento em memória interna – processamento é realizado por processador! (E) A entrada de
dados pode ser realizada por uma pessoa, através de um dispositivo de entrada (ex.: teclado). Esses dados
alimentam o sistema, que são processados e resultados são gerados (mostrados no monitor, por exemplo).
B) Memória Principal.
C) Memória Secundária.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
“Quem” realiza o processamento dos dados, bem como o devido controle dos dados a serem carregados em
memória, buscados para o processador, entre outras atividades, é o processador (também conhecido por
CPU – Unidade Central de Processamento). Portanto, a alternativa D está correta e é o gabarito da questão.
Comentários:
Um computador processa dados (através da CPU), armazena (através de memórias primárias e secundárias)
==13ab2a==
e transfere (através de barramentos, ou sistemas de interconexão) tanto para componentes internos como
para dispositivos de entrada (teclado, mouse etc.) e saída (impressora, monitor etc.). Portanto, a questão
está correta.
Comentários:
CPU = Central Processing Unit (Unidade Central de Processamento). Portanto, a alternativa C está correta e
é o gabarito da questão.
5. (MS CONCURSOS/IF-AC - 2014) Dentre as funções básicas do computador, podemos citar, exceto:
A) Entrada de dados.
B) Processamento de Dados.
C) Saída de Informações.
D) Capacidade de Unidade.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
7. (UFMT/UFSBA - 2017) A respeito de memória cache, os projetos denominados arquitetura Harvard são
aqueles
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
B) cujos conceitos do princípio da localidade foram descartados e adotou-se um protocolo serial de acesso a
dados.
D) cujo empacotamento de módulos de memória cache foi colocado fora do chip, reduzindo o custo de
produção e aumentando a quantidade de memória disponível.
Comentários:
Acabamos de ver na questão anterior . Portanto, a alternativa C está correta e é o gabarito da questão.
B) utilizar memória cache entre o processador e a memória principal com caminhos separados para dados e
instruções.
Comentários:
Como o processador é mais rápido que a memória, uma solução adotada há um bom tempo é o uso de
memórias cache, as quais mantêm as instruções e dados mais acessados, evitando ter que buscar da
memória RAM (o que seria mais lento). E, para melhorar ainda mais, as memórias cache começaram a
separar os dados das instruções, aplicando o conceito da Arquitetura de Harvard (que é um melhoramento
da Arquitetura de von Neumann). Portanto, a alternativa B está correta e é o gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
A figura que utilizamos na aula é mais abrangente, mas de uma forma mais simples poderíamos visualizar
assim (esquecendo a memória secundária):
Embora seja necessário para a comunicação entre os componentes, os barramentos não são considerados
como um subsistema básico, então sobraram os três: processador, memória e dispositivos de E/S. Portanto,
a alternativa A está correta e é o gabarito da questão.
10. (CESPE/ABIN - 2018) Na arquitetura de Von Neumann, o caminho único de dados é o barramento físico,
que liga a memória diretamente aos dispositivos de entrada e saída (E/S): o objetivo desse barramento
é a troca de dados externos com a máquina, enquanto a memória guarda os dados de forma
temporária no computador.
Comentários:
Podemos ver na figura mostrada na questão anterior que a CPU é o elemento central, então o barramento
faz a ligação dela com a memória e dela com os dispositivos de E/S. Portanto, a questão está errada.
11. (COPESE-UFT/UFT - 2018) Em 1952 John von Neumann desenvolveu um protótipo de um novo
computador de programa armazenado. Esse projeto ficou conhecido como arquitetura de Von
Neumann e ainda hoje influencia o projeto de computadores modernos. Os componentes abaixo fazem
parte da arquitetura de Von Neumann, EXCETO:
A) Memória Principal.
C) Barramento.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Mais uma vez uma questão que deixa o barramento de fora, como se aquelas “caixinhas” se comunicassem
através do ar. Mas é assim mesmo, temos que pensar que os 3 componentes da Arquitetura de von Neumann
são: processador, memória e dispositivos de E/S. Na questão aparece a ULA (Unidade Lógica e Aritmética),
que é um componente de um processador, então consideramos como processador na questão. Portanto, a
alternativa C está correta e é o gabarito da questão.
12. (INSTITUTO PRÓ-MUNICÍPIO/CRP-11ª Região - 2019) O computador é uma máquina que processa
informações eletronicamente, na forma de dados e pode ser programado para as mais diversas tarefas.
As fases do processamento são:
Comentários:
Está certo que a questão fala em fases do “processamento” e o correto seria algo como “funções básicas de
um computador”, mas tudo bem... a alternativa B está correta e é o gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Quando o assunto é saber qual a melhor arquitetura de processador, sempre há polêmica. Muitos defendem
que os “Macs” são mais rápidos por terem chips RISC, por exemplo. Mas o que é RISC? E CISC? Quais
vantagens e desvantagens? Vamos lá...
Um processador CISC (Complex Instruction Set Computer - Computador com um Conjunto Complexo de
Instruções), é capaz de executar várias centenas de instruções complexas diferentes, sendo extremamente
versátil. Alguns exemplos de processadores CISC são o 386 e o 486.
Alguns fabricantes decidiram seguir o caminho contrário, criando o padrão RISC (Reduced Instruction Set
Computer - Computador com um Conjunto Reduzido de Instruções). Os processadores RISC são capazes de
executar apenas algumas poucas instruções simples. Justamente por isso, os chips baseados nesta
arquitetura são mais simples e muito mais baratos.
Outra vantagem dos processadores RISC, é que, por terem um menor número de circuitos internos, podem
trabalhar a frequências mais altas. Alguns exemplos de processadores RISC são Sparc (Sun), Mips (Silicon
Graphics), Power (IBM) e Alpha (DEC).
Aí surge a dúvida...como um chip que é capaz de executar algumas poucas instruções pode ser considerado
por muitos, mais rápido do que outro que executa centenas delas? A grande questão é que um processador
RISC é capaz de executar suas poucas instruções muito mais rapidamente. A ideia principal é que apesar de
um processador CISC ser capaz de executar centenas de instruções diferentes, apenas algumas são usadas
frequentemente, o que parece ser um desperdício, não?
Mas, uma coisa é garantida: em instruções complexas os processadores CISC se saem melhor! O que
podemos concluir, então? O ideal é fazer um mix das duas tecnologias, e é por isso que atualmente temos
processadores híbridos, que são essencialmente processadores CISC, mas incorporam muitas características
dos processadores RISC (ou vice-versa). Tanto os processadores da família x86, como o Pentium II, Pentium
III e AMD Athlon, quanto processadores supostamente RISC, como o MIPS R10000 e o HP PA-8000 misturam
características das duas arquiteturas, por simples questão de desempenho.
Uma coisa é o mundo real, outra é o mundo dos concursos, onde é importante saber diferenciar bem as
características RISC e CISC.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Algumas características:
• Uso dos modos: Registrador para registrador, Registrador para memória, Memória para registrador;
• Múltiplos modos de endereçamento para a memória, incluindo indexação (vetores);
• Instruções com largura variável;
• Instruções requerem múltiplos ciclos de relógio para completar a execução, ex.: se existe a busca de
dois operandos na memória, demora mais;
• Poucos registradores, devido ao pouco espaço no chip (tem memória para o microcódigo,
decodificador etc.) e à possibilidade de acesso a operandos na memória;
• Há registradores especializados: controle (flags), segmento (ponteiro da pilha) etc.
Vamos analisar a tabela abaixo, de diferentes processadores e na sequência vamos classifica-los como RISC
ou CISC.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Modos de endereçamento 1 4 22 11
Quantidade de registradores de 32 32 16 8
uso geral
Olhando pela quantidade de instruções, o que apresenta 94 parece ser RISC (poucas instruções) e o 303 CISC
(muitas instruções), mas os outros dois são próximos e fica a dúvida.
Analisando os modos de endereçamento, fica evidente que os dois primeiros são RISC (poucos modos),
enquanto os dois últimos possuem bem mais.
Pela largura de instruções fica mais claro ainda que os dois primeiros são RISC, pois possuem uma largura
fixa de instruções (4 bytes), enquanto os outros dois possuem instruções de diversos tamanhos (2 a 57 bytes
um deles e o outro entre 1 e 12 bytes).
E para arrematar nossa análise, os dois que achamos que são RISC possuem mais registradores (32 cada um
deles), enquanto os outros dois processadores possuem menos registradores (um possui 16 e o outro 8).
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
QUESTÕES COMENTADAS
1. (ESAF/SUSEP - 2010) Em uma Arquitetura RISC
A) há poucos registradores.
Comentários:
Em uma arquitetura RISC existem muitos registradores, há muito uso da técnica pipelining (devido ao
tamanho fixo das instruções), as instruções possuem poucos formatos, não são realizadas por microcódigo.
E por fim, as instruções utilizam poucos ciclos de máquina (um ciclo, na verdade)! Portanto, a alternativa E
está correta e é o gabarito da questão.
2. (FCC/TRE-AM - 2010) Numa máquina estruturada multinível, é o nível essencial para as máquinas CISC
(Complex Instruction Set Computer), mas que inexiste nas máquinas RISC (Reduced Instruction Set
Computer). Trata-se do nível
A) do sistema operacional.
B) de lógica digital.
C) de microprogramação.
D) convencional de máquina.
E) do montador.
Comentários:
A microprogramação é utilizada pela arquitetura CISC, o que consome espaço no chip (na unidade de
controle do processador), algo que não existe na arquitetura RISC. Portanto, a alternativa C está correta e é
o gabarito da questão.
3. (CESPE/Correios - 2011) As instruções CISC são mais simples que as instruções RISC, por isso, os
compiladores para máquinas CISC são mais complexos, visto que precisam compensar a simplificação
presente nas instruções. Entretanto, se for usado pipeline, a complexidade do compilador CISC é
reduzida, pois a arquitetura pipeline evita a necessidade de reordenação inteligente de instruções.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
O nome já deixa claro: “Complex Instruction Set Computer”, portanto são mais complexas. Os compiladores
para máquinas RISC é que são mais complexos, pois devem lidar com instruções simples. Portanto, a questão
está errada.
Comentários:
Processadores RISC possuem instruções de tamanho fixo e cada instrução é executada em um ciclo de
relógio. Portanto, a alternativa B está correta e é o gabarito da questão.
C) Operações memória-para-memória.
Comentários:
RISC é tudo “simples” e uma instrução por ciclo de relógio. Realiza operações registrador-registrador, ou
seja, tem que buscar da memória os dados antes (através de LOAD). Portanto, a alternativa C está correta e
é o gabarito da questão.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Esse “exclusivamente” mata, heim! Para começar os fabricantes têm utilizado uma arquitetura híbrida, com
mais características de uma ou de outra. Portanto, a questão está errada.
7. (IADES/PCDF - 2016) Em relação ao projeto de máquinas RISC e CISC, assinale a alternativa correta.
A) Dadas as características das instruções das máquinas CISC, o pipeline fica favorecido nessa arquitetura.
B) Arquiteturas RISC normalmente realizam poucas operações de registrador para registrador, aumentando
o acesso à memória cache.
C) Programas para arquiteturas CISC sempre possuem tamanho menor que programas para arquiteturas
RISC, devido à relação um para um de instruções de máquina e instruções de compilador.
D) Arquiteturas RISC tendem a enfatizar referências aos registradores no lugar de referências à memória.
E) Arquiteturas CISC usam um número muito grande de instruções simples em detrimento de instruções
complexas.
Comentários:
Processadores da arquitetura só utilizam LOAD e STORE para acessar a memória, depois só realizam
operações envolvendo dados que estão nos registradores. Portanto, a alternativa D está correta e é o
gabarito da questão.
8. (INAZ do Pará/CORE-SP - 2019) “O projeto do Conjunto de Instruções inicia com a escolha de uma entre
duas abordagens, a abordagem RISC e a CISC”.
B) Objetivo de criar um hardware mais otimizado, com isso os programas tendem a ocupar menos espaço
em memória.
C) Grande número de registradores de propósito geral e os programas tendem a ocupar menos espaço em
memória.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
São mais baratos, pois são mais simples. Ocorrem menos acessos à memória (apenas LOAD e STORE). Possui
um conjunto de instruções simples, ao contrário da CISC (C = Complex). Portanto, a alternativa A está correta
e é o gabarito da questão.
9. (Quadrix/CRA-PR - 2019) Possuir um conjunto de instruções simples e limitado é uma das principais
características da arquitetura CISC.
Comentários:
10. (Quadrix/CRA-PR - 2019) A característica que mais se destaca na arquitetura RISC é que computadores
pertencentes a ela realizam milhares de instruções por ciclo.
==13ab2a==
Comentários:
Vamos relembrar as características da a arquitetura RISC (Reduced Instruction Set Computer), sendo que
destaquei três itens, os quais ajudam a responder esta questão e a seguinte:
11. (Quadrix/CREA-GO - 2019) Uma máquina RISC, geralmente, usa um conjunto de modos de
endereçamento relativamente simples e direto.
Comentários:
Como existem menos modos de endereçamento e eles possuem menos acesso à memória, temos um
conjunto de modos de endereçamento mais simples e direto. Portanto, a questão está correta.
12. (CESPE/TJ-PA - 2020) Na tentativa de solucionar o chamado espaço semântico (semantic gap),
fabricantes de computadores de grande porte criaram alternativas para resolver o problema, como,
por exemplo,
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
A) apenas o item I.
E) todos os itens.
Comentários:
O tal "espaço semântico" significa a diferença entre os conjuntos de programação de alto nível em várias
linguagens de computador e as instruções simples de computação com as quais os microprocessadores
trabalham na linguagem de máquina. Na verdade, essa parte só serve para distrair o candidato!
O foco é analisar as características elencadas nos itens I a III e verificar quais delas estão relacionadas à
arquiteturas CISC. Vamos lá...
I. Uma maior densidade do código significa que cada instrução deve "fazer muito", de modo que o programa
completo tenha poucas instruções - Isso é característica da CISC!
III. Como a RISC é uma arquitetura registrador-registrador, ela é quem possui uma execução otimizada de
chamadas de funções via registradores.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
HARDWARE X SOFTWARE
Máquina Multinível
• Tradução: Executa um programa escrito em L1 (nível 1), substituindo cada instrução por uma
sequência equivalente de instruções em L0 (nível 0);
Abaixo podemos ver uma estrutura em níveis de máquinas contemporâneas e na sequência uma breve
explicação de cada nível.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
As linguagens de máquina nos níveis 1, 2 e 3 são numéricas e as linguagens nos níveis 4 e 5 possuem palavras
e abreviações.
Vamos começar "de cima", ou seja, do ser humano, e vamos aos poucos "baixando o nível" (no bom sentido,
é claro), até chegarmos na máquina! Então vamos lá...sabemos que o computador serve para resolver
problemas, desde cálculos, edição de textos até jogos de entretenimento, por exemplo. Antes de colocar a
mão na massa (programar em alguma linguagem), é importante definir o passo a passo de como resolver o
tal problema. Comecemos pelo conceito de algoritmo, a seguir.
Na matemática, um algoritmo pode ser definido como uma sequência finita de regras, raciocínios ou
operações que, aplicada a um número finito de dados, permite solucionar classes semelhantes de problemas.
Na informática, um algoritmo pode ser definido como um conjunto das regras e procedimentos lógicos
perfeitamente definidos que levam à solução de um problema em um número finito de etapas.
Um exemplo clássico de algoritmo não-computacional é uma receita de bolo, pois você tem todos os
ingredientes e a sequência de passos para resolver o "problema" (preparar o bolo). Para fazer um bolo de
laranja pode existir uma infinidade de receitas (algoritmos), tendo como resultado um bolo de laranja! Claro
que um pode ficar mais ou menos saboroso, dependendo do paladar de cada um!
Todas as tarefas executadas pelo computador são baseadas em algoritmos. Um algoritmo deve ser bem
definido, pois é uma máquina que o executará, não haverá "alguém" para decidir o que fazer quando houver
alguma ação ambígua a ser executada! Uma calculadora por exemplo, para executar a operação de
multiplicação, executa um algoritmo que calcula somas até um determinado número de vezes, porque a
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
operação de multiplicação geralmente não está presente nas instruções conhecidas pela arquitetura
(hardware).
As variáveis são os endereços de dados salvos na memória do computador e usados na realização de cálculos
pelos algoritmos. Funciona como os ingredientes da receita. O programa é a representação do algoritmo, ou
seja, um texto escrito em uma linguagem de programação. Funciona como o texto da receita. Resumindo: o
algoritmo é algo mais alto nível, pode ser escrito em português estruturado (Portugol) ou algo semelhante
(Ler, Escrever, entre outros comandos), enquanto uma linguagem de programação tem regras bem definidas
quanto à sintaxe de comandos, estruturas de dados aceitas etc.
No exemplo acima, a execução no monitor seria assim (em vermelho o que você teria digitado):
No exemplo acima, a execução no monitor seria assim (em vermelho o que você teria digitado):
Digite um numero: 9
Numero impar!
Existem algumas classificações quanto à maneira pelos quais foram implementados, mas duas delas
merecem destaque, os algoritmos recursivos e os iterativos.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Uma forma bem resumida de explicar é dizer que recursão é autorreferência. Recursão ocorre quando algo
é definido em termos de si mesmo ou de suas variações, ou seja, recursão envolve estruturas aninhadas.
Uma figura que retrata a recursão é a seguinte (criada por Paul Noth, para o The New Yorker):
Para entender o conceito de recurso, vamos a um exemplo clássico, o cálculo do fatorial de um número. O
fatorial de um número n, denotado por n!, é calculado como a seguir:
n! = n × (n−1)!
A definição acima é incompleta porque não dos diz como calcular o fatorial de nenhum número específico.
Se tentarmos aplicá-la ao cálculo do fatorial de algum número, nunca seremos capazes de parar.
Continuaremos calculando indefinidamente.
Agora vamos para uma definição completa: O fatorial de um número n, denotado por n!, é calculado como
a seguir:
0! = 1
n! = n × (n−1)!
Com a adição de mais uma regra, sabemos que, ao chegar no zero, conseguiremos calcular o fatorial e
poderemos usar esse resultado no cálculo do fatorial dos demais números, até chegarmos ao fatorial do
número desejado inicialmente. O procedimento não executará indefinidamente, ou seja, temos uma
"condição de parada", uma regra que define até onde calculamos.
Para calcular o fatorial de 10, por exemplo, basta saber como calcular o fatorial de 9, pegar esse resultado,
e multiplicá-lo por 10. Só isso! E para calcular o fatorial de 9? Basta calcular o fatorial de 8 e multiplicar o
resultado por 9. E assim por diante... até chegar no cálculo do fatorial de 0, que sabemos que é 1. Agora, é
só pegar esse resultado e ir multiplicando… até chegar ao ponto em que consegue calcular o fatorial de 10.
fatorial(5) = 5 × fatorial(4) =
5 × (4 × fatorial(3)) =
5 × (4 × (3 × fatorial(2))) =
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
5 × (4 × (3 × (2 × fatorial(1)))) =
5 × (4 × (3 × (2 × (1 × fatorial(0))))) =
5 × (4 × (3 × (2 × (1 × 1)))) =
5 × (4 × (3 × (2 × 1))) =
5 × (4 × (3 × 2)) =
5 × (4 × 6) = 5 × 24 = 120
Note que temos uma chamada recursiva de uma "função" fatorial, conforme podemos ver na figura abaixo.
def fatorial(n):
if n == 0:
return 1
return n * fatorial(n - 1)
No código acima, foi fácil traduzir para uma linguagem de programação as duas partes da definição recursiva
do fatorial de um número. É possível ler o código e identificar facilmente o que ele está fazendo.
Outra vantagem de algoritmos recursivos é que eles são, em geral, fáceis de serem lidos. A correspondência
entre a definição e a implementação é óbvia. Por outro lado, algoritmos recursivos não são muito eficientes
em alguns casos, pois pode ser que eles realizem grandes quantidades de trabalho repetido.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Agora vamos focar nos algoritmos iterativos. Vimos há pouco que o fatorial de um número inteiro positivo
n nada mais é do que o produto de todos os inteiros positivos menores ou iguais a n. Por exemplo:
5! = 5 × 4 × 3 × 2 × 1 = 120
Comparando este exemplo com o exemplo do fatorial recursivo, vemos que a principal diferença entre o
procedimento recursivo e o iterativo é que o procedimento iterativo contém instruções completas de como
realizar uma tarefa, ao passo que o procedimento recursivo contém instruções de como realizar uma tarefa
tendo como base instâncias menores da mesma tarefa. Um exemplo tornará essa explicação mais clara.
0!=1
==13ab2a==
n!=n×(n−1)!
A definição iterativa do fatorial é um número é a seguinte: O fatorial de um número n, denotado por n!, é
calculado como a seguir:
n! = n × (n−1) × (n−2) × ⋯ × 2 × 1
Como dissemos acima, o procedimento iterativo nos diz cada passo do cálculo do fatorial de um número,
enquanto o procedimento recursivo nos diz como calcular o fatorial de um número n baseado no fatorial de
um número menor, (n−1, neste caso).
Na prática, é muito fácil distinguir um algoritmo recursivo de um algoritmo iterativo. O algoritmo recursivo
sempre terá uma chamada a si mesmo. O algoritmo iterativo nunca terá isso. Veja abaixo o algoritmo
recursivo para o cálculo do fatorial de um número.
def fatorial_iterativo(n):
resultado_fatorial = 1
resultado_fatorial = resultado_fatorial * i
return resultado_fatorial
No código acima, a chamada à função range(1, n + 1) gera uma lista de números no intervalo [1,n], ou seja,
indo de 1 até n. Uma outra forma de calcular o fatorial com um algoritmo iterativo:
resultado_fatorial = 1
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
while (n):
resultado_fatorial *= n
n -= 1
return resultado_fatorial
Note que nesses dois exemplos não há chamada à "fatorial_iterativo" em nenhum momento.
Dos símbolos mostrados acima, os cinco primeiros são os mais utilizados. Vamos colocar o nosso segundo
algoritmo (aquele que mostra se é número par ou ímpar) em um fluxograma para entender como funciona
(vamos assumir que não é necessário declarar as variáveis previamente):
Depois de pronto o algoritmo e/ou o fluxograma é hora de programar! Claro que é possível programar sem
ter que fazer qualquer algoritmo antes, mas não é o recomendado. É possível programar em Assembly
direto? Claro que sim! Mas é muito complexo e demorado! Por isso, o mais comum é programar em alguma
linguagem de alto nível e deixar que o compilador faça o trabalho de transformar o código de alto nível para
o executável (se considerarmos aquele compilador que faz tudo, incluindo também o papel de montador e
ligador).
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
O conjunto de palavras (lexemas classificados em tokens), compostos de acordo com essas regras,
constituem o código fonte de um software. Tal código é traduzido para código de máquina, o qual é
executado pelo processador.
A ideia principal das linguagens de programação é que programadores tenham uma maior produtividade,
permitindo expressar seus algoritmos mais facilmente do que quando comparado com o código de
máquina. Por isso, linguagens de programação são projetadas para adotar uma sintaxe de nível mais alto
(mais próxima do ser humano).
Outro fator importante é que as linguagens de programação tornam os programas menos dependentes de
computadores ou ambientes computacionais específicos, o que é denominado portabilidade. Isso ocorre
porque programas escritos em linguagens de programação são traduzidos para o código de máquina do
computador no qual será executado em vez de ser diretamente executado (no caso de programas
compilados). Na sequência vamos ver algumas classificações.
Programação estruturada: é uma forma de programação que preconiza que todos os programas possíveis
podem ser reduzidos a apenas três estruturas: sequência, decisão e repetição. A programação estruturada
orienta os programadores para a criação de estruturas simples em seus programas, usando as sub-rotinas e
as funções.
Programação linear: em matemática, problemas de programação linear são problemas de otimização nos
quais a função objetivo e as restrições são todas lineares. Esse tipo é mais complexo e dificilmente será
cobrado em concurso.
Diferentes linguagens de programação podem ser agrupadas segundo o paradigma que seguem para
abordar a sua sintaxe e semântica. Os paradigmas se dividem em dois grandes grupos: imperativo e
declarativo. Os paradigmas imperativos são aqueles que facilitam a computação por meio de mudanças de
estado e são divididos em:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
• Paradigma de orientação a objetos: descreve linguagens que suportam a interação entre objetos.
Exemplos: C++, Java e Python;
• Paradigma da computação distribuída: suporta que mais de uma rotina possa ser executada
independentemente. Exemplo: Ada.
Os paradigmas declarativos são aqueles nos quais um programa especifica uma relação ou função. Dividem-
se em:
• Paradigma funcional: linguagens que não incluem qualquer provisão para atribuição ou dados
mutáveis. O mapeamento entre os valores de entrada e saída são alcançados mais diretamente. Um
programa é uma função (ou grupo de funções), tipicamente constituída de outras funções mais
simples. Exemplo: Lisp;
Quanto a estrutura de tipos, as linguagens de programação podem ser definidas de duas formas:
• Fracamente tipada: quando o tipo da variável muda dinamicamente conforme a situação, ou seja,
uma variável pode receber um valor do tipo inteiro, depois string, e por aí vai. Exemplo: PHP;
• Fortemente tipada: quando o tipo da variável se mantém o mesmo até ser descartada da memória,
ou seja, se uma variável foi declarada como inteiro, ela não pode receber outro tipo de dado.
Exemplos: Java e Python.
• Dinamicamente tipada: o tipo da variável é definido em tempo de execução. Exemplos: Perl, Python
e Ruby;
Teste de Mesa
Teste de mesa é uma simulação da execução de um programa de forma manual, geralmente feita no papel
(geralmente em cima de uma mesa, por isso o nome!). Não há regras rígidas para criar um teste de mesa,
mas geralmente ele é feito do jeito que veremos na sequência. Considere o pseudocódigo abaixo:
leia(a, b)
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
soma = a + b
diferenca = a - b
Esse algoritmo simplesmente calcula a soma e a diferença entre dois números e imprime ambas. Baseado
nele, vamos criar uma tabela onde faremos um teste de mesa. O teste de mesa geralmente é feito de duas
formas. Primeiramente, vamos fazer um teste seguindo a primeira forma. Nessa primeira forma, coloca-se
as variáveis que se deseja acompanhar o valor em colunas de uma tabela. Então, preenche-se os valores das
variáveis para simular a execução do programa. Cada linha corresponde a uma execução.
a b soma diferenca
4 3 7 1
20 10 30 10
10 15 25 -5
Vamos ver agora a segunda forma. Ela também tem uma coluna para cada variável, mas inclui o número da
linha na primeira coluna e o valor que cada variável tem após a execução dela. Como cada linha corresponde
a uma linha do programa, a tabela inteira corresponde a uma execução. Vamos à tabela:
A primeira forma deve ser utilizada quando se deseja simular mais de 1 execução ou quando se acha
desnecessário expressar os valores das variáveis em diferentes pontos do algoritmo.
Testes de mesa são mais usados para propósitos didáticos, ou quando não se dispõe de um computador
enquanto se está criando um algoritmo e deseja-se testar o algoritmo, geralmente com valores de entrada
diferentes. São utilizados também quando se tem dificuldade para entender o funcionamento de um
algoritmo. Então, fazendo o teste de mesa, fica mais fácil entender o que o algoritmo faz.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
QUESTÕES COMENTADAS
1. (CESPE/TCE-PA - 2016) Utilizando-se linguagens fracamente tipadas, é possível alterar o tipo de dado
contido em uma variável durante a execução do programa.
Comentários:
Quanto a estrutura de tipos, as linguagens de programação podem ser definidas de duas formas:
• Fracamente tipada: quando o tipo da variável muda dinamicamente conforme a situação, ou seja,
uma variável pode receber um valor do tipo inteiro, depois string, e por aí vai. Exemplo: PHP;
• Fortemente tipada: quando o tipo da variável se mantém o mesmo até ser descartada da memória,
ou seja, se uma variável foi declarada como inteiro, ela não pode receber outro tipo de dado.
Exemplos: Java e Python.
No algoritmo solução1 apresentado a seguir as variáveis X, A e B são criadas com escopo global; no
algoritmo solução2 apresentado após algoritmo solução1, as variáveis A e B são criadas com escopo
global e a variável X com escopo local.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
Escopo global é quando uma variável não é declarada dentro de nenhum procedimento, ou seja, ela pode
ser utilizada em todo o algoritmo. Escopo local é quando uma variável é declarada dentro de um
procedimento e só pode ser utilizada neste procedimento. Logo, a questão está correta.
A) Algoritmos
B) Arquivos
==13ab2a==
C) Cases
D) Polinômio
Comentários:
Na matemática, um algoritmo pode ser definido como uma sequência finita de regras, raciocínios ou
operações que, aplicada a um número finito de dados, permite solucionar classes semelhantes de problemas.
Na informática, um algoritmo pode ser definido como um conjunto das regras e procedimentos lógicos
perfeitamente definidos que levam à solução de um problema em um número finito de etapas.
4. (CESPE/TRE-TO - 2017) Assinale a opção que apresenta o resultado final após a execução do algoritmo
precedente.
A) B
B) A
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
C) AC
D) C
E) BC
Comentários:
O algoritmo começa com a atribuição do valor 12 à variável numero. A seleção "se (numero mod 2 = 0)"
resulta em verdadeiro, é executado escreva("A"). O teste seguinte (numero > 12) resulta em falso, então
nada é executado. Portanto, apenas "A" é escrito.
5. (Quadrix/CRM-PR - 2018) Em um fluxograma, as caixas de decisão são como “caixas pretas”, uma vez
que não se tem clareza da ação que será executada.
Comentários:
Uma caixa de decisão é muito clara, pois tem uma condição e, caso seja verdadeira "vai para um lado", senão
"vai para outro":
Comentários:
Os algoritmos são uma sequência de instruções com o objetivo de resolver um problema. Claro que não pode
ser infinito, senão não resolveria o problema em vida! Logo, a questão está correta.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Relembrando...as linguagens de programação de alto nível são aquelas mais próximas do ser humano. Alguns
exemplos são ASP, C, Pascal, Visual Basic etc. A proporção entre as instruções de alto nível e as de baixo nível
(linguagem de montagem) é 1:n, ou seja, um simples printf("ola"); da linguagem C gera mais de uma
instrução Assembly.
As linguagens de programação de baixo nível são próximas ao hardware, sendo que a linguagem de
montagem (Assembly) possui uma relação 1:1 com o código objeto (binário). Se for necessária a união de
mais de um código objeto (programa objeto), deve-se utilizar o ligador (linkeditor), sendo que a carga ocorre
em tempo de compilação. Quando utilizadas as DLLs (Dynamic Link Library), a carga ocorre em tempo de
execução. Ou seja, se for a união de algo "fixo" (códigos objeto), há uma ligação deles, e no caso de DLLs, os
programas fazem a chamada delas somente quando são executados, deixando os executáveis menores.
Uma questão interessante é em relação à linguagem Java, que é compilada e interpretada. A compilação
gera o Bytecode, que é interpretado pelas máquinas virtuais Java (JVMs).
Compilador
De uma forma mais abrangente, um compilador serve para traduzir o código fonte de uma linguagem de
programação de alto nível (C, Pascal etc.) para uma linguagem de programação de baixo nível (Assembly ou
código de máquina). O candidato tem que pescar da banca como ela quer cobrar, se quer o entendimento
alto nível → Assembly ou alto nível → código objeto. Abaixo vamos ver as etapas da forma mais completa,
mas pode ser que o examinador nem cobre todas. Importante saber que existem as fases de análise (análise
do código fonte) e de síntese. Coloquei em vermelho e verde, de acordo com a figura apresentada abaixo.
Dentro de cada fase existem algumas etapas, que veremos a seguir.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Analisador semântico: tem como principal objetivo captar o significado das ações
a serem tomadas no código fonte. Sua principal função é criar uma interpretação
do texto, gerando uma linguagem intermediária. Algumas ações típicas são:
Otimizador de código: é uma etapa opcional que dificulta a engenharia reversa. A ideia principal é a
otimização de:
• Tempo;
• Espaço;
• Consumo energético.
Alguns termos interessantes que já foram cobrados em provas de concurso são mostrados a seguir.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Compilador cruzado (cross compiler): produz código executável para uma plataforma diferente da qual o
compilador está sendo executado. Ex.: compilador no Linux que gera código para o Windows.
Compilação JIT (Just In Time): tradução dinâmica (o próprio termo já deixa claro: "na hora"). Transforma um
sistema híbrido em um sistema de compilação adiada (compilação de um programa em tempo de execução).
Segundo a IBM, “o JIT é um componente do ambiente de tempo de execução que melhora o desempenho
de aplicativos Java compilando bytecodes para o código de máquina nativo em tempo de execução”.
Montador e Ligador
O montador (assembler) é o responsável pela tradução de código em linguagem Assembly para código
objeto (binário). Em sistemas Unix-like, o código objeto geralmente é armazenado em arquivos com a
extensão “.o”.
O ligador (linker ou link-editor) combina todos os arquivos objeto em tempo de compilação, gerando o
programa executável em linguagem de máquina. Por exemplo, o #include (linguagem de programação C) faz
com que bibliotecas sejam incluídas no programa para que comandos que estão descritos nelas possam ser
utilizados. Então, se o programador incluir alguma biblioteca desnecessária, o executável terá um tamanho
maior e comandos dessa biblioteca nunca serão utilizados!
O linker não combina as DLLs (bibliotecas dinâmicas - códigos objeto utilizados por vários programas), pois
estas são carregadas em tempo de execução.
Como já vimos anteriormente, um compilador pode assumir o papel do assembler também, sendo um "2 em
1", mas isso você tem que "pescar" da questão. Tudo depende do examinador que a elaborou!
Vemos também na figura que, o código objeto, junto com bibliotecas (menos as bibliotecas dinâmicas - DLLs),
são ligados através do linker, para gerar o código executável. Na prática, um compilador também já faz esse
papel hoje em dia, mas lembre-se mais uma vez...estamos focando em concurso, e pode haver a cobrança
de todos os elementos que vimos de forma separada!
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Interpretador
Até há pouco estávamos falando de tradução em que tínhamos uma entrada e era gerada uma saída, ex.:
código C compilado com o compilador gcc (que também "faz a parte do montador" e do ligador), gerando
um programa executável.
Agora vamos ver o que é o interpretador...trata-se de um programa que "traduz instantaneamente" o código
de programação de alto nível em código de máquina sem criar um arquivo executável do programa
traduzido. Ou seja, a tradução acontece instrução a instrução, o que obviamente é mais lento, se comparado
com a compilação. Alguns exemplos de linguagens interpretadas são BASIC, Perl e Python. Um exemplo de
interpretador de shell (no Linux) é o Bash.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Comentários:
Tendo em consideração aquele conceito mais simples, está ok. Por exemplo, se você pegar o gcc, que é um
compilador bastante conhecido, é só passar como entrada um programa feito em C que ele entrega o
executável pronto para ser utilizado. Portanto, a questão está correta.
2. (CESPE/TCE-PA - 2016) Na compilação de um programa que chama uma biblioteca compartilhada, todo
o código da biblioteca é copiado e inserido dentro do binário final.
Comentários:
Uma biblioteca compartilhada (ex.: DLL, no Windows) não é compilada junto com o código fonte. O
executável faz chamadas à DLL, inclusive se a DLL for atualizada, as chamadas serão feitas para a nova DLL
sem haver a necessidade de nova compilação! Portanto, a questão está errada.
Comentários:
Enquanto um compilador traduz o código fonte em um código binário (o montador também faz isso), o
interpretador traduz instrução por instrução "online", sem gerar nenhum código executável. Portanto, a
questão está correta.
Comentários:
• traduzir um código fonte de alto nível em um código de montagem (Assembly) e um montador traduz
o Assembly em código objeto;
• traduzir o código fonte direto para o executável "final" (como se tivesse embutido um assembler e
um linker).
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
5. (CESPE/ABIN - 2018) Chama-se cruzado o compilador que gera um programa que seja executável em
pelo menos um sistema operacional diferente daquele onde o compilador tenha sido executado.
Comentários:
Compilador cruzado (cross compiler): produz código executável para uma plataforma diferente da qual o
compilador está sendo executado. Ex.: compilador no Linux que gera código para o Windows.
6. (CESPE/ABIN - 2018) Em um compilador, os tokens são identificados na fase de análise léxica e são
representados por três propriedades: classe, valor e posição.
Comentários: ==13ab2a==
Analisador léxico: tem como principal função a fragmentação do programa fonte em trechos elementares
completos e com identidade própria (tokens). São eliminados os delimitadores e comentários, há a
identificação de palavras reservada etc.
Há uma varredura no programa fonte da esquerda para a direita, agrupando os símbolos de cada item léxico
e determinando a sua classe. Os tokens são representados por três propriedades: classe, valor e posição.
Classe é uma palavra reservada, um operador aritmético, delimitadores, identificadores etc. Alguns
exemplos de token, entre aspas: "if", "else", "(", ")", "+", "-".
7. (CESPE/ABIN - 2018) A etapa de análise semântica de um compilador tem como objetivo verificar os
inter-relacionamentos de um programa, validando tipologias, fluxos de controle e unicidade na
declaração de variáveis.
Comentários:
Analisador semântico: tem como principal objetivo captar o significado das ações a serem tomadas no código
fonte. Sua principal função é criar uma interpretação do texto, gerando uma linguagem intermediária.
Algumas ações típicas são:
8. (CESPE/EBSERH - 2018) Compilador é o programa que traduz o código fonte de uma linguagem de
programação de alto nível para uma linguagem de programação de baixo nível.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Agora apareceu uma questão que cobra o conceito mais "detalhista", ou seja, que o compilador traduz de
uma linguagem de alto nível (ex.: C) em uma linguagem de baixo nível (linguagem de montagem - Assembly).
A partir daqui quem assume é o assembler e o linker. Portanto, a questão está correta.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
A) debugger.
B) compilador.
C) montador.
D) fortran.
E) otimizador.
Comentários:
Podemos ver que a banca optou pelo conceito mais abrangente, aquele que define que o compilador traduz
do código fonte de alto nível para o Assembly (baixo nível). Depois deveria ser utilizado o montador para
transformar o Assembly em código objeto e, se fosse necessário fazer alguma ligação com bibliotecas ou
outros códigos objeto, deveria ser utilizado um ligador (linker). Portanto, a alternativa B está correta e é o
gabarito da questão.
2. (FCC/TCE-GO - 2014) Compiladores, montadores e ligadores são softwares que convertem programas
de um formato de código (entrada) para um mais próximo ao formato executável compreendido pela
máquina (saída). Os ligadores geram como saída
A) programas objeto.
Comentários:
O ligador (linker) está lá no fim, depois do código fonte ter sido compilado e montado. Ele gera o código
binário pronto para ser executado. Portanto, a alternativa D está correta e é o gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
necessidade de qualquer outro programa, recurso ou instalação, a não ser o sistema operacional (SO)
nativo de sua máquina. Nessas circunstâncias, o programador necessitará de um
A) tradutor capaz de gerar código para uma máquina virtual que executará o programa.
B) montador (assembler) capaz de gerar código de máquina para a plataforma e SO do cliente, a partir de
um código de montagem (assembly).
D) ligador (linkeditor) capaz de unir o código objeto da plataforma do programador com as bibliotecas
existentes apenas na plataforma e SO do cliente.
Comentários:
Nessa questão o examinador utilizou o conceito mais simplificado de compilador, pois ele "pega" o código
fonte e já entrega o executável pronto para ser executado no sistema operacional o qual o compilador
funciona (ex.: compilador no Windows gerando um software para o Windows). Notamos que esse
compilador é aquele que tem "embutidas" as funcionalidades do montador e do ligador também. Portanto,
a alternativa E está correta e é o gabarito da questão.
A) Montagem.
B) Compilação.
C) Linkedição.
D) Interpretação.
E) Carregador.
Comentários:
Percebemos que essa questão é detalhista, ou seja, o compilador não gera direto o executável. Então vamos
ver a sequência: código fonte → compilador → montador → ligador (link-editor) → executável.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
II. Identificação de sequências de símbolos que constituem estruturas como expressões e comandos,
através de uma varredura, ou parsing, da representação interna do programa fonte, produzindo uma
estrutura em árvore, chamada árvore de derivação.
III. Verificação das estruturas quanto ao sentido, ou seja, se o programa não possui erros de significado.
Por exemplo, verifica se um identificador declarado como variável é utilizado como tal, se existe
compatibilidade entre operandos e operadores em expressões etc.
Comentários:
I. Quando o foco é em tokens, estamos falando da análise léxica. II. Quando o foco é em varredura (parsing)
para a produção de uma estrutura em árvore (árvore de derivação), estamos falando da análise sintática. III.
Quando há uma busca pelo sentido/significado, trata-se da análise semântica. Portanto, a alternativa A está
correta e é o gabarito da questão.
I. cria o código objeto traduzindo as instruções da linguagem de montagem (assembly) para código de
máquina;
II. recebe como entrada um conjunto de arquivos objetos e bibliotecas, e produz como resultado um
arquivo objeto de saída;
III. traduz um programa descrito em uma linguagem de alto nível para um programa em linguagem
simbólica ou linguagem de máquina;
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
IV. recebe uma instrução do programa fonte, converte-a em linguagem de máquina e ordena ao
computador que execute esta instrução.
Comentários:
A) baseado em um sistema de compilação pura não realiza traduções; os programas são interpretados por
um software interpretador.
B) do tipo JIT- Just in Time tem sido utilizado em linguagens como Java e C#. Na prática, JIT transforma um
sistema híbrido em um sistema de compilação adiada.
C) que utiliza implementação híbrida traduz o programa para um código de formato intermediário e este
código é compilado.
D) separa a tarefa de analisar a semântica do código em 2 partes: análise léxica e análise sintática. Este
processo é realizado por uma máquina virtual.
E) de uma linguagem de programação traduz código de baixo nível para linguagem de máquina.
Comentários:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
Compilação JIT (Just In Time): tradução dinâmica (o próprio termo já deixa claro: "na hora"). Transforma um
sistema híbrido em um sistema de compilação adiada (compilação de um programa em tempo de execução).
Segundo a IBM, “o JIT é um componente do ambiente de tempo de execução que melhora o desempenho
de aplicativos Java compilando bytecodes para o código de máquina nativo em tempo de execução”.
C) gerar o código objeto correspondente à tradução do programa-fonte para alguma forma intermediária de
representação;
Comentários:
Comentários:
Palavra-chave = tokens → Analisador léxico! Portanto, a alternativa D está correta e é o gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
B) o link-editor é o utilitário responsável por carregar, na memória principal, um programa para ser
executado.
E) a grande vantagem do uso de interpretadores é o tempo gasto na tradução de suas instruções sempre
que é executado.
Comentários:
O ligador (link-editor) é aquele "lá no final", que une códigos objeto em um único arquivo executável. Daí o
nome ligador! Portanto, a alternativa D está correta e é o gabarito da questão.
11. (SUGEP-UFRPE/UFRPE - 2018) Abaixo, estão enumeradas as fases que integram o front-end de um
compilador:
1) Análise Semântica
2) Análise Léxica
3) Análise Sintática
A) 1, 3, 2 e 4.
B) 3, 1, 4 e 2.
C) 2, 3, 1 e 4.
D) 1, 4, 2 e 3.
E) 4, 1, 2 e 3.
Comentários:
2, 3, 1 e 4
Verifica os tokens (análise léxica) → Realiza a varredura (parsing) para montar a árvore de derivação (análise
sintática) → verifica o significado (tipo de dados, fluxo) (análise semântica) → gera o código intermediário.
Portanto, a alternativa C está correta e é o gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
12. (IBADE/Câmara de Porto Velho-RO - 2018) Algumas linguagens exigem que o código fonte seja
previamente traduzido para linguagem de máquina antes de ser executado. Chama-se esta fase de:
A) Linkedição.
B) Interpretação.
C) Tradução.
D) Compilação.
E) Edição.
Comentários:
O examinador usou o conceito mais simples, aquele em que o compilador possui "embutidos" o assembler
e o link-editor, tendo como entrada o código fonte e como saída o arquivo executável. Portanto, a alternativa
D está correta e é o gabarito da questão.
D) a quantidade de estágios de pipeline que a arquitetura deve ter para executar o programa.
Comentários:
O conjunto de instruções de uma arquitetura (ISA) define as instruções e os seus formatos. Não tem nada a
ver com compilador! Só coloquei aqui como pegadinha mesmo! Portanto, a alternativa C está correta e é o
gabarito da questão.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
LISTA DE QUESTÕES
1. (FUNIVERSA/IPHAN - 2009) Um sistema de processamento de dados é composto, basicamente, por
três etapas: (1) entrada de dados, (2) processamento ou tratamento da informação e (3) saída. Em um
computador, essas tarefas são realizadas por partes diversas que o compõem, como teclado, mouse,
microprocessador, memória etc. Levando-se em conta as tarefas de processamento de dados
realizadas por um computador, é correto afirmar que
A) dispositivos de hardware como teclado e mouse são responsáveis pela saída de dados, uma vez que
escrevem ou apontam o resultado esperado em uma operação realizada pelo computador.
B) acessórios modernos como webcams, bluetooth e leitores biométricos são dispositivos de saída de dados
incorporados a alguns computadores como acessórios de fábrica.
C) a tela (ou monitor) de um computador comporta-se como um dispositivo de entrada de dados, quando se
trabalha em sistemas de janelas, com botões a serem “clicados” pelo usuário.
D) as impressoras multifuncionais são dispositivos mistos, de entrada, processamento e saída de dados, pois
podem ler (scanner), processar (memória interna) e imprimir informações.
E) a entrada de dados é tarefa realizada pela pessoa (ou por um programa de computador) responsável por
alimentar o sistema com dados necessários para atingir o resultado esperado.
B) Memória Principal.
C) Memória Secundária.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
4. (MS CONCURSOS/IF-AC - 2014) Dentre as funções básicas do computador, podemos citar, exceto:
A) Entrada de dados.
B) Processamento de Dados.
C) Saída de Informações.
D) Capacidade de Unidade.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
6. (UFMT/UFSBA - 2017) A respeito de memória cache, os projetos denominados arquitetura Harvard são
aqueles
B) cujos conceitos do princípio da localidade foram descartados e adotou-se um protocolo serial de acesso a
dados.
D) cujo empacotamento de módulos de memória cache foi colocado fora do chip, reduzindo o custo de
produção e aumentando a quantidade de memória disponível.
B) utilizar memória cache entre o processador e a memória principal com caminhos separados para dados e
instruções.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
9. (CESPE/ABIN - 2018) Na arquitetura de Von Neumann, o caminho único de dados é o barramento físico,
que liga a memória diretamente aos dispositivos de entrada e saída (E/S): o objetivo desse barramento
é a troca de dados externos com a máquina, enquanto a memória guarda os dados de forma
temporária no computador. ==13ab2a==
10. (COPESE-UFT/UFT - 2018) Em 1952 John von Neumann desenvolveu um protótipo de um novo
computador de programa armazenado. Esse projeto ficou conhecido como arquitetura de Von
Neumann e ainda hoje influencia o projeto de computadores modernos. Os componentes abaixo fazem
parte da arquitetura de Von Neumann, EXCETO:
A) Memória Principal.
C) Barramento.
11. (INSTITUTO PRÓ-MUNICÍPIO/CRP-11ª Região - 2019) O computador é uma máquina que processa
informações eletronicamente, na forma de dados e pode ser programado para as mais diversas tarefas.
As fases do processamento são:
A) há poucos registradores.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
13. (FCC/TRE-AM - 2010) Numa máquina estruturada multinível, é o nível essencial para as máquinas CISC
(Complex Instruction Set Computer), mas que inexiste nas máquinas RISC (Reduced Instruction Set
Computer). Trata-se do nível
A) do sistema operacional.
B) de lógica digital.
C) de microprogramação.
D) convencional de máquina.
E) do montador.
14. (CESPE/Correios - 2011) As instruções CISC são mais simples que as instruções RISC, por isso, os
compiladores para máquinas CISC são mais complexos, visto que precisam compensar a simplificação
presente nas instruções. Entretanto, se for usado pipeline, a complexidade do compilador CISC é
reduzida, pois a arquitetura pipeline evita a necessidade de reordenação inteligente de instruções.
15. (VUNESP/UNESP - 2013) Um computador baseado em uma Unidade Central de Processamento do tipo
RISC
C) Operações memória-para-memória.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
18. (IADES/PCDF - 2016) Em relação ao projeto de máquinas RISC e CISC, assinale a alternativa correta.
A) Dadas as características das instruções das máquinas CISC, o pipeline fica favorecido nessa arquitetura.
B) Arquiteturas RISC normalmente realizam poucas operações de registrador para registrador, aumentando
o acesso à memória cache.
C) Programas para arquiteturas CISC sempre possuem tamanho menor que programas para arquiteturas
RISC, devido à relação um para um de instruções de máquina e instruções de compilador.
D) Arquiteturas RISC tendem a enfatizar referências aos registradores no lugar de referências à memória.
E) Arquiteturas CISC usam um número muito grande de instruções simples em detrimento de instruções
complexas.
19. (INAZ do Pará/CORE-SP - 2019) “O projeto do Conjunto de Instruções inicia com a escolha de uma entre
duas abordagens, a abordagem RISC e a CISC”.
B) Objetivo de criar um hardware mais otimizado, com isso os programas tendem a ocupar menos espaço
em memória.
C) Grande número de registradores de propósito geral e os programas tendem a ocupar menos espaço em
memória.
20. (Quadrix/CRA-PR - 2019) Possuir um conjunto de instruções simples e limitado é uma das principais
características da arquitetura CISC.
21. (Quadrix/CRA-PR - 2019) A característica que mais se destaca na arquitetura RISC é que computadores
pertencentes a ela realizam milhares de instruções por ciclo.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
22. (Quadrix/CREA-GO - 2019) Uma máquina RISC, geralmente, usa um conjunto de modos de
endereçamento relativamente simples e direto.
23. (CESPE/TJ-PA - 2020) Na tentativa de solucionar o chamado espaço semântico (semantic gap),
fabricantes de computadores de grande porte criaram alternativas para resolver o problema, como,
por exemplo,
A) apenas o item I.
E) todos os itens.
24. (CESPE/TCE-PA - 2016) Utilizando-se linguagens fracamente tipadas, é possível alterar o tipo de dado
contido em uma variável durante a execução do programa.
25. (CESPE/TCE-PA - 2016) Acerca de funções e procedimentos em subprogramas, julgue o item que se
segue.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
No algoritmo solução1 apresentado a seguir as variáveis X, A e B são criadas com escopo global; no
algoritmo solução2 apresentado após algoritmo solução1, as variáveis A e B são criadas com escopo
global e a variável X com escopo local.
26. (FUNDEP/UFVJM-MG - 2017) Assinale a alternativa que apresenta corretamente a sequência de passos
computacionais que transforma a entrada na saída, ou seja, procedimentos necessários para resolver
um determinado problema.
A) Algoritmos
B) Arquivos
C) Cases
D) Polinômio
27. (CESPE/TRE-TO - 2017) Assinale a opção que apresenta o resultado final após a execução do algoritmo
precedente.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
A) B
B) A
C) AC
D) C
E) BC
28. (Quadrix/CRM-PR - 2018) Em um fluxograma, as caixas de decisão são como “caixas pretas”, uma vez
que não se tem clareza da ação que será executada.
29. (Quadrix/CRM-PR - 2018) Os algoritmos são sequências finitas de instruções que, quando
corretamente executadas, levam à solução de um problema.
30. (VUNESP/Prefeitura de Ribeirão Preto-SP - 2018) Uma arquitetura de computador hipotética utiliza um
microprocessador que possui instruções com o modo de endereçamento “endereçamento indireto por
registrador”. Considere a instrução de máquina a seguir, que utiliza esse tipo de endereçamento,
envolvendo o registrador R1.
ADD A,(R1), 8
Considerando esse contexto, e que A representa o acumulador, 8 representa um valor imediato e ADD
é o mnemônico de uma instrução de máquina que realiza a operação soma, assinale a alternativa que
apresenta uma funcionalidade coerente para essa instrução e que utiliza o endereçamento indireto
por registrador.
B) O resultado da soma do valor que está em R1 com o valor do acumulador é armazenado no próprio
acumulador.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
D) O resultado da soma do valor 8 com o dado que está na memória em um endereço apontado por R1 é
armazenado no acumulador.
E) O resultado da soma do valor que está armazenado em R1 com o dado que está na memória de endereço
8 é armazenado no acumulador.
31. (FADESP/IF-PA - 2018) Em um sistema de computação, o modo mais simples de uma instrução
especificar um operando é a parte da instrução referente ao endereço conter o operando de fato em
vez de um endereço que descreva onde ele está. Ou seja, o operando é automaticamente buscado na
memória, ao mesmo tempo que a própria instrução. Esse modo de endereçamento é denominado
A) imediato.
B) direto.
D) indireto.
E) indexado.
32. (CESPE/ABIN - 2018) No método de endereçamento direto, a instrução contém o endereço da memória
onde o dado está localizado.
34. (UFRR/UFRR - 2019) Quanto mais um programador dominar uma linguagem de programação, melhor
ele conseguirá se expressar no mundo da programação e mais recursos ele terá para escrever soluções
para problemas computacionais via código.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
A) C
B) C++
C) Assembly
D) JAVA
E) Visual Basic
B) campo operando da instrução está indicado o endereço de memória, onde se localiza o dado.
C) campo operando da instrução está indicado o endereço de memória, onde se localiza o endereço do dado.
E) código de operação da instrução está indicado o endereço de memória, onde se localiza endereço do
dado.
36. (FGV/SUSAM - 2014) 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.
37. (FCC/TCE-GO - 2014) Compiladores, montadores e ligadores são softwares que convertem programas
de um formato de código (entrada) para um mais próximo ao formato executável compreendido pela
máquina (saída). Os ligadores geram como saída
A) programas objeto.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
38. (CESGRANRIO/CEFET-RJ - 2014) Um programador escolheu uma linguagem de alto nível para
desenvolver uma aplicação para um cliente. Ele deseja entregar um código executável que possa ser
simplesmente copiado na área de trabalho do cliente, que poderá executá-lo quando desejar, sem a
necessidade de qualquer outro programa, recurso ou instalação, a não ser o sistema operacional (SO)
nativo de sua máquina. Nessas circunstâncias, o programador necessitará de um
A) tradutor capaz de gerar código para uma máquina virtual que executará o programa.
B) montador (assembler) capaz de gerar código de máquina para a plataforma e SO do cliente, a partir de
um código de montagem (assembly).
D) ligador (linkeditor) capaz de unir o código objeto da plataforma do programador com as bibliotecas
existentes apenas na plataforma e SO do cliente.
A) Montagem.
B) Compilação.
C) Linkedição.
D) Interpretação.
E) Carregador.
40. (FCC/TRT-14ª Região - 2016) A compilação é o processo de tradução de um programa escrito em uma
linguagem fonte em um programa equivalente em linguagem de máquina. Nesse processo, o programa
fonte normalmente passa pelas fases:
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
II. Identificação de sequências de símbolos que constituem estruturas como expressões e comandos,
através de uma varredura, ou parsing, da representação interna do programa fonte, produzindo uma
estrutura em árvore, chamada árvore de derivação.
III. Verificação das estruturas quanto ao sentido, ou seja, se o programa não possui erros de significado.
Por exemplo, verifica se um identificador declarado como variável é utilizado como tal, se existe
compatibilidade entre operandos e operadores em expressões etc.
I. cria o código objeto traduzindo as instruções da linguagem de montagem (assembly) para código de
máquina;
II. recebe como entrada um conjunto de arquivos objetos e bibliotecas, e produz como resultado um
arquivo objeto de saída;
III. traduz um programa descrito em uma linguagem de alto nível para um programa em linguagem
simbólica ou linguagem de máquina;
IV. recebe uma instrução do programa fonte, converte-a em linguagem de máquina e ordena ao
computador que execute esta instrução.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
A) baseado em um sistema de compilação pura não realiza traduções; os programas são interpretados por
um software interpretador.
B) do tipo JIT- Just in Time tem sido utilizado em linguagens como Java e C#. Na prática, JIT transforma um
sistema híbrido em um sistema de compilação adiada.
C) que utiliza implementação híbrida traduz o programa para um código de formato intermediário e este
código é compilado.
D) separa a tarefa de analisar a semântica do código em 2 partes: análise léxica e análise sintática. Este
processo é realizado por uma máquina virtual.
E) de uma linguagem de programação traduz código de baixo nível para linguagem de máquina.
43. (FGV/IBGE - 2017) O módulo de análise léxica de um compilador tem por objetivo:
C) gerar o código objeto correspondente à tradução do programa-fonte para alguma forma intermediária de
representação;
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
B) o link-editor é o utilitário responsável por carregar, na memória principal, um programa para ser
executado.
E) a grande vantagem do uso de interpretadores é o tempo gasto na tradução de suas instruções sempre
que é executado.
46. (SUGEP-UFRPE/UFRPE - 2018) Abaixo, estão enumeradas as fases que integram o front-end de um
compilador:
1) Análise Semântica
2) Análise Léxica
3) Análise Sintática
A) 1, 3, 2 e 4.
B) 3, 1, 4 e 2.
C) 2, 3, 1 e 4.
D) 1, 4, 2 e 3.
E) 4, 1, 2 e 3.
47. (IBADE/Câmara de Porto Velho-RO - 2018) Algumas linguagens exigem que o código fonte seja
previamente traduzido para linguagem de máquina antes de ser executado. Chama-se esta fase de:
A) Linkedição.
B) Interpretação.
C) Tradução.
D) Compilação.
E) Edição.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
D) a quantidade de estágios de pipeline que a arquitetura deve ter para executar o programa.
50. (CESPE/TCE-PA - 2016) Na compilação de um programa que chama uma biblioteca compartilhada, todo
o código da biblioteca é copiado e inserido dentro do binário final.
52. (CESPE/TCE-PA - 2016) Compilador é um utilitário responsável por executar um programa objeto
diretamente na máquina.
53. (CESPE/ABIN - 2018) Chama-se cruzado o compilador que gera um programa que seja executável em
pelo menos um sistema operacional diferente daquele onde o compilador tenha sido executado.
54. (CESPE/ABIN - 2018) Em um compilador, os tokens são identificados na fase de análise léxica e são
representados por três propriedades: classe, valor e posição.
55. (CESPE/ABIN - 2018) A etapa de análise semântica de um compilador tem como objetivo verificar os
inter-relacionamentos de um programa, validando tipologias, fluxos de controle e unicidade na
declaração de variáveis.
56. (CESPE/EBSERH - 2018) Compilador é o programa que traduz o código fonte de uma linguagem de
programação de alto nível para uma linguagem de programação de baixo nível.
00341760390 -1289002
Marilu da Silva Bezerra
Equipe Informática e TI, Evandro Dalla Vecchia Pereira
Aula 00
GABARITO
1. E 30. Certo
2. D 31. D
3. Certo 32. A
4. C 33. Certo
5. D 34. D
6. E 35. C
7. C 36. B
8. B 37. B
9. A 38. D
10. Errado 39. E
11. C 40. C
12. B 41. A
13. E 42. D
14. C 43. B
15. Errado 44. B
16. B 45. D
17. C 46. D
18. Errada 47. C
19. D 48. D
20. A 49. C
21. Errado 50. Certo
22. Errado 51. Errado
23. Certo 52. Certo
24. A 53. Errado
25. Certo 54. Certo
26. Certo 55. Certo
27. A 56. Certo
28. B 57. Certo
29. Errado
00341760390 -1289002
Marilu da Silva Bezerra