从朱莉娅到生锈

2021-06-06 06:52:07

在用被动学习持续一段时间后,我最近一直非常认真地学习生锈。我的第一个真正的编程语言是朱莉娅,我知道其他对生锈感兴趣的朱利安。我为那些人写了这篇文章,因为生锈和朱莉娅是良好的表演伙伴,但Rust有一个不同的思想和权衡,值得考虑。

有3个谈判可以卖掉我的生锈值得学习,第一个是Carol Nichols,第二个是Ryan Eberhardt和Armin Nanavari的讲座。第一次谈论大科技公司的所有错误达到约70%来自内存安全,曾经没有紧急刹车的火车。第二次解释了系统编程码条的编程如何对编码器中的资源所有权的不变性产生了普及,但推理可能会易于错误,繁琐和自动化。

那个'它的技术点!不必担心以前的几代问题,因为我们发现了一种卸载到机器的方法。

真正卖掉我的第三个谈话是亚历克斯gaynor' s。它&#39是足够的,银行或学校网站可能因内存错误而崩溃,但一旦你考虑到世界上最好的程序员(由工资排序,大致排序)可以发货安全代码,你开始绝望一点。然后你听到了像sudo这样的令人难以置信的战斗库,并且随着道德争论的方式,你可能会把脆弱的人放在伤害中,如果你继续运送一个破碎的工具,那就会伤害伤害。我越来越多地购买该论证的紧迫性,当事员或人权倡导者由于琐碎的(但埋葬)C错误而受到国家行为者的目标。

所以当我在淋浴时争论生锈火车时,它的斯基辛赛跳跃。什么'生锈'哲学?

您可能知道朱莉娅'苏格兰的故事 - 有一个gajiltion的科学数据库,Blas是一团糟,但通过命名为绩效需求来实现多态性,而其他图书馆重新实施过贫穷的人和第39族版本因为性能约束。如果将聪明的JIT添加到多个调度CapabiLites,则可以轻松获取〜C性能,如果可以推断出类型,幸运的是,您可以在该范例和这些权衡中建立一般的编程语言。最终,他们向语言施洗了语言,以纪念算法的一个真正的女王。

Rust来自不同的地方:几年前,在Mozilla,Graydon Honare和团队厌倦了系统编程和C / C ++工具链。他们正在研究一种语言,允许程序员在低级系统中富有成效,没有足迹的情况下停用并发性能,并在运行时避免错误。起初,他们有不同的系统来处理以前的问题,直到团队拼凑在一起的所有权系统,在编译时借用检查员,可以用一块石头杀死2只鸟。最终,他们在真菌后命名的语言。

RECAP:朱莉安患了不可用的代码,利基DSL和贺卡多态性。随着中央设计的多次调度,他们解决了这些问题。 Riraceans厌倦了C / C ++雷区,并试图在他们的头脑中保留大型错误易于码码的所有不变性。所有权的概念和借书检查者知道在编译时的错误,并且是数据种类的错误是什么'让他们到现在的位置。

两层故事中缺少的重要细节显然有明显的细节 - 如果您愿意,您可以从适当的历史学家那里得到它,这是一个简短而非正式的介绍。然而,当我谈论他们如何获得一版本的通用代码时,我会提到另一个大型Ristian类型的仿射类型'在朱莉娅的土地上来了解和爱。 SPOILER ALERT:如果您支付Julia运行时的价格,则可以获得通用代码,而且'不是鲁西瓦斯的东西。如果您希望在编译时泛型,则必须"证明"对于编译器,您的类型在某种程度上受到约束,并且您通过在代码上进行仿射类型来传递该信息。

如果出于某种原因,你已经决定学习生锈是一个值得的努力,这里我的资源列表。我认为他们是近似顺序遵循的好资源,但使用任何作用,如果它没有,跳过它。

生锈书:单击链接以启动安装和IDE设置。只需一旦盖子覆盖即可覆盖即可覆盖即可才能回到棘手的比特。

vscode错误镜头和rustAnalyzer:从编译器中获得的反馈循环更快,您越早可以发现错误并继续前进。这些aren' t强制性但它' s更快地制作反馈循环的最简单方法。

Rust Docs:他们的Julia手册版本。确保单击[+]以查看代码如何下降。我仍然花时间看迭代器页面。

