Mezi jazyky Go a Rust jsou zřejmé rozdíly. Jazyk Go se více zaměřuje na vytváření webových rozhraní API a malých služeb, které lze nekonečně škálovat, zejména díky výkonu goroutin. To druhé je v Rustu také možné, ale z hlediska zkušeností vývojářů je vše mnohem těžší.

Rust dobře funguje při zpracování velkého množství dat a dalších operací náročných na procesor, například při provádění algoritmů. To je největší výhoda Rustu oproti Go. Projekty, které vyžadují vysoký výkon, jsou obecně vhodnější pro jazyk Rust.

V tomto kurzu porovnáme a srovnáme jazyky Go a Rust a zhodnotíme každý programovací jazyk z hlediska výkonu, souběžnosti, správy paměti a celkové zkušenosti vývojáře. Představíme také přehled těchto prvků, abychom vám na první pohled pomohli vybrat ten správný jazyk pro váš projekt.

Pokud s jazykem Rust teprve začínáte, možná by bylo dobré oprášit tuto příručku pro začátečníky, než budete číst dál.

Pokud jste se do všeho začetli, vrhněme se na to!

Výkonnost

Původně bylo Go navrženo inženýry společnosti Google a veřejnosti bylo představeno v roce 2009. Byl vytvořen s cílem nabídnout alternativu k jazyku C++, která by se snadněji učila a kódovala a byla optimalizována pro běh na vícejádrových procesorech.

Od té doby je jazyk Go skvělý pro vývojáře, kteří chtějí využít souběžnost, kterou tento jazyk nabízí. Jazyk poskytuje goroutiny, které umožňují spouštět funkce jako podprocesy.

Velkou výhodou jazyka Go je, jak snadno můžete goroutiny používat. Jednoduchým přidáním syntaxe go do funkce ji spustíte jako podproces. Souběžný model jazyka Go umožňuje nasadit zátěž na více jader procesoru, což z něj dělá velmi efektivní jazyk.

package mainimport ( "fmt" "time")func f(from string) { for i := 0; i < 3; i++ { fmt.Println(from, ":", i) }}func main() { f("direct") go f("goroutine") time.Sleep(time.Second) fmt.Println("done")}

Přes podporu vícejádrových procesorů se Rustu stále daří Go překonávat. Rust je efektivnější při provádění algoritmů a operací náročných na zdroje. Benchmarks Game porovnává Rust a Go pro různé algoritmy, například binární stromy. U všech testovaných algoritmů byl Rust rychlejší nejméně o 30 procent; v případě výpočtů binárních stromů to bylo až o 1 000 procent. Studie společnosti Bitbucket ukazuje podobné výsledky, ve kterých má Rust stejný výkon jako C++.

Výkon Rustu podle Bitbucket

Výkon Rustu podle Bitbucket

(Zdroj: Benchmarks Game)

Souběžnost

Jak bylo uvedeno výše, Go podporuje souběžnost. Řekněme například, že provozujete webový server, který zpracovává požadavky API. Můžete použít goroutines Go a každý požadavek spustit jako podproces, čímž maximalizujete efektivitu tím, že úlohy přenesete na všechna dostupná jádra procesoru.

Goroutines jsou součástí vestavěných funkcí Go, zatímco Rust získal pouze nativní syntaxi async/await pro podporu souběhu. Z toho vyplývá, že pokud jde o souběžnost, má Go výhodu ve zkušenostech vývojářů. Rust však mnohem lépe zaručuje paměťovou bezpečnost.

Tady je příklad zjednodušených vláken pro Rust:

