Elixir nativo: e quando já tá pronto em C?

Elixir nativo: e quando já tá pronto em C?

Apresentação feita no ELUG-SP dia 06/08/2016.

4b178f929b750c873b4d2b0c0a682051?s=128

Guilherme de Maio, nirev

August 06, 2016
Tweet

Transcript

  1. E quando já tá pronto em C? Código nativo em

    Elixir @nirev Guilherme Nogueira
  2. nirev? quem é

  3. nirev? quem é

  4. nirev? quem é

  5. ?

  6. None
  7. Stack Elixir 1.3 + Phoenix ClojureScript + Reagent PostgreSQL ElasticSearch

    Cassandra (In Production)
  8. Mas e aí? Qualé desse código nativo?

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

    xlsx)
  10. Features ?

  11. Features ? X

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

    xlsx)
  13. ?

  14. ✴ NIFs ✴ Ports ✴ Port Drivers ✴ Nodes ✴

    HTTP, pq né? Elixir/Erlang Interoperability Options
  15. Elixir/Erlang NIFs: Native Implemented Functions

  16. 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
  17. 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.
  18. BEAM Elixir/Erlang NIFs: Native Implemented Functions

  19. Elixir/Erlang NIFs: Native Implemented Functions BEAM

  20. Elixir/Erlang NIFs: Native Implemented Functions

  21. Elixir/Erlang Ports

  22. 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.
  23. Elixir/Erlang Ports BEAM Owner Process Port Programa

  24. 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
  25. Elixir/Erlang Port Drivers

  26. 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)
  27. 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.
  28. Conclusão?

  29. Nenhum homem é uma ilha

  30. Elixir/Erlang

  31. ̣ 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!!
  32. Obrigado! pahagon@xerpa.com.br Estamos contratando! @nirev Guilherme Nogueira