Вы находитесь на странице: 1из 10

Lista de exerccios Cap 1 - PLP - Robert W.

Sebesta

1. Por que til para um programador ter alguma experincia no projeto de linguagens, mesmo
que ele nunca projete uma linguagem de programao?

R: Alguns dos critrios para aprender paradigmas de linguagens de programao:

Capacidade aumentada para expressar ideias: As linguagens de programao usadas podem


impor restries no que diz respeito a abstrao de idias, estruturas de controle e de dados,
logo o conhecimento mais amplo em linguagens faz com o programador no apresente tanta
dificuldade na elaborao das idias de construo do software.

Embasamento para escolher linguagens adequadas: linguagens so como ferramentas, logo


devem ser escolhidas de acordo com a necessidade do projeto vigente.

Habilidade aumentada para aprender novas linguagens: Quando se aprende os conceitos dos
paradigmas por traz de uma linguagem, fica muito mais fcil entender linguagens que utilizem
aquele paradigma.

Melhor entendimento da importncia da implementao: os conceitos de linguagens de


programao podem levar a uma pessoa a ter um maior domnio de uma determinada
linguagem de programao e por sua vez da implementao dela e de como usar seus recursos
da melhor maneira possvel.

Melhor uso de linguagens j conhecidas e consolidadas: os conceitos de linguagens de


programao podem levar a uma pessoa a saber mais sobre uma linguagem que ela j utilize.

Avano geral da computao: Uma determinada linguagem pode acabar sendo melhor que
outra, mas no apresentar muita notoriedade. Em alguns casos uma determinada linguagem
pode ser baseada em uma mais antiga, trazendo consigo aspectos antigos e novos.

2. Como o conhecimento de linguagens de programao pode beneficiar toda a comunidade da


computao?

R: Uma linguagem de programao poder X poder ganhar notoriedade em face uma linguagem
de programao Y com base em possveis falhas da X. Ou seja, a comunidade poder ganhar
novas linguagens que substituem aquelas que so tidas como ruins ou at mesmo criar novas
para atingir objetivos especficos (suponha que Y uma linguagem boa, mas no possui recursos
web, uma nova linguagem W poder ser construda com base em Y e mais outros elementos para
preencher a lacuna de linguagem para web). Em suma, a comunidade pode sempre verificar os
pontos fortes e fracos numa linguagem, criando outras melhores, tomando como base sempre os
pontos fortes dela (e seu paradigma) e melhorando o que falta.

3. Que linguagem de programao tem dominado a computao cientfica nos ltimos 50 anos?
R: Fortran tem sido muito utilizada no ramo da computao cientfica, tendo sofrido diversas
atualizaes durante os anos.

4. Que linguagem de programao tem dominado as aplicaes de negcios nos ltimos 50 anos?

R: COBOL, uma vez que considerado com uma excelente linguagem geradora de relatrios.

5. Que linguagem de programao tem dominado a Inteligncia Artificial nos ltimos 50 anos?

R: Lisp, uma vez que a linguagem utiliza a notao lambda e tambm trabalha extensivamente
com listas e outras estruturas elementares tanto utilizadas em aplicaes de inteligncia.

6. Em que linguagem o UNIX escrito?

R: O sistema Unix foi escrito em linguagem C, em meados de 1970. Denis Ritchie foi o idealizador
desta linguagem e graas ao sistema Unix ela obteve uma grande fama. Atualmente C muito
utilizado em sistemas embarcados.

7. Qual a desvantagem de ter muitas caractersticas em uma linguagem?

R: Uma linguagem que contenha muitos recursos tender a consumir muito processamento ou
espao em memria.

8. Como a sobrecarga de operador definida pelo usurio pode prejudicar a legibilidade de um


programa?

R: Uma sobrecarga de operadores consistente e bem definida poder deixar o cdigo


