Rust:很难学但是令人兴奋的编程语言

Rust:很难学但是令人兴奋的编程语言
2018年11月15日 09:48 帅的相对论

Rust是一种令人兴奋的新语言。如果你有兴趣学习Rust,请继续阅读,以获得一个开发人员采取这种有趣的,虽然困难的语言。

我最近决定认真学习Rust编程语言。我看到它经常出现在有趣的项目中(例如ripgrep)并且一直听到有关它的好消息。自2015年发布1.0以来,我对于挑选Rust的犹豫不决来自两个方面。首先,由于InfluxDB,我完全投资了Go。其次,我听说这不是最容易学习的东西。虽然我通常不会回避困难的任务,但我还是犹豫不决,因为我相信很多开发工具都是这样做的,因为它们易于使用或者为开发人员带来显着的生产力提升。通常情况下,我希望将我的时间投入到我认为具有长寿性的工具中,这些工具将在市场上获得一些临界质量。

然而,有一些关于Rust的东西让我明白,即使它可能很难学习,它也可能在编程语言环境中找出一个非常重要(和需要)的利基。接下来是我对我认为这些优势是什么,我是如何接近学习语言以及为什么我对Rust感到非常兴奋的反思。但要注意,我还没有在生产中运行任何东西,我只编写了大约2,500行Rust代码,我还没有做任何多线程或网络编程或基准测试。这完全取决于我早期的印象。

那么为什么Rust呢?是什么让我想更深入地研究这门语言?如果我没有说它的表现不是重要因素之一,我会撒谎。没有垃圾收集,但在语言/编译器中内置了原语,以确保您不会忘记释放mallocs或意外取消引用无效指针?注册我 列表中还有两个对我感兴趣的重要功能。通过FFI创建可以链接到其他语言(如Python,Ruby,Go等)的库的能力是我一直在考虑的未来在Influx的工作。此外,与C和C ++库的低成本(或零成本)集成是一个很大的动力。我想整合一些大的C ++项目,Rust似乎是一个很好的方法。

至于Rust与Influx的相关性,我梦想创建一个基于Rust的Flux实现,这是一种新的脚本和查询语言,它使用C ++ Apache Arrow库,可以嵌入到其他系统中(如Spark,Kafka Streams,或者其他地方)。此外,我们的云平台的新版本是基于服务的设计,因此Rust可以通过特定服务进入我们的基础架构,这些服务可以从其性能和保证数据竞争中获益(另一个重要的Rust优势)。所以这些都是促使我最终实现这一目标的动力,但我很快发现,那些不会使Rust成为令人信服的语言的唯一因素。

通过实现Lexer,Pratt Parser和Tree Walking Interpreter来学习Rust

我认为一个小项目是开始学习语言的最佳方式。我看到有人链接到Thorsten Ball关于在Go中编写口译员的书并认为在Rust写这篇文章是一个很好的起点。读过这本书之后,我强烈推荐它,但我会回过头来看看。我以前写了一个翻译,我对Go非常熟悉,这个项目的好处在于它限制了我需要学习的范围。它仅使用标准库功能,不需要任何多线程或网络。Thorsten的书附带了所有代码和广泛的测试,所以很容易确保事情是正确的。我没有必要考虑算法如何构建我的内容,只考虑如何在Rust中专门做到这一点。但在我投入实施之前,我必须学习语言基础知识。

我应该给出一些关于我作为开发人员来自哪里的背景信息,因为我认为具有不同背景的人可能会发现学习Rust更容易(或更难)。自2013年中期以来,我一直是一名Go程序员。在此之前,我在一年中的大部分时间里都在单页JavaScript(Backbone)应用程序上工作,在此之前,我在Scala中构建了一个“时间序列数据库(API)”。回过头来,我正在编写Ruby和Rails应用程序,并将大量的JavaScript混合在一起,这是我在2006年到2010年期间所关注的。在此之前,它是C#和Delphi之前(我不是一个人看到的)在许多简历上)。我以前写过C和C ++,但是从2009年开始编写,到目前为止我可能只写了大约10k行的代码。更重要的是,我' 几乎我的整个职业生涯都在垃圾收集语言中工作。我也不是很低级别而不是系统人员(除非你计算建立一个数据库)。