use std::thread;use std::time::Duration;fn main() { // 1. create a new thread for i in 1..10 { thread::spawn(|| { println!("thread: number {}!", i); thread::sleep(Duration::from_millis(100)); }); } println!("hi from the main thread!");}

Konkurence byla pro vývojáře vždy ožehavým problémem. Není snadné zaručit paměťově bezpečnou souběžnost, aniž by došlo ke zhoršení zkušeností vývojářů. Extrémní zaměření na bezpečnost však vedlo k vytvoření prokazatelně korektní souběžnosti. Rust experimentoval s konceptem vlastnictví, aby zabránil nevyžádanému přístupu ke zdrojům a předešel tak chybám paměťové bezpečnosti.

Rust nabízí čtyři různá paradigmata souběžnosti, která vám pomohou vyhnout se běžným nástrahám paměťové bezpečnosti. My se blíže podíváme na dvě běžná paradigmata: kanál a zámek.

Kanál

Kanál pomáhá přenášet zprávy z jednoho vlákna do druhého. Tento koncept sice existuje i pro Go, ale Rust umožňuje přenášet ukazatel z jednoho vlákna do druhého, aby se předešlo závodním podmínkám o zdroje. Prostřednictvím předávání ukazatelů může Rust u kanálů vynutit izolaci vláken. Rust opět projevuje svou posedlost paměťovou bezpečností s ohledem na svůj model souběhu.

Zámek

Data jsou přístupná pouze tehdy, když je zámek držen. Rust se spoléhá na princip zamykání dat namísto kódu, který se často vyskytuje v programovacích jazycích, jako je Java.

Podrobnější informace o konceptu vlastnictví a všech paradigmatech souběžnosti naleznete v knize „Fearless Concurrency with Rust.“

Paměťová bezpečnost

Dřívější koncept vlastnictví je jednou z hlavních předností Rustu. Rust posouvá typovou bezpečnost, která je důležitá i pro umožnění paměťově bezpečné souběžnosti, na další úroveň.

Podle blogu Bitbucket: „Velmi přísný a pedantský kompilátor Rustu kontroluje každou proměnnou, kterou používáte, a každou paměťovou adresu, na kterou odkazujete. Předchází tak možným datovým závodům a informuje vás o nedefinovaném chování.“

To znamená, že díky extrémní posedlosti Rustu bezpečností paměti neskončíte s přetečením bufferu nebo závodní podmínkou. Má to však i své nevýhody. Například při psaní kódu si musíte být hyperaktivně vědomi zásad alokace paměti. Není snadné mít paměťovou bezpečnost vždy na pozoru.

Zkušenosti vývojáře

Nejprve se podívejme na křivku učení spojenou s jednotlivými jazyky. Jazyk Go byl navržen s ohledem na jednoduchost. Vývojáři o něm často mluví jako o „nudném“ jazyce, což znamená, že díky omezené sadě vestavěných funkcí si Go snadno osvojíte.

Go navíc nabízí jednodušší alternativu k C++, protože skrývá aspekty, jako je bezpečnost paměti a její přidělování. Rust volí jiný přístup a nutí vás přemýšlet o takových konceptech, jako je bezpečnost paměti. Koncept vlastnictví a možnost předávání ukazatelů činí z Rustu méně atraktivní možnost k naučení. Když neustále přemýšlíte o bezpečnosti paměti, jste méně produktivní a váš kód bude určitě více komlexní.

Křivka učení pro jazyk Rust je ve srovnání s jazykem Go poměrně strmá. Stojí však za zmínku, že Go má strmější křivku učení než dynamičtější jazyky, jako jsou Python a JavaScript.

Kdy použít Go

Go funguje dobře pro širokou škálu případů použití, což z něj dělá skvělou alternativu k Node.js pro vytváření webových API. Jak poznamenal Loris Cro, „souběžný model Go se dobře hodí pro aplikace na straně serveru, které musí zpracovávat více nezávislých požadavků“. Právě proto Go poskytuje goroutines.

Kromě toho má Go vestavěnou podporu webového protokolu HTTP. Pomocí vestavěné podpory HTTP můžete rychle navrhnout malé rozhraní API a spustit jej jako mikroslužbu. Proto Go dobře zapadá do architektury mikroslužeb a slouží potřebám vývojářů API.

Zkrátka, Go se hodí, pokud si ceníte rychlosti vývoje a dáváte přednost jednoduchosti syntaxe před výkonem. Navíc Go nabízí lepší čitelnost kódu, což je důležité kritérium pro velké vývojové týmy.

Vyberte si Go, když:

  • Záleží vám na jednoduchosti a čitelnosti
  • Chcete jednoduchou syntaxi pro rychlý zápis kódu
  • Chcete používat flexibilnější jazyk, který podporuje vývoj webových aplikací

Kdy použít jazyk Rust

Rust je skvělou volbou, když záleží na výkonu, například při zpracování velkého množství dat. Kromě toho vám Rust poskytuje jemnou kontrolu nad tím, jak se chovají vlákna a jak jsou zdroje sdíleny mezi vlákny.

Na druhou stranu je Rust spojen se strmou křivkou učení a zpomaluje rychlost vývoje kvůli dodatečné složitosti bezpečnosti paměti. To však nemusí být nutně nevýhoda; Rust také zaručuje, že se nesetkáte s chybami paměťové bezpečnosti, protože překladač kontroluje každý datový ukazatel. U složitých systémů se tato jistota může hodit.

Vyberte si Rust, když:

  • Záleží vám na výkonu
  • Chcete mít jemnou kontrolu nad vlákny
  • Ceníte si paměťové bezpečnosti více než jednoduchosti

Jděte proti Rustu:

Začněme zdůrazněním podobností. Go i Rust jsou open-source a jsou navrženy pro podporu architektury mikroslužeb a paralelních výpočetních prostředí. Oba optimalizují využití dostupných jader procesoru pomocí souběžnosti.

Ale nakonec, který jazyk je nejlepší?

K této otázce lze přistupovat mnoha způsoby. Doporučil bych se zamyslet nad tím, jaký typ aplikace chcete vytvořit. Jazyk Go dobře slouží k vytváření webových aplikací a API, které využívají jeho vestavěné funkce souběhu a zároveň podporují architekturu mikroslužeb.

Pro vývoj webového API můžete použít také jazyk Rust, ale ten nebyl navržen s ohledem na tento případ použití. Zaměření jazyka Rust na paměťovou bezpečnost zvyšuje složitost a dobu vývoje, zejména pro poměrně jednoduché webové API. Větší množství kontroly nad kódem vám však umožní psát optimalizovanější, paměťově úspornější a výkonnější kód.

Co nejjednodušeji řečeno, debata Go versus Rust je ve skutečnosti otázkou jednoduchosti versus bezpečnosti.

Další pohledy najdete v článku „Volba mezi Go a Rustem“.

LogRocket: Plný přehled o produkčních aplikacích Rust

Ladění aplikací Rust může být obtížné, zejména pokud se u uživatelů vyskytnou problémy, které je obtížné reprodukovat. Pokud máte zájem sledovat a monitorovat výkon svých aplikací Rust, automaticky odhalovat chyby a sledovat pomalé síťové požadavky a dobu načítání, vyzkoušejte LogRocket. LogRocket Dashboard Free Trial Banner

LogRocket je jako DVR pro webové aplikace, který zaznamenává doslova vše, co se děje ve vaší aplikaci Rust. Místo hádání, proč k problémům dochází, můžete agregovat a reportovat, v jakém stavu se vaše aplikace nacházela, když k problému došlo. LogRocket také monitoruje výkon vaší aplikace a hlásí metriky, jako je zatížení procesoru klienta, využití paměti klienta a další.

Modernizujte způsob ladění aplikací Rust – začněte monitorovat zdarma.

.

Articles

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.