![](https://img-blog.csdnimg.cn/direct/2a58d5524d3b4e3b927a95872c9c0f9b.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
rust
文章平均质量分 93
rust
xuejianxinokok
这个作者很懒,什么都没留下…
展开
-
Traits: Rust 中的统一概念
抽象类是不能直接实例化的,你必须扩展它来填充缺少的方法。在 Rust 中,这看起来像是具有默认实现的trait。println!("{}", s);Logger现在提供err的默认实现,因此不必这样做。仍然可以提供它自己的实现,这将覆盖trait默认值。原创 2024-04-24 14:46:54 · 713 阅读 · 1 评论 -
我希望学习 Rust 时知道的三件事
当您导入trait时,方法将出现在您的对象上。如果您有。原创 2024-04-23 14:43:38 · 389 阅读 · 0 评论 -
Rust异步编程简介
下面的问题是,我们作为开发人员希望使用漂亮的。原创 2024-04-22 13:36:21 · 1073 阅读 · 0 评论 -
写一个编译器非常简单(第 2 部分)
我认为这源于这样一个事实,即互联网上流传的许多常见建议都是为了编写优化编译器,所以我会听到诸如“static single-assignment”、“control flow graphs”、“phi-nodes”之类的东西’之类的,然后迷失在试图接受这一切的过程中。另外,我们已经看到,即使是非常幼稚的编译器,也比“快速”解释器快得多(尽管我认识到这里使用的“快速”是松散的)。(就像 C 语言一样!其次,我们依赖计算表达式的代码来更新标志寄存器,但它可能不会这样做(例如,读取变量,我们将其编译为单个。原创 2024-04-18 13:36:25 · 884 阅读 · 0 评论 -
转:Learn Rust the Dangerous Way-系列文章翻译-总述
最近发现了一个学习Rust的优秀系列文章,本人准备对该系列文章进行翻译。本文是《Learn Rust the Dangerous Way》系列文章翻译的第一篇。原创 2024-04-18 11:15:08 · 563 阅读 · 0 评论 -
写一个编译器非常简单(第 1 部分)
是的,不是使用与变量名称相对应的字符串,而是使用表示该变量在内存中的位置的索引。在这篇博客中,我打算向十几岁的自己展示如何编写一个代码生成器,事实上,一点也不复杂,它可以在几个周末内完全完成。不幸的是,当正确的项在中间步骤中也在’ %rcx '中存储一些东西时,这将不起作用。然后,为了能够运行它,我们只需添加一些程序集,该程序集将接受两个参数并将它们存储在堆栈槽 0 和 1 中,并在执行代码后返回。在更完整的编译器中,前面的步骤将负责为每个声明的变量分配栈槽,并将变量名称转换为栈槽。原创 2024-04-15 13:31:54 · 747 阅读 · 0 评论 -
用程序表示程序非常简单
让我们从一个简单的例子开始:一种带有变量、数字和加法的语言。请注意,该语言没有语句,只有计算结果为简单值的表达式。这意味着我们将能够表示01+1x+y甚至a+(b+1)等表达式。我们将为每种类型的表达式使用不同的数据类型。这些数据类型需要存储足够的信息来编码表达式的行为,而不是完整的文本表示。也就是说,我们将仅存储执行此代码所需的信息,但不足以重建相应的字符串。这是一个设计决定。如果您正在编写代码格式化程序,您还需要存储此类信息!让我们从整数 字面值 开始。我们需要什么样的信息?yes。原创 2024-04-12 11:05:02 · 659 阅读 · 0 评论 -
Rust 编写 WASM 入门
Rust 与 WASM 具有很好的互操作性,没有理由不利用这一点来帮助我们使用其他语言。原文地址:Writing & Compiling WASM in Rust。原创 2024-04-01 10:37:00 · 1528 阅读 · 2 评论 -
Java 变得越来越像 Rust
随着编程的增强和复杂性越来越流行,许多编程语言也相互效仿。Java 也不例外。尽管社区内部存在问题,Rust 仍逐年赢得了开发人员的喜爱。并且有充分的理由:由于编译器,Rust 使开发人员能够避免整个类别的问题。编译器要求正确性,以至于一些开发人员开始遇到一些不安全感。我想展示 Rust 的两个特性,这些特性是 Rust 优秀的一部分,然后将它们与 Java 的最新创新进行比较。免责声明:我绝不声称这些 Rust 功能导致其对应功能出现在 Java 中。原创 2024-03-25 10:58:41 · 326 阅读 · 0 评论 -
Rust web开发 ActixWeb 入门
目前,Actix Web 仍然是 Rust Web 后端生态系统中极其强大的竞争对手。尽管之前的事件可能对其产生影响,但它仍然很强大,并且是 Rust 中最受推荐的 Web 框架之一。最初基于同名的 actor 框架 (actix),后来它已经消失,并且actix现在仅用于 websocket 端点。本文将主要讨论 v4.4。原创 2024-03-22 09:49:50 · 1702 阅读 · 0 评论 -
Rust 中使用原生 SQL 与 SQLx
当谈到使用 SQL 时,Rust 生态系统让我们有太多的选择。SQLx 是一个纯粹的异步、与运行时无关的 Rust SQL 包,它允许您在没有 DSL 的情况下使用编译时类型检查的查询。让我们看看 SQLx 的实际应用!原创 2024-03-21 13:42:02 · 1398 阅读 · 1 评论 -
如何用 Rust Reqwest 写一个Web 爬虫?
您是否曾考虑过建立自己的 潜在业务数据库,用于潜在客户开发或产品价格数据,以便您可以毫不费力地以最便宜的价格获得产品?网络爬虫可以让您无需亲自执行任何手动工作即可做到这一点。Rust通过允许显式地处理错误和并发地运行任务,让您可以做一些事情,比如将web服务 路由 到爬虫 或输出数据的Discord bot。原创 2024-03-20 09:43:09 · 735 阅读 · 0 评论 -
Rust 错误处理入门和进阶
Error Trait在标准库中定义。它基本上代表了错误值的期望 -中E类型的值。Error Trait针对许多错误实现,并为错误信息提供统一的 API。Error Trait有点需要,要求错误同时实现 Debug 和 Display。虽然实现起来可能很麻烦,但我们稍后会看到一些工具库来实现这一点。在标准库中,VarError(用于读取环境变量)和(用于将字符串切片解析为整数)是不同的错误。当我们与它们交互时,我们需要区分类型,因为它们具有不同的属性和不同的堆栈大小。原创 2024-03-19 13:37:16 · 877 阅读 · 2 评论 -
Rust Web 框架入门和对比
利用 Tokio、Tower 和 Hyper 建立强大的生态系统。很棒的开发者经验。仍处于 0.x 版本,因此可能会发生重大更改。强大、独立的生态系统。通过主要版本保证实现稳定的 API。很棒的文档。丰富的内置功能。不像以前那样积极发展。对于初学者来说仍然是一个不错的选择。Functional approach. 函数式方法。Very expressive. 非常富有表现力。靠近 Tokio、Tower 和 Hyper,拥有强大的生态系统。原创 2024-03-18 13:40:57 · 2056 阅读 · 0 评论 -
为什么 Rust 中的枚举(enum)很常见很好用? ? ?
将 Rust 作为第二语言学习的人的一个常见的反应往往是,相比于其他任何语言, 枚举(enums) 在Rust中 得到了更好的支持。粗略地浏览一下 Google 搜索“Rust 中的枚举”会在“人们也搜索过”中返回一个结果,询问“为什么 Rust 中的枚举如此好用”。乍一看,这似乎是一个好问题;孤立地讲,枚举是代表 有- 例如:方向(东,南,西,北)或季节(春夏秋冬)。然而,Rust 以此为基础并以其他语言中根本不存在的方式增强枚举。原创 2024-03-14 11:30:27 · 812 阅读 · 0 评论 -
如何在rust中输出日志:在rust中打印日志的各种方式对比
有许多库可以在 Rust 中输出日志,有时很难选择该使用哪一个。当println!dbg!和eprintln!无法解决问题时,找到一种方便记录日志的方法就很重要,尤其是在生产级应用程序中。本文将帮助您深入了解在 Rust 日志记录方面最适合您的用例的日志 crate。原创 2024-02-23 13:50:44 · 1480 阅读 · 0 评论 -
在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁
构建自己的 TCP栈是一项极具挑战的任务。通常,当**用户空间**应用程序需要互联网连接时,它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据,从而消除了直接处理原始数据包的复杂性。这是开发标准应用程序的绝佳选择。原创 2024-03-01 15:48:58 · 1227 阅读 · 0 评论 -
在 Rust 中实现 TCP : 2.解析原始字节
前 2 个字节是 flags ,可以提供有关收到的数据包的更多信息,例如,内核设置的“TUN_PKT_STRIP”,用于向用户空间程序发出信号,表明数据包因缓冲区太小而被截断。现在已经解析了内核在以太网帧前添加的前 4 个字节,剩下的就是 TCP 数据,需要解析它。为了理解 proto 字段的含义,可以查看这张将 ether 类型 映射 到协议的表,可以查到我们解析的 proto 字段的值对应于互联网协议版本 6 (IPv6)。方法读取数据包的前 2 个字节,并获取人类可读的flags 值。原创 2024-03-04 11:39:28 · 1040 阅读 · 0 评论 -
在 Rust 中实现 TCP : 3. TCP连接四元组
到目前为止,已经确保接收到正确的 IPv4 数据包,并且已经实现了一种机制,将传入数据包与其各自的状态相关联,并由唯一的连接四元组作为键。从最初的握手到数据传输和最终的断开,连接的状态都会被仔细跟踪,以保证可靠和有序的数据交换。脚本来启动程序,该脚本将构建并执行二进制文件并为其提供必要的提升网络访问权限,接下来,将使用 Netcat 尝试与应用程序建立 TCP 连接,最后为了可视化,将使用 tshark 通过运行 tshark -I tun0 来监视和捕获 tun0 接口上的数据包。这是我们下一个目标。原创 2024-03-05 11:48:16 · 1128 阅读 · 0 评论 -
Rust 中如何解析 JSON?
在本文中,我们将讨论如何在 Rust 中使用 JSON 解析库,以及比较最流行的库及其性能。原创 2024-03-05 13:45:04 · 1368 阅读 · 0 评论 -
在 Rust 中实现 TCP : 4. 完成握手
继续看on_packet方法,我们进入了 TCP 三次握手的关键时刻。发送 SYN-ACK 后,服务器在等待客户端的 ACK 时使用此方法。如果收到 确认信息 连接会从状态推进到状态,完成握手并正式打开通信通道。on_packet方法完成了完成三次握手的繁重工作,它检查来自客户端的 ACK 响应。如果正确接收到 ACK,该方法会将连接状态更改为,表示 TCP 连接已建立 并且可以开始数据传输。在接着实现之前,增加一个“write”方法,在on_accept和on_packet中使用。此方法 将。原创 2024-03-06 10:26:20 · 1182 阅读 · 1 评论 -
在 Rust 中使用 Serde 处理json
Rust中的serdecrate用于高效地序列化和反序列化多种格式的数据。它通过提供两个可以使用的traits来实现这一点,这两个traits为和Serialize。作为生态系统中最著名的 crate 之一,它目前支持 20 多种类型的序列化(反序列化)。为了更好地理解serde在底层是如何工作的,我们还可以自定义实现和Serialize。这相当复杂,但现在我们将实现一个简单的。下面是序列化i32where为了能够转换类型,serde内部要求我们使用实现Serializer的类型。原创 2024-03-12 10:58:25 · 1473 阅读 · 0 评论 -
Rust 中的 Pin UnPin Async Await 实现机制
我们将探讨 Rust 的协作多任务处理和异步/等待功能。我们详细了解 async/await 在 Rust 中的工作原理,包括Future特征的设计、状态机转换和固定。然后,我们通过创建异步键盘任务和基本执行器来向内核添加对 async/await 的基本支持。branch.该博客是在 GitHub 上公开开发的。如果您有任何问题或疑问,请在那里提出问题。也可以在底部留言评论。原创 2023-10-10 11:46:26 · 1087 阅读 · 0 评论 -
Rust trait、动态派发和向上转型
format!format!println!defines aTT那么这里到底发生了什么?签名定义了一个通用函数。每次调用该函数时,编译器都会确定第一个参数的类型T,检查T是否实现特征,如果是,则生成此函数特定类型参数的 代码。根据类型的精确大小、对齐和布局以及特征实现的细节,生成的代码可能会有很大差异。这个过程通常称为单态化。由于函数调用的代码是在编译时静态生成的,因此这种调用泛型代码的方法有时称为静态派发。原创 2023-10-26 10:39:03 · 177 阅读 · 0 评论 -
Writing an OS in Rust : Allocator Designs 分配器设计与实现
In theused thecrate在上一篇文章中,我们向内核添加了对堆内存分配的基本支持。为此,我们在页表中创建了一个新的内存区域,并使用crate 来管理该内存。虽然现在有了一个可以工作的堆,但我们将大部分工作留给了外部分配器 crate,而没有尝试了解它是如何工作的。crate).在这篇文章中,我们将展示如何从头开始创建我们自己的堆分配器,而不是依赖于外部的 分配器crate。原创 2023-11-06 16:49:18 · 244 阅读 · 1 评论 -
理解堆:一个美丽的混乱
池化是计算技术中常见的设计模式,它涉及:预先分配并保留一个程序中经常使用的核心资源池,由程序自行管理,以提高资源利用率并保证程序有固定数量的资源。内存池是一种动态分配和管理内存的技术。通常,程序员习惯直接使用new、delete、malloc、free等API来分配和释放内存,这会导致程序长时间运行时,会产生大量的内存碎片,大小分配的内存块不固定,降低了程序和操作系统的性能。在实际使用内存之前,内存池会预先分配一大块内存(内存池)作为保留。当程序员请求内存时,会从池中动态分配一个块。原创 2023-12-14 16:10:12 · 787 阅读 · 0 评论 -
C语言如何面向对象编程? 面向对象编程是一种方法,并不局限于某一种编程语言
将上下文放在一个结构上并从中创建一个接口怎么样?这是一个带有tag的union,其行为与其中之一相同。有一个函数可以与该结构进行交互:。它检查type成员并使用正确的上下文调用正确的函数。API 现在看起来像这样。这将是对实现和接口的最终更改。它仍然不关心过滤器如何工作,因此它足以覆盖未来的所有情况。它只是在给定的指针上调用。然而,switch和taged union对扩展并不友好。确实,这对扩展来说。原创 2024-01-22 11:16:33 · 960 阅读 · 0 评论 -
Rust中 零成本抽象的 future
Rust生态系统的一个关键缺陷是缺少快速高效的异步I/O。虽然我们拥有坚实的基础,例如 mio 库,但它们的级别非常低:您必须直接处理 连接状态机并处理回调。futures我们想要更高层次的东西,具有更好的人体工程学,而且还有更好的可组合性,支持所有协同工作的异步抽象生态系统。这个故事可能听起来很熟悉:正是这个目标导致了许多语言中引入future(又名Promise),其中一些支持 async/await 语法糖。原创 2024-01-25 11:17:56 · 1213 阅读 · 1 评论 -
What is Rust? Why Rust?
2006 年,Rust 最初是由当时 Mozilla 的软件开发人员 Graydon Hoare 创建的一个小型业余项目。2009 年,Mozilla 正式赞助该项目,并于 2015 年 5 月实现稳定版本。此后,微软、亚马逊和 Cloudflare 等许多公司都采用了 Rust。2022 年 12 月,Linux 内核也开始使用 Rust。该语言在社交媒体上也非常受欢迎,许多 Rust 开发人员在他们的名字中使用了螃蟹表情符号。随着时间的推移,主要开源 Rust 生态系统的增长变得越来越快。原创 2024-01-26 13:54:10 · 1174 阅读 · 2 评论 -
Rust Vs Go:从头构建一个web服务
易于学习、快速、适合 Web 服务丰富的内置功能。我们仅使用标准库就做了很多事情。例如,我们不需要添加模板引擎或单独的身份验证库。我们唯一的外部依赖项是Gin和sqlx快速、安全、不断发展的网络服务生态系统内置功能较少。我们必须添加大量依赖项才能获得与 Go 中相同的功能并编写我们自己的小型中间件。最终的处理程序代码没有分散注意力的错误处理,因为我们使用了自己的错误类型和?运算符。这使得代码非常可读,但代价是必须编写额外的适配器逻辑。处理程序很简洁,并且存在自然的关注点分离。原创 2024-02-18 13:38:10 · 1894 阅读 · 2 评论 -
Rust异步编程 Async Await 入门
要了解什么是异步代码,我们首先来谈谈同步代码。println!println!上述语句按照明确的顺序执行,从上到下一个接一个地执行。” 打印,然后读取并打印Cargo.toml的内容。这种模式在正常操作下非常好 - 但有时代码需要在当前上下文在等待其他内容时暂停 - 这通常称为阻塞。换句话说,当一段代码被阻塞时,它实际上处于暂停状态,等待特定操作完成才能继续。例如,当等待文件系统、网络通信、数据库事务甚至一段时间过去时,就会发生这种情况。在此阻塞状态期间,程序保持空闲状态,无法同时执行其他任务。原创 2024-03-13 11:34:42 · 1086 阅读 · 1 评论