Submit Search
Upload
用PY实现"Go元编程"
•
Download as PPTX, PDF
•
1 like
•
1,003 views
Weng Wei
Follow
Opening presentation given at PyCon 2014 Zhuhai.
Read less
Read more
Technology
Report
Share
Report
Share
1 of 63
Download now
Recommended
Python 1-簡介
Python 1-簡介
阿Samn的物理課本
Php 5.4 performance
Php 5.4 performance
Xinchen Hui
Jaskell Core Parsec
Jaskell Core Parsec
March Liu
Weibo lamp improvements
Weibo lamp improvements
Xinchen Hui
Zalora php to_go
Zalora php to_go
Weng Wei
谈谈缓存
谈谈缓存
Weng Wei
20141030 ntustme computer_programmingandbeyond_share
20141030 ntustme computer_programmingandbeyond_share
Ting-Shuo Yo
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Jen Yee Hong
Recommended
Python 1-簡介
Python 1-簡介
阿Samn的物理課本
Php 5.4 performance
Php 5.4 performance
Xinchen Hui
Jaskell Core Parsec
Jaskell Core Parsec
March Liu
Weibo lamp improvements
Weibo lamp improvements
Xinchen Hui
Zalora php to_go
Zalora php to_go
Weng Wei
谈谈缓存
谈谈缓存
Weng Wei
20141030 ntustme computer_programmingandbeyond_share
20141030 ntustme computer_programmingandbeyond_share
Ting-Shuo Yo
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Jen Yee Hong
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
kewuc
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
Win Yu
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
Andy Dai
C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界
requiemformemories
简单Pthon教程
简单Pthon教程
junjun chen
Go
Go
Feng Yu
Pair Programming (结对编程)
Pair Programming (结对编程)
Josh Chen
Python简明教程
Python简明教程
ingong
2012,我的技术之选
2012,我的技术之选
勇浩 赖
2 Python开发工具链
2 Python开发工具链
March Liu
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
Yu Lung Shao
面試心得
面試心得
澐 向
0507 coding lesson
0507 coding lesson
YU-TING LIN
第1章 概论
第1章 概论
tjpucompiler
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
appuniverz
The ruby-way
The ruby-way
fangdeng
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
iTrEnD
Recycle Open Source Projects
Recycle Open Source Projects
George Ang
2006 recycle opensourceprojects
2006 recycle opensourceprojects
George Ang
注重实效的编程(2)
注重实效的编程(2)
Horky Chen
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
About Caching
About Caching
Weng Wei
More Related Content
Similar to 用PY实现"Go元编程"
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
kewuc
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
Win Yu
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
Andy Dai
C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界
requiemformemories
简单Pthon教程
简单Pthon教程
junjun chen
Go
Go
Feng Yu
Pair Programming (结对编程)
Pair Programming (结对编程)
Josh Chen
Python简明教程
Python简明教程
ingong
2012,我的技术之选
2012,我的技术之选
勇浩 赖
2 Python开发工具链
2 Python开发工具链
March Liu
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
Yu Lung Shao
面試心得
面試心得
澐 向
0507 coding lesson
0507 coding lesson
YU-TING LIN
第1章 概论
第1章 概论
tjpucompiler
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
appuniverz
The ruby-way
The ruby-way
fangdeng
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
iTrEnD
Recycle Open Source Projects
Recycle Open Source Projects
George Ang
2006 recycle opensourceprojects
2006 recycle opensourceprojects
George Ang
注重实效的编程(2)
注重实效的编程(2)
Horky Chen
Similar to 用PY实现"Go元编程"
(20)
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
C++基礎程式設計 ch1 進入c++的世界
C++基礎程式設計 ch1 進入c++的世界
简单Pthon教程
简单Pthon教程
Go
Go
Pair Programming (结对编程)
Pair Programming (结对编程)
Python简明教程
Python简明教程
2012,我的技术之选
2012,我的技术之选
2 Python开发工具链
2 Python开发工具链
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
面試心得
面試心得
0507 coding lesson
0507 coding lesson
第1章 概论
第1章 概论
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
The ruby-way
The ruby-way
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
Recycle Open Source Projects
Recycle Open Source Projects
2006 recycle opensourceprojects
2006 recycle opensourceprojects
注重实效的编程(2)
注重实效的编程(2)
More from Weng Wei
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
About Caching
About Caching
Weng Wei
Metaprogramming Go
Metaprogramming Go
Weng Wei
Why use Go for web development?
Why use Go for web development?
Weng Wei
Go for web
Go for web
Weng Wei
Go for web
Go for web
Weng Wei
Python to go
Python to go
Weng Wei
论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性
Weng Wei
A byte of git
A byte of git
Weng Wei
My understanding of Git
My understanding of Git
Weng Wei
Sharding
Sharding
Weng Wei
Inside Zend Framework
Inside Zend Framework
Weng Wei
More from Weng Wei
(12)
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
About Caching
About Caching
Metaprogramming Go
Metaprogramming Go
Why use Go for web development?
Why use Go for web development?
Go for web
Go for web
Go for web
Go for web
Python to go
Python to go
论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性
A byte of git
A byte of git
My understanding of Git
My understanding of Git
Sharding
Sharding
Inside Zend Framework
Inside Zend Framework
用PY实现"Go元编程"
1.
用PY实现"Go元编程" 翁伟@ 希品科技
2.
3.
关于我 • 翁伟,原常驻新加坡,现居深圳
• 不断折腾(10年?)的全端程序员 • .net -> python -> go • 再次回国创业,觅伙伴 • wengwei@xipintech.com
4.
元编程 • 指某类计算机程序的编写,这类计算机程序编写或者
操纵其它程序(或者自身)作为它们的数据 • 与手工编写全部代码相比,程序员可以获得更高的工 作效率
5.
元编程其实无处不在 • 最常见的元编程工具是编译器,它可以将程序员使用
高级语言编写的相对短小的程序转换为等价的汇编语 言或者机器语言程序 • 其它元编程系统则允许以编程方式操纵一种语言。宏 系统即是这样一种简单的系统
6.
C宏 #define list_for_each(pos,
head) for (pos = (head)->next; pos != (head); pos = pos->next)
7.
“Go,互联网时代的C,下一个C” – 许式伟
8.
Go元编程? • 木有宏
• 木有泛型 • 反射很难用 • “ gopher 这几年很努力,解决了许多别的语言中不存 在的问题……” - @赖勇浩
9.
看看很努力的gopher 如何用py来实现go的泛型?
10.
11.
• StringSet与IntSet代码很类似,仅类型不同 •
泛型的典型使用场景
12.
13.
14.
简单、粗暴、有效
15.
自动生成 • MakeFile?
• 监控文件修改:github.com/gorakhargosh/watchdog
16.
再来看看“ORM”
17.
我们用thrift作对象定义 的DSL
18.
19.
20.
21.
同一对象元信息 • 增删改查
• 全文搜索 • 后台权限 • RPC
22.
对象传递、赋值、显示 有大量相似的代码
23.
24.
25.
26.
27.
• 上述代码都根据对象元信息生成出来 •
生成的代码不会错
28.
如何实现?
29.
解析对象 • 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
30.
代码生成模板 • www.cheetahtemplate.org
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
YAML也是好东西~
41.
42.
43.
44.
• 实现与ORM类似,只是把DSL从thrift换成YAML •
YAML • 表达能力更强 • 需求人员友好
45.
外部接口 • 需要多端实现:
• web • mobile web • mobile client • 各端业务一致,但调用业务可能需要不同封装
46.
47.
48.
49.
50.
封装代码 都不应该人肉写
51.
52.
所以我们项目有30万80万行代码
53.
• 上述仅仅是“演示代码” •
实际代码要复杂得多多 • ORM有开源:github.com/sipin/xuanwu • 仅供参考、切勿使用 • 无文档 • 不维护 • 内部已推倒重来
54.
如何定制? • 生成一次,后面随便改
• 随模板修改反复生成: • 提供定制接口方法回调 • 覆盖特定方法
55.
56.
57.
• 泛型、ORM、流程、接口封装等等场景均可考虑“元编程” •
显然也不只上述场景 • 把“元编程”视为一种重构手段 • 先手动写一遍代码 • 把反复出现、类似的代码抽象为模板 • 选择DSL • Python简单、库资源丰富;可以很容易的验证“元编程”的想法
58.
“元编程”的难点 • 选择合适的DSL
• 提供高层次抽象能力 • 维持细节定制能力 • www.joelonsoftware.com/articles/LeakyAbstractio ns.html
59.
代码生成 • 解析DSL调用模板生成代码的模式很容易实现
• 生成的都是简单代码,容易debug • 编译器检查代码
60.
反射甚至LISP教? • 无须重复编译
• 运行时检查错误 • 实现更有难度 • 代码更加精巧、优雅 • 显然高大上
61.
“When in doubt,
use brute force.” –Ken Thompson
62.
Q & A
63.
其实 • Python不快
• 比方说,体验过git的极速,就很难忍hg的“不快” • 元编程最好还是解析语言本身 • golang.org/pkg/go/parser/ • go generate • docs.google.com/document/d/1V03LUfjSADDooDMhe- _K59EgpTEm3V8uvQRuNMAEnjg
Download now