用PY实现"Go元编程" 
翁伟@ 希品科技
用PY实现"Go元编程"
关于我 
• 翁伟,原常驻新加坡,现居深圳 
• 不断折腾(10年?)的全端程序员 
• .net -> python -> go 
• 再次回国创业,觅伙伴 
• wengwei@xipintech.com
元编程 
• 指某类计算机程序的编写,这类计算机程序编写或者 
操纵其它程序(或者自身)作为它们的数据 
• 与手工编写全部代码相比,程序员可以获得更高的工 
作效率
元编程其实无处不在 
• 最常见的元编程工具是编译器,它可以将程序员使用 
高级语言编写的相对短小的程序转换为等价的汇编语 
言或者机器语言程序 
• 其它元编程系统则允许以编程方式操纵一种语言。宏 
系统即是这样一种简单的系统
C宏 
#define list_for_each(pos, head)  
for (pos = (head)->next; pos != (head); pos = pos->next)
“Go,互联网时代的C,下一个C” 
– 许式伟
Go元编程? 
• 木有宏 
• 木有泛型 
• 反射很难用 
• “ gopher 这几年很努力,解决了许多别的语言中不存 
在的问题……” - @赖勇浩
看看很努力的gopher 
如何用py来实现go的泛型?
用PY实现"Go元编程"
• StringSet与IntSet代码很类似,仅类型不同 
• 泛型的典型使用场景
用PY实现"Go元编程"
用PY实现"Go元编程"
简单、粗暴、有效
自动生成 
• MakeFile? 
• 监控文件修改:github.com/gorakhargosh/watchdog
再来看看“ORM”
我们用thrift作对象定义 
的DSL
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
同一对象元信息 
• 增删改查 
• 全文搜索 
• 后台权限 
• RPC
对象传递、赋值、显示 
有大量相似的代码
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
• 上述代码都根据对象元信息生成出来 
• 生成的代码不会错
如何实现?
解析对象 
• ptsd: github.com/wickman/ptsd 
• thrift lexer/parser using ply 
• ply: www.dabeaz.com/ply/ 
• An implementation of lex and yacc parsing tools 
for Python
代码生成模板 
• www.cheetahtemplate.org
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
YAML也是好东西~
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
• 实现与ORM类似,只是把DSL从thrift换成YAML 
• YAML 
• 表达能力更强 
• 需求人员友好
外部接口 
• 需要多端实现: 
• web 
• mobile web 
• mobile client 
• 各端业务一致,但调用业务可能需要不同封装
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
用PY实现"Go元编程"
封装代码 
都不应该人肉写
用PY实现"Go元编程"
所以我们项目有30万80万行代码
• 上述仅仅是“演示代码” 
• 实际代码要复杂得多多 
• ORM有开源:github.com/sipin/xuanwu 
• 仅供参考、切勿使用 
• 无文档 
• 不维护 
• 内部已推倒重来
如何定制? 
• 生成一次,后面随便改 
• 随模板修改反复生成: 
• 提供定制接口方法回调 
• 覆盖特定方法
用PY实现"Go元编程"
用PY实现"Go元编程"
• 泛型、ORM、流程、接口封装等等场景均可考虑“元编程” 
• 显然也不只上述场景 
• 把“元编程”视为一种重构手段 
• 先手动写一遍代码 
• 把反复出现、类似的代码抽象为模板 
• 选择DSL 
• Python简单、库资源丰富;可以很容易的验证“元编程”的想法
“元编程”的难点 
• 选择合适的DSL 
• 提供高层次抽象能力 
• 维持细节定制能力 
• www.joelonsoftware.com/articles/LeakyAbstractio 
ns.html
代码生成 
• 解析DSL调用模板生成代码的模式很容易实现 
• 生成的都是简单代码,容易debug 
• 编译器检查代码
反射甚至LISP教? 
• 无须重复编译 
• 运行时检查错误 
• 实现更有难度 
• 代码更加精巧、优雅 
• 显然高大上
“When in doubt, use brute force.” 
–Ken Thompson
Q & A
其实 
• Python不快 
• 比方说,体验过git的极速,就很难忍hg的“不快” 
• 元编程最好还是解析语言本身 
• golang.org/pkg/go/parser/ 
• go generate 
• docs.google.com/document/d/1V03LUfjSADDooDMhe- 
_K59EgpTEm3V8uvQRuNMAEnjg

More Related Content

PDF
Php 5.4 performance
PDF
Jaskell Core Parsec
PDF
Weibo lamp improvements
PDF
Zalora php to_go
PDF
谈谈缓存
PDF
專業外語(二)ghbhuhhhyggyyggyggggggggg-W04.pdf
PDF
專業外語(二)hwhwbajwnjsnansjsjsnsnnsnsnsb-W04.pdf
PDF
20141030 ntustme computer_programmingandbeyond_share
Php 5.4 performance
Jaskell Core Parsec
Weibo lamp improvements
Zalora php to_go
谈谈缓存
專業外語(二)ghbhuhhhyggyyggyggggggggg-W04.pdf
專業外語(二)hwhwbajwnjsnansjsjsnsnnsnsnsb-W04.pdf
20141030 ntustme computer_programmingandbeyond_share

Similar to 用PY实现"Go元编程" (20)

PDF
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PDF
Geo science cafe 如何找到一份满意的工作
PDF
無瑕的程式碼 Clean Code 心得分享
PDF
該怎麼樣(認真的)部署你的 Python Web 應用程式?
PPTX
C++基礎程式設計 ch1 進入c++的世界
PDF
简单Pthon教程
PDF
PPT
Pair Programming (结对编程)
PDF
Python简明教程
PPT
2012,我的技术之选
PPT
2 Python开发工具链
PDF
讓軟體開發與應用更自由 - 使用 Docker 技術
PDF
面試心得
PPTX
0507 coding lesson
PPT
第1章 概论
PPTX
2012/05/23 AU Talk - 讓事情發生
PDF
The ruby-way
PPT
愛創小小聚201307 小強分享
PDF
2006 recycle opensourceprojects
PDF
Recycle Open Source Projects
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Geo science cafe 如何找到一份满意的工作
無瑕的程式碼 Clean Code 心得分享
該怎麼樣(認真的)部署你的 Python Web 應用程式?
C++基礎程式設計 ch1 進入c++的世界
简单Pthon教程
Pair Programming (结对编程)
Python简明教程
2012,我的技术之选
2 Python开发工具链
讓軟體開發與應用更自由 - 使用 Docker 技術
面試心得
0507 coding lesson
第1章 概论
2012/05/23 AU Talk - 讓事情發生
The ruby-way
愛創小小聚201307 小強分享
2006 recycle opensourceprojects
Recycle Open Source Projects
Ad

More from Weng Wei (13)

PDF
Fastest golang ORM implemented with generic
PDF
Migrate PHP E-Commerce Site to Go
PDF
About Caching
PDF
Metaprogramming Go
PDF
Why use Go for web development?
PPTX
Go for web
PDF
Go for web
PDF
Python to go
PDF
论使用Python开发推荐引擎的优越性
PDF
A byte of git
KEY
My understanding of Git
KEY
Sharding
KEY
Inside Zend Framework
Fastest golang ORM implemented with generic
Migrate PHP E-Commerce Site to Go
About Caching
Metaprogramming Go
Why use Go for web development?
Go for web
Go for web
Python to go
论使用Python开发推荐引擎的优越性
A byte of git
My understanding of Git
Sharding
Inside Zend Framework
Ad

用PY实现"Go元编程"