SlideShare a Scribd company logo
用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
Ad

More Related Content

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

PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Jen Yee Hong
 
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
kewuc
 
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
Win Yu
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
Andy Dai
 
C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界
requiemformemories
 
简单Pthon教程
简单Pthon教程简单Pthon教程
简单Pthon教程
junjun chen
 
Pair Programming (结对编程)
Pair Programming (结对编程)Pair Programming (结对编程)
Pair Programming (结对编程)
Josh Chen
 
Python简明教程
Python简明教程Python简明教程
Python简明教程
ingong
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
勇浩 赖
 
2 Python开发工具链
2 Python开发工具链2 Python开发工具链
2 Python开发工具链
March Liu
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
Yu Lung Shao
 
面試心得
面試心得面試心得
面試心得
澐 向
 
0507 coding lesson
0507 coding lesson0507 coding lesson
0507 coding lesson
YU-TING LIN
 
第1章 概论
第1章 概论第1章 概论
第1章 概论
tjpucompiler
 
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
appuniverz
 
The ruby-way
The ruby-wayThe ruby-way
The ruby-way
fangdeng
 
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
iTrEnD
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
George Ang
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
George Ang
 
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Jen Yee Hong
 
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
kewuc
 
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
Win Yu
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
Andy Dai
 
C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界
requiemformemories
 
简单Pthon教程
简单Pthon教程简单Pthon教程
简单Pthon教程
junjun chen
 
Pair Programming (结对编程)
Pair Programming (结对编程)Pair Programming (结对编程)
Pair Programming (结对编程)
Josh Chen
 
Python简明教程
Python简明教程Python简明教程
Python简明教程
ingong
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
勇浩 赖
 
2 Python开发工具链
2 Python开发工具链2 Python开发工具链
2 Python开发工具链
March Liu
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
Yu Lung Shao
 
面試心得
面試心得面試心得
面試心得
澐 向
 
0507 coding lesson
0507 coding lesson0507 coding lesson
0507 coding lesson
YU-TING LIN
 
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
appuniverz
 
The ruby-way
The ruby-wayThe ruby-way
The ruby-way
fangdeng
 
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
iTrEnD
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
George Ang
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
George Ang
 

More from Weng Wei (13)

Fastest golang ORM implemented with generic
Fastest golang ORM implemented with genericFastest golang ORM implemented with generic
Fastest golang ORM implemented with generic
Weng Wei
 
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to GoMigrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
 
About Caching
About CachingAbout Caching
About Caching
Weng Wei
 
Metaprogramming Go
Metaprogramming GoMetaprogramming Go
Metaprogramming Go
Weng Wei
 
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
Weng Wei
 
Go for web
Go for webGo for web
Go for web
Weng Wei
 
Go for web
Go for webGo for web
Go for web
Weng Wei
 
Python to go
Python to goPython to go
Python to go
Weng Wei
 
论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性
Weng Wei
 
A byte of git
A byte of gitA byte of git
A byte of git
Weng Wei
 
My understanding of Git
My understanding of GitMy understanding of Git
My understanding of Git
Weng Wei
 
Sharding
ShardingSharding
Sharding
Weng Wei
 
Inside Zend Framework
Inside Zend FrameworkInside Zend Framework
Inside Zend Framework
Weng Wei
 
Fastest golang ORM implemented with generic
Fastest golang ORM implemented with genericFastest golang ORM implemented with generic
Fastest golang ORM implemented with generic
Weng Wei
 
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to GoMigrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
 
About Caching
About CachingAbout Caching
About Caching
Weng Wei
 
Metaprogramming Go
Metaprogramming GoMetaprogramming Go
Metaprogramming Go
Weng Wei
 
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
Weng Wei
 
Go for web
Go for webGo for web
Go for web
Weng Wei
 
Go for web
Go for webGo for web
Go for web
Weng Wei
 
Python to go
Python to goPython to go
Python to go
Weng Wei
 
论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性
Weng Wei
 
A byte of git
A byte of gitA byte of git
A byte of git
Weng Wei
 
My understanding of Git
My understanding of GitMy understanding of Git
My understanding of Git
Weng Wei
 
Inside Zend Framework
Inside Zend FrameworkInside Zend Framework
Inside Zend Framework
Weng Wei
 
Ad

用PY实现"Go元编程"