relativamente simples de ser escrito e entendido, mas se for feita de qualquer maneira poder ter
consequncias desagradveis. Vamos supor o caso do operador de adio +. Se ele for
permitido para a soma de valores inteiros e flutuantes, isso gerar uma facilidade de compreenso
e escrita no cdigo, trazendo at certa simplicidade. No entanto se algum usurio tiver a
possibilidade de us - lo para quaisquer outras operaes, poder acarretar no no entendimento
do cdigo por parte de outro desenvolvedor, deixando - o confuso. Se pegarmos por exemplo o
operador ++, utilizado pelo C/C++ como operador de incremento de uma unidade
(principalmente me laos for) e sobrecarregarmos ele para qualquer outra coisa, um outro
programador C ou C++ poder no entender o cdigo ao v - lo sendo usado de uma forma no
convencional.

9. Cite um exemplo da falta de ortogonalidade no projeto da linguagem C.

R: C apresenta basicamente dois tipos de dados estruturados: vetores e registros (structs). Os


registros podem ser retornados por funes, no entanto, vetores no podem. C utiliza void para
indicar a no existncia de um elemento (ex: uma funo tida como void no retorna nenhum
valor). Neste contexto, uma estrutura pode conter quaisquer tipos de dados, exceto o void ou uma
estrutura de mesmo tipo. O mesmo ocorre com vetores: eles podem te quaisquer tipos, menos o
tipo void. Ao utilizar passagem de valores para dentro de uma funo ou procedimento, C utiliza a
tcnica de passagem por valor (ou seja, ele passa uma cpia dos dados para a funo), no
entanto, ao passar um vetor, o mesmo passado como referencia.

10. Qual linguagem usou a ortogonalidade como um critrio de projeto primrio?


R: Assembly utilizado pelas mainframes da IBM, principalmente se comparado com os
minicomputadores VAX.

11. Que sentena de controle primitiva usada para construir sentenas de controle mais
complicadas em linguagens que no as tm?

R: Voc pode usar vetores e ponteiros para construir sentenas muito mais complexas, como por
exemplo listas encadeadas, rvores e outros. No caso voc poder utilizar a ideia de vetores e
ponteiros associados a algum tipo de dado primitivo, como o int, criando assim uma estrutura de
dados como uma lista que armazena valores inteiros.

12. Que construo de uma linguagem de programao fornece abstrao de processos?

R: A abstrao algo tido como importante pois permite a facilidade de escrita de uma linguagem.
Um exemplo de abstrao pode ser encontrado na construo de uma funo (subprograma), a
fim de resolver algum problema especfico nele. Se no fosse possvel ter essa abstrao, o
cdigo dessa funo teria que ser replicado nos diversos pontos do programa onde ele fosse
utilizado.

13. O que significa para um programa ser confivel?

R: Um programa tido como confivel quando est de acordo com suas especificaes em todas
as condies. Alm disso existem basicamente dois pontos que levam um programa ser tido como
confivel:

Verificao de tipos: Um programa executa testes para detectar erros de tipo, tanto em tempo de
compilao, quanto em tempo de execuo.

Tratamento de excees: Um programa tem a habilidade de identificar e tratar erros, tomando


medidas corretivas quando uma falha encontrada ou uma exceo ocorre.

14. Por que verificar os tipos dos parmetros de um subprograma importante?

R: quando a linguagem ou o ambiente em si incapaz de realizar uma verificao de tipos de


parmetros passados a uma funo, simplesmente deixando passar qualquer tipo, voc poder
ter resultados inconsistentes. Por exemplo, se uma funo tem em seu cabealho (definio da
funo) um parmetro do tipo int e passado a ela um tipo float, podero haver problemas com
relao aos clculos feitos para se manter a representao de tal valor. Por exemplo, um int no
possui representao da parte fracionria, o range de um int tende a ser muito menor que o de um
float, o que gera um calculo de parte decimal muito defasado e sem nexo. Por fim, se o ambiente
ou o compilador no capaz de emitir nem um warning informando tal problema, a depurao
torna - se praticamente impossvel.

15. O que so apelidos?

R: Apelidos so espcies de identificadores, geralmente utilizados quando se possvel ter um ou


manis nomes definidos para acessar a mesma clula de memria. Um apelido por exemplo, pode
ser definido quando dois ponteiros esto apontando para a mesma variassem.

