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.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
Share
More Decks by kiwanami
See All by kiwanami
Backlog Anti-Patterns
kiwanami
0
7.6k
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Become a Pro
speakerdeck
PRO
25
5k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
What's in a price? How to price your products and services
michaelherold
243
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
700
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
It's Worth the Effort
3n
183
27k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
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