johnhax.net/2017/stc-vs-ptc/ (观赏本 slide 请使用 Chrome 50+ 等支持 ES6、Fetch API 等新特性的浏览器)
个人简介
hax
贺师俊
百姓网 www.baixing.com
Craigslist
-
58同城,
-
赶集,
-
百姓网
-
58集团,
-
百姓网
百姓网 架构组
Web 前端
Web 标准
W3C HTML5 Chinese IG
HTML, Acknowledgments
做了 一点微小的 工作
JavaScript
- node.js
- babel
- atom
- eslint
- ...
..<
Groovy, Swift
JS
人呐… 自己就不可以预料
github: @hax zhihu: 贺师俊 weibo: @johnhax
正题, 之前
高橋流 簡報法 Takahashi Method
Ruby
高桥征义
高橋流
“人生的忠告”
STC vs PTC
Functional Programming
JavaScript
Production 大规模使用?
FP in JS
===
Garbage
Strong Preference for Immutable Data, 一次性中间变量, 回收
Recursion & Tail Call Elimination, 没有尾递归优化, 爆栈
Trampolining
function trampoline(f) {
return function() {
var result = f.apply(this, arguments);
while (result instanceof Function) {
result = result();
}
return result;
};
}
var reduce = trampoline(function myself(f, list, sum) {
if (list.length < 1) {
return sum;
} else {
return function() {
var val = list.shift();
return myself(f, list, f(val, list));
};
}
});
Trampolining 每次迭代都产生一个临时函数, 垃圾
Function Composition & Partial Application, 临时的参数数组和partial的函数, 垃圾
Conclusion, Never forget that, JS hates you
ES6
PTC Proper Tail Calls
function sum(n, total = 0) {
if (n === 0) return total
else return sum(n - 1, total + n)
}
现场 演示
Flag
Only Safari
V8 flag --harmony_tailcalls
两点 问题
不知道 写对没
新事物
学习一个
反馈
不知道 写对没
调一调
看看 是不是
爆了
然而:, 没爆也不能证明你写对了 也许只是运气(不)好🤡
难调试
DevTools
Error.prototype.stack
ShadowChicken
调试时 ≠ 运行时
Syntactic Tail Calls STC
Proposal co-championed by Mozilla & Microsoft
function factorial(n, acc = 1) {
if (n === 1) {
return acc;
}
return continue factorial(n - 1, acc * n)
}
没写对 就报错
你自己 选的路
逗我呢?
区别
决定权也是 很重要的!
收集错误
浏览器升级 支持PTC……
其他问题
性能
- JSC 📈
- V8 📊
- Chakra 📉
Cross-Realm
安全模型
膜 membrane
Developer Intent
显式地编码 程序员的意图
这里需要 Tail Call!
不小心 “重构”
PTC 优点 STC 缺点
渐进增强?
function foo(x) {
function _foo() {
if (x > 1) {
acc = acc + (x / 2);
x = x - 1;
return _foo();
}
}
var acc = 1;
while (x > 1) {
try {
_foo();
}
catch (err) { }
}
return acc;
}
foo( 123456 ); // 3810376848.5
新语法意味着 需要维护 两套后端
Apple: 我反对!
TC39 Notes 2016-5-24
Conclusion/Resolution: , No consensus on removing PTC No consensus and no rejection to advance STC to stage 1
Apple 胜了?
流程上要求 一致同意
一年过去了……
僵局
😣 JavaScript 依然没有 普遍可用 的尾递归
通向FP之路 依然漫长
但至少……
编译 Target
Elm/PureScript ClojureScript F# |> Babel
@bobzhang BuckleScript, @be5invis Idris => js
WebAssembly
虽然, 不会
但是
Exciting
谢谢!
QA/交流 github: @hax zhihu: 贺师俊 weibo: @johnhax