生物信息Rust-01

前言-为什么想学Rust?

一直想多学一门编译语言,主要有几个原因吧(1. 看到一位老师实验室要求需要掌握一门编译语言;2. 自己享想试着开发一些实用的生信工具,感觉自己现在相比于数据分析,探索生物学层面的意义相比更想做一些实用性的东西出来),之前在C、C++、Rust之间摇摆,一直没有行动起来学,确实也怪自己拖延。

直到前段时间,想去的那个实验室发了一篇很有创新性的文章,又勾起了我想前往深造的想法。(叠个甲,不是只想着为了发文章才去,而是觉得在那里会有更多的可能性。)再浏览实验室信息的时候,偶然发现一位博士师兄之前竟然是我在B-G-I实习时候的室友,尽管只当了三四天的室友,但对他的一些基本情况还是比较了解的。知道他去了那个学校,但没想到竟然去了那位老师门下。

有在网上搜索这位师兄的相关信息,确实很优秀,掌握很多技能,渐渐地心里将他变成了我研究生阶段的榜样。看到他的github或者是推文中都在推荐Rust,我那摇摆的天平最终偏向Rust这边,下决心要开始行动了。

再不做真的就wan(晚/完)了。

说干就干,赶紧学!!!

PS:现在脑中有个小工具的雏形,争取能在今年实现!!

Rust资源

  1. Rust圣经

关于本书 - Rust语言圣经(Rust Course)

  1. 菜鸟教程

Rust 教程 | 菜鸟教程

  1. Rust官方文档中文教程

Rust 文档网 - Rust 官方文档中文教程

  1. rustlings

https://github.com/rust-lang/rustlings/

  1. 在线运行网站

Rust Playground

  1. Rust By Example

Introduction - Rust By Example

Rust特点

简单了解一下Rust特点,之前一直听说一大特点是内存安全,之前在大一时候学过C++,但是到后面学指针的时候就开小差了,其实也不能很好理解这部分内容。这里引用一下菜鸟教程里的内容吧:

  • 内存安全:Rust 的所有权系统在编译时防止空悬指针、数据竞争等内存错误,无需垃圾收集器。
  • 并发编程:Rust 提供了现代的语言特性来支持并发编程,如线程和消息传递,使得编写并发程序更加安全和容易。
  • 性能:Rust 编译为机器码,没有运行时或垃圾收集器,能够提供接近 C 和 C++ 的性能。
  • 类型系统:Rust 的类型系统和模式匹配提供了强大的抽象能力,有助于编写更安全、更可预测的代码。
  • 错误处理:Rust 的错误处理模型鼓励显式处理所有可能的错误情况。
  • 宏系统:Rust 提供了一个强大的宏系统,允许开发者在编译时编写和重用代码。
  • 包管理:Rust 的包管理器 Cargo 简化了依赖管理和构建过程。
  • 跨平台:Rust 支持多种操作系统和平台,包括 Windows、macOS、Linux、BSDs 等。
  • 社区支持:Rust 有一个活跃的社区,提供了大量的库和工具。
  • 工具链:Rust 拥有丰富的工具链,包括编译器、包管理器、文档生成器等。
  • 无段错误:Rust 的所有权和生命周期规则保证了引用的有效性,从而避免了段错误。
  • 迭代器和闭包:Rust 提供了强大的迭代器和闭包支持,简化了集合的处理。

对于生信可以借助Rust进行工具开发,这也是我一直想学着做的一件事

Cargo

我们在平常管理生信环境是经常会用到conda/pip,那么在Rust里面可以使用Cargo来对包进行管理。

创建项目

在这里使用cargo创建一个world_hello项目

(base) PS D:\000zyf\Learning\rust_learn> cargo new world_helloCreating binary (application) `world_hello` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
(base) PS D:\000zyf\Learning\rust_learn> cd .\world_hello\
(base) PS D:\000zyf\Learning\rust_learn\world_hello> lsDirectory: D:\000zyf\Learning\rust_learn\world_helloMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           2025/4/12    21:33                src
-a---           2025/4/12    21:33             82 Cargo.toml(base) PS D:\000zyf\Learning\rust_learn\world_hello>

这里如果使用命令cargo new --vcs git xxx来创建项目的话还会给出相应的git文件。

吐槽:windows终端上操作真难受!!

运行项目

有两种方式运行:

  1. cargo run
  2. 手动编译和运行项目
cargo run

在刚刚创建的项目路径下运行cargo run便可看到:

(base) PS D:\000zyf\Learning\rust_learn\world_hello> cargo run        Compiling world_hello v0.1.0 (D:\000zyf\Learning\rust_learn\world_hello)Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.83sRunning `target\debug\world_hello.exe`
Hello, world!

上述代码,cargo run 首先对项目进行编译,然后再运行,因此它实际上等同于运行了两个指令