我从阅读The Rust Programming Language开始,这是免费在线文档的一部分。我的学习过程通常涉及多次覆盖我正在努力学习的主题的材料。第一步是获得更高层次的想法并介绍词汇。我将此称为我在概念中构建索引的点。因此,我很快就仔细阅读了这本书,而不必担心我是否对每个部分都有深刻的理解,因为我打算重新阅读它或者拿一本书以略微不同的方式覆盖相同的材料。

阅读这本特别的书让我很早欣赏Rust社区的优势:文档内置于所有内容中。标准库的文档是在线的,或者您可以通过一个命令在本地启动它们(当您在飞机上学习时这是很棒的)。文档作为代码中的注释存在,这是第三方库的标准。货物,包裹管理系统,非常善于将这一切结合在一起。如果您有一个库,则可以使用单个命令显示其所有依赖项的文档和文档。注释中文档的另一个惊人之处在于,您在文档中放置的示例实际上是在测试期间构建的,因此文档中的代码永远不会与实际的库定义不同步(我项目的例子)。这些小小的改动结合起来构建了我认为是未来Rust库作者,更重要的是用户的非常坚实的基础。

此时,我已准备好开始实际编写代码。Thorsten的书只有四章,但它有相当多的材料(仅200多页)。你实现一切的顺序是:首先是词法分析器,然后是解析器,然后是解释器,然后返回在所有三个区域中为语言添加功能。将词法分析器转换为Rust是一个相当简单的过程,除了与借用检查器和编译器的初步斗争之外,并没有提出太多的挑战。由于学习新事物的很大一部分是死记硬背,因此构建词法分析器和解析器的机械方面实际上是一个很好的重复性任务,可以开始将语法和词汇敲入大脑。创建测试也是有趣和令人满意的,看它失败了,然后编写一些代码让它通过。托尔斯滕”

当实现解析器时,我碰到了一堵墙。具体来说,我不得不弄清楚如何进行递归和嵌套树结构(AST),而不会让Rust借用检查器对我大喊大叫。我用Google搜索了一下并重新阅读了本书的某些部分,但我显然需要更深入地了解借阅检查器。我还读了其他人在学习Rust的过程中“撞墙”的说法,所以我认为额外的努力会让我缩小它。

事实上,在我的学习过程中,有多次我被及时运回到我最初尝试学习如何编程的时候。在小学和初中学习Basic之后,我记得在高中的晚上试图让C程序编译而不是搞清楚。我采取了多种尝试和方法,最终以任何有意义的方式获取编程。与流行的看法相反,我认为伟大的程序员不具备使学习编码变得容易的先天能力。我认为他们只是通过障碍来寻找那些“正常工作”并且您感到非常满足感的那些时刻。我的感觉是,如果你要学习Rust,你需要为这种努力和挫折做好准备,但如果你这样做,

我决定是时候回到一些更有条理的学习了,所以我选择了编程Rust,并在回到代码之前阅读前十章。这本书很棒,正是我需要开始真正获得Rust的一些核心概念。这个内容涵盖了一些关于内存如何组织的深入内容,并且经常引用C ++代码进行比较,但是C ++知识并不是从中获取重要价值的先决条件。我认为阅读两者都是一种很好的方法,我可能会以同样的方式重复它:读一个,写一些代码,然后读另一个。

在阅读了编程Rust的前10章后,我能够完成其余的实现。我仍然有开放的问题,我不确定我使用的结构是否最有意义。我试图非常接近Thorsten的Go实现,但我确实带来了一些特定于Rust的东西。但总的来说,我不确定经验丰富的Rust程序员是否会赞同其风格和结构。在我的知识中,我将回到我计划做的事情来解决这个差距。

我使用枚举非常广泛,我使用Rust的Result模式返回错误。Rust的错误处理习惯非常棒。必须处理错误(或通过额外的代码和击键明确忽略)和?运算符非常适合消除一堆样板错误处理代码(对于来自Go的任何人来说应该特别引人注目)。不再检查错误并返回它是否存在。Rust为您处理此问题。使用此函数解析Thorsten的Go实现和Rust实现中的哈希文字。

Rust的优势和最佳位置

