a maioria destas “dicotomias” são um continuo
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
i
do array pid
i = 0
for x in range(10):
i = 1
---
i = 0
for x in range(10):
pass
i=1
---
i = 0
i = 1
---
i = 1
compila para um arquivo mas ele não é auto-contido, por exempli depende de 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) WebAssembly(Wasm)/browser
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. (entre 1 e 2) Compila para linguagem de maquina apenas alguns trechos que código que são 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 - Numba em Python (acho)
Ha ainda transcompilação - traduz da linguagem original para uma linguagem de programacao destino, e esta é compilada com o seu compilador.
typescript -> javascript
coffescript -> javascript
dart-> javascript
Javascript é o destino pois todo mundo já tem um interpretador de javascript nos seus browsers.
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áveis. 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 e RUST(?)
OO estraga esse conhecimento em tempo de compilação do que deve ser feito. A decisão fica para o tempo de execução.
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();
Python:
x=4
x="qwerty"
x=[3,4,5]
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")
a = "casa"
b = 3
c = a + b
c == "casa3" -> tipagem fraca
erro -> tipagem forte
normalmente, quase todas linguagens aceitam que a conversão de inteiro para float pode ser automática (menos RUST)
PHP é a mais citada linguagem de tipagem fraca.
aritimetica em ponteiros do C é outro exemplo de tipagem fraca
conversão explicita vs conversão implicita (coercion)
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 código é 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;
}
mas o tipo T precisa ser um que aceira a comparação >. Restrições nos tipos
veremos isso em Haskell
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
modo interativo é util para debug
Jupiter: modo interativo com memória, intercala texto, código, figuras, plots, expressões, etc