Rust的Tokio和async-std和go的goroutine,C#标准库的async,Java的loom,以及无栈协程和有栈的优缺点比较
以下对比了 Tokio、async-std、goroutines、C# 的 async、Java 的 Loom、无栈与有栈协程,旨在为读者提供异步编程框架的参考。Tokio 是基于 Rust 的异步编程框架,使用 Futures 和 Streams 实现并发。它提供异步运行时、I/O 和任务功能。与 Go 的 Goroutines 相比,Tokio 更侧重于高级异步特性,而 Goroutines 提供快速、高效的轻量级线程。相较于 Rust 的 async-std,Tokio 在更复杂的异步场景下表现出色,而 async-std 为简单应用提供了便捷的 API。Tokio 与 C# 的 async 结合 Rust 的语言特性,提供高效异步编程,而 C# 的 async 则为 .NET 开发者提供了易于使用的异步支持。Tokio 与 Java 的 Loom 相似,都是面向高并发应用的框架,但
在 Rust 中使用内联汇编 (Inline assembly)
自 Rust 1.59 版本起,内联汇编成为 Rust 语言的稳定特性,可用于实现复杂功能,如在代码中实现有栈协程。本文将深入探讨 Rust 内联汇编的局部内联汇编、寄存器分配、全局内联汇编、名称修饰、程序重定位与位置无关代码等关键点。在 Rust 中,内联汇编使用类似于 GCC 的语法,但融入了 Rust 的特色,如寄存器自动分配。`in`、`out`、`lateout` 等参数允许程序员利用编译器的优化策略,高效地进行参数传递。局部内联汇编通常在函数体中使用,而全局内联汇编则提供更大的控制,但不包含自动寄存器分配功能,需要程序员自行管理。程序名称修饰是汇编语言不可移植性的一个例子,不同平台的 ABI 可能影响函数名的处理。为了避免这个问题,Rust 提供了引用符号的功能,可以适应不同目标平台。裸函数(naked function)允许更简洁的编写,但牺牲了一般函数的上下文。在编写涉及程序重定位的代码时,如动态链接库或防止地址攻击,需要考虑程序地址的随机性
从openresty谈到rust
在2015年,我开始探索nginx的世界,彼时,我主要在C++领域进行网络开发工作,专注于通信协议栈研发及CORBA框架实现,沉浸其中已有七八年。那时我开始意识到世界之大,视野的局限性,深感惭愧。接触nginx后,我自然注意到了openresty,对其赞誉有加。nginx的代码优化得当,如HTTP解析仅用2000多行就实现了高效处理,这给我留下了深刻印象。同时,openresty引入了lua,封装了cosocket,使得在nginx基础上进行二次开发变得简单,且借助luajit,开发性能损失微乎其微。这让我对openresty产生了浓厚的兴趣,对章亦春大神也深感敬仰。当时,我感到工作有些乏味,心中萌生了跳槽的念头,但意识到自己长期专注于C++相关底层项目,缺乏竞争力。为了提升自己,我萌生了编写一个HTTP框架的念头,利用lua的ffi和高性能的luajit,考虑是否能将nginx本身以lua重写,并提供openresty一样的API,以兼容所有*-resty的第三方库
在 Rust 中使用内联汇编 (Inline assembly)
自 Rust 1.59 版本起,内联汇编成为 Rust 语言的稳定特性,可用于实现复杂功能,如在代码中实现有栈协程。本文将深入探讨 Rust 内联汇编的局部内联汇编、寄存器分配、全局内联汇编、名称修饰、程序重定位与位置无关代码等关键点。在 Rust 中,内联汇编使用类似于 GCC 的语法,但融入了 Rust 的特色,如寄存器自动分配。`in`、`out`、`lateout` 等参数允许程序员利用编译器的优化策略,高效地进行参数传递。局部内联汇编通常在函数体中使用,而全局内联汇编则提供更大的控制,但不包含自动寄存器分配功能,需要程序员自行管理。程序名称修饰是汇编语言不可移植性的一个例子,不同平台的 ABI 可能影响函数名的处理。为了避免这个问题,Rust 提供了引用符号的功能,可以适应不同目标平台。裸函数(naked function)允许更简洁的编写,但牺牲了一般函数的上下文。在编写涉及程序重定位的代码时,如动态链接库或防止地址攻击,需要考虑程序地址的随机性