Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # # # # # # # # # # # # # #
- # Linguagens de Programação #
- # Prof. Fernando Pereira #
- # notasdogarcia.blog.com #
- # # # # # # # # # # # # # #
- Essa aula é uma revisão de toda a materia vista até hoje.
- Hoje começamos discutindo sobre os dois mundos de linguagens declarativas e imperativas.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Sobre gramaticas:
- Temos um simbolo de partida
- Simbolos terminais
- Simbolos nao terminais.
- Regras de gramatica.
- Tem também a arvore de derivação.
- Como provar se uma arvore é ambigua ou não?
- Basta encontrar para uma mesma palavra duas derivações diferentes.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Sobre linguagens de programação:
- Temos a sintaxe e a semantica, sendo a segunda o significado de cada palavra.
- Sobre prolog e gramaticas:
- lembram da gramatica de a^nb^nc^n que não pode ser expressa por uma gramatica comum?
- lembrem que através dos atributos prolog consegue expressar essa linguagem também e se torna turing completo.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Sobre tradução e interpretação e compiladores em geral.
- Etapas de compilação:
- Preprocessamento.
- Tradução para assembly.
- Tradução para código de máquina.
- Então é relizada a linkagem. // Acho que ela ocorre agora, mas pode ocorrer sobre o código assembly.
- E então o carregamento.
- E apenas por fim a execução.
- Porque a linguagem de java script é interpretada?
- Porque roda em vários computadores simuntaneamente.
- E se voce envia o código fonte para ser compilado em cada computador fica lento é melhor
- interpretar que é mais barato já que cada programa só sera usado uma vez.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Sobre SML
- Esses programas de linguagens funcionais usam bastante principios indutivos.
- Ou seja, se X é da forma (h::t) então eu opera-se recursivamente para t e retorne uma operação sobre h.
- É normalmente esse tipo de raciocinio.
- Sobre listas pode-se operar de duas formas: hd l ou tl l onde a primeira retorna a cabeça da lista e a segunda a calda.
- Formas de dados mais basicas: Listas e tuplas.
- Toda função em SML só recebe um parametro e um retorno.
- Assim tuplas são úteis quando voce deseja receber vários parâmetros ou vários retornos.
- // O professor ainda que que agente descubra qual algoritimo é prejudicado se for implementado por listas, ao invés de arranjos?
- // Ele disse que deve cobrar isso na prova.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Casamentos de Padrão em SML:
- É uma característica muito interessante, pois eu posso decompor um objeto em suas partes mais básicas.
- Assim se quero acessar a cabeça de uma lista, eu posso usar a decomposição de padrões para encontrar ela.
- ex:
- fun f nil = nil
- | f (h::t) = h
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Tipos de dados:
- Cada tipo é um conjunto de valores juntamente com sua representação e conjunto de operações realizáveis sobre ele.
- Como criar tipos compostos?
- Em SML pode-se usar tuplas.
- Em C pode-se usar structs, unions.
- Em java temos as classes e assim por diante.
- Note que unions em C são uniões de dois conjuntos porém elas não são disjuntas.
- Em sml quando voce cria um datatype A of int | B of real voce tem 2 tipos disjuntos.
- Tipagem fraca: é o caso de C que não há verificação dos tipos quando voce faz uma atribuição.
- No geral voce pode dar um cast e multiplicar um struct por uma string o que provavelmente daria muito errado.
- Tipagem forte é o caso de java que em tempo de execução há uma verificação de toda operação ou coersão realizada.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Coerção
- Porque?
- xxx complete isso
- Construtores de tipos:
- Ex: 'a list é um construtor de tipos, ela recebe como parâmetro um tipo chamado 'a e retorna uma lista desse tipo.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Variáveis livres e captura de variáveis em calculo lambda.
- Se tenho (<l>a (<l>b (a + b)))
- Perceba que a é livre dentro das duas expressões mais internas.
- Porém se eu colocar como parametro a letra b assim:
- (<l>a (<l>b (a + b)))b
- e substituir:
- (<l>b (b + b))
- Agora a variável que antes era a tornou presa à b. ou seja foi capturada.
- isso deve ser evitado. mudando-se o nome do parâmetro quando ocorrer esse problema.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Escopos e espaços de nomes.
- Um escopo é uma região onde um conjunto de nomes e rotulos são referenciáveis.
- Espaços de nomes podem ser classes em C++, namespaces em C++.
- Escopo estatico é calculado durante a compilação.
- Quase todas nossas linguagens de programação hoje são desse tipo.
- Escopo dinâmico é quando uma variável livre declarada em uma função muda dependendo do contexto onde a função for usada.
- Ex: se tenho uma variável one =1 dentro do escopo onde declarei a funçào, e tenho outra variável one=2 no local onde a função foi chamada.
- Se o comportamento da funçào utilizar a nova variável one=2 ao invés da antiga, ocorrerá um comportamento bem inesperado para quem tem costume
- com as linguagens atuais. e esse caso é chamado de escopo dinamico.
- Caso contrario é o escopo estático.
- Note que as macros de C++ possuem escopo dinâmico, e deve-se tomar cuidado com isso pois pode dar merda se voce ficar desatento.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Como criar um tipo arvore?
- crie um construtor de tipos:
- datatype 'a tree = Empty | Node of 'a tree * 'a * 'a tree
- E pronto declaramos uma arvore de tipo generico.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Registro de ativação.
- Um registro de ativação é o conjunto de dados que ficam armazenados durante o tempo de vida de uma função.
- Registros estaticos reservam o espaço de armazenamento em tempo de compilação.
- Registros dinâmicos reservam esse espaço em tempo de execução. E usam portanto uma pilha de registros de ativação.
- Assim quando uma função retorna, ela retorna para o ultimo registro da pilha.
- e assim recursivamente até que o registro de main retorne e o programa se encerre.
- Agora voltando a falar das variáveis livres.
- Como encontrar a definição original de uma variável livre?
- Se eu procurar sua definição na pilha de registros de ativação, eu vou possuir escopo dinâmico. Mas isso é confuso e preferivelmente evitavel.
- // Bem fim da aula =],
Advertisement
Add Comment
Please, Sign In to add comment