Das Schlüsselwort zum Nachdenken über diese Dinge ist Abstraktion .
Abstraktion bedeutet nur, die Details eines Systems absichtlich zu ignorieren, damit Sie es als eine einzige, unteilbare Komponente betrachten können, wenn Sie ein größeres System aus vielen Subsystemen zusammensetzen. Es ist unvorstellbar leistungsfähig - das Schreiben eines modernen Anwendungsprogramms unter Berücksichtigung der Details der Speicherzuordnung und des Verschüttens von Registern sowie der Transistorlaufzeiten wäre auf idealisierte Weise möglich, aber unvergleichlich einfacher nichtum über sie nachzudenken und stattdessen nur Operationen auf hoher Ebene zu verwenden. Das moderne Computerparadigma stützt sich entscheidend auf mehrere Abstraktionsebenen: Festkörperelektronik, Mikroprogrammierung, Maschinenanweisungen, Programmiersprachen auf hoher Ebene, Betriebssystem- und Webprogrammierungs-APIs, vom Benutzer programmierbare Frameworks und Anwendungen. Praktisch niemand kann heutzutage das gesamte System verstehen, und es gibt nicht einmal einen denkbaren Weg, über den wir jemals zu diesem Zustand zurückkehren könnten.
Die Kehrseite der Abstraktion ist der Machtverlust. Indem wir Entscheidungen über Details niedrigeren Ebenen überlassen, akzeptieren wir oft, dass sie mit suboptimaler Effizienz getroffen werden können, da die unteren Ebenen nicht das „Gesamtbild“ haben und ihre Funktionsweise nur durch lokales Wissen optimieren können und nicht so (potenziell) sind. intelligent wie ein Mensch. (Normalerweise. Zum Beispiel wird das Kompilieren von HLL zu Maschinencode heutzutage oft besser von Maschinen als von selbst dem erfahrensten Menschen durchgeführt, da die Prozessorarchitektur so kompliziert geworden ist.)
Das Thema Sicherheit ist interessant, da Fehler und "Lecks" in der Abstraktion häufig ausgenutzt werden können, um die Integrität eines Systems zu verletzen. Wenn eine API postuliert, dass Sie die Methoden A, B und C aufrufen dürfen, aber nur, wenn Bedingung X gilt, ist es leicht, die Bedingung zu vergessen und nicht auf die Auswirkungen vorbereitet zu sein, die auftreten, wenn die Bedingung verletzt wird. Beispielsweise nutzt der klassische Pufferüberlauf die Tatsache aus, dass das Schreiben in Speicherzellen zu einem undefinierten Verhalten führt, sofern Sie diesen bestimmten Speicherblock nicht selbst zugewiesen haben. Die API garantiert nur das etwaswird als Ergebnis passieren, aber in der Praxis wird das Ergebnis durch die Details des Systems auf der nächstniedrigeren Ebene definiert - was wir bewusst vergessen haben! Solange wir die Bedingung erfüllen, ist dies nicht wichtig, aber wenn nicht, kann ein Angreifer, der beide Ebenen genau versteht, normalerweise das Verhalten des gesamten Systems wie gewünscht steuern und schlimme Dinge verursachen.
Der Fall von Speicherzuordnungsfehlern ist besonders schlimm, da es sich als sehr, sehr schwierig herausgestellt hat, den Speicher ohne einen einzigen Fehler in einem großen System manuell zu verwalten. Dies könnte als ein fehlgeschlagener Fall der Abstraktion angesehen werden: obwohl es möglich ist, mit dem C alles zu tun, was Sie brauchenmallocAPI, es ist einfach zu leicht zu missbrauchen. Teile der Programmierergemeinschaft sind jetzt der Meinung, dass dies der falsche Ort war, um eine Ebenengrenze in das System einzuführen, und fördern stattdessen Sprachen mit automatischer Speicherverwaltung und Speicherbereinigung, die etwas an Leistung verlieren, aber Schutz vor Speicherbeschädigung und undefiniertem Verhalten bieten . Tatsächlich ist ein Hauptgrund für die heutige Verwendung von C ++ genau die Tatsache, dass Sie damit genau steuern können, welche Ressourcen wann erworben und freigegeben werden. Auf diese Weise kann das große Schisma zwischen verwalteten und nicht verwalteten Sprachen heute als Uneinigkeit darüber angesehen werden, wo genau eine Abstraktionsebene definiert werden soll.
Das Gleiche gilt für viele andere wichtige alternative Paradigmen im Computerbereich - das Problem taucht immer dann auf, wenn große Systeme konstruiert werden müssen, da wir einfach nicht in der Lage sind, Lösungen für die heute üblichen komplexen Anforderungen von Grund auf neu zu entwickeln. (Ein allgemeiner Standpunkt in der KI ist heutzutage, dass das menschliche Gehirn tatsächlich so arbeitet - Verhalten, das durch Rückkopplungsschleifen, massiv miteinander verbundene Netzwerke usw. entsteht, anstatt durch separate Module und Schichten mit einfachen, abstrahierten Schnittstellen zwischen ihnen, und deshalb sind wir es haben so wenig Erfolg bei der Simulation unserer eigenen Intelligenz gehabt.)