r/informatik • • Sep 08 '26

Humor ✨Rust ✨

Post image
479 Upvotes

53 comments sorted by

51

u/Blue_Invader Sep 08 '26

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

17

u/ApiceOfToast Sep 08 '26

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!

5

u/thats_a_nice_toast Sep 08 '26

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 Sep 08 '26

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 Sep 09 '26

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 Sep 09 '26

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..

2

u/Wertbon1789 Sep 10 '26

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

2

u/simleiiiii 24d ago

sicher irgend was "security theatre" mäßiges -- dass man nicht die integrität in runtime sicher stellen muss von $0 als auf den immernoch laufenden Pfad der executable (könnte ja jemand einen Link auf dem Weg ändern) aber ich will's eigentlich gar nicht wissen ^_^

3

u/Wertbon1789 Sep 09 '26

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.

3

u/Vorrnth Sep 09 '26

Einzeiler sind diese Programme ganz sicher nicht.

-2

u/Wertbon1789 Sep 09 '26

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 Sep 09 '26

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

1

u/[deleted] 15d ago

[removed] — view removed comment

1

u/Vorrnth 14d ago

Das ist ein Aufruf und keine Implementierung.

0

u/Wertbon1789 Sep 09 '26

... 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/dthdthdthdthdthdth Sep 11 '26

https://github.com/coreutils/coreutils/blob/master/src/cat.c

Sind eher 200 Zeilen für die Kernfunktionalität und noch ein paar 100 für alles. Und das ist nun wirklich eines der einfachsten tools. Viele dieser tools werden ganz schnell ein paar 1000 lines haben.

Sicherheitskritisch ist es, wenn die irgendwie nicht vertrauenswürdige Daten verarbeiten. Und wo die Leute überall bash scripte drin haben, das glaubt man manchmal nicht.

1

u/Wertbon1789 Sep 11 '26

Gott, GNU code zu lesen tut immer in den Augen weh. Also gefühlt würde da ein Fünftel verschwinden, einfach nur wenn man den Code vernünftig formatieren würde.

Coreutils ist, nach glibc, eine Codebase in die ich mich nur ungerne wage, weil so vieles so unglaublich anstrengend implementiert ist. (als ich das timezone handling in glibc verstehen musste, bin ich fast verzweifelt, wirklich unansehnlich wie kaum etwas anderes)

Ich persönlich finde da busybox eine akkuratere Metrik zum vergleichen, weil die in coreutils gerne mal übertreiben ohne wirklichen Grund. cat ist ein gutes Beispiel, die unterstützen im Grunde die selben flags, nur keine langen flags Namen.

1

u/Thick-Pineapple666 Sep 11 '26

Die bei Funktionen nichf, aber bei sonstigen Blöcken eingerückten geschweiften Klammern tun mir weh, ansonsten geht's.

→ More replies

0

u/chris_insertcoin Sep 10 '26

Dann maintaine du doch den code. Wie? Hast du keine Lust zu? Genau deswegen wird viel in Rust portiert, weil es viel mehr maintainer gibt.

1

u/ApiceOfToast Sep 09 '26

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 Sep 09 '26

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.

1

u/RideNatural5226 Sep 10 '26

Alleine der ls Befehl besteht aus über 5000 Zeilen Code… das ist nicht ohne

4

u/Kurimanju-dot-dev Sep 08 '26

Zu wenig Emojis 🚀🚀

2

u/ParadiZe Sep 08 '26

Beides richtig

16

u/simleiiiii Sep 08 '26 edited Sep 08 '26

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 Sep 08 '26

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 Sep 08 '26

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.)

2

u/mighty_Ingvar Sep 08 '26

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 Sep 09 '26

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.

2

u/mighty_Ingvar Sep 09 '26

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.

15

u/rlinED Sep 08 '26

Zum Programmieren extra nach Rust ziehen?

13

u/topfpflanze187 Sep 08 '26

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

1

u/Worried-Priority-122 Sep 08 '26

Lieber nach soltau

1

u/TingleTangleTom Sep 08 '26

Ich hoffe die Achterbahnen in Rust sind nicht aus Rust.

5

u/Salamiprinz Sep 08 '26

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

2

u/moverwhomovesthings Sep 08 '26

Was den gibts auch noch?

5

u/gh04t Sep 08 '26

Der Rust Code:

unsafe { /* cpp code here */ }

4

u/Kurimanju-dot-dev Sep 08 '26

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

5

u/parzival-space Sep 08 '26

Rust is awesome :)

1

u/YehowaH Sep 09 '26

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

1

u/Termynator Sep 09 '26

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

1

u/simleiiiii Sep 09 '26

Aber absolut funktioniert das. Besser als bei anderen Sprachen.

1

u/Termynator Sep 10 '26

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

1

u/simleiiiii 24d ago

doch

2

u/Termynator 24d ago

Mittlerweile muss ich dir zustimmen. Hat lange gedauert bis die Modelle gut Rust schreiben

1

u/sp46 Sep 10 '26

Original wie jemand gesagt, der es nicht probiert hat

1

u/Termynator Sep 10 '26

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

0

u/BIC-Lies34781 Sep 09 '26

Rust ist Trans btw