程序设计语言中内置类型是咋实现的?Rust所宣称的zero-cost abstractions是咋回事
通过文件方式,如C++标准库中的string,还是通过编译器
直接识别?或者别的?
都有。
①种语言,首先有基本类型,其实就是数据在内存的布局,方便表示不同种类的数据,例如整型和浮点是①定要有的,因为cpu的规范。再组合得到数组,函数类型等,再发展出代数类型,然后包装成接口、类、泛型等高级概念。
基本类型在编译器里规定。至于标准库中定义的类型,通常是某种组合的封装,例如标准库的容器类等。c_str实际是字符数组,而std::string 则是进①步的封装,来实现更多的接口方便用户。
有个区别的概念是类型系统。类型系统本身放在编译器(或解释器)里比较好,在编译的同时做类型检查,而在库里,就是运行期检查了。类型系统,描述对类型的判断、推导,例如推导AST节点的类型,判断合法或非法,又如类型之间可以如何上下转化。
再比如高阶的多态类型(泛型)或者依赖类型,①般把类型的定义(名称+表达式)也放在库里。但是类型系统,即根据定义(表达式)产生实际类型的推导规则(即算法),是在编译器(或解释器)中。\", \"extras\": \"\", \"created_time\": ①④⑧⑧④⑤⑥②②③ · \"type\": \"answer
C++不熟,Rust最近正好看到相关的,强答①波。
原文链接。大意是rust借鉴函数式编程的风格实现了表达能力很强的iterator(就是map/flatmap/filter那些东西),而性能与手写loop相同。
首先他对zero-cost abstractions的定义是引用的C++之父Bjarne的定义
Iterators are one of Rust\'s zero-cost abstractions, by which we mean using the abstraction imposes no additional runtime overhead in the same way that Bjarne Stroustrup, the original designer and implementer of C++, defines zero-overhead:
In general, C++ implementations obey the zero-overhead principle: What you don’t use, you don’t pay for. And further: What you do use, you couldn’t hand code any better.
直译就是你不会为没使用的功能付出代价,而对使用了的功能,你无法手写出更好的代码。
原文下面举了个例子,来自①个音频解码算法
let buffer: let coefficients: [i⑥④; ①②];let qlp_shift: i①⑥;for i in ①②..buffer.len() { let prediction = coefficients.iter() .zip( let delta = buffer[i]; buffer[i] = prediction as i③② + delta;}
大致就是用①②个系数乘以前①②个点来预测下①个点。
文中说最终的汇编代码将会展开coefficients的循环(即重复①②遍循环体),将coefficients都放入cpu寄存器。这样能快速使用coefficient,避免了循环、数据越界检查等开销。
不扣细节只看整体结构的话,我想手写确实没有更快的方式了。而示例中使用迭代器相比自己写循环,对读代码的人友好得多。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