手动编译运行
(base) PS D:\000zyf\Learning\rust_learn\world_hello> cargo buildFinished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s
(base) PS D:\000zyf\Learning\rust_learn\world_hello> lsDirectory: D:\000zyf\Learning\rust_learn\world_helloMode                 LastWriteTime         Length Name  
----                 -------------         ------ ----  
d----           2025/4/12    21:39                src       
d----           2025/4/12    21:50                target    
-a---           2025/4/12    21:39              8 .gitignore
-a---           2025/4/12    21:50            155 Cargo.lock
-a---           2025/4/12    21:39             82 Cargo.toml(base) PS D:\000zyf\Learning\rust_learn\world_hello> .\target\debug\world_hello.exe
Hello, world!
(base) PS D:\000zyf\Learning\rust_learn\world_hello> 

行云流水,但谈不上一气呵成。 细心的读者可能已经发现,在调用的时候,路径 ./target/debug/world_hello 中有一个明晃晃的 debug 字段,没错我们运行的是 debug 模式,在这种模式下,代码的编译速度会非常快,可是福兮祸所伏,运行速度就慢了. 原因是,在 debug 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。

比如你想要高性能的代码怎么办? 简单,添加 --release 来编译:

cargo run --release

cargo build --release

试着运行一下我们高性能的 release 程序:

(base) PS D:\000zyf\Learning\rust_learn\world_hello> cd .\target\         
(base) PS D:\000zyf\Learning\rust_learn\world_hello\target> lsDirectory: D:\000zyf\Learning\rust_learn\world_hello\targetMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           2025/4/12    21:51                debug
d----           2025/4/12    22:00                release
-a---           2025/4/12    21:51           1120 .rustc_info.json
-a---           2025/4/12    21:50            177 CACHEDIR.TAG(base) PS D:\000zyf\Learning\rust_learn\world_hello\target> .\release\world_hello.exe
Hello, world!

cargo check

当项目大了后,cargo run 和 cargo build 不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着!

cargo check 是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过。因此该命令速度会非常快,能节省大量的编译时间。

Cargo.toml和Cargo.lock

Cargo.toml 和 Cargo.lock 是 cargo 的核心文件,它的所有活动均基于此二者。

Cargo.toml 是 cargo 特有的项目数据描述文件。它存储了项目的所有元配置信息,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建 Cargo.toml。

Cargo.lock 文件是 cargo 工具根据同一项目的 toml 文件生成的项目依赖详细清单,因此我们一般不用修改它。

什么情况下该把 Cargo.lock 上传到 git 仓库里?很简单,当你的项目是一个可运行的程序时,就上传 Cargo.lock,如果是一个依赖库项目,那么请把它添加到 .gitignore 中。

现在用 VSCode 打开上面创建的"世界,你好"项目,然后进入根目录的 Cargo.toml 文件,可以看到该文件包含不少信息:

[package]
name = "world_hello"
version = "0.1.0"
edition = "2024"[dependencies]

name 字段定义了项目名称,version 字段定义当前版本,新项目默认是 0.1.0,edition 字段定义了我们使用的 Rust 大版本。

定义项目依赖

使用 cargo 工具的最大优势就在于,能够对该项目的各种依赖项进行方便、统一和灵活的管理。

在 Cargo.toml 中,主要通过各种依赖段落来描述该项目的各种依赖项:

  1. 基于 Rust 官方仓库 crates.io,通过版本说明来描述
  2. 基于项目源代码的 git 仓库地址,通过 URL 来描述
  3. 基于本地项目的绝对路径或者相对路径,通过类 Unix 模式的路径来描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串与相应函数(上)

字符串处理函数分类 求字符串长度:strlen长度不受限制的字符串函数:strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找:strstr,strtok错误信息报告:strerror字符操作,内存操作函数&…

asm汇编源代码之文件操作相关

提供7个子程序:   1. 关闭文件 FCLOSE   2. 打开文件 FOPEN   3. 文件大小 FSIZE   4. 读文件 FREAD   5. 写文件 FWRITE   6. 建立文件 FCREATE   7. 读取或设置文件指针 FPOS 具体功能及参数描述如下 ; ---------------------------- FCLOSE PROC  FAR ; IN…

[Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的详细指南

在 AI 应用快速发展的今天,开源项目如 Dify 正成为构建本地化 AI 应用的利器。通过 Dify,你可以轻松地集成不同的大语言模型(LLM),如 Ollama,并快速创建可交互的 AI 应用。本篇文章将带你一步步通过 Docker…

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

DevOps与功能安全:Perforce ALM通过ISO 26262合规认证,简化安全关键系统开发流程

本文来源perforce.com&#xff0c;由Perforce中国授权合作伙伴、DevSecOps解决方案提供商-龙智翻译整理。 近日&#xff0c;Perforce ALM&#xff08;原Helix ALM&#xff09;通过了国际权威认证机构 TV SD的ISO 26262功能安全流程认证&#xff01;该认证涵盖Perforce ALM解决方…

Android11车载WiFi热点默认名称及密码配置

一、背景 基于车厂信息安全要求,车载热点默认名称不能使用统一的名称,以及默认密码不能为简单的1~9。 基于旧项目经验,组装工厂自动化测试及客户整车组装的时候均存在多台设备同时打开,亦不太推荐使用统一的热点名称,连接无法区分。 二、需求 根据客户的要求,默认名称…

MacOs java环境配置+maven环境配置踩坑实录

oracl官网下载jdk 1.8的安装包 注意可能需要注册&#xff01;&#xff01;&#xff01; 下载链接&#xff1a;下载地址点击 注意晚上就不要下载了 报错400 &#xff01;&#xff01;&#xff01; 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…

如何解读 /proc/net/netstat

在刷了屏的川普&#xff0c;关税&#xff0c;AI 大模型和 RDMA 之外的一股清流&#xff0c;来点实用的。 众所周知 /proc/net/netstat 很难读&#xff0c;且 netstat 并不是每个系统上都支持 -s&#xff0c;那么对齐该文件给出一个可读的输出就是一件高尚的事。可以用 column …

汉化进度100%

P3834 #include<bits/stdc.h> #define int long long #define 定义整型变量 int #define 这是一个常量 const #define 无返回值函数 void #define 这是一个循环条件在后面 for #define 定义结构体 struct #define 如果 if #define 否则 else #define 定义无返回值的 sig…

基于SpringBoot的动物救助中心系统(源码+数据库)

500基于SpringBoot的动物救助中心系统&#xff0c;本系统共分为2个角色&#xff1a;系统管理员、用户&#xff0c;主要功能如下 【管理员】&#xff1a; 1. 登录&#xff1a;管理员可以通过登录系统来管理各种功能。 2. 用户管理&#xff1a;管理员可以查看用户列表&#xff0…

rockylinux 8 9 升级到指定版本

rockylinux 8 update 指定版本 rockylinux 历史版 所有版本rockylinux 最新版 所有版本vault历史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名称 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 &#xff5c; 科技热点关注】 随着近年来AI与大模型的兴起&#xff0c;云计算行业正在发生着一场大变局。 “在2025年春节期间&#xff0c;DeepSeek两周火爆全球&#xff0c;如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出&#xff0c;AI与…

React8+taro开发微信小程序,实现lottie动画

安装核心依赖 npm install lottie-miniprogram tarojs/plugin-html --save修改 Taro 配置 (config/index.js) const config {plugins: [tarojs/plugin-html,// 其他插件...],mini: {canvas: true,webpackChain(chain) {chain.merge({module: {rule: {lottie-loader: {test: …

有效压缩 Hyper-v linux Centos 的虚拟磁盘 VHDX

参考&#xff1a; http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml VHDX 有个不好的问题就是&#xff0c;如果在里面存放过文件再删除&#xff0c;那么已经使用过的空间不会压缩&#xff0c;导致空间一直被占用。那么就需要想办法压缩空间。 还有一点&a…

【力扣hot100题】(089)最长有效括号

这题目真是越做越难了。 但其实只是思路很难想到&#xff0c;一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组&#xff0c;维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够&#xff0c;看了答案…

Ajax------免刷新地前后端交互

本文略带PHP代码需要在PHP环境下使用 介绍 AJAX (Asynchronous JavaScript and XML) 是一种创建快速动态网页应用的开发技术&#xff0c;它允许网页在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页内容。例如&#xff0c;在我们做爬虫的时候发现有些…

Android 中支持旧版 API 的方法(API 30)

Android 中最新依赖库的版本支持 API 31 及以上版本&#xff0c;若要支持 API30&#xff0c;则对应的依赖库的版本就需要使用旧版本。 可通过修改模块级 build.gradle 文件来进行适配。 1、android 标签的 targetSdk 和 compileSdk 版本号 根据实际目标设备的 android 版本来…

JDBC注入无外网(上):从HertzBeat聊聊SnakeYAML反序列化

上周日联合Ar3h 师傅一起&#xff0c;在【代码审计知识星球】里发布了一个Springboot的小挑战&#xff1a;https://t.zsxq.com/tSBBZ&#xff0c;这个小挑战的核心目标是在无法连接外网的情况下&#xff0c;如何利用PSQL JDBC注入漏洞。我会分两篇文章来讲讲Java安全的不出网利…

QTreeWidget 手动设置选中项后不高亮的问题

当使用Qt编程QTreeWidget setCurrentItem() 方法设置 QTreeWidget 的当前项时&#xff0c;如果发现选中项显示为灰色而不是高亮状态&#xff0c;这通常是由以下几个原因导致的&#xff1a; 方法1. 焦点问题 • 确保 QTreeWidget 有焦点 • 解决方案&#xff1a; cpp treeWidge…

javaSE学习(前端基础知识)

文章目录 前言一、HTML1、< th >、< tr > 和 < td >标签&#xff1a;2、< button > 标签&#xff1a;3、< input type"text" >&#xff1a;4、< br >&#xff1a; 二、CSS1、选择器2、声明块3、常用属性及值 三、JS1、Vue 实例对…