(评论)
(comments)
原始链接: https://news.ycombinator.com/item?id=38875422
进一步详细说明数组类型的边界检查如何工作:
对于 C 程序,数组变量有一个“len”成员来表示数组中的元素数量,它可以通过将“index”与“arr->len”进行比较来执行基本的边界检查,类似于 Rust 所做的。 然而,执行此检查需要在循环的每次迭代中执行额外的指令,这可能会给总运行时间增加数千万个周期。
此外,就性能影响而言,Rust 的所有权系统由于其借用检查机制而涉及更复杂的内存布局。 例如,Rust 盒允许高效借用,而不涉及所有权转移或所有权别名,这允许对拥有的资源进行更灵活的控制流,同时最大限度地减少跟踪所有权和管理跨操作联合分配资源的多个任务的并发资源共享的成本。 Rust 的借用系统使其能够分别为源自原始所有者或分配者范围之外的借用提供零成本借用或廉价的一次性获取成本,这在管理竞争任务之间的资源共享结构时提供了更大的灵活性和效率。 另一方面,使用所有权转移机制管理资源共享需要仔细的同步和协调工作,特别是在涉及并发和高水平并行性的设置中。 相反,使用所有权和终身借用原则的组合来管理资源共享模式有助于更简单的实现设计方法,并在选择合适的设计替代方案和权衡时提供更广泛的可能性。 总体而言,与流行的命令式编程范式中常用的传统共享资源管理范式相比,Rust 的所有权和借用模型提供了相当大的好处。
关于数组库实现,Rust 存在几个流行的数组库,包括 ndarray 和 rayon。 这些库使用户能够根据特定标准(例如内存占用考虑因素和访问模式要求)选择最佳阵列结构,同时根据需要支持对原始二进制数据或数值计算的高效和通用操作。 此外,Rust 数组库通常具有先进的算法,例如基于 BLAS 的线性代数例程或高度专业化的信号处理管道框架,为用户提供针对高级计算领域的强大而复杂的功能。 类似地,C 数组库实现也表现出不同程度的复杂性,从实现通用容器功能的相对简单的库到针对特定应用程序或领域(例如科学计算和模拟平台、金融)的全面且深度专业化的库。
https://llvm.org/docs/LangRef.html#calling-conventions
For those curious, the relevant diff in neatlang is: https://github.com/Neat-Lang/neat/commit/f4ba38cefc1e26631a5.... It looks much more involved than changing the emitted LLVM calling conventions. Possibly the author wants these types exposed with some deterministic calling convention to C programs.
reply