Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Developing Emacs extensions in Go
Search
kiwanami
July 03, 2017
0
1.5k
Developing Emacs extensions in Go
Geeks Who Drink @nulab on 2017/06/28
https://nulab.connpass.com/event/57238/
kiwanami
July 03, 2017
Tweet
Share
More Decks by kiwanami
See All by kiwanami
Backlog Anti-Patterns
kiwanami
0
6.9k
Featured
See All Featured
Building Applications with DynamoDB
mza
88
5.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
The Brand Is Dead. Long Live the Brand.
mthomps
48
28k
Design by the Numbers
sachag
274
18k
The Invisible Customer
myddelton
114
12k
Producing Creativity
orderedlist
PRO
336
39k
Happy Clients
brianwarren
91
6.4k
Fireside Chat
paigeccino
20
2.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
186
16k
Building a Modern Day E-commerce SEO Strategy
aleyda
16
6.4k
Adopting Sorbet at Scale
ufuk
67
8.6k
Transcript
Developing Emacs extensions in Go kiwanami 2017/06/28
Topics • Emacs and extension? • Why do I choose
go? • Design and implementation of go-elrpc
Me • Masashi Sakurai • @kiwanami • Software Developer –
Software engineer for medical/hospital systems • OSS – Emacs Lisp, JavaScript • Go – 2016/12 -
Emacs and Extensions
Emacs? • TEXT EDITOR! – Since mid-1970s and continues actively
as of 2017. • Extensible, Customizable!
Emacs start up screen
Editing code
Split windows and color customize
IDE like window layout
Database integration
Web browser and Data analysing with jupyter
Reading and Writing Mails
Schedule management with calendar services
Cacoo Integration
3D FPS(First person sampo) game
Online Multi-player 3D FPS
Emacs is Great !!
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...
EPC, RPC stack for Emacs Lisp • TCP Socket /
S-exp encoding • Language binding – emacs lisp, perl, python, ruby, nodejs, nim, scala
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
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
None
Desing and Implementation go-elrpc
EPC overview
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
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
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
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:
Performance • echo(a int) int method – perl: 3154 msg/sec
– ruby: 10526.3 msg/sec – nodejs: 9174.31 msg/sec – golang: 26347 msg/sec
Thank you