Slide 1

Slide 1 text

E quando já tá pronto em C? Código nativo em Elixir @nirev Guilherme Nogueira

Slide 2

Slide 2 text

nirev? quem é

Slide 3

Slide 3 text

nirev? quem é

Slide 4

Slide 4 text

nirev? quem é

Slide 5

Slide 5 text

?

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Stack Elixir 1.3 + Phoenix ClojureScript + Reagent PostgreSQL ElasticSearch Cassandra (In Production)

Slide 8

Slide 8 text

Mas e aí? Qualé desse código nativo?

Slide 9

Slide 9 text

Features Processamento de
 Imagens Importação/Exportação de planilhas e documentos
 (docx; xlsx)

Slide 10

Slide 10 text

Features ?

Slide 11

Slide 11 text

Features ? X

Slide 12

Slide 12 text

Features Processamento de
 Imagens Importação/Exportação de
 planilhas e documentos
 (docx; xlsx)

Slide 13

Slide 13 text

?

Slide 14

Slide 14 text

✴ NIFs ✴ Ports ✴ Port Drivers ✴ Nodes ✴ HTTP, pq né? Elixir/Erlang Interoperability Options

Slide 15

Slide 15 text

Elixir/Erlang NIFs: Native Implemented Functions

Slide 16

Slide 16 text

Elixir/Erlang NIFs: Native Implemented Functions Permite implementar funções em C e rodá-las dentro da BEAM São vistas como uma função em Elixir/Erlang para quem chama; pertencem a um módulo Compiladas e linkadas numa biblioteca compartilhada carregada dinamicamente (.so no linux) Jeito mais rápido de rodar C em Elixir/Erlang: não tem troca de contexto

Slide 17

Slide 17 text

Elixir/Erlang NIFs: Native Implemented Functions BEAM NIF Uma NIF é executada como uma extensão direta do código nativo da VM. A execução não é feita num ambiente seguro. A VM não consegue prover o mesmo que ao executar código Erlang, como: escalonamento preemptivo e proteção de memória.

Slide 18

Slide 18 text

BEAM Elixir/Erlang NIFs: Native Implemented Functions

Slide 19

Slide 19 text

Elixir/Erlang NIFs: Native Implemented Functions BEAM

Slide 20

Slide 20 text

Elixir/Erlang NIFs: Native Implemented Functions

Slide 21

Slide 21 text

Elixir/Erlang Ports

Slide 22

Slide 22 text

Elixir/Erlang Ports Mecanismo padrão para comunicar-se com o mundo de fora do Erlang Interface orientada a bytes para comunicação, por exemplo usando pipes em Linux O programa de fora reside em outro processo no SO. Cada port é um recurso de um único processo, e somente ele pode falar com a port. Se o processo termina, a port é fechada.

Slide 23

Slide 23 text

Elixir/Erlang Ports BEAM Owner Process Port Programa

Slide 24

Slide 24 text

Elixir/Erlang Ports Programas que esperam EOF: fechar a port, fecha os dois pipes. Não tem como responder via stdout depois. (alternativa: Porcelain, DIY) Comunicação é stream, sem garantias de chunk: tem que parsear! Se tiver coisa muito complicada, vale usar o Erlang Term Format

Slide 25

Slide 25 text

Elixir/Erlang Port Drivers

Slide 26

Slide 26 text

Elixir/Erlang Port Drivers É uma mistura de NIF com Port. É criada uma port, mas para um processo que está dentro da BEAM. Assim como NIF: • é carregado um .so feito em C • não tem troca de contexto • se pegar fogo, explode tudo A diferença é que você implementa um processo Erlang em C, portanto pode ser assíncrono e reagir a eventos! (mas é mais difícil de implementar)

Slide 27

Slide 27 text

Elixir/Erlang C/Java Nodes Usando a Erl_Interface em C ou Jinterface em Java. Essas libs tem funções que permitem você rodar seu programa como um nó distribuído do Erlang. O acoplamento fica menor, e você consegue detectar falhas no nó remoto. IMO, faz mais sentido quando são duas aplicações que podem co-existir sem necessariamente depender uma da outra.

Slide 28

Slide 28 text

Conclusão?

Slide 29

Slide 29 text

Nenhum homem é uma ilha

Slide 30

Slide 30 text

Elixir/Erlang

Slide 31

Slide 31 text

̣ http://erlang.org/doc/tutorial/introduction.html ̣ http://erlang.org/doc/man/erl_nif.html ̣ http://theerlangelist.com/article/outside_elixir ̣ https://github.com/knewter/complex ̣ https://github.com/alco/porcelain ̣ http://elixir-lang.org/docs/stable/elixir/Port.html ̣ https://github.com/Xerpa/exmagick Referências Links for everyone11!!

Slide 32

Slide 32 text

Obrigado! [email protected] Estamos contratando! @nirev Guilherme Nogueira