狠狠撸

狠狠撸Share a Scribd company logo
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟; 
翁伟@ 希品科技
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
对于我 
? 翁伟,原常驻新加坡,现居深圳 
? 不断折腾(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的泛型?
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
? StringSet与IntSet代码很类似,仅类型不同 
? 泛型的典型使用场景
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
简单、粗暴、有效
自动生成 
? MakeFile? 
? 监控文件修改:github.com/gorakhargosh/watchdog
再来看看“翱搁惭”
我们用thrift作对象定义 
的DSL
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
同一对象元信息 
? 增删改查 
? 全文搜索 
? 后台权限 
? RPC
对象传递、赋值、显示 
有大量相似的代码
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
? 上述代码都根据对象元信息生成出来 
? 生成的代码不会错
如何实现?
解析对象 
? 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
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
驰础惭尝也是好东西词
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
? 实现与ORM类似,只是把DSL从thrift换成YAML 
? YAML 
? 表达能力更强 
? 需求人员友好
外部接口 
? 需要多端实现: 
? web 
? mobile web 
? mobile client 
? 各端业务一致,但调用业务可能需要不同封装
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
封装代码 
都不应该人肉写
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
所以我们项目有30万80万行代码
? 上述仅仅是“演示代码” 
? 实际代码要复杂得多多 
? ORM有开源:github.com/sipin/xuanwu 
? 仅供参考、切勿使用 
? 无文档 
? 不维护 
? 内部已推倒重来
如何定制? 
? 生成一次,后面随便改 
? 随模板修改反复生成: 
? 提供定制接口方法回调 
? 覆盖特定方法
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
? 泛型、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

Similar to 用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟; (20)

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

More from Weng Wei (13)

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

用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;