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

Developing Emacs extensions in Go

kiwanami
July 03, 2017
1.6k

Developing Emacs extensions in Go

Geeks Who Drink @nulab on 2017/06/28
https://nulab.connpass.com/event/57238/

kiwanami

July 03, 2017
Tweet

Transcript

  1. Topics • Emacs and extension? • Why do I choose

    go? • Design and implementation of go-elrpc
  2. Me • Masashi Sakurai • @kiwanami • Software Developer –

    Software engineer for medical/hospital systems • OSS – Emacs Lisp, JavaScript • Go – 2016/12 -
  3. Emacs? • TEXT EDITOR! – Since mid-1970s and continues actively

    as of 2017. • Extensible, Customizable!
  4. Emacs Extension • Pure Emacs Lisp • “Dynamic module” –

    Since Emacs 25.1 – include “emacs-module.h” – not popular yet... • IPC – STDOUT/IN, TCP Socket, D-bus – Hard to implement...
  5. EPC, RPC stack for Emacs Lisp • TCP Socket /

    S-exp encoding • Language binding – emacs lisp, perl, python, ruby, nodejs, nim, scala
  6. Ok, EPC solves problem? • Yes. – Emacs gets powers

    through other languages. • But, Installing other language environment and package system is very difficult... – perl/CPAN, ruby/gem, node/npm, etc
  7. Go may solve the problem • Easy deploying – One

    binary • Fast and static typing – Comparing with LL • Easy to learn – Simple language and GC – Concurrency → go bindign : go-elrpc
  8. go-elrpc overview • S-exp encoding/decoding – parsing s-exps and serializing

    data values – type conversion • RPC stack – TCP stream – async and sessions – bi-directional
  9. S-exp encoding/decoding • goyacc and handwritten lexer (call add (1

    2 3)) Lexer State channel [token] Parser (yacc) S-exp AST rune (unicode char) lexer thread parser thread
  10. RPC stack implementation • stream threads and controle thread Receiver

    thread Sender thread Controle thread decoding encoding socket stream dispatching messages managing sessions User Code RPC Service
  11. Type convesion • S-exp (not static typed) input • Types

    which are needed by static typed functions func add(a int64, b float64) float64 1 (int), 2 (int) input:
  12. Performance • echo(a int) int method – perl: 3154 msg/sec

    – ruby: 10526.3 msg/sec – nodejs: 9174.31 msg/sec – golang: 26347 msg/sec