Bisswegierig schrieb:> Wie/wo findet man "guten" C Code von embedded Projekten?
Nirgends.
Gut war beispielsweise Code von TeX (sogar gut dokumentiert), CP/M, GEM
und Windows (3.11), auch kommerziell erfolgreich.
Schlecht wurde es mit Windows-NT, zuvor DEC VMS war auch grottig.
Aber selbst wenn das Zeug für heutige Verhältnisse so klein war dass es
embedded laufen könnte, gilt es nicht als embedded Software.
Es gibt Viele, die behaupten, guten code zu schreiben, gut wartbar,
zukunftsorientiert, mit en neuesten Methoden der Softwareentwicklung.
Oftmals ist das aber nur grober Schrott, oder ein Verhau wie Linux.
Etwas besser sieht es aus, wenn code ein Lehrbeispiel werden soll, dann
ist der Umfang klar und es gibt Doku um ihn zu erklären, z.B. TeX und
Minix. Wenn der code dann aber so mangelhaft ist, dass er in keinem
kommerziellen Projekt eingesetzt werden kann, z.B. weil
Fehlerbearbeitung fehlt, dann kann er nicht als guter code gelten.
Guter code müsste also kommerziell erfolgreich UND als Lehrbeispiel
tauglich sein. Gibt's eher nicht.
Bisswegierig schrieb:> "guten" C Code von embedded Projekten?
Das ist eigentlich schon ein Widerspruch in sich. C bietet wenig
Möglichkeit zur Strukturierung und Abstraktion. Somit wird C-Code nie
besonders toll sein und stattdessen alle möglichen Hacks (gerne mit
Makros) einsetzen, damit man einigermaßen effizient damit arbeiten kann.
Vielleicht macht es Sinn nach Embedded C++ -Code zu suchen. Wer sich
gegen die üblichen Widerstände durchsetzt um C++ zu nutzen, weiß
möglicherweise was er tut und wendet vielleicht sogar etablierte Best
Practices an.
Ok, anders gefragt: was ist das beste embedded C-Projekt, das ihr kennt?
Zwangsläufig open source. Muss nicht kommerziell sein, aber Erfolg
spräche für Qualität?
Ich schrieb:> Woher kommt die Weisheit denn?
Populäre Projekte ziehen Leute an. Populär unter Umständen, weil "gut".
Unabhängig davon: "gute" Leute können das Projekt verbessern.
Programmierer schrieb:> Das ist eigentlich schon ein Widerspruch in sich. C bietet wenig> Möglichkeit zur Strukturierung und Abstraktion.
Quatsch.
Auch in C kann man guten Code schreiben. Man kann Prinzipien einhalten
wie:
-Funktionen möglichst klein halten. Eine Funktion erfüllt eine
Aufgabe, und nicht etwa fünf oder zehn.
-Funktionen und Variablen sinnvoll benennen
-(In der Regel) Eine Anweisung pro Codezeile. Nein, Code wird nicht
besser indem man möglichst viel davon in eine Zeile quetscht.
> Somit wird C-Code nie besonders toll sein und stattdessen alle möglichen> Hacks (gerne mit Makros) einsetzen, damit man einigermaßen effizient damit> arbeiten kann.
An Makros ist rein gar nichts effizienter. Es ist schlicht und
ergreifend eine Textersetzung. Der Code wird dadurch weder besser noch
performanter. Gute Programmierer setzen Makros sparsam ein.
Gute Programmierer lesen Bücher wie zum Beispiel dieses:
Clean Code: A Handbook of Agile Software Craftsmanship
von Robert C. Martin
Mark B. schrieb:> Quatsch.> Auch in C kann man guten Code schreiben.
Das hat keiner bezweifelt.
Mark B. schrieb:> An Makros ist rein gar nichts effizienter.
Doch. Man kann dadurch schneller seine gewünschte Funktionalität
erreichen und braucht weniger Code. Man kann also effizienter arbeiten.
Dass der Code effizienter läuft habe ich nicht gesagt. In C++ geht es
dank Templates halt besser ohne Makros.
Vielleicht nennt mal jemand die Kriterien, die einen Code zu einem guten
Code machen.
Sind es vielleicht:
- gut und übersichtlich lesbar/verstehbar für einen Dritten oder nur für
sich selber?
- schön formatiert?
- hochperformant bei der Ausführung, dafür u.U. verklausuliert
geschrieben?
Oder was ist hier entscheidend?
Ich bin kein Informatiker; ich versuche meine Codezeilen so zu
schreiben, dass ich in einem Jahr auch schnell wieder nachvollziehen
kann, warum ich was gemacht habe. Keine 'Tricks', sprechende Variablen-
und Funktionsnamen, Funktionen nur, wenn ich sie mehrfach benötige (z.B.
kein init() am Anfang von Main), ausreichend Kommentare, usw.
Für mich als weniger Geübter Programmierer bin ich damit nicht immer
erfolgreich, zugegeben. 😀
HildeK schrieb:> Funktionen nur, wenn ich sie mehrfach benötige (z.B. kein init() am> Anfang von Main)
Würde ich nicht so unterschreiben. Wenn du alles in die main() packst,
wird die unübersichtlich. Besser auf Funktionen unterteilen. In C++ geht
das gut via Konstruktoren...
> ausreichend Kommentare, usw.
Idealerweise braucht man wenig Kommentare. Der Code sollte so gut lesbar
sein, dass Kommentare überflüssig sind. Nur bei unoffensichtlichen
Dingen wie komplexe Berechnungen kann man mit Kommentaren etwas
erläutern. Kommentare sollten normalerweise erläutern warum man etwas
macht, denn was man macht ist direkt am Code ersichtlich. Und: Falsche
Kommentare sind schlimmer als gar keine Kommentare - wenn man also jede
Menge (unnötige) Kommentare hat, ist es schwierig sie immer alle aktuell
zu halten!
Bisswegierig schrieb:> Ok, anders gefragt: was ist das beste embedded C-Projekt, das ihr kennt?> Zwangsläufig open source. Muss nicht kommerziell sein, aber Erfolg> spräche für Qualität?
CLisp, CPython (embedded im Sinne dass man danach keinen C-Code mehr
verwendet...)
HildeK schrieb:> Vielleicht nennt mal jemand die Kriterien, die einen Code zu einem guten> Code machen.> Sind es vielleicht:> - gut und übersichtlich lesbar/verstehbar für einen Dritten oder nur für> sich selber> - schön formatiert?
Ja! U.a. konsistent eingerückt und umgebrochen, am besten wenn genau
dies intrinsischer Bestandteil der Syntax ist... Moment: Python! :-)
FORTRAN? X-D
Programmierer schrieb:> Würde ich nicht so unterschreiben. Wenn du alles in die main() packst,> wird die unübersichtlich. Besser auf Funktionen unterteilen.
Klar, jeder hat seinen eigenen Stil. Mir ist es lieber, wenn ich nur
wenig scrollen oder erst recht nicht in anderen Files schauen muss.
In viele Funktionen aufteilen gibt halt ein sehr, sehr übersichtliches
main(), aber man sieht eben nicht direkt, was tatsächlich dahinter
steckt bzw. was alles initiiert wird. Zusätzlich kommen in dem init()
bestimmt nochmals Aufrufe, wie z.B. SetPortDefinitions() und ich suche
im nächsten File/Abschnitt, was gemacht wurde. Wenig befriedigend.
Zugegeben, den einen oder anderen Hinweis könnte man sich sparen, aber
imho besser zu viel als zu wenig.
Programmierer schrieb:> Kommentare sollten normalerweise erläutern warum man etwas> macht, denn was man macht ist direkt am Code ersichtlich.
Das meinte ich auch. Aber wenn ich z.B. einen Timervorteiler setze, dann
schadet es nicht, den Teilerfaktor im Kommentar zu nennen. Ich will ja,
wenn ich den Code wieder in die Hand nehmen, nicht erneut im DB
nachschauen müssen, welchen Faktor ich damals gewählt hatte. So gibt es
viele Beispiele.
SCNR schrieb:> Ja! U.a. konsistent eingerückt und umgebrochen ...
Ich habe ja nur versucht, heraus zu finden, was ihr für Kriterien habt,
um einen Code dann als 'gut' zu bezeichnen und mögliche Beispiele
genannt. Dass die Formatierung und das Einrücken nicht die Hauptrelevanz
sein würde, war schon klar 😉.
Ich als Gelegenheits-/Hobbyprogrammierer würde auch gerne was sinnvolles
lernen von den Profis. Dazu konnte ich in dem Thread jedoch noch nicht
viel lesen, mit Ausnahme vom Beitrag von Mark. B., was ich aber
weitgehend schon umsetze. Das dürfte aber nicht alles sein für das
Kriterium 'guter Code'.
HildeK schrieb:> gut und übersichtlich lesbar/verstehbar für einen Dritten oder nur für> sich selber?
Selbstverstandlich.
> schön formatiert?
Selbstverstandlich.
> hochperformant bei der Ausführung,
Selbstverständlich.
Guter code führt genau die Prozessorinstruktionen aus, die zur
Bewältigung der Aufgabe minimal notwendig sind, d.h. man kann kein
Statement weglassen ohne sich damit Fehler einzufangen, z B. Errors
nicht mehr abgefangen werden.
> dafür u.U. verklausuliert> geschrieben?
Blodsinn. Code der nichts überflüssiges macht ist auch immer gut
verständlich, es ist gerade der code der nichts mit dem Problem zu tun
hat, der den Blick auf's wesentliche verstellt und die Übersicht
behindert.
Klar will man auch den performantesten Algorithmus nutzen, der ggf.
länger und schwerer nachvollziehbar ist als der primitiveste
Algorithmus, aber: Algorithmen sind der Kern der Informatik, wer die
nicht liebt, ist bloss Coder.
>> dafür u.U. verklausuliert>> geschrieben?MaWin schrieb:> Blodsinn. Code der nichts überflüssiges macht ist auch immer gut> verständlich, es ist gerade der code der nichts mit dem Problem zu tun> hat, der den Blick auf's wesentliche verstellt und die Übersicht> behindert.> Klar will man auch den performantesten Algorithmus nutzen, der ggf.> länger und schwerer nachvollziehbar ist als der primitiveste> Algorithmus
Ich meinte nicht die Algorithmen, sondern die z.B. in C vorhandene
Möglichkeit, unleserlichen Code zu schreiben. Gibt es da nicht sogar
Wettbewerbe? Mir fällt gerade der Name dazu nicht ein.
Und ob der Algo maximal performant sein muss, hängt von der Aufgabe ab.
In vielen Fällen ist es schlichtweg egal, wenn da ein paar
Maschinenstatements mehr compiliert werden.
Einfaches Beispiel:
1
x++;
2
x=x%10;// ich will nur einen Ringzähler 0...9; ihmo besser lesbar,
3
// Modulo kann aber mehr, was hier nicht gebraucht wird und
4
// führt zu größerem Maschinencode
5
// oder
6
x++;
7
if(x>9)x=0;// imho ist die Absicht etwas schlechter erkennbar
HildeK schrieb:> Ich meinte nicht die Algorithmen, sondern die z.B. in C vorhandene> Möglichkeit, unleserlichen Code zu schreiben. Gibt es da nicht sogar> Wettbewerbe? Mir fällt gerade der Name dazu nicht ein.https://www.ioccc.org/
"Guter Code" ist zu allgemein ...
Wenn der Code für dich ist und du ihn gut findest, weil du schon
schlechteren geschrieben und daraus gelernt hast bist du auf dem
richtigen Weg. Dein Code ist dann gut wenn er seine Funktion erfüllt, du
ihn jemand anderen erklären kannst und er ihn versteht.
Wenn du beruflich Code schreibst kommt es sehr auf die Umgebung an in
der du arbeitest ...
Durch abtippen oder kopieren von Code aus dem Internet ohne zu
reflektieren lernst du nicht viel. Bücher und Akademiker hören oft da
auf wo erst richtig interessant wird und reale Aufgaben zu lösen sind.
Bei "open source code" hat du oft das Problem die zehn Zeilen, die dich
vielleicht interessieren aus den 500 Zeilen Kommandozeilen Interpreter
und Python Erweiterungen zu finden ;-)