行业主义:如果你想进入一些导游的学习,运动就是很棒的,但在开始时,专注于弦乐的弦乐。当你完成时,请务必查看社区解决方案。

代码2020由AMOS出发:这是我的第一个"让你的手脏"经验丰富。 AMOS的其他文章也非常友好,但该系列对于弄清楚探索的工作流程和设计思维是有用的。

Ryan Eberhardt Stanford课程:大学课程让您启动和运行系统编程约束和解决问题。我不是它的目标受众,但它非常适合理解生锈' s域。

Jeff Zarnett为绩效课程编程进行编程,拥有一个完整的YouTube播放列表:另一个良好的课程,用于直接进入高性能计算 - 还没有完成它,但教授是友好和热情的。

rustlings:我发现一些练习太难了我第一次拿起铁锈书。你的里程可能有所不同,但我做了独奏和遭受的。在尝试所有内容之前,我建议与伙伴配对。

有太多的链接名单:一旦你觉得更舒适的阅读和写作锈,另一个伟大的演练。

Jon Gjengset' S溪流:Jon Gjengset是一个着名的生锈社区成员,具有惊人的质量流 - 如果您想看到熟练的rustacean代码,这是一个始于一个好的地方。

多芯和原子:进入杂草关于生锈可以拯救你的所有痛苦,当你实现低级棘手的并发性并发。

好的,所以你'重新开始参加学习之旅。与朱莉娅相比,'无论如何都是如此?

我们喜欢可组装性和多次调度,所以让我们看看如何获​​得良好的OL&#39的简短示例; Julia Bang-for-Buck,有一个1D点:

导入基础:+ struct point {t<:real} val :: t end +(x :: point {t},y :: point {t})其中t<:real = point {t}(x.val + y .val)a = point {int32}(1)b = point {int32}(2)a + b#worksc = point {float32}(1.0)d = point {float32}(2.0)c + d#也有效!

我确保不使用任何显式类型,让调度系统休息。您使用像零(...),Eltype(...)这样的功能。通过调度,我将它们添加到适当的子类型,其中t<:foo。如果我定义了相应的方法,则其他人会被他们组成,所以我不需要定义+ =一旦i' ve定义+。鸭子类型一路 - 当运行时的东西时出现错误,因为我忘记了一个案例(就像上面的事实一样,我只写了一个函数,我错过了,并继续黑客。

设置一个简单类型的层次结构,在类型上定义某些功能而不明确使用它们,从未重写所有代码,即时重写所有代码,即插即用或perf命中,查看Rept中的Docstrings以帮助您。快乐的人生。

