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.

  1. compila para um arquivo mas ele não é auto-contido, bibliotecas – C com compilação dinâmica
  2. "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
  3. 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