Aula 0
1 Dicotomias em linguagens de programação
- compilado x interpretado
- tipagem estática x dinâmica
- tipagem forte x tipagem fraca
- batch x iterativo
a maioria destas "dicotomias" são um continuo
2 Compilado x interpretado
2.1 2 extremos
- compila para um arquivo auto-contido que roda na plataforma de destino: – C com compilação estática
- cada linha do programa é interpretada (+tabela de símbolos) – BASIC, Bash (sh, csh)
for i in {0..9} do ssh -N -L 900${i}:${nos[${i}]}:22 wainer@ssh.recod.ic.unicamp.br & pid[${i}]=$! sleep 1 done echo -n ${pid[@]} > ~/.pidssh
- interpretado precisa processar a linha "pid[\\({i}]=\\)!" 9 vezes onde processar significa – fazer a analise sintática e descobrir se há erros – entender o comando – fazer o que o comando manda: computa o pid do processo (\$!) e
atribui à entrada i do array pid
2.2 tarefas de um compilador
- analise sintática: os comandos estao corretos
- analise semântica: arvore de operações/comandos
- otimização não especifica da arquitetura. ex: invariantes fora do loop
i = 0 for x in lista: i = 1 i = 0 for x in lista: pass i=1 i = 0 i = 1 i = 1
- otimização especifica de arquitetura: registradores
- geração de código de maquina
2.3 há um continuo de alternativas entre auto contido e processar cada linha todas as vezes.
- compila para um arquivo mas ele não é auto-contido, bibliotecas – C com compilação dinâmica
- "compila" para uma "linguagem de maquina" que não roda no hardware mas precisa de um "interpretador" – Java com o JRE (interpretador) – byte-code – todas as tarefas de um compilador sem a otimização especifica
- analisa a sintaxe do programa inteiro, faz a análise semântica, converte para uma "linguagem de maquina" falsa, que precisa de um interpretados, mas o interpretador e o compilador são o mesmo programa – Python, Perl, Lisp
1.5) Compila para linguagem de maquina apenas alguns trechos que codigo que sao auto-contidos e são usados muito – Java com compilação JIT (de métodos) – Lisp com compilação de algumas funções e não outras
3 Tipagem estática ou dinâmica
3.1 estática
- variáveis tem tipo e ele é fixo - e normalmente declarado mas não NECESSARIAMENTE
- C, Java
- se a variável tem tipo, é possível em tempo de compilação definir exatamente o que fazer com uma operação na variável
a+b
isso é uma soma (inteiros? reais? complexos?) ou uma concatenação (Python)
- a linguagem pode ser estática mas não ter declaração de variáreis. O compilador infere o tipo da primeira atribuição e não permite que valores de outros tipos sejam atribuídos a essa variável. (veremos em Haskell)
- OO estraga esse conhecimento em tempo de compilação do que deve ser feito
public class A { public void m() { System.out.println("Hello World!"); } } public class B extends A { public void m() { System.out.println("Bye World!"); } } A x; ... x = new A() ou x = new B() x.m();
3.2 Dinâmica
- dados tem tipos, e variáveis apontam para dados
x=4 x="qwerty" x=[3,4,5]
3.3 diferenças
- tipagem dinâmica é mais lenta – indireção – decisão em tempo de execução o que fazer – gasta mais memória (apontador + tags)
- tipagem dinâmica é útil em modo iterativo
- tipagem estática garante uma programação mais segura
def soma(a,b) return 4*(a+b) ou return (a+b)/4 soma(3,4) soma("casa","azul")
- linguagens dinâmicas estão cada vez mais permitindo declaração/hints de tipo para argumentos de funções! Python Mas ainda não esta claro o que o interpretador faz com essas declarações
4 Tipagem forte vs fraca
- tipagem forte não faz conversão de tipos a não ser explicitamente pelo programador.
a = "casa" b = 3 c = a + b c == "casa3" -> tipagem fraca erro -> tipagem forte
- normalmente, todos aceitam que a conversão de inteiro para float pode ser automática mas há problemas nessa conversão!!!
>>> 1000000000000000000001*2.0 2e+21 >>> 1000000000000000000001*2 2000000000000000000002
- PHP é a mais citada linguagem de tipagem fraca.
5 Outros conceitos de tipagem
5.1 tipagem paramétrica ou polimorfismo paramétrico
Em C, lista ligada de inteiros e de float são códigos diferentes, apenas por causa das declarações dos argumentos das funções, o resto do codigo é igual
struct IntLinkedList{ int data; struct IntLinkedList *next; }; typedef struct LinkedList *inode; struct FloatLinkedList{ float data; struct FloatLinkedList *next; }; typedef struct LinkedList *fnode; inode addiNode(inode head, int value){ ...} fnode addfNode(fnode head, float value){ ...}
- parametric typing
struct LinkedList(X){ X data; struct IntLinkedList *next; }; typedef struct LinkedList(X) *node(X); node(X) addNode(node head, X value){ ...}
um exemplo real e mais simples em C++
template <class T> T max(T a, T b) { return a > b ? a : b; }
- mas o tipo T precisa ser um que aceira a comparação \(>\). Restrições nos tipos
- veremos isso em Haskell
6 Batch vs interativo
- Batch: compila e roda, ou chama o run environment e roda
$ jre a.java
- interativo: existe um modo onde o usuário entra num ambiente que permite o usuário entrar uma linha de comando por vez
$ python Python 3.6.8 |Anaconda, Inc.| (default, Dec 29 2018, 19:04:46) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> c=4 >>> c+6 10
- implementações interativas também implementam um modo batch
$ python a.py
- modo interativo é útil para aprender uma linguagem, para aprender sobre uma biblioteca,
- modo interativo é útil para trabalho exploratório - data science
- Jupiter: modo interativo com memória, intercala texto, código, figuras, plots, expressões, etc
7 Que linguagens vc deve saber
- C
- C++
- Java
- Python
- Javascript
7.0.1 linguagens que talvez valha a pena aprender (um dia)
- Go (golang) - da google
- Scala (prog funcional + oo)
- Julia (Python-like, R-like mas compilado)
- F# ou OCaml (prog funcional menos complexa/pura que Haskell)
- Ruby (ruby-on-rails)
- R (data science)
- Erlang (paralelo)
- Rust
- Swift (IOs)
- Perl (bioinformatica)
- Kotlin (Android)
- FORTRAN (computação científica)
7.1 linguagens que vc não deve colocar no currículo (na minha opinião)
- Prolog
- PHP
- SQL