使用std :: ops ::添加;结构< t> {val:t} imagr; t:添加<输出= t>>添加< t> {type = self; FN(自我,B:自我) - > self ::输出{self {val:self.val + b.val}} fn(){let a = point ::< I32> {val:1};让B =点::< I32> {val:2};让c = point ::< F32> {val:1.0}; Println!(" {:?}" a + b); Println!(" {:?}",c == c);}

我像这段代码的一半一样工作,然后不得不查找它。您可以在此处在Rust Playground中运行它。狂热读者将注意到以下内容:

要获得泛型,需要为您的类型提供一个结构,Alich< t>点击点< t>块在其中定义的添加函数,键入Self ::输出等注释,添加<输出= t&gt ;.

有一种"名称间距和#34;与涡轮送鱼操作员:::<这个!&gt ;.我们不要获得可以共享名称但在行为中不同的函数。 bummer。 (我们用一些更好的外部构造函数来到Julia,但我认为这是争论的推力。)

println!功能是不同的 - 它' s宏,它在解析时间,也像朱莉娅'宏。我们希望调试打印的{:?}信号内的字符,我们使用上面的#[派生(debug)]。 Rustn'如果您没有定义它,那就像Lyndon White指出的那样,它是如何打印新的结构。它是多次调度解决的问题之一。

哦,那些#[东西(上面_the_struct)]也是宏。我仍然不知道他们是如何不同的,但它们似乎也会影响编译器如何与箱子相互作用。由于一些特征(如用于复制或打印的人),因此样板沉重和可预测,您可以为&#34获得一些行为;免费"如果您在声明中添加了右侧#[派生(...)]。那个'它如何实际上工作,它由于PartiaLeq而作出的作用。

拍摄< t>在您的结构面前以及您希望它泛化的字段。查找文档中每个特征所需的功能。设置一个简短的测试用例。 ' t编译?看看Rustc说的是什么,并尝试在一些特征上钉起来;也许你错过了一种带有iclip< t:foo&gt的仿射型;或self ::输出 - 编译器通过修补代码来指导您。如果你'重新要求一些通用行为,编译器会抱怨和你' ll必须添加另一个特征实现,以便该死的确定'重新允许继续。

我也选择了一个特别容易的例子:在我的点中没有关联的数据(如字符串),所以我不需要向编译器证明我的数据并在' t持续它的用途 - 那些是寿命,他们可以快速,快速,但是你最终跑进了他们。我也没有知道您可以如何容易地处理多种通用类型和与它们相关联的编译时间惩罚。

与Julia相比,在前面的比较方面的语法更多,而不仅仅是因为我们在这里编写库代码。 Pythonistas可以在几个小时内拿起朱莉娅并富有成效。 Rust在学习语言时有很多表面积:参考文献,特征,锯片,枚举,寿命,与匹配,宏,货物标志进行配置,所有权和借用,发送和同步......

Whodathunkit,垃圾收集器让您担心其他事情的小型运行时价格。它们可能对每种用例都不适合,但它们'重新投资。

当与锈病开始时,在那里爬上陡峭的墙壁 - 但是,他们宣布了学习艰难的东西的用户体验。我认为这是沿着&#34的线条的Esteban Kuber;我们不喜欢缺少一个足够聪明的编译器,而是一个更加友好的一个"

好吧,所以什么'从顶部看起来像什么样的视图?像朱莉娅一样,Rust是一个拥挤的空间的现任,所以它如何冲到它上面'对既定候选人的重量?

这里的所有项目的列表都是我'在朱莉安人的笔记中发现的所有项目的列表。

人造丝是我对生锈感兴趣的原因。检查他们的Hello World - 承诺是,如果您使用的是迭代器,则可以在Par_iter()和编译时交换(大多数)iter(),您可以知道代码是否正常运行。 ' s只是关于线程的并行性的最友好的用户界面。@线程,以及一些额外的保证 - 一个小的更新循环很容易保留头部的不变性,但它真的付出代价,但是当Rust编译器捕获并发时确实付出代价跨越多个文件,模块和数据结构的错误。 Cool Tech注意:Rayon使用同样的工作窃取线程调度程序,朱莉娅' S并行任务运行时间系统使用(由Cilk启发,得到它?' Cuz人造丝是假丝绸......) 。

Tokio也值得提及其异步编程的能力,但我不熟悉它可以评论它。生锈人对此感到兴奋!

鸡蛋和相关项目如herbie:一个邪恶的快速快速呈现引擎 - 一个伟大的竞争对手和灵感符号.jl生态系统。

MMTK和GCS:垃圾收集器是一个共享行为的一系列算法,可以在可调参数上建立不同的策略。垃圾收集器建立可配置,表演和战斗的后端的承诺与史蒂夫布拉底堡和团伙一起活着这个项目。如果您没有听到Immix或Ploorplan,则享受rabbithole。如果你'重新到GCS,这是经验丰富的朱莉安的一个很好的起点。

Rust Cli:Rust人们觉得在终端工作舒适,他们'用户体验非常重视,并为他们的命令行CLIS拥有顶级的表现和用户体验。在这里,我的一些最爱 - 你只需要货物安装foo,它们应该在系统上正确安装。

左撇子:目录自动jumumper。我没有真正做CD .. ......爬行,我爬了几次,这通常猜测。

COZ:因果分析的宝贵工具。独自展示的emery berger&#39是值得了解这个项目。我重新欣喜地希望有人搬到朱莉娅。

雪橇'基准测试和数据库的方法是顶部缺口。值得注意的是同样的作者' s rio crate,这是一个用于io_ing linux内核模块的生锈界面,这可以显着加速异步编程。在Libuv,Julia' STREEN运行时后端的一些WIP PRS的一些WIP PRS,并且该努力将接近包装。

生锈FFT:在某些情况下,他们在某些情况下击败了FFTW,所以看起来很值得看看♥。

绿色函数评估内核:较新的包,但是我喜欢看多功能在锈的土地上的特殊功能。

波拉:一些使用案例的高度调整的Dataframes实现。他们'在一些H20AI基准中,它们齐全地饰演了图表,所以它们肯定有技术录音。 (他们击败了DataFrames.jl,因为稀疏技巧有点不琐碎,但是在那里' s不一定是匹配它们的速度的障碍。)

LOOM:用于原子基元的模型检查器,Tokio的姐妹项目。我认为朱莉娅对这种方法更加自然的契合鉴于操作员过载,这将是一个詹姆森'原子学公关的类似一些类似的东西。

Creusot:将一些宏添加到生锈代码中,并通过Whe3正式验证。

proptest:配置探索型实例化的策略以使您的测试模糊,缩小案例,并自动跟踪回归。令人印象深刻的东西!

闪闪发光的和腔:闪光是一种磨牙后端,是基于erlang的语言,流明是一种重写的res-in-rus-rust-in-rudvm,梁。 Erlang是一个并发怪物,它们的演员的模型可扩展为某些工作负载。我很高兴看到朱莉娅开始逐步参加actors.jl。这似乎是抽象容错工作负载的正确方法。

在那里更多。如果您想探索更多(这是他们的社区juliahub等效),请签出箱子.IO或lib.rs。

我' ll是一个特殊的evcxr,一个锈的reft。现在,我不认为它''使用Rust的工作流程使用Rust。我也习惯了在朱莉娅,在那里工作,但我认为那里的风险将自己挖掘到A"一切都必须是曲折"心理和削减自己的学习机会。在Rust Land中,我不介意作为rustaceans做和学习在命令行中做事,导航编译器错误和配置某些行为或部署选项的旗帜和功能。自那个'当我买进生锈时我想学习的包裹,我不介意调整这一心态。我仍然希望他们一切顺利,并希望他们能够制作最好的锈病 - 我' d在这条路上有错。

如果您想深入进入Nitty Gitty性能基础,这些是我发现的最佳指南,即用于解释那些美味,美味的笨蛋的权衡,Gotchas,Mental Model和工程。

成本纸:也许不适合这里,但这是我最喜欢的论文之一,每个人都应该阅读它。

所以Rust是"值得学习"但是这些是我面临的障碍,并会警告其他人即将拯救他们一些悲伤。

您可以学习其他业余爱好等待锈的项目编译。编译时担保的价格/是代码库中指定的驱动程序对编译器卸载了更多的工作。他们'重新努力利用并发加速管道,并达到更好的'让' S只是说他们也患有TTFP♥。

学习用货物运行的代码 - 释放和其他技巧。这相当于使用全局(或-o0标志)运行朱莉娅代码,它是一个简单的gotcha'这不会改变生锈。

生锈人们一直说他们没有垃圾收集器,当他们有一个基于地区的垃圾收集器时。它'既有乐趣和游戏,直到他们必须实施这些链接的清单......

Don' t手动添加箱子!安装Cargo-Add,使用它来管理Crate依赖项。除了上面的文章中,这与其他一些诀窍很好地完成了adventofcode2020。

用于数字,安装ndArray和num_traits。线性代数和数字,在开始时不是朱莉娅的原始重点。

在vscode或IDE上设置生锈分析仪和错误镜头插件,You' LL稍后谢谢。 Rust-Land希望您与编译器保持不变的对话,并使迭代周期尽可能符合人体工程学,从长远来看会产生红利。我们不从Repl中访问Help Docs访问,Rust人员保留终端选项卡,在那里运行Cargo Watch -C并获得编译器的连续反馈。

你可以' t索引到ruct的字符串中与ints!而是使用像&amp的片; str [1 ..] == str [2:结束],如果我可以在那里的平等中的rust和julia语法上riff。

从STDIN阅读是一种痛苦作为新人。我想尝试一些有竞争力的编码练习,并从Stdin阅读是Waaaay起初对我来说太粗糙了。最终我把这个模板旋转到这里联系在这里,以便你不要挣扎,如果你想尝试几个代码的问题。

没有仿制兰特只是痛苦。如此痛苦。到目前为止,这是我最简单的解决方法,以生成N个随机条目的向量:

没有@code_native和friend在forr - 你最好的选择是使用铁锈游乐场,然后点击......让它发出总装配。这仅适用于前100名最受欢迎的箱子。您可以货物运行 - - 释放 - - - emit = llvm-Ir / asm,然后将结果捕获出目标/,但是' s联合国

......