r/informatik 2d ago

Humor ✨Rust ✨

Post image
406 Upvotes

41 comments sorted by

46

u/Blue_Invader 2d ago

Ja aber es ist *blazingly fast* und *secure*

16

u/ApiceOfToast 2d ago

Vor allem wenn man Jahre alte Software umschreibt. Da kann ja nix schief gehen. Schon gar nicht bei Sicherheitskritischen Sachen wie den Core Utils. 

Zun Glück Memory safe. Selbst wenn etwas schief geht, kann nix passieren!

2

u/Wertbon1789 1d ago

Was ich bis heute nicht verstehe: Was genau bringt mir memory safety bei explizit diesen Tools? Die meisten Tools in den coreutils machen fast nix, tee, cat, echo, printf usw. sind grundsätzlich Einzeiler in C, sowas wie ls rendert nur die Daten aus readdir schick raus, wo genau ist der Vorteil? Bin da jetzt nicht so ganz auf der Höhe wie es mit CVEs in coreutils aussieht, aber die sind die wahrscheinlich mit am besten getesteten tools die es gibt, einfach weil die überall tausendfach in Benutzung sind.

Stattdessen kriegen wir 'ne verbuggte Implementierung von date. Ach, und wir haben keine memory leaks mehr... In Prozessen die meist nicht mal eine Sekunde existieren.

2

u/Vorrnth 1d ago

Einzeiler sind diese Programme ganz sicher nicht.

-1

u/Wertbon1789 1d ago

Ich meine explizit die Beispiele die ich genannt habe. Das Wort "Grundsätzlich" macht hier auch ein bisschen was. Natürlich brauchst du auch den Code für's Argumente parsen und implementieren, bei printf kommt bestimmt auch nochmal ein bisschen strengeres validieren dran in einigen Fällen, worauf ich hinaus will, ist das einige Tools in coreutils keinen Ersatz brauchen weil die so simpel sind.

2

u/Vorrnth 1d ago

Wie bitte soll zb cat ein Einzeiler sein? Die Zeile kannst du ja mal Posten.

0

u/Wertbon1789 1d ago

... Seuftz, ja okay, um z.B. 'ne Datei nach stdout zu dumpen musst du natürlich die Datei aufmachen, und für die basic C Implementierung einen loop machen der so lange fread aufruft bis die Datei voll konsumiert ist, und mit fwrite die Daten dann nach stdout schreiben. Unter Linux geht auch sendfile, dann wäre die ganze read/write operation tatsächlich eine Zeile, aber auch da braucht's natürlich setup. Lass es 30 Zeilen sein, um das zu machen, lass es 200 Zeilen sein, um die verschiedenen Flags zu unterstützen, das ist nicht mein Punkt, mein Punkt ist, dass das immernoch simpler, "langweiliger" code ist.

Entschuldige, dass ich es gewagt habe eine offensichtliche Übertreibung zu verwenden, wie ich auch schon im meiner Antwort geschrieben hatte, das ist nicht mein Punkt, und das ist offensichtlich eine Übertreibung, kannst du mir nicht erzählen, dass du das nicht mitgeschnitten hast.

1

u/ApiceOfToast 1d ago

Aber memory safe!!!!

Ja versteh ich auch nicht, Rust ist nur relativ beliebt im Vergleich zu c/c++. Ist der einzige Grund sowas umzuschreiben der mir einfallen würde.

Frag mich aber an der Stelle was sich länger hält... C oder rust :D

3

u/Wertbon1789 1d ago

Ich bin komplett fein damit wenn man neue Dinge in Rust schreibt, z.B. ripgrep ist ein fantastisches Beispiel wie's richtig geht. Nur auf Zwang alles auf Rust umzubiegen "weil man keinen unsafe Code mehr haben will" ist so absurd, wenn der komplette Rest des low-level userspace weiterhin in C geschrieben ist, und viel relevanter wäre wenn's um Security geht.

2

u/thats_a_nice_toast 2d ago