16. O que o tratamento de excees?


R: O tratamento de excees a habilidade de um programa de interceptar erros em tempo de
execuo e contorna - los.

17. Por que a legibilidade importante para a facilidade de escrita?

R: A legibilidade um dos conceitos mais importantes na hora de se avaliar uma linguagem de


programao, pois ela compreende justamente a facilidade com que um programa pode ser
entendido. Durante muito tempo, principalmente antes da dcada de 70, as linguagens de
programao estavam mais prximas de instrues de mquina que do usurio em si, o que
tornava a tarefa de construo de softwares algo muito mais complexo de ser feito e
principalmente aprendido. Aps os anos 70 e principalmente aps do surgimento da idias de ciclo
de vida do software, as linguagens comearam a ter um nvel de abstrao maior, tornando - se
mais fceis de serem escritas, lidas e entendidas. Se uma linguagem fcil de ser lida e
entendida, supostamente isso implica que ela tem um alto nvel de abstrao, alm de ser fcil
de ser escrita.

18. Como o custo de compiladores para uma linguagem est relacionado ao projeto dela?

R: Dependendo de como o projeto da linguagem, o compilador poder ter que um grande


nmero de checagens ou no antes de terminar o processo de compilao. Se a quantidade de
checagens for muita, ento ele poder acabar tornando-se ineficiente.

19. Qual tem sido a influncia mais forte no projeto de linguagens de programao nos ltimos 50
anos?

R: Arquitetura de computadores, principalmente no que diz respeito a arquitetura de Von


Neumann.

20. Qual o nome da categoria de linguagens de programao cuja estrutura ditada pela
arquitetura de computadores de von Neumann?

R: So as linguagens classificadas como Imperativas. Linguagens desse tipo descrevem o


programa em termos de seus estados, definindo aes que modifiquem tal estado.

21. Que duas deficincias das linguagens de programao foram descobertas como um resultado
da pesquisa em desenvolvimento de software dos anos 1970?

R: Primeiramente, antes dos anos 1970, as estruturas condicionais usavam muito goto, o que
em muitos casos gerava problemas de legibilidade no cdigo. Um outro problema foi a verificao
de tipos primitivos.

22. Quais so os trs recursos fundamentais de uma linguagem orientada a objetos?

R: Encapsulamento, herana e polimorfismo.

23. Qual foi a primeira linguagem a oferecer suporte aos trs recursos fundamentais da
programao orientada a objetos?

R: Smaltalk

24. D um exemplo de dois critrios de projeto de linguagens que esto em conflito direto um com
o outro.
R: Legibilidade e facilidade de escrita.

25. Quais so os trs mtodos gerais de implementar uma linguagem de programao?

R: compilao, interpretao pura e sistemas hbridos.

26. Qual produz uma execuo de programas mais rpida, um compilador ou um interpretador
puro?

R: Geralmente os programas compilados tendem a consumir menos tempo de execuo. O


interpretador puro ter que, em tempo de execuo, ler as instrues, verifica - las e convert-las
a algo que maquina entenda. J os sistemas hbridos possuem a facilidade de carregar somente
mdulos que so necessrios naquele instante (just in time), o que pode reduzir
consideravelmente o seu custo em relao ao tempo de execuo.

27. Que papel a tabela de smbolos tem em um compilador?

R: A tabela de smbolos serve como uma base de dados para o processo de compilao. O
contedo primrio na tabela de smbolos so informaes de tipo e atributos de cada um dos
nomes definidos pelo usurio no programa. Essa informao colocada na tabela pelos
analisadores lxico e sinttico e usada pelo analisador semntico e pelo gerador de cdigo.

28. O que faz um ligador?

R: O ligador (ou linker) um programa de sistema que tem por objetivo coletar programas de
sistemas e lig - los aos programas de usurio, criando assim o mdulo de carga (tambm
conhecido como imagem executvel).

29. Por que o gargalo de von Neumann importante?

