Lesen und Verstehen von c-Code

8

Ich möchte den Linux-Kernel-Code verstehen, und ich habe ihn durchlaufen, aber ich kann nicht das volle Gefühl dafür bekommen, was passiert (ich konzentriere mich auf den Netzwerkteil des Linux-Kernels), also kann jeder von Ihnen etwas Gutes vorschlagen Praktiken zum Lesen von C-Code (oder einem anderen Lang-Code) im Allgemeinen und spezifisch für den Netzwerkteil des Linux-Kernels. Danke im Voraus

Davidhaskins
quelle
12
Der Linux-Kernel ist verrückt. Es macht viele seltsame Dinge für die Leistung. Daher ist es viel schwieriger zu lesen als auf Anwendungsebene c. Schreibe niemals so einen Code!
Byron Whitlock

Antworten:

10

Wenn Sie C lernen müssen, indem Sie zuerst lesen, dann ist der Linux-Kernel nicht der Ort, an dem Sie anfangen würden: Es ist ein eher untypisches Programm auf niedriger Ebene (obwohl ich festgestellt habe, dass es ziemlich gut strukturiert ist).

Schauen Sie sich lieber den Quellcode für ein BSD-Hilfsprogramm an, z . B. die in OpenBSD . In der Manpage finden Sie eine semi-formale Spezifikation des Programms auf hoher Ebene.

Besorgen Sie sich eine Kopie von Spinellis ' Code Reading und / oder Kernighan und Pikes Programmierpraxis .

Lesen Sie abschließend ein gutes Buch über Unix- oder Linux-Kernel-Interna und lesen Sie den Kernel. (Ich habe festgestellt, dass Maurice J. Bachs Design des Unix-Betriebssystems (ca. 1986) auch für Linux immer noch ein guter Anfang ist.)

Fred Foo
quelle
danke larsmans, Code-Lesebuch spricht viel über c, können Sie ein ähnliches Buch über C ++ vorschlagen
@hue: Ich habe noch nie ein solches Buch über C ++ gefunden. Wenn jemand anderes einen kennt, wäre ich interessiert.
Fred Foo
2

Was mich erstaunt hat, als ich versucht habe, dasselbe zu tun (was Sie tun möchten), ist, so wenige relevante Kommentare (falls vorhanden) in einem so komplexen Code zu finden.

Die Dokumentation sollte der Code sein, richtig, aber die Kommentarfunktion ist aus einem bestimmten Grund in der Programmiersprache C vorhanden.

Wenn sie entfernt wurden, hat das wahrscheinlich auch einen Grund: Sie davon fernzuhalten.

Ich bezweifle aufrichtig, dass alle Kernel-Entwickler an dieser bereinigten Codebasis arbeiten müssen, und ich bin der Ansicht, dass (zumindest) der Autor eines bestimmten Kernel-Features (wie Epoll, um der Diskussion willen) dies behält eine private Version des Codes mit all den fehlenden Kommentaren.

Warum glaube ich das?

Ein bekannter Kernel-Entwickler, der versuchte, mich davon zu überzeugen, den Quellcode des G-WAN-Servers als Open Source freizugeben, riet mir, "das Lesen so schwierig wie möglich zu gestalten".

Er fügte hinzu, dass diese Taktik während Jahrzehnten bei all seinen "Open-Source" -Projekten wunderbar für ihn funktioniert habe.

Wenn Sie einen kritischen Teil eines weit verbreiteten "Open-Source" -Projekts im Griff behalten, ergeben sich offensichtlich Chancen, wenn Ihre Einnahmen ausschließlich aus der Beratung stammen.

Zurück zu Ihrer Frage: Das Nützlichste, was Sie tun können, um diesen Code zu verstehen, ist, ihn Schritt für Schritt zu studieren und die fehlenden Kommentare hinzuzufügen.

Dann wird es nach und nach sinnvoll (und Sie werden feststellen, warum die Kommentare entfernt wurden).


quelle
4
-1 für anonyme Anschuldigungen.
Obwohl ich der Meinung bin, dass Kommentare wichtig sind, könnte man durchaus argumentieren, dass der Linux-Kernel von Experten geschrieben wurde und nur von anderen Experten gelesen / geändert werden sollte. Viele der Kommentare, die Sie und ich hilfreich finden würden, würden wahrscheinlich als "Lärm" für die Zielgruppe angesehen, ähnlich wie wir niemals schreiben würden:i++ // increment i by 1
Cody Gray
@Larsman, ich präsentiere mich in meinem Konto, daher ist dies KEINE anonyme Anschuldigung.
@Cody, an dem Tag, an dem Sie Code so schnell wie G-WAN schreiben (ich wünschte, Sie könnten es), werden Sie verstehen, dass ich, obwohl ich meinen Code stark kommentiere, wahrscheinlich nicht "i ++" brauche, um kommentiert zu werden.
3
-1. Ich wünschte, ich könnte mehr subtrahieren.
0

Was mir manchmal hilft, ist das Debuggen durch den Code. Die Visualisierung der tatsächlichen Daten und der tatsächlichen Pfade macht sie für mich verständlicher. Wie von anderen Mitgliedern hervorgehoben, ist der Linux-Kernel-Code ein sehr schlechter Ausgangspunkt für das Verständnis von c.

refro
quelle