Post by Stefan RamPost by Sebastian BarthelIch stimme ja voll zu, daß es eigenartig ist, daß da immer noch ein
Layer draufgepackt wird und man so immer mehr "Zeug" anhäuft.
Ein Beispiel wäre die Speicherverwaltung.
C hat eine Speicherverwaltung, bei welcher der Programmierer viel
arbeiten muß und viel falsch machen kann.
Genau genommen hat C *keine* Speicherverwaltung. Genau das ist ja das
Problem.
malloc() und free() sind keine Sprachkonstrukte von C sondern nur
Aufrufe an das Betriebssystem, für die Prozess eine Speicherblock mit
einer bestimmten Größe zu reservieren. Die Größe des Blockes zu
beachten, wenn man z.B. Daten dort hin schreiben lässt, obliegt allein
dem Programmierer.
C selbst ist völlig egal, ob der Programmierer in einen 10 KB großen
Block versucht, 20 KB Daten aus einer Datei abzulegen. Ebenso gibt es in
C keine echten Strings, sondern nur Pointer auf Speicheradressen. Ein
String ist nur durch ein 0-Byte terminiert - aber es keinerlei
Information darüber, wie lang der String maximal werden darf und
Funktionen wie strcpy() kopieren einfach so lange wie es geht, egal ob
der Zielbuffer groß genug ist oder nicht.
Im günstigsten Fall hindert das Betriebssystem Zugriff auf
Speicherbereiche, die er Prozess nicht hat (unter Windows ist das dann
die berüchtigte "Allgemeine Schutzverletzung"). Im ungünstigsten Fall
überschreibt das Programm dann seine eigenen Daten oder Code, der sich
den Speicher mit Daten teilt - das wiederum ist ein klassischer Angriff,
weil ein Angreifer mit Pufferüberlauf auch eigenen Code einschleusen kann.
Post by Stefan RamNun wurde ja neulich eine Warnung aus der Regierung der Vereinigten
Staaten vor solchen Sprachen wie C bekannt. Sie seien fehlerträchtig
und daher riskant.
Ja, zurecht.
Post by Stefan RamPython hat eine Speicherverwaltung, die auf der von C aufbaut, aber
vieles automatisiert. Sie ist für Programmierer einfacher und weniger
fehlerträchtig. Also eine Art von "Schicht".
Zumindest *weiß* Python wie groß Speicherblöcke sind und kennt auch
Garbage Collection. Das ist um Größenordnungen zuverlässiger als C.
Zudem wurde Python ursprünglich nicht dafür entwickelt, compiliert,
sondern interpretiert zu werden. Die Standardimplementierung ist CPython
- ein Interpreter, der Aufrufe von C-Bibliotheksfunktionen aus Python
heraus erlaubt.
Post by Stefan RamFür mich paßt es nicht ganz, wenn eine Regierung, sich "per
Mikromanagement" in die Wahl von Programmiersprachen einmischt. Aber
man könnte auch sagen, daß die EDV-Abteilungen eine Menge falsch
machen müssen, bevor eine Regierung sich so weit herabläßt!
Solange etwas nicht per Gesetz reguliert wird, wird vieles falsch
gemacht, weil es eben billiger ist. Sicherheitsgurte und Zulassungen für
den Straßenverkehr waren vor vielen Jahrzehnten auch nicht
vorgeschrieben. Die Zahl der Verkehrstoten hat dann aber doch dazu
geführt, dass man Standards vorgegeben hat - das hätten die
Autohersteller auch selber machen können, aber niemand hätte für ein
Auto mehr Geld bezahlt, nur weil es "sicherer" ist oder einen
Sicherheitsgurt verlangt, weil er gehört hat, dass das im Falle eines
Unfalls mutmaßlich Leben retten könnte.
Post by Stefan Ram1.) (Besonders früher) C und C++ wurden für Anfängerkurse eingesetzt,
wodurch der falsche Eindruck entstand, daß es einfach beherrschbare
Sprachen seien.
An welchen "Anfängerkurse" denkst Du hier? BASIC wurde bereits 1964
entwickelt und wesentlich häufiger gerade im Bereich von Schule und
Ausbildung für "Anfänger" genutzt. Wenn es etwas anspruchsvoller sein
sollte, dann Pascal, was auch schon 1972 explizit als Lehrsprache
entwickelt wurde.
Heutzutage ist es eher Java oder Kotlin.
Aber das C oder C++ in "Anfängerkursen" vorkommt, habe ich selten erlebt.
Post by Stefan Ram2.) In der Folge wurden vielleicht Programmierer an C-Projekte
gelassen, die dafür nicht richtig ausgebildet waren.
Heute werden solche Fehler etwas korrigiert, indem mehr Python
eingesetzt wird.
Ich halte C und C++ für großartige und unverzichtbare Sprachen (man
muß sehen, inwiefern Rust oder Go ein Ersatz sein können), aber für
sie muß man richtig ausgebildet und ausgewählt worden sein!
C ist ein etwas besserer Makroassembler (Makros hat C ja auch von
Assemblern übernommen) und C++ baut im Kern auf C auf und erbt damit
auch alle "Schweinereien" von C. Einzig durch Code-Analyse von Compilern
hofft man, die größten Löcher schon vor dem Einsatz des Programms finden
zu können. Aber die ganzen Schichten mit Templates und STL sind nichts
anderes als eine Verschönerung der Syntax ohne echten Sicherheitsgewinn
der Sprasche.
Post by Stefan RamDann wird C++ damit beworben, daß gleichwertige Software in C++ in
der Regel weniger Energie verbraucht als in höheren Sprachen
(weniger Schichten). Ja, das ist ein starkes Argument für C++ bei
immer mehr exergiehungrigen Rechenzentren. Aber man muß C++ eben auch
können.
Viele der einst als "langsam" und "ineffizent" betrachtete Sprachen
arbeiten mittlerweile mit Compilern, und wenn es auch nur
Just-in-time-Compiler sind. Das holt *sehr* viel raus. Node.js oder
Kotlin sind durchaus ernstzunehmende Umgebungen.
--
Arno Welzel
https://arnowelzel.de