生物信息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.pswp.cn/pingmian/76464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76464.shtml
英文地址,請注明出處:http://en.pswp.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 實例對…