Please enable JavaScript.
Coggle requires JavaScript to display documents.
Paradigmas de linguagens de programação (Subprogramas (aula 10) (Fruto da…
Paradigmas de linguagens de programação
Princípios fundamentais (aula 1)
Por que estudar esses conceitos? (q1+q2)
Aumentar a capacidade de expressar ideias
, reduzindo limitações no desenvolvimento e aumentando a capacidade de se "comunicar".
Maior expertise para escolher linguagens apropriadas
para cada projeto.
Facilitar o aprendizado de novas linguagens de programação
, pois, ao aprender conceitos gerais, fica mais simples programar em linguagens desconhecidas e entender sua documentação.
Implementar linguagens de maneira mais eficiente
, o que facilita correções e desempenho das soluções.
Capacidade de projetar novas linguagens
.
Campos de aplicação (q3 à q8)
Científico
Aplicações com
grande número de cálculos
, mas estruturas de dados simples;
Linguagens de
alto nível
, com foco na eficiência;
Estruturas principais:
Matrizes
(dados), laços de
contagem
e
seleções
(controle).
FORTRAN
ALGOL 60
Comercial
COBOL
Linguagens e equipamentos especiais foram desenvolvidos para essas linguagens;
Foco em relatórios elaborados, armazenamento preciso de textos e números decimais, operações aritméticas decimais, por exemplo;
Para computadores pequenos, as principais ferramentas eram as planilhas eletrônicas e bancos de dados.
Inteligência artificial
LISP
PROLOG
Computação simbólica em vez de numéricas;
Nomes manipulados no lugar de números;
Listas encadeadas ao invés de matrizes.
Programação de sistemas
Software básico, que exige uma linguagem com execução rápida e possibilidade de trabalhar com recursos de baixo nível.
PL/S (IBM)
BLISS (Digital)
Extended ALGOL (Burroughts)
C (Sistema UNIX)
Scripting
As mais recentes linguagens, consistem em listras de comandos em um arquivo para execução;
A primeira linguagem, sh (shell) tinha comandos que chamavam subprogramas e executam funções do sistema;
Posteriormente, foram adicionadas variáveis, instruções de fluxo de controle, funções, entre outros.
sh (shell)
ksh
awk
tc1
tk
Perl
JavaScript
Critérios de avaliação (aula 2)
Legibilidade
É a facilidade de leitura e compreensão dos programas.
Simplicidade global:
Multiplicidade de recursos complica a legibilidade.
Ortogonalidade:
"Algo é ortogonal em relação à alguma outra coisa se mudar algo nele não afetará nada nas outras coisas. Não existe uma relação de dependência. "
Ou como a infeliz diz, um conjunto pequeno de construções primitivas pode ser combinado para formar estruturas de controle e dados da linguagem.
"Tipos de dados e estruturas" ou, como é definido no lugar que a vaca copiou, o
suporte para abstração
. É a capacidade de definir e depois usar estruturas ou operações complicadas de uma maneira que permita ignorar os detalhes.
Sintaxe,
que é a forma que algo é escrito
, diz respeito aos identificadores (nome de variáveis, por exemplo), palavras especiais, além da forma e significado simples - instruções claras sobre o que fazem no nome e escrita.
Capacidade de escrita
Mais uma vez, copiando o conteúdo
desse link
, essa é a medida de quão fácil é utilizar uma linguagem para criar programas e resolver problemas. Capacidade de escrita e legibilidade estão ligadas.
Fatores importantes são o
suporte à abstração (definir e usar estruturas complicadas sem detalhamento desnecessário) e um conjunto relativamente conveniente de maneiras de especificar operadores.
Confiabilidade
O programa precisa funcionar do mesmo jeito em todas as situações.
Isso inclui também a verificação de erros pelo compilador ou durante a execução, além de manipular exceções e por em prática medidas corretivas.
Custo
Esse item tem relação com o treinamento necessário para utilizar a linguagem, a escrita, compilação, execução de programas (velocidade de execução com muitas verificações, por exemplo), a implementação, confiabilidade e manutenção.
Fatores que influem no projeto da linguagem (aula 3)
Arquitetura Von Neumann
Influiu em vários projetos de linguagens, diretamente ligada às
linguagens imperativas
.
Tem como principais deficiências a insuficiência das instruções de controle e a falta de verificação de tipos.
Metologias de programação
No final da década de 70, começaram a surgir projetos de linguagens orientadas aos dados...
...que evoluíram para a
Orientação à objetos
Recursos fundamentais (a
abstração
, basicamente):
Encapsulamento (ocultando o acesso ao processamento com objetos de dados);
Herança;
Vinculação dinâmica de métodos.
A
primeira linguagem a suportar parcialmente
esses recursos foi a
SIMULA70
.
A
Smalltalk foi a primeira a suportar totalmente
os conceitos de abstração.
Metodologias de Implementação
Existem três metologias para implementação de uma linguagem:
Compilação
:
Execução mais rápida
, pois os programas são traduzidos para linguagem de máquina e executados diretamente.
Interpretação pura
: Os programas são apenas interpretados pelo interpretador, mas com execução mais lenta.
A depuração é mais fácil
.
Implementação híbrida
: É o que acontece com o Java, que tem uma linguagem de mais alto nível, que passa por um interpretador e ele transforma isso em uma linguagem de máquina, de baixo nível (não tão a grosso modo assim).
Nota: um ambiente de desenvolvimento é um conjunto de ferramentas necessárias para o desenvolvimento (editor de texto, compilador, gerenciador de arquivos, etc).
Programação imperativa (aula 4)
Paradigma de programação
é um meio de se classificar as linguagens de programação baseado em suas funcionalidades, de acordo com a
Wikipedia
.
De acordo com a grossa definição da professora, é um método para realizar computações e a forma que se deve estruturar e organizar as tarefas de um programa.
Baseado em instruções e comandos, o programador diz como e o quê exatamente um programa ou rotina deve realizar. É neste paradigma que surgiram os famosos laços de repetição, estruturas condicionais, atribuição de valor à variáveis e controle de estado, de acordo com
esse link
.
FORTRAN77
COBOL
Pascal
BASIC
C
Ada
Tipos de dados
devem modelar os dados do mundo real, por isso, é necessário que exista suporte para diversos tipos deles.
Dados Primitivos
são os tipos básicos de dados que compôem um programa, podendo serem como constantes ou variáveis, conforme
aqui
.
Numéricos
, geralmente inteiros e ponto
vírgula
flutuante.
Booleanos
, basicamente o "verdadeiro" ou "falso".
Caracteres
, que são textos, na verdade números, que referenciam uma tabela como a ASCII
Cadeias de caracteres
são sequências de caracteres (avá).
Devemos considerar, num projeto de linguagem, se as cadeias serão um
tipo especial de vetor (para esse caso, um vetor de caracteres únicos referenciado como tal) ou primitivo
e se o tamanho será
estático (tamanho fixo na declaração) ou dinâmico (conforme necessário, ilimitado ou limitado)
.
Um
tipo ordinal
é aquele em que o intervalo de valores pode
facilmente ser associado com o conjunto dos inteiros positivos, de acordo com
esse link
.
O kibe veio
daqui
.
Enumeração
: valores possíveis indicados na definição.
Subfaixa
: de onde começa até onde vai.
Matriz
é um arranjo homogêneo de elementos de dados, cujo elemento individual é indicado por sua posição no arranjo.
Os
mecanismos sintáticos
são o nome do arranjo e o seletor (geralmente dinâmico).
A
categorização
ocorre em quatro categorias:
Matriz estática
Matriz fixa dinâmica na pilha
Matriz dinâmica na pilha
Matriz dinâmica na monte (???)
Expressões e instruções de atribuição (aulas 5 e 6)
As
expressões
tem função de especificar uma operação
computação
aritmética. As
instruções
tem a finalidade de mudar o valor de uma variável.
Expressões
podem ser formadas por operadores, operandos, parênteses, e chamadas a função.
A
computação
aritmética requer que os operandos sejam buscados, e as operações, executadas.
Ordem de avaliação
Associatividade
: Essa regra depende, pois cada linguagem pode definir, quando ocorrem duas expressões seguidas, qual será executada primeiro. Tipo, numa conta de 1+1-2 numa linguagem, vai depender.
A
precedência
baseia-se em regras da matemática, com hierarquias de prioridades do operador.
Tem os parênteses ainda, aí entram também as questões de
efeitos colaterais funcionais
(uma expressão altera um parâmetro ou variável global).
Sobrecarga
de um operador é quando um operador tem múltiplos usos.
Conversão de Tipo
Estreitamento
: conversão para um tipo que não pode armazenar o valor original
Alargamento
: converte para um tipo que pode guardar pelo menos o valor aproximado do original
Quando um operador pode ter diversos tipos, as expressões são chamadas de
modo misto
, e as conversões devem ser implícitas. (definição de
coerção
)
Operadores relacionais
Servem para
comparar os valores de dois operandos
,
sendo do tipo booleano
(exceto quando a linguagem não tem esse tipo, como por exemplo o C).
Geralmente,
os booleanos
são avaliados na ordem de precedência hierárquica. =! → && → ||
A
avaliação curto-circuito
é quando o resultado de uma parte da expressão é calculado sem que a avaliação completa ocorra. Por exemplo, (a+b)
(b
c), se a=0 e b=1, fica 0
(b
c)... enfim né.
Estruturas de controle no nível da instrução (aulas 7, 8 e 9)
Uma
instrução de controle
é um mecanismo linguístico que fornece meios para seleção de caminhos alternativos de fluxo de controle e, também, provocar execução repetida de determinado conjunto de instruções.
A
estrutura de controle
nada mais é que uma instrução de controle e a coleção de comandos que ela controla a execução.
Uma
instrução de seleção
oferece os meios de seleção entre dois ou mais caminhos de execução.
Bidirecional
: são baseadas nas seguintes considerações:
O tipo de expressão que controla a seleção;
Quantas instruções podem ser selecionadas;
Significado de seletores aninhados (por sintaxe ou regra semântica [essa é uma das
soluções para o problema do aninhamento
de seletores]).
O
Java
permite utilizar soluções semânticas e sintáticas para resolver o problema do
aninhamento
, porém, o Pascal apernas sintática.
Múltipla (ou n-direcional)
: baseia-se nas considerações:
Qual a forma e o tipo da expressão que controla a seleção;
Que instruções são selecionadas (simples, compostas, sequencias de instruções);
O fluxo de execução através da estrutura se limitaria a incluir apenas um segmento selecionável?
O que ocorre quando o valor da expressão não é representado.
ISSO CAIU NA PROVA N2
:
A instrução do FORTRAN é
IF(expressão) N1,N2,N3
N1 = negativo
N2 = zero
N3 = positivo
Isso faz com que a expressão tenha problema com legibilidade, ausência de encapsulamento e restrição do fluxo de controle a um único segmento.
Seletor múltiplo de Hoare
: É a base para os seletores modernos (tipo o case, do C).
A estrutura é encapsulada e tem uma única entrada;
Desvios implícitos para um único ponto no final de toda a construção são oferecidos para cada segmento;
as instruções selecionáveis podem ser únicas ou compostas.
No
Pascal
, ele é do tipo ordinal, as instruções podem ser únicas ou compostas, a lista de constantes deve ser do mesmo tipo que da expressão. Bem semelhante ao do ALGOL-W (o que implementou primeiro).
Nas versões mais recentes, o
compilador detecta quando o resultado da expressão não está representado
, além de utilizar a claúsula "else".
As
instruções iterativas
fazem com que uma instrução ou uma coleção de instruções sejam executadas zero, uma ou mais vezes.
As duas questões básicas do projeto são categorias de
controle de iteração
: como a iteração
deve ser controlada
e onde deve
aparecer o mecanismo de controle
do laço.
Esse mecanismo de controle deve aparecer na parte
superior ou inferior
.
Com nomes bem autoexplicativos, nas instruções pré-teste, o teste para finalização ocorre antes da execução do laço; por sua vez, as pós-testes ocorrem depois do laço.
Laços controlados logicamente
são os que o controle de execução se baseia em uma expressão booleana em vez de contador. Ele deve ter uma condição
pré ou pós-teste
, além da necessidade de ser um tipo especial de laço de contagem ou instrução separada.
Uma
instrução de desvio incondicional
transfere o controle da execução para um lugar específico no programa.
Essa joça é o nome bonitinho para o GOTO, que pode piorar a legibilidade do programa, confiabilidade e tornar a manutenção dele impossível.
Subprogramas (aula 10)
Fruto da abstração, são trechos de código com
um único ponto de entrada, que permitem somente a execução de um por vez e, ao final da execução, retornam o controle ao programa chamador (principal)
.
Um subprograma está ativo quando ainda está em execução, sem ter finalizado.
O
cabeçalho
é a primeira linha da definição de um subprograma, onde é especificado o tipo, nome, e opcionalmente a lista de parâmetros.
O
perfil de parâmetro
é o número, ordem e os tipos de parâmetros formais.
Parâmetros formais (ou variáveis fictícias)
: são os parâmetros do cabeçalho do programa.
Parâmetros reais:
a chamada der subprogramas incluem o nome e parâmetros a serem vinculados aos parâmetros reais, esses são eles.
Parâmetros posicionais
são os que permitem a correspondências entre parâmetros reais e formais pela posição.
Parâmetros chave
podem aparecer em qualquer parte da lista de parâmetros, mas é necessário que o usuário os conheça.
O
protocolo
é o perfil do parâmetro e seu retorno, se for uma função.
A
abstração de processos
é a escrita e chamada de subprogramas dentro de um código, reduzindo o número de linhas e melhorando a legibilidade.
Uma
função
define novos operadores determinados pelo usuário, já os
procedimentos
definem novas instruções.
Variáveis locais dinâmicas na pilha
são vantajosas devido a flexibilidade, porém, peca no custo e tempo necessário para alocação e desalocação, o acesso indireto e o fato de não guardar histórico.
Sobre
modelos semânticos
de passagem de parâmetros, existem três tipos:
entrada
(parm. formais recebem os reais correspondentes),
saída
(os formais transmitem dados ao parm. real) e
entrada/saída
(podem fazer ambos).
Os
modelos conceituais de transferência de de dados
são dois: o valor real é transmitido
fisicamente
para o chamador, chamado ou ambos;
o caminho de acesso é transmitido
, geralmente um ponteiro.
Programação orientada à objetos (aulas 11 e 12)
Em ordem, nós tivemos as metodologias de projetos orientadas a
processos
, depois, a
dados
e por fim a
objetos
.
A partir do projeto de dados, surgiu o conceito de
abstração
, que nada mais é que a visualização ou uma representação de uma entidade que inclui somente os atributos de importância em um contexto particular.
Isso permitiu
menor complexidade
,o que permite que os programadores
se concentrem nos atributos essenciais
e ignorem os subordinados.
Abstração de processos
: todos os subprogramas são abstrações de processos, pois oferecem uma forma do programa especificar que algum processo dever ser realizado, sem oferecer detalhes de como é realizado.
Recipientes sintáticos ou módulos
são containers (ou recipientes) quer incluem grupos de subprogramas e de dados logicamente relacionados.
A
unidade de compilação
é a organização de programas em coleções de subprogramas re de dados, cada um dos quais pode ser compilada sem recompilação do restante do programa.
O
Encapsulamento
é o agrupamento de subprogramas e os dados que eles manipulam.
Ele faz com que o programa apareça como uma única coleção de subprogramas, além de resolver o problema da recompilação.
Um
tipo de dado abstrato
é um encapsulamento que contém somente a representação de dados de um tipo específico de dado e os subprogramas que fornecem as operações para esse tipo.
A
vírgula flutuante
é um tipo de dado abstrato que utilizam a ocultação de dados. O valor real é oculto e só ficam disponíveis as operações permitidas pela linguagem.
Um tipo de dado abstrato
definido pelo usuário
permite que a unidade de programa declare suas variáveis ocultando sua representação, além do conjunto de operações para manipular objetos do tipo.
A representação ou definição do tipo e as operações estão contidas em uma unidade sintática, então, outros unidades do programa podem ter permissão para utilizarem esse tipo; essa representação fica oculta para as unidades de programa, sendo as únicas operações disponíveis aquelas oferecidas na definição.
O
cliente
é a unidade de programa que utiliza esse tipo de dado.
Eles não devem ser capazes de ver os detalhes da representação, impedindo que sejam mudadas diretamente, aumentando confiabilidade.