Standardbibliothek in C
-
Hallo,
ich frage mich hin und wieder, wie eigentlich in C gewissen Dinge gemacht werden, welche immer mal wieder anfallen. Also z.B von wo kommen Datenstrukturen, wie Listen, Schlangen usw. oder aber auch Algorithmen, wie sortieren o.ä her?
Klar kann man sich das alles selbst her programmieren, aber über die Nachteile müssen wir, denke ich nicht sprechen. Aber woher kommen solche Sachen denn effektiv, wenn man ein Projekt in C hat?
Gibt es da eine Bibliothek oder Sammlung von Bibliotheken, welche als _der_ Standard angesehen werden und man benutzt oder gibt es da mehrere mehr oder wenig als korrekt anerkannte Bibliotheken, welche so üblicherweise benutzt werden?
Ist mehr aus Interesse, weil das so eine Frage ist, welche mir immer mal wieder durch den Kopf schwirrt und ich irgendwie noch nie irgendwas in diese Richtung gehört habe. Ich bleibe anyway bei C++, aber interssieren tut es mich doch, wie das bei euch so gemacht wird. (Wir haben ja die STL und boost :))
-
In C gibt es leider keine allumfassende wollmichsau eierlegende super ole ole Bibliothek. Das kann Vorteile haben, aber auch Nachteile haben.
Viele C Programmieren tendieren (zu Unrecht und manchmal zurecht) dazu, solche Grundlegende Sachen wie Listen stets für sich neu zu implementieren. Manchmal macht es eben Sinn, Listen für die eigene Anforderungen selber zu schreiben.
Es gibt Frameworks, die von vielen verwendet und deshalb auch gut getestet sind. Für C nehme ich in der Regel die Glib (Basisbibliothek für Gtk+), was viel Support für die oben genannten Sachen hat.
-
Hmm. Ok. Irgendwie beängstigend.
Also sagen wir ich möchte ein Spiel mit C und z.B der SDL schreiben. Da brauche ich ja sicher ein mal Listen, dynamische Arrays und vielleicht noch eine Art Baum.
Dann möchte ich natürlich effizient sotieren und suchen können.Was würdest du/ihr dazu empfehlen? Glib?
btw:
Worin siehst du den Vorteil, dass es keine etablierte Standardbibliothek gibt? Warum hat sich da niemand so richtig mal gesagt: "so und jetzt bauen wir uns mal eine grosse, offene C Bibliothek, welche so die grundlegenden Sachen unterstützt und in mittlerer Frist zum quasi Standard werden soll." ? (das wäre dann das pendant zu boost bei C++)
-
drakon schrieb:
Warum hat sich da niemand so richtig mal gesagt: "so und jetzt bauen wir uns mal eine grosse, offene C Bibliothek, welche so die grundlegenden Sachen unterstützt und in mittlerer Frist zum quasi Standard werden soll." ?
Weil es C-Entwickler sind. Die leiden fast alle am sogenannten C-Hacker Syndrom.
-
Janjan schrieb:
drakon schrieb:
Warum hat sich da niemand so richtig mal gesagt: "so und jetzt bauen wir uns mal eine grosse, offene C Bibliothek, welche so die grundlegenden Sachen unterstützt und in mittlerer Frist zum quasi Standard werden soll." ?
Weil es C-Entwickler sind. Die leiden fast alle am sogenannten C-Hacker Syndrom.
Ist das jetzt ernst gemeint oder nur geflame?
-
drakon schrieb:
Janjan schrieb:
drakon schrieb:
Warum hat sich da niemand so richtig mal gesagt: "so und jetzt bauen wir uns mal eine grosse, offene C Bibliothek, welche so die grundlegenden Sachen unterstützt und in mittlerer Frist zum quasi Standard werden soll." ?
Weil es C-Entwickler sind. Die leiden fast alle am sogenannten C-Hacker Syndrom.
Ist das jetzt ernst gemeint oder nur geflame?
Das ist vollkommen ernst gemeint.
-
drakon schrieb:
Ist das jetzt ernst gemeint oder nur geflame?
Bei manchen ist das dasselbe
-
Das Problem bei der Entwicklung von generischen Sachen in C dürfe doch sein, dass das meist nur durch den Präprozessor möglich und somit nur unzureichend zu realisieren ist.
In C++ hab ich Templates, die beliebige Datentypen aufnehmen können, in C hab ich nur Makros, mit denen man aber keine Überprüfung zur Laufzeit vornehmen kann.Ich bin gerade dabei selber Datenstrukturen wie Listen mit Makros zu realisieren, einfach weil ich nicht jedes Mal alles neu schreiben möchte und bisher dafür auch nichts fertiges gefunden hab, das was taugt. Das funktioniert aber noch nicht so wie ich mir das vorgestellt hab. Liegt wahrscheinlich daran, weil ich nicht genug Ahnung hab wie man so etwas in C am besten realisiert, aber ich bezweifle auch, dass es in C überhaupt möglich ist generische Strukturen zu realisieren, die beliebige Datentypen aufnehmen können und dennoch gleich einfach anzusteuern sind wie z.B. in C++.
-
drakon schrieb:
Also sagen wir ich möchte ein Spiel mit C und z.B der SDL schreiben. Da brauche ich ja sicher ein mal Listen, dynamische Arrays und vielleicht noch eine Art Baum.
Dann möchte ich natürlich effizient sotieren und suchen können.als C Programmier würde ich sagen: wer will denn schon mit C ein Spiel schreiben? Klar wird es gehen, mit C kannst du alles schreiben, aber der Aufwand ist enorm. Wenn du vorhast mit C ein Spiel zu programmieren, dann solltest du lieber eine andere Sprache nehmen.
drakon schrieb:
Was würdest du/ihr dazu empfehlen? Glib?
ja, das habe ich bereits gesagt.
drakon schrieb:
Worin siehst du den Vorteil, dass es keine etablierte Standardbibliothek gibt? Warum hat sich da niemand so richtig mal gesagt: "so und jetzt bauen wir uns mal eine grosse, offene C Bibliothek, welche so die grundlegenden Sachen unterstützt und in mittlerer Frist zum quasi Standard werden soll." ? (das wäre dann das pendant zu boost bei C++)
der Vorteil ist, dass C dadurch "klein und kompakt" bleibt, also der Balast der mitgeliefert klein ist. C ist bis auf Assemble die hardware nahste Hochsprache und deshalb auch so weit verbreitet. Ohne genaue Zahlen zu kennen, würde ich sagen, dass es fast keine Architektur gibt, für die kein C-Compiler existiert.
Auf dem Embedded-System Bereich hat man manchmal die wildesten Anforderungen, da ist man froh, dass man wenig balast hat, weil man nur das nötigste hat und der balast dadurch gering ist. Außerdem ist es deshalb (im Vergleich zu anderen Hochsprachen) viel einfacher für solche Architekturen einen C Compiler zur Verfügung zu stellen.
Egal was C++-Fans sagen, C++ bringt balast mit. Ich habe ein ganz normales Debian auf der Arbeit:
/* c code */ #include <stdio.h> int main(void) { printf("Hello World\n"); return 0; } / c++ code */ #include <iostream> int main(void) { std::cout << "Hello World" << std::endl; return 0; }
und wenn ich beide kompiliere:
$ gcc h.c -ohc $ g++ h.cpp -oh++ $ ls -alh hc h++ -rwxr-xr-x 1 yanez domain users 6.1K Jun 10 13:43 h++ -rwxr-xr-x 1 yanez domain users 4.4K Jun 10 13:42 hc
klar kann ich mit stript und was es noch alles gibt, die binaries kleiner machen, aber da sieht man, dass die C++ binaries einfach größer sind, und wenn man nur wenige Kilobyte Speicher hat, dann ist jedes gespartes Kb Goldwert.
-
Für generische, allgemein wiederverwendbare Implementierungen grundlegender Datenstrukturen ist C weniger geeignet. Das bedeutet dann meistens schwer durchschaubare Makrotricks, keinerlei Typsicherheit, meistens ist es nicht allzu effizient, und oft ist es bei der späteren Verwendung von solchen Dingen immer noch erforderlich, dass man versteht, wie sie intern funktionieren.
Für viele Dinge, bei denen man in anderen Sprachen vorgefertigte Datenstrukturen nehmen würde, "braucht" man in C aber nichts derartiges. C ist eher dafür gedacht, dass man sich an "keep it simple, stupid" hält. Und das bedeutet eben, dass man nicht versucht, seine Datenstrukturen in komplizierte generische Listen- und Baum-Datenstrukturen zu pressen, sondern stattdessen nach einfachen, direkten Lösungen sucht. Also z.B. statt einer generischen Liste einfach an der richtigen Stelle einen Next-Pointer setzt und fertig.
Das erfordert natürlich etwas Erfahrung und Umstellung, gerade wenn man es aus anderen Sprachen anders gewöhnt ist.
Man kann sicher trotzdem versuchen, solche generischen Standarddatenstrukturen (oder, was in die selbe Richtung geht, irgendwelche Makrosammlungen für Exceptionhandling oder Klassen mit allem drum und dran) zu implementieren, es gibt ja auch fertige Bibliotheken wie glib. Manchmal mag das sinnvoll sein. Aber IMHO ist das meist die falsche Herangehensweise und führt selten zu besseren Programmen, sondern zeugt eher davon, dass man krampfhaft versucht, Vorgehensweisen aus bestimmten Sprachen in andere Sprachen zu übertragen, wo sie nicht hingehören. Etwa vergleichbar mit dem Versuch von jemandem, der ewig funktional programmiert hat, in Java genauso zu programmieren und alles rekursiv zu machen.
-
@Antoras
Habe ich glaube ich irgendwo gesehen. Riesen Makro Hacking, aber die Idee ist nett.@supertux
Ok. Das Beispiel war vielleicht nicht sonderlich gut geeignet. Aber wo würded ihr denn noch effektiv C einsetzen? Ich meine jetzt im Computer (Andwendungsbereich) und nicht Embedded Bereich (auch nicht OS).@namespace invader
Ich habe da das Wort generisch nicht so eng gemeint, wie es in C++ z.B benutzt wird. Sondern eher einfach im Sinne der Wiederverwendbarkeit. Wenn man also mal was sortieren muss, dann wird das eben auch noch schnell implementiert (sofern man natürlich nicht sowieso eine allgemeine Lib benutzt). Sehe ich das richtig?Ok, also so, wie ich das bis jetzt sehe ist die Aussage von JanJan bestätigt worden (Grundaussage davon zumindest). Ihr würded also eine normale Anwendung nicht in C programmieren?
@supertux
Es soll jetze kein C vs. C++ sein, aber kommt halt drauf an mit was man arbeitet. Der C und C++ Code den du da zeigst sind einfach nicht äquivalent und daher nicht zu vergleichen. Und ich höre/lese immer wieder, dass Leute C++ für Embedded benutzen und gegenüber C keinen Nachteil haben sofern ein anständiger Compiler benutzt wird, welcher schlau optimiert. Zuletzt hier.
-
drakon schrieb:
Aber wo würded ihr denn noch effektiv C einsetzen? Ich meine jetzt im Computer (Andwendungsbereich) und nicht Embedded Bereich (auch nicht OS).
Da ich Systemprogrammier bin, kann ich das nicht ganz antworten. Unter Unix-like systemen wird C aber noch oft für große Projekte verwendet, Gtk+, gnome, usw. wäre bekannte Beispiele dafür.
-
namespace invader schrieb:
C ist eher dafür gedacht, dass man sich an "keep it simple, stupid" hält.
Ich benötige eine sortierte Datenstruktur mit schnellen Zugriffszeiten. Da eignet sich ein Rot-Schwarz-Baum... Also in C mühsam implementieren, testen, debuggen... Oder in C++ eine vorgefertigte Struktur nutzen.
Hey, C hält es wirklich einfach.
-
Ich möchte an dieser Stelle anmerken, dass es in der C-Standardbibliothek eine Sortierfunktion gibt:
#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
Zwar ist die C-Standardbibliothek nicht annähernd so umfangreich wie die von C++ und setzt völlig andere Schwerpunkte, aber es gibt sie durchaus.
Container finden sich darin nicht, aber C ist nun keine so esoterische Sprache, dass sich so etwas nicht auftreiben ließe. Etwa GNU libavl oder Linux Kernel Lists.