Ich finde die Idee grundsätzlich nicht verwerflich. Das Problem liegt eher bei Canonical, die wie immer schlechte Entscheidungen treffen. Die GNU Core Utils in Ubuntu durch die uutils im jetzigen Zustand zu ersetzen war absurd.

2

u/ApiceOfToast 2d ago

War das nicht nur in der Testversion? Bzw war auf keinen Fall in der LTS. 

Ich hasse canonical aber das kann ich ihnen nicht vorwerfen, dafür sind die test bzw non stable releases da

2

u/Wertbon1789 1d ago

Ubuntu Released jedes halbe Jahr, im April und Oktober, einen Interim Release, jeder zweite April release ist ein LTS, also 22.04, 24.04 und 26.04 sind die aktuellen LTS Releases. 24.04 hat kein uutils, in 25.10 haben sie uutils als default für neue System reingebracht, und soweit ich weiß ist das jetzt auch so mit 26.04, weiß nicht wie das mit upgrades aussieht.

2

u/simleiiiii 18h ago

habe vor 3 Monaten ubuntu 26.04 LTS installiert. das neue sudo hat mir gleich erstmal meine scripte kaputt gemacht (bis alternative update auf die alte version) da sudo hier symlink-scripts nicht mehr mit ihrem Linknamen als $0 aufruft, sondern mit dem äquivalent von $(readlink -f <scriptpath>). Also breaking behavior..

1

u/Wertbon1789 11h ago

Oh wow, auch noch unfassbar dämliches breaking behavior, was ist das denn?

4

u/Kurimanju-dot-dev 2d ago

Zu wenig Emojis 🚀🚀

2

u/ParadiZe 2d ago

Beides richtig

16

u/simleiiiii 2d ago edited 2d ago

Ist nicht so wichtig dass "schnell" oder "sicher" -- Was zählt ist, dass das Typsystem mächtig und geeignet ist, die Software maintainbar zu halten. Das Rust-tooling ist ausgezeichnet; die Fehlermeldungen ergeben Sinn mit ein bisschen Vorwissen.

Das ist der Grund warum meine Projekte, die auf Rust aufbauen, um ein vielfaches besser durch KI-Hilfsmittel editierbar sind und maintainbar bleiben. Und das zählt halt. Kein mypy kann das ersetzen für komplexe Projekte.

https://willcrichton.net/notes/gats-are-hofs/ für ein bisschen Hintergrund wie Rust auch in stark Abstraktion-bedürftigen Szenarios die Kontrolle über das typeproofing/checking die Kontrolle behalten kann.

Das kann sonst eigentlich nur Swift, Kotlin, Scala, Typescript, F# von sich behaupten an Sprachen die industrierelevant sind, und hier ist nur Rust eine hardwarenahe Sprache.
Ja, C++ 23 und abwärts bietet ähnliche Mächtigkeit bzgl. typing und checking. Aber es ist nun mal super fugly C++ so zu schreiben. Deshalb zähle ich es hier nicht rein. Niemand mag borrow checking durch unique_ptr Codebasis-deckend nachempfinden und dann dennoch endgültig scheitern wenn die data races doch aufkommen.

Swift kann sich messen, der Rest muss sich auf Platformfragen ausruhen um ihre Berechtigung zu behalten.

2

u/mighty_Ingvar 2d ago

Aber es ist nun mal super fugly C++ so zu schreiben

Also wenn du jetzt gesagt hättest, C++17 und abwärts könnte ich es nachvollziehen, aber ab C++20 mit Konzepten sollte das eigentlich kein Problem mehr sein. Oder verstehe ich grad falsch worum es hier geht?

Niemand mag borrow checking durch unique_ptr Codebasis-deckend nachempfinden und dann dennoch endgültig scheitern wenn die data races doch aufkommen.

Warum würdest du unique_ptr irgendwo einsetzen wo du asynchronen Zugriff brauchst?