R: A mxima por trs da arquitetura de Von Neumann que a velocidade de conexo entre a
memria e o processador o que define a velocidade do computador, isso porque as instrues
podem ser executadas com mais freqncia do que movidas da memria para o processador.
Essa caracterstica conhecida como Gargalo de Von Neumann e o fator responsvel pelas
pesquisas em computao paralela. A computao paralela por sua vez uma forma de
computao onde os vrios clculos que o processador realiza so quebrados em problemas
menores (clculos menores) e divididos para serem realizados ao mesmo tempo (ou seja, de
forma paralela).

30. Quais so as vantagens de implementar uma linguagem com um interpretador puro?

R: No modo de interpretao puro, o interpretador executa o cdigo escrito de forma direta, sem a
necessidade de um processo de compilao ou criao de um sistema intermedirio (como o
bytecode do Java). A medida que o programa vai sendo lido, ele vai sendo executado. Quando
uma execuo termina e o programa chamado novamente, um novo processo de interpretao
realizado. As vantagens desse modelo consistem em:

Correes e alteraes podem ser realizadas de forma muito mais rpida

No h dispndio do tempo de compilao.


Tende a consumir menos memria
Conjunto de Problemas

1.Voc acredita que nossa capacidade de abstrao influenciada por nosso domnio de
linguagens? Defenda sua opinio.

R: Em tese, sim. Acredito que a capacidade do programador de conseguir observar um problema


e abstra-lo de tal maneira que ele possa enxergar seus mdulos, funes, objetos e outros
elementos algo que est a parte de qualquer linguagem de programao estando pautada
puramente na lgica do programador. No entanto, ao codificar a soluo, tal poder ser
diretamente atingida pela linguagem e por seu paradigma, influenciando em muito o resultado. Por
exemplo: suponha que um programador queira criar um jogo e para isso opta por usar C. Pelo fato
de C no dar suporte ao paradigma de OO (Orientao a Objetos), tal programador acabar tendo
que passar por certos problemas que em linguagens de programao com suporte a OO ele no
teria.

2.Que argumentos voc pode dar a favor da ideia de uma nica linguagem para todos os
domnios de programao?

R: A nica vantagem nessa abordagem est na facilidade de conseguir fazer tudo utilizando uma
nica linguagem de programao. O programador dever aprender somente esta linguagem, sua
plataforma e ambiente de programao.

3.Java usa um smbolo de fechamento de chaves para marcar o trmino de todas as sentenas
compostas. Quais so os argumentos a favor e contra essa deciso de projeto?

R: No projeto foi determinado que o smbolo { definiria a abertura de um bloco, enquanto que o
} definiria o fechamento de bloco. Em tese isso tende a deixar a linguagem mais arrumada, pois
permite que quem l o cdigo saiba quais instrues esto associadas entre si e seus respectivos
escopos. No entanto, por justamente permitir que seja utilizado { }, um programador poder
simplesmente ignorar a indentao do cdigo, deixando - o mais confuso de ser lido e entendido,
afetando em legibilidade.

4. Muitas linguagens distinguem entre letras minsculas e maisculas em nomes definidos pelo
usurio. Quais so as vantagens e desvantagens dessa deciso de projeto?

R: O uso de caixa baixa e alta na definio dos identificadores pode ser usada para deixar o
cdigo mais fcil e legvel, principalmente quando se utiliza nomes compostos, alm de identificar
se algo faz parte de alguma classe, interface ou biblioteca. Por exemplo, vamos supor os
seguintes identificadores: UIView e SKSpriteNode. O UI do UIView" serve para identificar que
ele faz parte do pacote UIKit, responsvel por interfaces de usurio; j o SK" significa que ele
faz parte do SpriteKit, biblioteca responsvel por gerenciar os elementos bsicos relacionados a
jogos, como sprites, sons, e animaes. Um outro uso de caixa alta seria relacionado ao nome de
classes e objetos, como por exemplo, cachorro = new Cachorro(). Em suma, linguagens que
permitem case sensitive, fazem isso visando ampliar a quantidade de identificadores que podem
ser usados, padronizar o cdigo e facilitar a leitura.

