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
1.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Developing Emacs extensions in Go
Geeks Who Drink @nulab on 2017/06/28
https://nulab.connpass.com/event/57238/
kiwanami
July 03, 2017
More Decks by kiwanami
See All by kiwanami
Backlog Anti-Patterns
kiwanami
0
8.6k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
290
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
600
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Optimising Largest Contentful Paint
csswizardry
37
3.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
Scaling GitHub
holman
464
140k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
How GitHub (no longer) Works
holman
316
150k
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