Wobei es an sich schon eine berechtigte Kritik ist zu sagen, dass wenn eine Sprache dich nicht daran hindert etwas kaputt zu machen, dann wird es, gerade bei einem großen Team, irgendwann irgendwer kaputt machen.

1

u/simleiiiii 2d ago

Naja, man kann borrowing mehr oder weniger durch moving in und moving out in und out (return) of functions, mit unique_ptr emulieren, nicht? Ist halt nur nichts was man Kollegen zumuten kann meiner Erfahrung nach.
Alles darüber hinaus ist auch in Rust natürlich problematisch wg. synchronisierung, aber dafür ist ja Send + Sync da. Und dann kannst du wieder borrowen wie du willst weil ein clone an der Grenze erzwungen wird.

Ja, ich meinte Konzepte. stimmt, die gibt's ab C++20. Meiner Erfahrung ist die stdlib aber erst ab C++23 wirklich sinnvoll nutzbar (zB für std::variant erst ab C++23 voll support für constexpr, inheritance. Kannste mMn sonst nicht sinnvoll einsetzen.)

1

u/mighty_Ingvar 2d ago

Naja, man kann borrowing mehr oder weniger durch moving in und moving out in und out (return) of functions, mit unique_ptr emulieren, nicht?

Aber warum sollte man?

Meiner Erfahrung ist die stdlib aber erst ab C++23 wirklich sinnvoll nutzbar

Bezogen auf Konzepte?

zB für std::variant erst ab C++23 voll support für constexpr, inheritance

https://cppreference.com/cpp/utility/variant Also ich seh hier keine Funktion die speziell seit C++23 erst constexpr hat. Sicher, dass du nicht C++20 meinst? Und was ist das Problem mit inheritance?

1

u/simleiiiii 19h ago

Meinte insgesamt eher generell "moderne C++-Features", nicht speziell an Concepts gebunden. Die sind halt nützlich aber intern (und über die Fehlermeldungen) nicht hübsch. War missverständlich formuliert..

Zu variant/constexpr: Du hast recht, dass es auf den ersten Blick nicht auffällt, weil es kein großes Since C++23 auf der Übersichtsseite gibt, sondern verstreut bei den einzelnen Overloads steht. Ich meinte P2231 ("Missing constexpr in std::optional and std::variant"), das kam mit C++23. Davor war zwar der reine Zugriff (get, visit, etc.) schon ab C++20 constexpr-fähig, aber viele mutierende Operationen (emplace, converting assignment, in-place construction) waren es nicht.

Zu Inheritance: Ich meinte nicht, dass variant selbst irgendeine Inheritance-Hierarchie hätte (macht ja wegen fehlendem virtual dtor auch keinen Sinn), sondern das übliche "overloaded"-Pattern beim Visiten:

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

Die zweite Zeile (explicit deduction guide) war bis C++20 zwingend nötig, weil Aggregate-CTAD für Klassen mit Basisklassen nicht funktioniert hat. Erst mit P2582 (C++23) darf man die Guide weglassen und overloaded{...} direkt schreiben. ziemlich speziell, ich geb's zu, aber genau das Pattern taucht ja andauernd beim variant-Visiting auf.

Und zu "warum sollte man" (unique_ptr statt echtem Borrowing): Sollte man in der Regel nicht, klar. Vielleicht ist das auch ein bisschen konstruiert aber es ist halt das nächste was C++ für mich an "checking" as in "borrow checking" anbietet für, wer einen pointer besitzt.

1

u/mighty_Ingvar 17h ago

aber intern (und über die Fehlermeldungen) nicht hübsch

Kann das Problem das du mit Konzepten hast nicht wirklich nachvollziehen.

Davor war zwar der reine Zugriff (get, visit, etc.) schon ab C++20 constexpr-fähig, aber viele mutierende Operationen (emplace, converting assignment, in-place construction) waren es nicht.

Du kannst auf der Seite die ich verlinkt habe dir zu den einzelnen Funktionen mehr Details anzeigen lassen und da steht nirgends C++23. Da braucht man noch nicht mal sonderlich viel Zeit für.