我估计我在学习Rust的过程中还没有完成,但我仍然对我认为Rust适合编程环境的方法有所了解。考虑它的最简单方法是讨论Rust可能取代的语言。我认为你在C或C ++中考虑做的几乎所有项目都是Rust的候选人。较低级别的系统项目,需要优异性能的项目,或需要更多控制内存发生情况的项目。负载平衡器,代理,操作系统,数据库,网络队列,分布式系统,机器学习库,更高级语言的底层实现,以及可能无法想到的无数其他事情。我认为所有这些都代表了Rust实现的完美候选者。

在过去的五年中,Go已经开展了大量这类项目。Go的主要优势之一是语言的简单程度以及学习的速度。相比之下,Rust有更多的语法,一个用于内存管理的模型,很少有程序员熟悉,以及一个比最差的规则更严格的编译器。然而,Rust可以吹嘘有令人信服的优势,我认为这需要最初的学习曲线。

我之前提到过这一点,但Rust的模型在开发安全的Rust代码时无法创建数据竞争。并发模型由编译器检查。我们在InfluxDB中遇到了一些生产错误,因为数据竞争只是在高负荷下捕获的。虽然Go可能有通道,但它不提供编译时保证,您不会创建数据竞争。

编译器强制错误检查是另一个重大胜利。是的,您的开发过程可以强制执行代码审查,这应该捕获任何代码未正确处理错误,但这是一个错误的过程。使用Rust,编译器会强制您“做正确的事情”,这很好,因为那时您不必担心它会超过代码审查。

没有引用nil指针。哦,在过去的五年中,我做过多少次,看过这个或者被它咬过了?这一切都随着Rust而消失。再次,编译器将强制您做正确的事情。说到编译器,它给出的消息是我见过的最好的。很有帮助,并经常告诉您如何解决您的错误。

在Rust中,由于编译时间保证,完全不可能创建错误类。因为它是软件,所以会有bug。哦,是的,会有错误。但是,我们可以创建所有新错误,而不是绊倒我们在过去四十多年中创建的其他错误。这是收益,尽管编译器很严格,但Rust的赌注是,如果你学习的方式与其他语言一样高效(或更多)。在编程Rust中,Jim Blandy和Jason Orendorff将此称为“Rust的激进赌注”。

后续步骤和结论

在我验证Blandy和Orendorff的主张之前,我有更多的里程可以在我的Rust之旅中旅行,但我打算给它真正的努力。以下是我获得某种级别的Rust专业知识的后续步骤。

我打算完成编程Rust并阅读The Rustinomicon,这本关于高级和不安全的Rust的书。之后,我将选择一个小型原型项目来创建一个使用C ++存储库的Web服务。为此,我将最终深入研究网络编程和多线程。我还会拿起一些不安全的代码(或使用现有的Crate)。说到,Rustaceans如何编写gRCP服务?

我需要关注的另一个地方是Rust惯用的东西。为此,我想花时间阅读Crates(Rust库),其他Rust开发人员认为这些风格很好,并且可以练习语言的各个方面。这里的任何建议都会非常感谢,只是在推特上。此外,如果有任何Rustaceans有一个小时与我进行Zoom调用并为Monkey Rust选择代码,我会欠你的债务,我很乐意将其付给其他一些新人一旦我更加快速。或者我还在回购中提出了拉动请求的一些问题。

最后,我选择了Thorsten在Go中编写解释器的续集,题为“在Go中编写编译器”,我期待着阅读并添加到我的Monkey Rust实现中。如果您对该主题感兴趣,我强烈推荐它们。

在完成所有这些之后,我将在一个很好的地方为我在Vietx上设想的一些项目做出真正的努力。我认为在Rust中创建一个可嵌入的Flux实现是一件很棒的事情。

我还没弄清楚我在Rust中的表现如何,但到目前为止,我很高兴能够学习这门语言,并对我用它构建的内容感到非常兴奋。我认为很有可能在未来五十年内重写大量的C和C ++代码,从而形成围绕Rust保证构建的更安全的系统软件。我会在其中写一个新的网络服务吗?也许,虽然我可能仍然可以使用Go,但根据要求,Rust可能是首选。

如果Rust的激进赌注证明是一个胜利的赌注,它将成为我事实上的服务器和系统的首选。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部