Um ponto negativo fica com relao as linguagens que no requerem definio de tipo na
declarao da varivel, como por exemplo o Python, onde varInteiro = 10 diferente de
varinteiro = 10,
5. Explique os diferentes aspectos do custo de uma linguagem de programao.

R: Existem vrios pontos a serem levantados na hora de avaliar o custo de uma linguagem de
programao, a saber:

Treinamento de pessoal: Uma linguagem de programao requer de treinamento para a sua


utilizao.

Escrita de programas: Isso est relacionado a facilidade de escrita da linguagem, a qual


depende da proximidade com o propsito da aplicao em particular. Ao criar uma linguagem
de alto nvel, seus esforos esto direcionados a criao de software de maneira menos
custosa.

Custo de compilao de programas.

Custo de execuo: Dependendo do propsito e de como uma linguagem foi arquitetada, a


mesma poder realizar verificaes durante o seu tempo de execuo, o que elevar o seu
tempo de execuo, mas em contra partida poder impedir falhas.

Implementao da linguagem e disponibilidade de compiladores: Uma linguagem chegar


mais rpido ao pblico (e poder ter uma fcil aceitao) se voc ao terminar a de concebe-la,
liberar o compilador dela de forma gratuita, fazendo assim com que vrias pessoas possam
testar tal linguagem e verificar o seu poderio.

Confiabilidade baixa: se uma linguagem de programao falhar em um ambiente crtico, os


resultados podem ser catastrficos.

Manuteno de programas: Isso inclui correo e implementao de novas funcionalidades


em programas. Se uma linguagem tem uma legibilidade ruim, ento havero problemas ao se
dar continuidade na vida do software que foi desenvolvido.

6.Descreva alguns tradeoffs de projeto entre a eficincia e a segurana em alguma linguagem


que voc conhea.

R: Pegando o exemplo da linguagem Java, ela por exemplo faz uma verificao por tipo de dados
(e referencias) que fazem parte de um vetor, o que aumenta a segurana, mas ao mesmo tempo
diminui a sua eficincia. Ainda sobre vetores, o java sempre faz uma verificao sobre a
quantidade de elementos dentro de um vetor, novamente provendo uma segurana maior em
relao s falhas de segmentao que poderiam ocorrer, mas tal verificao torna a execuo do
programa mais lenta. Em suma, a linguagem tende a realizar uma srie de pequenas verificaes
em relao a vetores, tipos de variveis e instancias, alm de verificar o uso de memria, o que
acaba gerando uma maior segurana a despeito do programa, mas ao custo de uma certa
lentido na execuo, principalmente se comparado com outras linguagens, como o C++ por
exemplo.

7.Quais recursos principais uma linguagem de programao perfeita deveria incluir, em sua
opinio?

R: Na minha opinio, poderiam haver alguns fatores que ajudariam, tais como suporte a
multimdia e principalmente suporte nativo a criao de GUI. Em muitos casos, para voc criar
uma interface grfica, voc tem que recorrer a bibliotecas e frameworks de terceiros. O mesmo
ocorre com relao a sistemas multimdia. O problema de se implementar tal recurso o custo de
compilao (ou interpretao). Um outro problema justamente o fato da abstrao por parte da
plataforma.
8.A primeira linguagem de programao de alto nvel que voc aprendeu era implementada com
um interpretador puro, um sistema de implementao hbrido ou um compilador? (Voc no
necessariamente saber isso sem pesquisar).

R: A primeira linguagem de alto nvel que aprendi considerada de alto nvel e compilada
(linguagem C). Seguido de C veio o C++ e o Java, sendo a ltima implementada atravs de
sistema hbrido.

9.Descreva as vantagens e desvantagens de alguns ambientes de programao que voc j


tenha usado.

R: O Netbeans tem uma vantagem em relao ao Eclipse pelo fato de j conter por padro um
form builder (ferramenta para construir GUI arrastando e configurando componentes), mesmo na
verso mais simples e destinada somente ao Java. A principal desvantagem do ambiente seu
alto consumo de memria e processador quando executado.

