Técnicas Alternativas de
Cléber Zavadniak
2020
https://cleber.solutions/
versus
"Features" de linguagem
importam muito menos que
outras características de ecossistema.
Agora, sim, a pergunta faz sentido.
Commodity.
C#
Java
JS
Python
Go
PHP
COBOL
C++
C
asm
swipl -f awesome.pl
swipl -f roads.pl
path(a, e, Path, Distance).
path(a, e, Path, Distance), [H|T] = Path, [H2|T2] = T, H2 = b.
append([a], [b], X).
append(A, B, [a, b, c, d]).
<vírgula> = AND | <ponto-e-vírgula> = OR/ELSE | <ponto> = END
Vide:
https://medium.com/clebertech-en/prolog-is-not-that-hard-f8cb2b8b3e43
https://medium.com/clebertech-en/prolog-is-not-that-hard-part-2-3a88ac8f02e0
Exemplo interessante: "julian"
Datas, baseado somente em constraints.
:- use_module(library(julian)). :- use_module(library(clpfd)). solution(Year) :- % Eisenhower presidency had % Fourth of July on Sunday in ... form_time([dow(sunday), Year-07-04]), Year in 1953..1961. ?- solution(Y). Y = 1954.
Código feito para rodar eternamente.
Casamento de padrões: herdado do Prolog
(Ver no terminal)
{Status, Fd} = file:open(Filename, [read]).
{ok, Fd} = file:open(Filename, [read]).
X = 10. 10 = X. → Erro!
(Recursão no rabo)
Ver no terminal
(arquivos.erl+29)
read_line consegue "printar" um arquivo
de qualquer tamanho
sem variação no uso de memória.
IMPLEMENTAR: "count.erl"
count(N): printa os números de 0 até N.
Registro de ativação atual
Registro de ativação atual
Ver: processos.erl
(Ou green threads)
(one_to_one)
(one_to_all)
"Tão rápida quanto C,
tão expressiva quanto Python,
tão extensível quanto LISP."
Valores do tipo do primeiro parâmetro de uma função
podem chamá-la com notação similar a
chamada de métodos
(dot notation)
Ver no terminal: ufcs.nim
Ver no terminal
(Ver no terminal)
the_minimum(2, 3)
the_minimum[float](2, 3)
(Ver no terminal: templates.nim)
Ver no terminal: templates.nim
Vide:
https://hookrace.net/blog/introduction-to-metaprogramming-in-nim/
Se você escrever um `if`...
CPython
C compiler
Nim Transpiler
Nim
Generated C
Rust
Rust Compiler
Binário
Binário
C
Python
https://github.com/kostya/benchmarks
https://github.com/drujensen/fib
BF = Máquina de Turing.
base64 = encoding.
Havlak = Sei lá. Mas usa várias estruturas de dados.
Absolutamente recomendado:
https://benchmarksgame-team.pages.debian.net/benchmarksgame/sometimes-people-just-make-up-stuff.html
C++ (1s)
Nim GCC (1.75)
Nim Clang (1.78)
C GCC (1.81)
Kotlin (1.87)
Resto:
Rust (2.02)
C Clang (2.16)
Go (2.42)
C GCC (12s)
Crystal (16s)
C Clang (17s)
C++ (17s)
C# (17s)
Rust (18s)
Nim GCC (18s)
Nim Clang (20s)
Kotlin (21s)
Java (21s)
Resto:
Go (40.15)
Rust (1.33s)
C (1.47)
Nim Clang (1.65)
Nim GCC (1.66)
V (~2)
Crystal (2.13)
Ruby (2.17)
Java (2.49)
Resto:
Kotlin (2.62)
Node (2.91)
Go (2.93)
Crystal (6.90s)
Nim GCC (11.72)
Nim Clang (12.21)
Resto:
C++ (14.20)
Go (18.72)
(M-i-n, não "Nim".)
Também Forth, Joy e Cat
"Concatenativa" não significa necessariamente
"stack based". Mas a maioria é.
Concatenativa:
Prog_A <concat> ProgB =
Prog_B(Prog_A)
(
:n
1 :i
1 :f
(i n <=)
(
f i * @f
i succ @i
) while
f
) :factorial
Imagine que
você tem apenas
32 bytes de memória
disponíveis
e precisa executar algoritmos razoavelmente complexos.
Argo Submersible Vehicle
Space Shuttle (now retired)
Dedique algum tempo para estudar uma parada ridícula.
http://cleber.solutions