-
-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1) #994
Comments
简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1) by @nagisakaworu17简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1)
我的长期TODO列表里已经躺着五六篇以“博文”开头的条目——原本想着寒假一周一篇很快就能写完,然而到现在也没动笔。爆肝填坑了一个星期,今天实在有点累,不大想打开 RustLion,于是把这篇坑了很久的文章写一写。
本文的主要内容是从我个人的经验出发,简单聊聊对于 Rust 的一些想法和体会。我会尽量避开诸如 “文档质量良好”、“很有特点” 这类宽泛的概括,而尽量将自己在使用 Rust 编程的过程中感受到的一些特别之处、尤其是和此前经历的不同之处拿来说说。我期望如此行文能使得本文对无论是 Rust 初学者、还是仍在观望的开发者甚至是 Rust 老手们都能带来一定启发。 本文将主要按这些体会主要关注的语言侧面组织,每一点之间的内容基本独立,我将尽量涉及从语言哲学到线程安全的实现细节等多个方面和层次的内容。 由于篇幅原因,本文将分截为两到三篇文章发出。其实原本不想写这么多……. 😥😥😥 以下是文章内容的粗略概要(很可能有变动):
本文将包含以上概要的第一到三部分。其实原本真的真的不想写这么多……. 😥😥😥😥😥😥 Cover image by かざり on Twitter. 编程语言的哲学一直以来我都认为,一门计算机语言的哲学对语言多个方面的特性都有着非常重要的影响,理解语言的设计哲学对理解语言为何如此有着重要的意义。比如,个人认为:
Rust: “be explicit”Rust 一点重要的设计考虑,在于 be explicit。或许是看到了 C++ 长期坚持在各种问题上走隐式优先的策略如今吃了太多苦头(比如隐式类型转换一向以来被视作是 “bug 的一大来源”,甚至还有
Rust 要求在各种引用、分配内存时显式声明,这使得程序员更加关心引用的传递以及资源的消耗:以程序员的更高心智负担为代价,Rust 不断提醒着程序员注意资源分配,通过语法的冗长督促提醒程序员尽量减低资源使用。 Rust 同样具有一些程度的隐式(implicit ,注意不是 Scala 语境下的那个 implicit):如通过 有时候,复杂的分配声明、引用和解引用转换会导致冗长难读的代码。Rust 通过一些标准库 trait 部分缓解了这一负担,并通过宏(macro)系统(下文会更深入地涉及)为一些常见范式提供了全兼容的写法,将这一负担转嫁到宏的实现中。比如,众所周知,大家都不喜欢用
这一点哲学,是 Rust 的首创吗?我想不是。写到这里,我在想,是不是所有与ML系(或者说 Haskell 系?)语言的元素(如 Typeclass、ADT through datatype + pattern matching with exhaustiveness checking 等)有强烈关联的语言都更加倾向于 be explicit。Rust 如此;Haskell 如此;C++ 20 的一个失败的 concept 的设计草案(被称为 Indiana Concept)同样如此(我觉得这个草案被否决某种上是因为在一门本来鼓励隐式的语言中去推行 be explicit 只会导致如 这样一簇语言设计思路为什么都走向了 be explicit 这一哲学?这一哲学是必然隐含在人们通常界定的 “ML味”(即:带类型推导和参数化多态(但没有子类型多态)的静态类型系统,即 Hindley-Milner 类型系统;
复杂性我想大家应该都会同意,Rust 是一门复杂的语言。但是 Ruaaast 的复杂性并不在于这一门语言表达力多么惊人、程序员能够接触到多少新的特性、进而将此前多少无法简洁表达的抽象统统实现,而是在于 Rust (出于各种权衡)引入的独特所有权和线程安全机制将大大挑战程序员以往的思维——或者说,Rust 带来的主要的复杂度和陌生之处,并不用于向程序员的工具箱中增添多少强力的工具(事实上,个人认为,很大程度上 Rust 的表达力并未显著超出ML系语言的一般水平,详见下文),而是用于解决很多其它语言中并不存在的问题。 Rust 具有复杂的类型系统。在 Rust 中,不仅值和引用(以及和引用的引用,引用的引用的引用,…)不是同一个类型,不符合生命周期约束的引用,同样不是同一个类型,不匹配的传参将会被编译器拒绝(生命周期 “匹配” 的规则,能不能看作是生命周期的 subtyping…?比如, “子语言”借用知名PLT大V千里冰封在某次技术分享中的话语,那就是和绝大部分计算机语言一样,Rust 同样也是由很多门子语言组成的。简单列举一下,我们可以得到:
并发和线程安全我真的好累,眼睛还疼学校里还没有人喜欢我 😥😥😥,所以这个部分只能简单写写算了。 在一门没有运行时的语言里实现易用的并发是有挑战性的——特别是线程安全的并发。Rust 通过向标准库中引入几个设计精巧的 API —— 从一般工程实践上看,在 Rust 中编写良好的线程安全并发,需要了解的包括:
除此以外,如果需要深入理解 Rust 并发的实现原理,还需要了解 在任何编程语言中实现线程安全的并发都需要细致的设计考虑和复杂的工程实现。Rust 社区呈现出如此完全的生态和易用程度,足以为开发人员和软件生产带来良好的体验,并为其它编程语言的设计带来重要启发。 第一部分:主要引述来源以下简单列出本部分文章主要引述资料的来源。有一部分引文已在原文中以超链接形式给出,故在此处略去。
本文就这么多。感觉其实没讲什么很有意思的东西。。。。然而我真是要累死了 😑😑 希望还有机会写完本文。祝大家新年 Ruaaaaaaaaast 愉快! <全文完> 简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1) |
感觉这样下去真的不行,如果每次动笔都是起码五千字——意味着好几天的全天候无休码字、占用了所有的空闲时间、导致长久的眼睛酸疼的话,很快就要丧失更新博文的动力了…… 😥😥😥
Tags:
via Pocket https://ift.tt/3aZ57uN original site
February 13, 2021 at 07:36AM
The text was updated successfully, but these errors were encountered: