问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

rust是前端还是后端

发布网友 发布时间:2022-04-23 01:40

我来回答

2个回答

懂视网 时间:2022-04-23 17:32

我们之前说过,对于javascript来言,前端的世界千变万化。前几篇文章给大家说过用Emscripten来编译C语言然后用到asm.js和WebAssembly,这种方法是可以始前端代码的执行速度提升很大,但是由于在实际的项目里C语言缺乏很多高级特性,很多功能没法实现,不利于开发大型的项目,而C++又太过于复杂,所以最终我选择了用Rust。

一开始也纠结过要用Go还是Rust或者Swift的,后来发现Go目前还不支持编译到WebAssembly,Swift按理说应该可以支持的,因为都是用LLVM做的编译器,不过没有找到好的资料,好像说要自己编译LLVM去支持https://stackoverflow.com/questions/46572144/compile-swift-to-webassembly 。另外对Rust的一些特性很是喜欢,听说Rust很复杂,比较像Scala和Haskell,而偏偏我对Scala还算熟悉,也学过一下Haskell,所以决定尝试一下Rust。

https://github.com/ChristianMurphy/compile-to-web 这里可以查看目前能编译到WebAssembly的语言。

PS, 话说asm.js和Rust都是Mozilla搞的呢。

安装Rust的管理工具rustup

rustup用于安装管理Rust的相关工具,包括编译器rustc、包管理工具cargo等,支持安装不同版本比如stable, beta, nightly等以及在不同版本之间切换,类似于nvm。

curl https://sh.rustup.rs -sSf | sh

安装Emscripten Rust编译器

用rustup安装最新体验版(Nightly Version):

rustup toolchain add nightly
rustup target add wasm32-unknown-emscripten --toolchain nightly

安装cmake

根据平台自行选择:

brew install cmake   # MacOS, brew
sudo port install cmake  # MacOS, MacPorts
sudo apt-get install cmake  # Debian Linux

安装 Emscripten

参考前一篇,或者直接执行下面命令:

wget https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz
tar -xvf emsdk-portable.tar.gz
cd emsdk-portable
./emsdk update
./emsdk install sdk-incoming-64bit

这一步花的时间比较久,据说要2个多小时,我是执行完命令就出去跟朋友吃饭了,所以具体时间不知道。

添加下列路径到PATH中:

~/emsdk-portable
~/emsdk-portable/clang/fastcomp/build_incoming_64/bin
~/emsdk-portable/emscripten/incoming

终端执行emcc -v检查是否安装成功。

用Webpack运行Rust

新建一个Rust/Javascript混合项目:

cargo new webasm --bin --vcs none
cd webasm
npm init
rustup override set nightly

安装Webpack, webpack-dev-server, rust-wasm-loader,

npm i -D webpack webpack-dev-server rust-wasm-loader

增加package.json脚本:

{
 "name": "webasm",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
 "test": "echo "Error: no test specified" && exit 1",
 "compile": "webpack --progress",
 "serve": "http-server",
 "start": "webpack-dev-server --content-base ./build"
 },
 "author": "magicly",
 "license": "ISC",
 "devDependencies": {
 "http-server": "^0.10.0",
 "rust-wasm-loader": "^0.1.2",
 "webpack": "^3.6.0",
 "webpack-dev-server": "^2.8.2"
 }
}

在build目录下新建文件index.html:

<!DOCTYE html>
<html>
 
<head>
 <title>Hello WebAssembly</title>
</head>
 
<body>
< div id="container"></div>
 <script src="/bundle.js"></script>
</body>
 
</html>

配置webpack.config.js:

module.exports = {
 entry: './src/index.js',
 output: {
 filename: 'bundle.js',
 path: dirname + '/build',
 },
 module: {
 rules: [
 {
 test: /.rs$/,
 use: {
  loader: 'rust-wasm-loader',
  options: {
  <span>// The path to the webpack output relative to the project root</span>
  path: '',
  release: true <span>// 没有的话性能巨差,差不多只有1/10</span>
  }
 }
 }
 ]
 },
 <span>// The .wasm 'glue' code generated by Emscripten requires these node builtins,</span>
 <span>// but won't actually use them in a web environment. We tell Webpack to not resolve those</span>
 <span>// require statements since we know we won't need them.</span>
 externals: {
 'fs': true,
 'path': true,
 }
}

新建src/main.rs文件,添加我们要从js中调用的函数:

fn main() {
 println!("Hello, world!");
}
 
<span>// Functions that you wish to access from Javascript</span>
<span>// must be marked as no_mangle</span>
#[no_mangle]
pub fn add(a: i32, b: i32) -> i32 {
 return a + b
}

新建src/index.js,写代码加载WebAssembly模块:

const wasm = require('./main.rs')
 
