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

    View Slide

  2. nirev?
    quem é

    View Slide

  3. nirev?
    quem é

    View Slide

  4. nirev?
    quem é

    View Slide

  5. ?

    View Slide

  6. View Slide

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

    View Slide

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

    View Slide

  9. Features
    Processamento de

    Imagens
    Importação/Exportação de
    planilhas e documentos

    (docx; xlsx)

    View Slide

  10. Features
    ?

    View Slide

  11. Features
    ?
    X

    View Slide

  12. Features
    Processamento de

    Imagens
    Importação/Exportação de

    planilhas e documentos

    (docx; xlsx)

    View Slide

  13. ?

    View Slide

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

    View Slide

  15. Elixir/Erlang
    NIFs: Native Implemented Functions

    View Slide

  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

    View Slide

  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.

    View Slide

  18. BEAM
    Elixir/Erlang
    NIFs: Native Implemented Functions

    View Slide

  19. Elixir/Erlang
    NIFs: Native Implemented Functions
    BEAM

    View Slide

  20. Elixir/Erlang
    NIFs: Native Implemented Functions

    View Slide

  21. Elixir/Erlang
    Ports

    View Slide

  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.

    View Slide

  23. Elixir/Erlang
    Ports
    BEAM
    Owner
    Process
    Port
    Programa

    View Slide

  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

    View Slide

  25. Elixir/Erlang
    Port Drivers

    View Slide

  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)

    View Slide

  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.

    View Slide

  28. Conclusão?

    View Slide

  29. Nenhum homem é uma ilha

    View Slide

  30. Elixir/Erlang

    View Slide

  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!!

    View Slide

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

    View Slide