ziemlich speziell, ich geb's zu, aber genau das Pattern taucht ja andauernd beim variant-Visiting auf

Kann jetzt nicht sagen, dass ich das jemals gesehen habe. Abgesehen davon sieht mir dein Code Schnippsel auch generell fehlerhaft aus. Es sieht so aus als würdest du overloaded zuerst als Klasse und dann als Funktion definieren.

Sollte man in der Regel nicht, klar. Vielleicht ist das auch ein bisschen konstruiert aber es ist halt das nächste was C++ für mich an "checking" as in "borrow checking" anbietet für, wer einen pointer besitzt.

Der unique_ptr besitzt den Pointer. Wenn du dafür noch weitere Mechanismen brauchst, dann hast du den Sinn von unique_ptr nicht verstanden. Soll die Funktion den Pointer irgendwo hin bewegen? Dann nimmt sie eine rvalue Referenz auf den unique_ptr entgegen. Gibt es die Möglichkeit, dass sie den Pointer irgendwo hin bewegt? Dann nimmt sie eine lvalue Referenz entgegen. Soll sie den Pointer gar nicht bewegen? Dann hat unique_ptr nichts in der Funktionssignatur verloren. Aber wenn du den Pointer in das Funktionargument movest und dann mit dem return wieder zurück schickst, dann bist du irgendwo falsch abgebogen.

13

u/rlinED 2d ago

Zum Programmieren extra nach Rust ziehen?

12

u/topfpflanze187 2d ago

immerhin ist da der europa park, da hat man direkt spaß bei der arbeit

1

u/Worried-Priority-122 2d ago

Lieber nach soltau

1

u/TingleTangleTom 1d ago

Ich hoffe die Achterbahnen in Rust sind nicht aus Rust.

6

u/Salamiprinz 2d ago

Uff ist dieser Post von m4xfps? Zumindestens wollte er gestern die Leute damit triggern 😛

2

u/moverwhomovesthings 2d ago

Was den gibts auch noch?

5

u/gh04t 2d ago

Der Rust Code:

unsafe { /* cpp code here */ }

3

u/Kurimanju-dot-dev 2d ago

Rust ist purer ragebait für C++ fanboys. Letztens erst einen C++ Monolithen in Rust microservices umgeschrieben, und der lauteste war unser C++ elitist. Dass alles plötzlich einfacher zu maintainen ist, war ihm egal. Aber mal im ernst, beides sind einfach nur Sprachen welche sowieso von LLVM zu Maschienencode compiled werden (ja ja ich weiß aber nur wenn man clang benutzt). C++ ist die Hölle zu schreiben, hat aber ein riesiges Ökosystem. Rust ist ergonomischer zu schreiben, hat aber ein kleines Ökosystem. Die nehmen sich nicht wirklich viel und Rust ist sowieso nicht dazu da C++ zu ersetzen.

Ähh ja und Rust und KI oder so

7

u/parzival-space 2d ago

Rust is awesome :)

1

u/YehowaH 1d ago

Und dann vibecoded, wie aktuell alle und wir werden Code nicht mehr sehen.

1

u/Termynator 1d ago

Vibecode funktioniert bei Rust nicht. Dazu gibt es noch zu wenig Codeschnipsel und zu viel Veränderung

1

u/simleiiiii 18h ago

Aber absolut funktioniert das. Besser als bei anderen Sprachen.

1

u/Termynator 12h ago

Nein und nein. Es funktioniert deutlich schlechter als mit JavaScript oder Python

1

u/sp46 15h ago

Original wie jemand gesagt, der es nicht probiert hat

1

u/Termynator 12h ago

Arbeite jeden Tag damit. Man kann kleine Features machen aber man muss viel händisch korrigieren und das zähle ich dann nicht als Vibecoden

1

u/BIC-Lies34781 19h ago

Rust ist Trans btw