Darwin.
Klingt nach fehlenden Include-Guards.
Ein iPhone: Nahezu unmöglich, wenn du jedes einzelne Exploit einer Chain selber finden willst.
Allgemein: Kein Problem und oft sehr einfach, ist immerhin ein großes Feld.
Genaus hättest du auch fragen können: "Wie schwierig ist es eine professionelle Hochzeitstorte zu backen, oder Wasser zu kochen?"
Da liegen Welten dazwischen!
Ich war auch 13, als ich mein erstes OS geschrieben habe, aber das wurde eigentlich nur in die ersten Sektoren einer Diskette kopiert, bot eine einfache Shell, ein naives Dateisystem, und die einzige Anwendung mit Grafik war ein PCX-Bildbetrachter.
Wenn du wirklich eine GUI haben willst, sei dir bitte im Klaren darüber, das das SEHR VIEL Arbeit ist! Allein der Kernel meines OS war (damals noch in Assembler geschrieben) nur eine Hand voll Diskettensektoren (mit 512 Byte) groß, aber es hat richtig lange gedauert, vor allem, da es noch kein nennenswertes Internet gab.
Falls du dich inspirieren lassen möchtest, guck dir mal MenuettOS an! Das ist auch komplett in ASM geschrieben, hat Grafik, Sound, schicke GUI, Multithreading, sogar einen primitiven Webbrowser, uvm.
Unterschätze die Sache nicht! Sogar nur ein nacktes OS mit einer primitive Shell ist nichts, was du mal eben an einem Nachmittag entwickelst!
Trotzdem viel Spaß dabei ... falls du nicht - wie die meisten - vorher aufgeben wirst. :)
Ja, das geht tatsächlich, aber zuvor solltest du das hier wissen:
- Die ZSH ist eine Shell, in der man Skripte (das sind reine Textdateien) ausführen kann, die dafür geschrieben sind.
- C hingegen ist eine Programmiersprache, die von einem Compiler in ein ausführbares Prograamm (z. B. EXE-Dateien unter Windows) übersetzt, und erst dann ausgeführt werden können.
Es gibt aber einen sehr einfachen Trick! Du musst an den Anfang deiner *.c Datei nur das schreiben, was im folgenden Beispiel-Programm steht:
#if SHELL
cc "$0" && ./a.out && rm a.out; exit $?
#endif
#include <stdio.h> /* puts */
int main(void) {
puts("Hello, shell!");
return 0;
}
Vorausgesetzt, du hast einen C-Compiler installiert, kannst du jetzt einfach auf der Kommandozeile ...
zsh hello.c
... schreiben (angenommen, deine C-Datei heißt "hello.c").
Du kannst aber auch einmalig ...
chmod +x hello.c
... schreiben, und hast direkt ein ausführbares "C-Skript", welches du noch einfacher mit ...
./hello.c
... ausführen kannst.
Such dir die Variante aus, die dir am besten gefällt!
Ich nutze diesen "Hack" oft gerne bei Minimalprogrämmchen in C, die wie herkömmliche Skripte ausgeführt werden sollen und ich zu faul bin, extra eine Makefile zu schreiben.
Warum das alles funktioniert, und was die drei magischen Zeilen am Anfang des Quelltextes bedeuten, und was eine Makefile ist, musst du jetzt aber noch nicht wissen.
Naja, viel Spaß dabei! :)
Einfach (statische oder dynamische) Bibliotheken bauen, zur Not auch als Header-only Templates.
Ja, Kontrollstrukturen.
Ein "Stück" Daten als Teil eines Größeren.
Egal ob in Dateien, Netzwerkpaketen, im RAM, oder sonstwo.
Nahezu jedes Binärformat hat irgendwelche Chunks.
Das ist nicht richtig, da ohne "&" keine Reverenz zurück gegeben, sondern ein neues Objekt erzeugt wird.
Neben dem, was KarlRanseier gesagt hat, fällt mir spontan eine "XOR Linked List" ein, bei der zwei Zeiger in eine Variable gequetscht werden, sodass du effizient vorwärts und rückwärts iterieren kannst, obwohl nur ein einziger "Zeiger" vorhanden ist.
Dieser Ansatz bringt aber wieder andere Nachteile mit sich.
Ach so, und ein vector ist bei deiner Aufhabenstellung auch nicht optimal, sondern eher ein deque! Bei dem Benchmark in den Kommentaren unter der anderen Antwort, wird eine Implementierung mit deque sicher den Vogel abschießen!
Davon abgesehen: Merkwürdige Aufgabenstellung! Eine Liste ist dafür die denkbar ungünstigste Datenstrukur.
Naja, wollte nr ein paar Anregungn einwerfen. Viel Spaß noch beim basteln! :)
Warum nutzt du nicht einfach Standardfunktionen und Operatoren, statt Unterstrich-Funktionen wie __str__ und __eq__?
Und die Benennung deiner Bezeichner lässt earauf schließen, dass du nicht aus der Pythonwelt kommst.
Was genau funktioniert denn nicht!
Virtue-Signaling, Cancel-Culture, Echo-Chamber und Social-Justice-Warriors.
Das nennt man Metaprogrammiersprache und den Übersetzer einen Transpiler.
Nimm eine beliebige C oder. C++ Bibliothek, die entspr. Funktionen anbietet, und nutze diese direkt in Python, mithilfe des ctypes-Moduls.
SO-Punkte sind so sinnlos, wie das Sammeln von Konfetti. Pure Zeitverschwendung.
Die API hat hier und da mal kleinere Besonderheiten und Konventionen, ansonsten sind 99% ganz herkömmliches C++.
Also der Senf in diesen kleinen Tütchen in Nattoverpackungen ist durchweg DEUTLICH schärfer, als die "scharfen" Sorten aus dem Glas / Becher in Deutschland. Aber natürlich kannst eu den auch essen.
Und Dashi ist was völlig anderes als Sojasoße. Dann doch lieber gänzlich ohne.
Wenn rohe Wachteleier hast, kannst du das auch drüber kippen. Schmeckt super zum Natto auf Reis zum Frühstück.
Ein Kumpel von mir ist Maurer mit Hauptschulabschluss, und er verdient 20000€ im Monat!
Und zwar hat er sich auf Schornsteinbau spezialisiert und mauert weltweit, wenn Fabriken neu gebaut werden.
Außer ihm gibt es dafür nur eine Hand voll Fachleute europaweit.
Und zum Thema Webdev: Ich habe als Schüler über 200€ pro Stunde dafür genommen. Das war aber zu Bubblzeiten in den 90ern und damals war der Markt noch nicht so übersättigt. Hatte mich auf WAP und Imode mit cHTML spezialisiert, falls das noch jemand kennt.
Heutzutage arbeite ich aber etwas Richtiges, und mache solche Schülerjobs nicht mehr.
Ändere die Compilereinstellungen!
Releasebuild, Optimiert, Stripping ist das wichtigste, usw.
Dann bist du bei 2 bis 5 Megabyte.
Weiter kannst du mit einm Laufzeitpacker wie UPX kommen, auf unter 1 MB bei kleineren Programmen.
Aber wie gesagt: Strippe erstmal alle unnötigen Symbole von der EXE-Datei!
Dafür nutzt man Mocks, Stubs und Spies, was ausdrücklich unterschiedliche Dinge sind, die nicht verwechselt werden wollen.
Als QnD-Lösung kannst du auch Reflection nutzen, um private Member zur Laufzeit public zu machen, aber das erachte ich als Pfusch und außerdem erzeugst du damit unnötig Abhängigkeiten von einer konkreten Implementierung.
Buchtipp am Rande: The Art of Unit Testing