Aula 1

Dicotomias em linguagens de programação

a maioria destas “dicotomias” são um continuo

Compilado x interpretado

2 extremos

    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

tarefas de um compilador

    i = 0
    for x in lista:
        i = 1
---
    i = 0
    for x in lista:
        pass
    i=1
---
    i = 0
    i = 1
---
    i = 1

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)

  3. analisa a sintaxe do programa inteiro, faz a análise semântica, otimizações, e converte para uma “linguagem de maquina” falsa, que precisa de um interpretador, mas o interpretador e o compilador são o mesmo programa – Python, Perl, Lisp, etc

1.5. Compila para linguagem de maquina apenas alguns trechos que código que sao auto-contidos e que são usados muito: - Java com compilação JIT (de métodos) (Julia?) - Lisp com compilação de algumas funções e não outras

Tipagem estática ou dinâmica

estática

isso é uma soma (inteiros? reais? complexos?) ou uma concatenação (Python)

    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();

Dinâmica

    x=4
    x="qwerty"
    x=[3,4,5]

diferenças

    def soma(a,b)
      return 4*(a+b)
      ou  return (a+b)/4
 soma(3,4)
 soma("casa","azul")

Tipagem forte vs fraca

a = "casa" 
b = 3
c = a + b
c == "casa3" -> tipagem fraca

erro -> tipagem forte

Outros conceitos de tipagem

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){
    ...}
     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;
    }

Batch vs interativo

    $ 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

Que linguagens vc deve saber

linguagens que talvez valha a pena aprender (um dia)