Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Guilherme de Maio, nirev

August 06, 2016
Tweet

More Decks by Guilherme de Maio, nirev

Other Decks in Programming

Transcript

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

    Elixir @nirev Guilherme Nogueira
  2. ?

  3. ?

  4. ✴ NIFs ✴ Ports ✴ Port Drivers ✴ Nodes ✴

    HTTP, pq né? Elixir/Erlang Interoperability Options
  5. 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
  6. 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.
  7. 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.
  8. 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
  9. 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)
  10. 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.