+
-
*
e ==
em
arrays fazem as operacoes nos arryas como um todo Em
particular *
é o produto de matrizes, ==
é a
igualdade de vetores
.*
.==
fazem as operaçoes elemento por
elemento
julia> [1,2,3]==[1,2,8]
false
julia> [1,2,3].==[1,2,8]
3-element BitVector:
1
1
0
julia> [1 2; 3 4] * [5 6; 7 8]
2×2 Matrix{Int64}:
19 22
43 50
julia> [1 2; 3 4] .* [5 6; 7 8]
2×2 Matrix{Int64}:
5 12
21 32
+
e .+
sao equivalentes!!
C
Rust
Go
Swift (apple) https://www.swift.org https://en.wikipedia.org/wiki/Swift_(programming_language)
Zig https://ziglang.org https://en.wikipedia.org/wiki/Zig_(programming_language)
https://go.dev site do Go
https://go.dev/play/ Go online
https://gobyexample.com fonte
https://go.dev/tour/list tour com exemplos executaveis
desenvolvida pela google
2009
2012 versao 1
tipagem estatica mas com inferencia de tipos para variaveis (usando :=)
funcoes precisam ter o tipo declarado
sintaxe parecida com o C mas sem o ;
- mudança de
linha termina comando
{ }
chaves para blocos (como C)
=
é atribuição :=
é uma atribuicao que
declara as variavies e infere os tipos
var foo int = 10
ou
foo := 10
var
para declarar variaveis mutavies, val
para declarar variaveis imutaveis
há dois conceitos relacionados com array
um array é de tamanho fixo e o tamanho é parte to tipo
um slice é definido apenas pelo tipo interno e nao o tamanho. Ele se refere a um trecho de um array.
Slices sao criados por make
. Arrays sao definidos em
declaracoes de variavies
var a [5]int <-- array
b := make([]int, 5) <-- slice
slices vs arrays https://go.dev/blog/slices-intro
chamados de map
tipados
m := make(map[string]int)
go funcao(a,b)
executa a funcao em paralelo
gorotines
as funcoes em paralelo podem se comunicar via canais (tipo
chan
)
c <- ...
envia para o canal
.. <- c
recebe de um canal
defer funcao(a,b)
coloca a chamada numa pilha e elas
serao executadas quando a funcao envolvente acabar
linguagem de baixo nivel para desenvolvimento de sistemas
na minha opiniao, C com melhoras obvias (;
if
for
switch
)
ja vem com um ambiente de execução paralela (assincrona)
gerenciamento de memoria proprio - garbage collection https://medium.com/safetycultureengineering/an-overview-of-memory-management-in-go-9a72ec7c76a8
esses 2 componentes do ambiente de execução vao contra a filosofia de linguagens de desenvolvimento de sistemas (minha opiniao)
compilador é rapido - o codigo gerado pode nao ser otimizado (parece que parte da velocidade é sobre dependencias de pacotes https://devrajcoder.medium.com/why-go-compiles-so-fast-772435b6bd86
https://www.rust-lang.org site
https://doc.rust-lang.org/rust-by-example/ fonte
https://doc.rust-lang.org/book/title-page.html outra fonte
https://play.rust-lang.org rust online
outra linguagem de baixo nivel
desenvolvida pela Mozila
2009
2014 versao 1
declaradas usando let
nao mutavies por
default
inferencia de tipo possivel https://doc.rust-lang.org/rust-by-example/types/inference.html
fn main() {
// Variables can be type annotated.
let logical: bool = true;
let a_float: f64 = 1.0; // Regular annotation
let an_integer = 5i32; // Suffix annotation
// Or a default will be used.
let default_float = 3.0; // `f64`
let default_integer = 7; // `i32`
// A type can also be inferred from context
let mut inferred_type = 12; // Type i64 is inferred from another line
inferred_type = 4294967296i64;
// A mutable variable's value can be changed.
let mut mutable = 12; // Mutable `i32`
mutable = 21;
// Error! The type of a variable can't be changed.
mutable = true;
}
nao ha nenhuma conversao automática de tipos incluindo de int para float
arrays e slices como em Go (tamanho conhecido e fixo ou nao na compilação).
escopo de uma variável é o bloco { }
. Vc pode
definir variaveis locais dentro do bloco https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html
variaveis morrem quando o bloco termina (mas como ficam closures?)
shadowing - definir multiplas vezes a mesma variavel imutavel
fn main() {
let a = [1, 2, 3, 4, 5];
println!("Please enter an array index.");
let mut index = String::new();
io::stdin()
.read_line(&mut index)
.expect("Failed to read line");
let index: usize = index
.trim()
.parse()
.expect("Index entered was not a number");
sintaxe do C com ;
e { }
permite programacao funcional (veja https://doc.rust-lang.org/rust-by-example/fn/hof.html
(ao que parece com thunks - veja o (0..)
é um range
infinito
esse é o grande diferencial de Rust
https://www.makeuseof.com/rust-ownership/
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
variavies que apontam para a mesma posicao de memoria - só uma tem direito aquela posicao
transferir posse de uma para outra variavel é chamado de move
Nao há ownership para valores imutaveis. i32 f64 etc, so para coisas alocadas no heap
nao ha diferenca se o apontador é mutavel ou imutavel.
let s = "um"; <- aloca no stack
let owner = String::from("one"); <- aloca no heap e pode ser modificavel
...
let new_owner = owner; <- new_owner passa a ter o valor
...
println("{}",owner); <- da erro
nao ha problema com variavies no stack - tamanho fixo
let x = 5;
let y = x; <-- causa copia
println("{}",x); <-- sem problema
passar uma variavel para uma funçao causa um move
fn takes_ownership(some_string: String) {
println!("{}", some_string);
}
fn makes_copy(some_integer: i32) {
println!("{}", some_integer);
}
...
let s = String::from("hello"); // s comes into scope
takes_ownership(s); // s's value moves into the function...
// ... and so is no longer valid here
let x = 5; // x comes into scope
makes_copy(x); // x would move into the function,
// but i32 is Copy, so it's okay to still
// use x afterward
voce pode passar uma referencia que nao causa o move
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1); <-- referencia a s1 e nao causa o move
println!("The length of '{}' is {}.", s1, len); <-- funciona
}
fn calculate_length(s: &String) -> usize {
s.len()
}
referencias mutaveis
fn main() {
let mut s = String::from("hello");
change(&mut s);
<-- acho!! que o s esta disponivel aqui
}
fn change(some_string: &mut String) {
some_string.push_str(", world");
}
nao pode haver mais de uma referencia mutavel ao mesmo tempo
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);
ownership sobre partes de um array/slice https://doc.rust-lang.org/book/ch04-03-slices.html
Me parece que é a ideia do escape analysys. Vc determina que referencias a uma memoria nao escapam de uma funcao e entao qunado termina o escopo da referencia, vc pode desalocar a memoria do heap.
https://doc.rust-lang.org/book/title-page.html
if/else, loop etc como expressoes (o break funciona como um return do loop)
funcoes com tipos genericos
closures e iterators
metaprogramming - uma linguagem (do compilador) para escrever macros https://doc.rust-lang.org/book/ch19-06-macros.html
pattern matching https://doc.rust-lang.org/book/ch18-00-patterns.html
unsafe rust https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html