Baixe o app para aproveitar ainda mais
Prévia do material em texto
Prova CLP Cap 1- 1.1 - Razões para estudar LP’s: • Maior capacidade para desenvolver soluções computacionais. • Maior habilidade ao usar um LP. • Maior facilidade para aprender outras LP’s. • Maior capacidade de escolher a LP apropriada para a resolução de um problema vigente. 1.2 - O Papel das Linguagens de Programação no Processo de Desenvolvimento de Software: • Especificação de requisitos: Discussão sobre, em que ambiente o SW atuará; Quais serão as maneiras de interação com o usuário; e estudo de viabilidade de custos. • Projeto de SW: Definição dos módulos e a hierarquia do sistema. • Implementação: Onde ocorre a programação dos módulos definidos no projeto de SW. • Validação: Fase de teste das especificações do sistema. Dividida em: 1. Teste de módulo: Testes “isolados”. Verifica se o módulo em questão está fazendo o que deveria corretamente. 2. Teste de Integração: Teste mais amplo. Verifica se os módulos estão interagindo corretamente. 3. Teste do Sistema: Teste completo das funcionalidades do SW. • Manutenção: Onde ocorrem, correções de eventuais erros descobertos após a liberação do Sw, ou a adição de novas funcionalidades ao SW. 1.3 Propriedades Desejáveis em uma Linguagem de Programação: • Legibilidade: Envolve a facilidade p/ ler e entender um programa. Exemplos negativos de legibilidade, podemos citar o uso de “go to”(Desvios incondicionais) em C. Já exemplos positivos temos o uso de “{“ e “}” para definição de blocos de códigos, também presentes no C. • Redigibilidade: Envolve a facilidade de escrever algoritmos em uma determinada linguagem considerando suas ferramentas. Um exemplo negativo de redigibilidade está presente no Visual Basic que não permite a declaração de várias variáveis de um mesmo tipo em uma única linha, diferentemente do C++, que permite. • Eficiência: De acordo com as demandas por recursos de um tipo de aplicação, certas LPs são mais recomendadas, e outras não devem ser usadas. Aplicação de automação em tempo real, por exemplo, normalmente requerem o uso de LPs que minimizem o tempo de execução e de acesso aos dispositivos periféricos, bem como o consumo de especo de memória. Por exemplo, PASCAL, JAVA, VISUAL BASIC impõe que os índices de vetores sejam verificados em todos os acessos durante a execução dos programas. Isso implica necessidade de fazer um teste antes de qualquer acesso aos vetores. Por outro lado, como o C não faz esse tipo, o código gerado será mais veloz. • Confiabilidade: Está relacionado com os mecanismos fornecidos pela LP para evitar erros e consequentemente aumentar a confiabilidade. Um exemplo positivo, é encontrado em linguagens como JAVA e Python que possuem mecanismos para tratamento de exceções (caso um evento indesejado ocorra). Um exemplo negativo está presente na linguagem C que não faz a verificação de índices ao acessar um vetor. • Facilidade de Aprendizado: Se uma linguagem possui diferentes formas de fazer a mesma coisa, isso aumenta a sua redigibilidade, mas diminui a facilidade de aprendizado, já que o programador iniciante deverá se preocupar em conhecer as diferentes formas de fazer a mesma coisa. Um exemplo negativo está presente em C++. A atribuição a variáveis pode ser feita de 4 formas diferentes: var += 1; var = var + 1; var++; ++var. • Ortogonalidade: Diz respeito a capacidade da LP permitir ao programador combinar seus conceitos básicos sem que se produzam efeito anômalos nessa combinação. Assim uma LP é tão mais ortogonal quanto menor for o numero de exceções aos sues padrões regulares. Um exemplo negativo está presente em PASCAL que não permite retornar vetores em funções. • Modificabilidade: Refere-se às facilidades oferecidas pela LP para possibilitar ao programador alterar o programa em função de novos requisitos, sem que tais modificações impliquem mudanças em outras partes do programa. Um exemplo positivo é o uso de constantes simbólicas que permitem alterar o valor apenas uma vez e todas as aparições que façam referencia aquele valor, também serão alterados. Aumentando também a produtividade do programador. • Portabilidade: É altamente desejável que programas escritos em uma LP se comportem da mesma maneira independentes da ferramenta utilizada para traduzi-los para a linguagem de máquina ou da arquitetura computacional (hardware ou sistema operacional) sobre a qual estão sendo executados. Como exemplo a linguagem JAVA é executada por modo híbrido, compilada e depois interpretada pela máquina virtual Java, isso possibilita portabilidade para execução em SO. O .NET também possui essa característica. 1.4 Especificação de LPs: Considere a=b;. O léxico da LP estabelece que ‘a’, ’ =’, ‘b’ e ‘; ‘ fazem parte do vocabulário da LP. A sintaxe da LP indica que a sentença formada pelo identificador ‘a’, o símbolo ‘=’, o identificador ‘b’ e o símbolo ‘;’ designa um comando válido de atribuição. A semântica da LP indica que este comando deve ser executado de modo a substituir o valor de ‘a’ pelo valor atual de b. 1.5 Métodos de Implementação de LPs: • Compilado: Efetua a tradução direta do código fonte para o código de máquina. Um ponto positivo é que o método é considerado mais eficiente, já que as verificações já foram realizadas na tradução do código. E um negativo, é a portabilidade já que o código traduzido não pode ser executado em diferentes arquiteturas. • Interpretado: Efetua a tradução de uma instrução p/ código de máquina apenas no momento de execução da instrução, ou seja, esse processo é considerado um único. E isso faz com que esse método seja considerado menos eficiente. Junto a isso, o espaço de memória ocupado é maior já que, o código fonte a tabela de símbolos da LP e o interpretador devem estar na memória. Um ponto positivo é a depuração, visto que as referencias entre o código fonte e o a tradução são mantidas. • Híbrido: É considerado “o melhor dos dois mundos” já que as vantagens dos dois métodos são exploradas. Nesse método primeiramente o código é traduzido para um código intermediário, onde as verificações de erros já foram feitas, economizando tempo no momento da execução. Este código intermediário é portável e para executá-lo basta ter o interpretador da arquitetura em que o código será executado. 1.6 Paradigmas de Programação: • Paradigma Imperativo: O modelo imperativo é o mais antigo e está ligado ao funcionamento dos computadores, ou seja, na execução sequencial de comandos e armazenamento de dados alteráveis. Isso se relaciona com os conceitos de linguagem de máquina. Os três pilares do modelo são, variáveis, atribuições e sequência. As variáveis são endereços de memória que possuem um valor, esse valor pode ser alterado através de comandos de atribuição e os comandos são executados em uma sequência lógica. Dentro desta sequência encontram-se laços de repetição, funções e desvios condicionais e incondicionais. Alguns exemplos de linguagens fazem uso desse modelo são, Assembly, C, Pascal, COBOL e ALGOL. Como vantagens, podemos citar a eficiência e a tipagem fraca, já como desvantagens, podemos apontar a difícil legibilidade e a descrição em como fazer e não o que fazer. • Paradigma Estruturado: O modelo estruturado surgiu com a finalidade de suprir algumas necessidades e pôr fim em alguns problemas. Com o tempo, percebeu-se que o modelo imperativo, devido seus desvios condicionais e incondicionais, que determinavam o fluxo de execução do programa, e seus comandos rígidos, geravam erros excessivos, e diminuíam a produtividade. Então, a programação estruturada surgiu. Esse paradigma baseia-se na ideia de melhoramentos sucessivos de código, além disso, organiza o fluxo de execução estimulando apenas o uso de desvios condicionais, fazendo com que o código seja organizado em blocos. Alguns exemplosde linguagens que utilizam desse paradigma são, C, Pascal e Basic. Entre as vantagens, pode-se citar a fácil legibilidade e compreensão da organização estrutural. As desvantagens são que os dados ficam separados das funções, fazendo com que uma única alteração na estrutura dos dados gere um efeito dominó de alteração em todas as funções, dessa forma, são gerados sistemas difíceis de serem mantidos. • Paradigma Orientado a Objetos: O modelo orientado a objetos pode ser considerado uma evolução do paradigma estruturado, e traz consigo conceitos que ajudam na agilidade e confiabilidade de desenvolvimento. Enquanto o modelo estruturado se preocupa em abstrair a sequência de execução dos comandos, o orientado preocupa-se em abstrair os dados, e para isso faz uso das classes, que detém uma estrutura de dados e um agrupamento de operações que são executadas através dos métodos. Objetos que são instancias de classes, e outros pilares, são os conceitos de herança e polimorfismo. A herança se traduz em compartilhamento de atributos, métodos e outros membros entre as classes. E o polimorfismo é a capacidade de duas ou mais classes derivadas de uma mesma superclasse, fazerem chamadas a um método com a mesma assinatura/identificação, porém com comportamentos distintos. Exemplos de linguagens que fazem uso desse modelo são, C++, Java, Python e Ruby. Como vantagens o modelo orientado possui todas as qualidades do paradigma imperativo e entre outras, pode-se citar a reutilização de módulos conforme sua independência. Entre desvantagens tem-se a dificuldade de muitos programadores em compreender a forma “orientada” de pensar, fazendo com que o seu uso não predomine sobre a maioria. • Paradigma Concorrente: O paradigma concorrente tem sido usado cada vez mais e é caracterizado pela execução simultânea de processos que, como o nome sugere, concorrem por recursos. Esses processos podem ser executados por uma única unidade de processamento ou mais, em paralelo. No segundo caso, o centro de processamento pode estar localizado em uma única máquina, ou dividido em várias. As linguagens que fazem uso do paradigma concorrente são, Ada, C, C++ e Java. Dentre as vantagens tem-se a divisão de trabalho e aumento de desempenho em uma tarefa importante. Como desvantagens, pode-se citar a dificuldade em tratamento de threads (processos leves) e a sincronização, para que um processo não seja interferido por outro. • Paradigma Declarativo: O paradigma declarativo relaciona-se com a forma abstrata de se realizar uma tarefa, ou seja, o programador não precisa se preocupar como o computador vai implementar aquela tarefa, e se essa é a melhor forma. Portanto, esse modelo é antagônico ao paradigma imperativo, já que o imperativo se concentra em como o computador deve realizar uma instrução. Em programas de linguagens declarativas não existem atribuições a variáveis, já que variáveis declarativas são incógnitas. Os interpretadores e compiladores de linguagens que fazem uso desse modelo, gerenciam a memória, tornado visível para o programador a necessidade de alocação e desalocação. Representando linguagens declarativas estão, HTML, SQL e Prolog. Dentre as vantagens tem-se a objetividade e agilidade. E nas desvantagens nota-se a difícil legibilidade. • Paradigma Funcional: O paradigma funcional tem como objetivo definir uma função que dê a resposta correta para um determinado problema. As linguagens funcionais, como o nome sugere, trabalham apenas sobre funções, as quais recebem uma lista de valores e retornam um valor de resposta. Programas funcionais são chamadas à funções que normalmente fazem chamadas a outras funções, a fim de gerar uma resposta coerente para o problema. Uma característica fortemente presente nesse modelo é a chamada recursiva de funções. Exemplos de linguagens funcionais são, Haskell, Lisp e Scheme. Dentre as vantagens estão presentes a sintaxe e semântica simples. Já nas desvantagens, percebe-se a baixa eficiência e a quantidade reduzida de usuários. • Paradigma Lógico: O paradigma lógico trabalha com dedução automática e para isso faz uso da lógica de predicados onde um predicado define a relação entre fatos ou variáveis. Quando uma questão é formulada um mecanismo de inferência tenta deduzir novos fatos a partir dos já existentes e dessa forma verificar se a questão é verdadeira ou não. Exemplos de linguagens lógicas são, Prolog e Mercury. Dentre as vantagens estão a não preocupação de como fazer, e sim, o que fazer e a resolução de problemas específicos de forma um pouco mais simples, por exemplo, no aprendizado de uma IA. Entre as desvantagens, têm- se os problemas de eficiência e variáveis sem tipos. Cap 4- Variáveis: São uma abstração das células de memória. Fazem referencia a um endereço de memória. Possuem algumas características, tais como, nome, endereço, tipo, valor, tempo de vida e escopo de visibilidade. • Nome: Escolhido pelo programador e obedece a regra de formação dos identificadores da linguagem. • Endereço: Posição de memória da primeira célula ocupada pela variável. • Tipo: É o conjunto de valores que a variável pode assumir. • Valor: É o conteúdo da variável. É compatível com seu tipo. • Tempo de vida: Duração da existência de uma variável. Exemplo, variáveis globais possuem tempo de vida igual ao tempo de execução do programa. Já variáveis locais existem apenas durante a execução de seu bloco. • Escopo de visibilidade: Parte do programa onde a variável pode ser referenciada. Variáveis compostas: Variáveis cujo tipo é composto. Pode ser inicializada ou atualizada de forma completa ou seletiva. Um exemplo pode ser dado em C com o struct onde podemos inicializar todos os valores ou apenas um. Constantes: Valores que não serão modificados ao longo do programa.
Compartilhar