Za mě je Rust super jazyk pro tvorbu GraphQL api nebo RPC. Hlavně z hlediska výkonu. Oproti skriptovacím jazykům (PHP, NodeJS/Javascript) je úplně jinde.
Oproti Go je taky výkonnější a to hlavně, protože má lepší správu paměti (nemá garbage collector). Co se týče syntaxe jazyka má blíž k skriptovacím jazykům. Go mi přijde, že má blíže k C++.
Pro GraphQL api používám kombinaci knihovny Actix-web (http server) a Juniper (GraphQL protokol). Líbí se mi, že http server běží ve více vláknech + v Rustu asynchronní programování je stejné jako v Javascriptu (jenom Promise se tam jmenuje Feature).
Mimo to v Rustu existuje frontendový framework Yew, který funguje stejně jako React. Jsou v něm funkcionální komponety, states, kotexty, pomocí maker je tam něco JSX, ... . Celý projekt se kompiluje do WebAssembly.
31. 10. 2023, 20:47 editováno autorem komentáře
V Rustu mi příjde, že je přehledněší typování (používá se dvojtečka) a v asynchroním programování používá await.
use tokio::time::{Duration, sleep};
use futures::future::join_all;
#[tokio::main]
async fn main() {
let strings: Vec<&str> = vec!["apple", "banana", "cherry"];
let tasks = strings.iter().map(|&s| async_task1(s));
let results = join_all(tasks).await;
// Zde můžete pracovat s výsledky úkolů
for result in results {
match result {
Ok(res) => println!("Task result: {}", res),
Err(err) => eprintln!("Task error: {}", err),
}
}
}
async fn async_task1(s: &str) -> Result<String, Box<dyn std::error::Error>> {
// Simulace asynchronního úkolu
sleep(Duration::from_secs(2)).await;
let result = format!("Processed: {}", s);
Ok(result)
}
Zde je kód v Go:
package main
import (
"fmt"
"time"
)
func asyncTask1(input string, ch chan string) {
// Simulace asynchronního úkolu
time.Sleep(2 * time.Second)
result := "Processed: " + input
ch <- result
}
func main() {
strings := []string{"apple", "banana", "cherry"}
ch := make(chan string)
for _, s := range strings {
go asyncTask1(s, ch)
}
results := make([]string, len(strings))
for i := 0; i < len(strings); i++ {
result := <-ch
results[i] = result
}
// Zde můžete pracovat s výsledky úkolů
for _, result := range results {
fmt.Println(result)
}
}
Zde je ještě pro porovnání Typescript, který má viditelně podobnější sytaxi k Rustu. Proto mi přijde jednoduší přechod z PHP nebo NodeJS do Rust než do Go.
async function asyncTask1(input: string): Promise<string> {
// Simulace asynchronního úkolu
await new Promise((resolve) => setTimeout(resolve, 2000)); // 2 sekundy
return `Processed: ${input}`;
}
const strings: string[] = ["apple", "banana", "cherry"];
async function main() {
const promises: Promise<string>[] = strings.map(async (s) => asyncTask1(s));
const results: string[] = await Promise.all(promises);
// Zde můžete pracovat s výsledky úkolů
results.forEach((result) => console.log(result));
}
main();
Moje kratší zkušenost s Rustem je taková, že když už kompilátor konečně kód akceptuje a zkompiluje, program/změna obvykle na první pokus běží. S C/C++ obvykle bojuji, abych vychytal paměťové "pasti", do kterých vždy spadnu, a program nekolaboval. Takže z mého pohledu je Rust pro non-seasoned céčkaře přívětivější. Píše se mi v něm skoro jako v javě (až na hlídání borrowcheckeru), high-level struktury (mapy, množiny, atd.), funkcionální zápis ala javovské streamy, oproti javě užitečné návratové tuples. Vlastně featury javy v posledních letech (match/switch, var) míří stejným směrem, takže Rust byl ještě higher-level. A zkompilovaný výsledek běží daleko rychleji a úsporněji.
Další obrovská výhoda je z mého pohledu snadný vývoj i na windows. Jenom rozchodit kompletní kompilační chain pro C je pro linuxového občascéčkaře docela boj. Ve win Rustu stačí spustit binárku rustup, stáhnout windowsí Ideu a do ní (bohužel již deprecated) rustí plugin. A možná by si ten plugin i spustil rustup sám :-)
Dělal jsem WASAPI Exclusive JNI DLL pro javasound https://github.com/pavhofman/csjsound-wasapi a bez Rustu bych se do toho vůbec nepustil. V Rustu to šlo docela pohodlně, generování DLL byly dva řádky v Cargo.toml. Samozřejmě jsem poté postupně měsíce ladil problémy nahlášené uživateli, ale to se týkalo hlavně korektního volání API WASAPI a víceméně nesouviselo s Rustem, fungující základ (včetně komunikace mezi několika vlákny) byl hotový za pár dnů.
Jako ano, je to asi hlavně otázka úhlu pohledu. Třeba z hlediska správy paměti Go půjde do úplně jiné kategorie (spíše vedle Javy než C/C++/Rust). A Rust je dost specifický na úrovni kódu, ale za běhu odpovídá správa paměti C/C++.
Rust umožňuje dost low-level věcí, často ale (narozdíl od C a částečně i C++) se statickou kontrolou. A řekl bych, že Linusovi Torvaldsovi se Rust zdál blíž C než C++…