J relacionado ao ambiente de programao para iOS, o debuger do Xcode, onde nele voc tem
uma completa visualizao de todos os componentes(podem ser elementos visuais ou objetos
criados) e suas relaes, consumo de memria, energia, processador e rede em tempo real. A
grande desvantagem do Xcode sua integrao com o git, simplista demais e muito limitada
(praticamente inexistente).

10.Como sentenas de declarao de tipos para variveis simples afetam a legibilidade de uma
linguagem, considerando que algumas no precisam de tais declaraes?

R: A declarao do tipo da varivel ajuda o programador a saber o tipo da varivel, evitando erros
em relao a tipos incompatveis.

11.Escreva uma avaliao de alguma linguagem de programao que voc conhea, usando os
critrios descritos neste captulo.

R: Pegando o Java como exemplo e considerando os principais pontos:

Legibilidade e facilidade de escrita: a linguagem Java herda muitas das caractersticas das
sintaxes de C e C++, o que a torna simples de ler e escrever, principalmente para pessoas j
habituadas no C ou C++. Um coisa que talvez confunda os programadores no incio so os
wrapers dos tipos primitivos (para basicamente todo tipo primitivo h uma classe relacionada,
exemplo: tipo int -> Integer (classe); tipo char -> Character (classe)).

Confiabilidade: Java tem um formalismo muito forte no que diz respeito as suas especificaes,
e tambm possui um forte sistema de captura e contorno de falhas (error exceptions).

Custo: Nos mais diferentes aspectos, podemos pontuar:

Treinamento: Pela dimenso do Java, a curva de aprendizagem torna - se muito grande.

Escrita de programas: Java possui um apelo" desktop/web (principalmente web), o que o


torna uma linguagem muito boa para tal propsito. Um lado ruim dele tentar us-lo para
aplicaes que envolvam um certo controle de hardware ou SO, onde ele no apresenta
pontos fortes e acaba por limitar seu uso.

Compilar programas: Java est atrelado as caractersticas da compilao usada em


sistemas hbridos.
Executar programas: A linguagem tende a fazer uma srie de verificaes de tipo durante o
seu tempo de execuo, o que pode torn - la um pouco lerda. Uma novidade
implementada nos ltimos anos foi o Just in Time, o que permite a linguagem carregar
somente alguns mdulos necessrios durante a execuo, coisa que no era feita
antigamente e gerava como consequncia uma execuo lerda e um alto consumo de
memria.

Manter programas: Java uma linguagem relativamente fcil de se manter programas e


fazer manuteno, ainda mais pelo seu formalismo puramente focado em OO. Mesmo com
os inmeros frameworks, uma pessoa com conhecimentos mnimos na utilizao deles
poder dar manuteno em cdigos sem maiores dores de cabea.

Confiabilidade baixa a custos altos: Sistemas relativamente crticos (sistemas com muitos
acessos, para ser mais exato) usam Java pela sua robustez (exemplo: sistemas utilizados
em tribunais de justia, bancos, servidores web, etc).

12.Algumas linguagens de programao por exemplo, Pascal tm usado o ponto e vrgula


para separar sentenas, enquanto Java os utiliza para terminar sentenas. Qual desses usos, em
sua opinio, mais natural e menos provvel de resultar em erros de sintaxe? Justifique sua
resposta.

R: Ao meu ver isso est relacionado com qual linguagem a pessoa estudou primeiro. Cada
linguagem pode usar uma determinada forma para indicar final da instruo, como por exemplo, o
C/C++/Java onde o ; usado para indicar o termino de uma sentena e o Python no utiliza
nenhum caractere (no caso talvez ele uso o /n para indicar o termino da sentena). Se uma
pessoa comear estudando Pascal e ir para uma linguagem nova, como o C, ter que se habituar
a essa nova sintaxe, sendo possvel que hajam erros no incio por parte do programador. Aps o
advento do C e com muitas linguagens usando a base da sintaxe dela, menos provvel uma
pessoa ter dificuldades de aprender e assimilar uma linguagem de programao mais recente.