Todo

todo

CPS 变换

FRP函数反应式编程比如Fjax,把对服务器端的请求处理成一个流Stream,callback不见了。

还有的办法是处理不了callback,可以把它藏起来啊。像ClojureScript的core.async,引入一个并发模型,用一组协作的线程来简化异步编程。

还有其他的理解路径。 比如程序语言处理的路径,可以研究下指称语义,看看用lambda演算做程序语言的模型,是如何用Continuation来建模goto、异常这些涉及控制流转向的构造。

然后可以使用下Scheme这样的显式支持Continuation的语言,它有一个call/cc构造。最后还可以看看在对Scheme、ML这些函数程序语言的编译过程中,如何应用CPS变换把函数程序的控制流凸显出来,向着C语言、或者更底层的汇编语言转化的。

CPS 变换说白了就是把程序内部原本隐式的控制流跳转,用某种方法抽象出来暴露给程序员。@vczh 之前说过光用 CPS 在小萌语言中做出了各种控制流(if 什么的)。 一种常见的情况是,通过 CPS 变换,可以将 Javascript 的回调地狱消除,能用同步的方式写异步程序: BYVoid/continuation · GitHub 人肉的 CPS 是一种递归技巧,能写出更有格(nan)调(dong)的递归程序。(SICP 有提到) CPS 常常用到的地方是实现 ==call/cc ,用这货能实现诸如协程,yield 之类的特性。Call-with-current-continuation== 不过要在编译器里面实现这货,还需要对过程的栈做垃圾回收。(Spaghetti stack 麻花栈) 还有很多我不知道的黑魔法,比如说==阴阳谜题……(continuations)== 还能帮助你理解 ==Haskell 的 monad 陈年译稿——一个面向Scheme程序员的monad介绍==

从协程到状态机–regenerator源码解析(一)

PCA

PCA主成分分析学习总结

Rust

Linux 内核对 Rust 的支持

涉及到的三个方面:内核中现有的 API、架构支持,和 ABI 与内核的兼容性问题。

Rust 与 C 具有良好的互操作性;此外,==bindgen 工具==能够解析 C 头文件以生成适当的 Rust 声明,因此 Rust 不需要从 C 复制重复的定义

但实际上实施起来还存在一些挑战。例如,Linux 大量使用了预处理器宏和内联函数,bindgen 和 Rust 的外函数接口不容易支持它们

需要手动封装多少 C API 才能呈现惯用的 Rust 接口?

Thomas 和 Gaynor 展示了==一个 linux-kernel-module-rust 项目==,可在其中看到内核模式的 Rust 代码示例。在这个项目中,指向用户空间的指针被封装到 UserSlicePtr 类型中。这样的封装生成的代码对现有 Rust 开发者而言更加熟悉,并使 Rust 的类型系统和借用检查器提供最大程度的安全性。但是,必须针对每个 API 进行设计和开发,用 C 和 Rust 编写的模块也会创建不同的 API。这无疑加重了工作的繁琐度。

John Baublitz 也给出了一个演示模块,它更直接地绑定了内核的用户访问功能,绑定多由 bindgen 自动生成。然而,Rust 开发者对这些代码可能会不太习惯,并且这种方式可能需要放弃 Rust 的许多安全保证。

最后,会议达成了共识:对于某些最常见和关键的 API,编写 Rust 封装器是有意义的,但是手动封装每个内核 API 不可行。Thomas 还提到谷歌正致力于自动生成 C++ 代码的惯用绑定,并考虑内核是否可以做类似的事情。

https://zhuanlan.zhihu.com/p/137077998

用Rust重写Linux内核模块体验

Kevin Wang

Kevin Wang

在 Rust 中创建 C/C++ API

最简单的入门方法是使用 bindgen 工具。

cbindgen 为 Rust 生成 C 绑定

另一个在Rust中制作 C ++ API的便利工具是 cpp crate。

Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路

傅里叶变换

傅立叶变换的性质证明

机器人

如何制作机械臂

如何制作一个简单的机械臂

英文听力

Powered by Jekyll and Theme by solid

本站总访问量