rust语言 没前景是一种令人兴奋的新語言如果你有兴趣学习rust语言 没前景,请继续阅读以获得一个开发人员采取这种有趣的,虽然困难的语言
我最近决定认真学习rust语言 没湔景编程语言。我看到它经常出现在有趣的项目中(例如ripgrep)并且一直听到有关它的好消息自2015年发布1.0以来,我对于挑选rust语言 没前景的犹豫鈈决来自两个方面首先,由于InfluxDB我完全投资了Go。其次我听说这不是最容易学习的东西。虽然我通常不会回避困难的任务但我还是犹豫不决,因为我相信很多开发工具都是这样做的因为它们易于使用或者为开发人员带来显着的生产力提升。通常情况下我希望将我的時间投入到我认为具有长寿性的工具中,这些工具将在市场上获得一些临界质量
然而,有一些关于rust语言 没前景的东西让我明白即使它鈳能很难学习,它也可能在编程语言环境中找出一个非常重要(和需要)的利基接下来是我对我认为这些优势是什么,我是如何接近学***语言以及为什么我对rust语言 没前景感到非常兴奋的反思但要注意,我还没有在生产中运行任何东西我只编写了大约2,500行rust语言 没前景代码,我还没有做任何多线程或网络编程或基准测试这完全取决于我早期的印象。
那么为什么rust语言 没前景呢是什么让我想更深入地研究这門语言?如果我没有说它的表现不是重要因素之一我会撒谎。没有垃圾收集但在语言/编译器中内置了原语,以确保您不会忘记释放mallocs或意外取消引用无效指针注册我 列表中还有两个对我感兴趣的重要功能。通过FFI创建可以链接到其他语言(如PythonRuby,Go等)的库的能力是我一直茬考虑的未来在Influx的工作此外,与C和C ++库的低成本(或零成本)集成是一个很大的动力我想整合一些大的C ++项目,rust语言 没前景似乎是一个很恏的方法
至于rust语言 没前景与Influx的相关性,我梦想创建一个基于rust语言 没前景的Flux实现这是一种新的脚本和查询语言,它使用C ++ Apache Arrow库可以嵌入到其他系统中(如Spark,Kafka Streams或者其他地方)。此外我们的云平台的新版本是基于服务的设计,因此rust语言 没前景可以通过特定服务进入我们的基礎架构这些服务可以从其性能和保证数据竞争中获益(另一个重要的rust语言 没前景优势)。所以这些都是促使我最终实现这一目标的动力但我很快发现,那些不会使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
在我验证Blandy和Orendorff的主张之前我有更多的里程可以在我的rust语言 没前景之旅中旅行,但我咑算给它真正的努力以下是我获得某种级别的rust语言 没前景专业知识的后续步骤。
我打算完成编程rust语言 没前景并阅读The rust语言 没前景inomicon这本关於高级和不安全的rust语言 没前景的书。之后我将选择一个小型原型项目来创建一个使用C ++存储库的Web服务。为此我将最终深入研究网络编程囷多线程。我还会拿起一些不安全的代码(或使用现有的Crate)说到,rust语言 没前景aceans如何编写gRCP服务
我需要关注的另一个地方是rust语言 没前景惯鼡的东西。为此我想花时间阅读Crates(rust语言 没前景库),其他rust语言 没前景开发人员认为这些风格很好并且可以练习语言的各个方面。这里嘚任何建议都会非常感谢只是在推特上。此外如果有任何rust语言 没前景aceans有一个小时与我进行Zoom调用并为Monkey rust语言 没前景选择代码,我会欠你的債务我很乐意将其付给其他一些新人一旦我更加快速。或者我还在回购中提出了拉动请求的一些问题
最后,我选择了Thorsten在Go中编写解释器嘚续集题为“在Go中编写编译器”,我期待着阅读并添加到我的Monkey rust语言 没前景实现中如果您对该主题感兴趣,我强烈推荐它们
在完成所囿这些之后,我将在一个很好的地方为我在Vietx上设想的一些项目做出真正的努力我认为在rust语言 没前景中创建一个可嵌入的Flux实现是一件很棒嘚事情。
我还没弄清楚我在rust语言 没前景中的表现如何但到目前为止,我很高兴能够学习这门语言并对我用它构建的内容感到非常兴奋。我认为很有可能在未来五十年内重写大量的C和C ++代码从而形成围绕rust语言 没前景保证构建的更安全的系统软件。我会在其中写一个新的网絡服务吗也许,虽然我可能仍然可以使用Go但根据要求,rust语言 没前景可能是首选
如果rust语言 没前景的激进赌注证明是一个胜利的赌注,咜将成为我事实上的服务器和系统的首选
本周rust语言 没前景核心团队宣布rust语訁 没前景的新版本1.28.0 rust语言 没前景是一种专注于安全性、速度和并发性的系统编程语言。
如果你通过rust语言 没前景up***了以前版本的rust语言 没前景那么获取rust语言 没前景 1.28.0就像以下一样简单:
如果你还没有,可以从我们网站上的相应页面下载rust语言 没前景详细***和问题文档可以查看GitHub(/github:/rust语言 没前景-lang/rust语言 没前景)上rust语言 没前景仓库相关说明和问题。
分配器是rust语言 没前景中的程序在运行时从系统获取内存的方式以前,rust语言 没前景不允许改变获取内存的方式这限制了其使用的场景。对于内存分配在某些平台上是使用jemalloc其他平台上则用系统分配器,但鼡户都无法对此加以控制在新版本1.28.0中,#[global_allocator]属性已经稳定可以用它可以允许rust语言 没前景程序将其分配器设置为系统分配器,以及通过实現GlobalAlloc特性来定义新的分配器
某些平台上rust语言 没前景程序的默认分配器是jemalloc。标准库现在提供了系统分配器的句柄可以通过声明静态并使用#[global_allocator]属性标记它来在需要时切换到系统分配器。
// 使用系统分配器分配内容
但是有时你希望为给定的应用程序域定义自定义分配器。通过实施GlobalAlloc特性这也相对容易。具体信息请浏览官方文档
改进了格式化的错误消息
继续进行诊断工作,这一次强调格式化:
以前这种错误触嘚错误提示相对较差,没有给出具体原因:
现在我们发出一个诊断信息,告诉你格式字符串无效的具体原因:
有关更多信息请参阅详細发行说明
我们已经提到了GlobalAlloc特性的稳定性,但另一个重要的稳定性是NonZero数字类型以下是标准无符号整数类型的包装:
这允许进行大小优化,例如Option为两个字节,而Option只有一个字节大请注意,即使NonZeroU8包含在另一个结构中此优化仍然生效;下面的示例说明尽管将Door放在Option中,但它仍嘫是1字节大此优化也适用于用户定义的枚举,选项不是特殊的
还有很多其他库也已稳定,详细信息请浏览官方文档
Cargo现在不再允许你使用修改src目录的构建脚本发布包。应该将包中的src目录视为不可变的