wasm.initialize({ noExitRuntime: true }).then(module => {
 <span>// Create a Javascript wrapper around our Rust function</span>
 const add = module.cwrap('add', 'number', ['number', 'number'])
 
 console.log('Calling rust functions from javascript!')
 console.log(add(1, 2))
})

然后执行npm start,访问http://localhost:8080/就可以看到调用rust代码的效果了。并且还支持热更新哦,直接修改rust代码,保存,页面就能看到最新效果。


测试了一下前一篇里的代码,直接运行rust优化过的代码只需要300多ms,这个基本跟C代码一样,但是用wasm运行,居然要2.7s左右,不知道是哪里没有配置好,还是说现在Rust编译成wasm没有优化好。Rust支持WebAssembly应该还不是特别成熟,可以关注https://github.com/rust-lang/rust/issues/38804 跟进。

另外Rust有一个包https://crates.io/crates/webplatform, 可以用来操作DOM,不过我目前用不到(感觉没啥用)

以上文章就是我对于WEB的高性能计算的理解,希望能帮助到有需要的朋友,之前也有俩篇文章《asm.js & webassembly-WEB的高性能计算》,《asm.js & webassembly-WEB的高性能计算》,有需要的朋友可以去看一下。

推荐阅读:

WebWorkers-前端的高性能计算


asm.js & webassembly-WEB的高性能计算


JavaScript提交表单校验三种方法分享

热心网友 时间:2022-04-23 14:40

后端。

Rust是一款高级通用语言,而且属于少有的一款兼顾开发和执行效率的编程语言。Rust结合了脚本语言的语法结构和C语言编译执行效率,并且具有类似垃圾回收和数据类型及所有权系统等功能,所以可靠性和高性能运行都属于Rust的特色。

虽然是一个非常年轻的编程语言,但是Rust可以算是最近几年最流行的编程语言。5月发布的Stack Overflow 2020开发者调查中,Rust被86.1%开发者选择为“最喜欢”的编程语言,比第二名TypeScript高出近20%。

虽然Rust并不是一个专属的网络应用开发语言,但是作为一个以安全著称的编辑语言,实际上是非常适合网络开发的。而且因为是编译型语言,编译器也能在过程中就安全稳定的问题作出提醒,作为后端网络开发还是不错的一个优势。

Rust的通用库中已经包含了类似TcpListener这样的网络通讯库,可以直接通过调用std : : net 下面的TcpListener来直接监听Tcp端口,然后再处理Request。这点上与一些脚本型的编程语言比要自由得很多。

Rust作为比较流行的编程语言,也有不少第三方HTTP库来支持Web开发,可以不用再花时间从底层开发,比较热门的库像Hyper或者Tide都是被不少Web开发框架用到的。Rust下Web开发框架也不少,比较热门的有Rocket、Actix-Web、Tower-web、Warp等等框架。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
车搭电正负极怎么接 勾车线怎么接 我想自己创业,但是我只会做理发这行,我想要改行,想多赚点钱。 作为一名新幼儿教师如何正确树立自己的职业理想 2024年江苏物理类619分能考上什么大学? 2023北京985/211率出炉!北京学生上名校到底难不难? 多少分能考上宁波诺丁汉大学 2024年浙江618分能考上什么大学? 2024年浙江627分能考上什么大学? 2024年浙江619分能考上什么大学? 怎么提高省呗额度? steam里面腐蚀rust怎么打中文补丁。 Rust语言的最新版本说明 steam平台游戏腐蚀怎么设置中文 想学编程不知道从哪里开始?? win10怎么在rust里输入中文 rust怎么设置中文 如何开始学习 Rust 语言 《腐蚀Rust》怎么设置中文? 新版《腐蚀》怎么设置中文 如何开始学习rust语言 windows 7 下Rust 入门 Helloworld 怎么编写 加湿器可以使用矿泉水来代替自来水吗??如果不能有什么危害呢??会对... 加湿器直接添加自来水会导致什么后果? 有说加湿器得加纯净水的,加自来水不可以吗 能直接把自来水加入加湿器中吗? 加湿器可以加自来水吗? 加湿器能直接添加自来水吗? 加湿器可以直接加自来水吗? 加湿器里放自来水可以吗? Rust语言有那些好的GUI库? 省呗给的额度高吗?有什么好处? 有谁研究rust编程语言来交流一下 Rust语言的代码 制片人主要是做什么工作? rust中文是什么意思 省呗借钱的额度最多可以达到多少? 请问下省呗额度高吗?怎么样? 电影的制作人 主要做什么事情 省呗APP开通后有多少借款的额度? 省呗额度到期是什么意思 电影制片人具体是干什么的 ...制片人、监制、编剧、策划、出品人等都是干什么的?大小顺序是什么... 省呗额度是多少 吃饭的小碗5碗水应放多少米才能煮稀饭 导演和制片人分别是干什么的? 省呗额度计算中是什么意思 煮饭一碗米放多少碗水? 电影制片人是干什么的? 制片人、出品人、总策划、监制都做什么?