Grundstufen:
Schauen wir uns die Dinge auf der einfachsten und grundlegendsten Ebene an.
Für Mathe haben wir:
2 + 3 = 5
Das habe ich gelernt, als ich sehr, sehr jung war. Ich kann die grundlegendsten Elemente betrachten: zwei Objekte und drei Objekte. Toll.
Bei der Computerprogrammierung verwenden die meisten Menschen eine Hochsprache. Einige übergeordnete Sprachen können sogar in eine der untergeordneten übergeordneten Sprachen "kompiliert" werden, z. B. C. C kann dann in die Assemblersprache übersetzt werden. Die Assemblersprache wird dann in Maschinencode konvertiert. Viele Leute denken, dass die Komplexität dort endet, aber das tut es nicht: Moderne CPUs nehmen den Maschinencode als Anweisungen, führen dann aber "Mikrocode" aus, um diese Anweisungen tatsächlich auszuführen.
Dies bedeutet, dass es auf der einfachsten Ebene (Umgang mit einfachsten Strukturen) jetzt um Mikrocode geht, der in die Hardware eingebettet ist und den die meisten Programmierer nicht einmal direkt verwenden oder aktualisieren. Tatsächlich berühren die meisten Programmierer nicht nur den Mikrocode (0 Ebenen höher als der Mikrocode), sondern auch nicht den Maschinencode (1 Ebene höher als der Mikrocode) und nicht einmal die Baugruppe (2 Ebenen höher als der Mikrocode) ( außer vielleicht für ein bisschen formale Ausbildung während des Studiums). Die meisten Programmierer verbringen Zeit nur 3 oder mehr Ebenen höher.
Wenn wir uns die Baugruppe anschauen (die so niedrig ist, wie es die Leute normalerweise tun), ist jeder einzelne Schritt normalerweise für Leute verständlich, die geschult wurden und über die Ressourcen verfügen, um diesen Schritt zu interpretieren. In diesem Sinne ist Assembly viel einfacher als eine höhere Sprache. Die Montage ist jedoch so einfach, dass die Ausführung komplexer oder mittelmäßiger Aufgaben sehr mühsam ist. Die höheren Sprachen befreien uns davon.
In einem Gesetz über "Reverse Engineering" erklärte ein Richter, dass moderne Programme, auch wenn Code theoretisch byteweise verarbeitet werden kann, Millionen von Bytes umfassen, so dass einige Arten von Datensätzen (wie Kopien von Code) nur für solche erstellt werden müssen eine Anstrengung, machbar zu sein. (Daher wurde die interne Entwicklung nicht als Verstoß gegen die allgemeine Urheberrechtsregel "Keine Kopien erstellen" angesehen.) (Ich denke wahrscheinlich an die Herstellung nicht autorisierter Sega Genesis-Kassetten, denke aber möglicherweise an eine Aussage im Fall Game Genie. )
Modernisierung:
Führen Sie Code für 286s aus? Oder führen Sie 64-Bit-Code aus?
Die Mathematik verwendet Grundlagen, die Jahrtausende zurückreichen. Bei Computern halten die Leute Investitionen in etwas, das zwei Jahrzehnte alt ist, normalerweise für unnütz und ressourcenschonend. Das heißt, Mathematik kann viel gründlicher getestet werden.
Standards der verwendeten Werkzeuge:
Mir wurde von einem Freund beigebracht, dass es keinen fehlerfreien C-Compiler gibt, der die C-Spezifikationen erfüllt. Dies liegt daran, dass die C-Sprache grundsätzlich die Möglichkeit annimmt, unendlichen Speicher für den Zweck eines Stapels zu verwenden. Offensichtlich musste von einer solchen unmöglichen Anforderung abgewichen werden, als versucht wurde, brauchbare Compiler zu erstellen, die mit tatsächlichen Maschinen arbeiteten, die etwas begrenzter waren.
In der Praxis habe ich festgestellt, dass ich mit JScript in Windows Script Host mit Objekten viele gute Ergebnisse erzielen konnte. (Ich mag die Umgebung, weil das Toolset, das zum Testen von neuem Code benötigt wird, in modernen Versionen von Microsoft Windows integriert ist.) Bei Verwendung dieser Umgebung habe ich festgestellt, dass es manchmal keine leicht auffindbare Dokumentation zur Funktionsweise des Objekts gibt. Die Verwendung des Objekts ist jedoch so vorteilhaft, dass ich es sowieso tue. Ich würde also Code schreiben, der möglicherweise als Hornissennest fehlerhaft ist, und zwar in einer schön sandkastenartigen Umgebung, in der ich die Auswirkungen sehen und das Verhalten des Objekts kennenlernen kann, während ich mit ihm interagiere.
In anderen Fällen habe ich manchmal erst festgestellt, nachdem ich herausgefunden habe, wie sich ein Objekt verhält, dass das Objekt (im Lieferumfang des Betriebssystems enthalten) fehlerhaft ist und dass es sich um ein bekanntes Problem handelt, von dem Microsoft absichtlich entschieden hat, dass es nicht behoben wird .
Verlasse ich mich in solchen Szenarien auf OpenBSD, das von meisterhaften Programmierern erstellt wurde, die regelmäßig (zweimal im Jahr) neue Releases mit einem bekannten Sicherheitsrekord von "nur zwei Remote-Lücken" in mehr als 10 Jahren erstellen? (Sogar sie haben Errata-Patches für weniger schwerwiegende Probleme.) Nein, auf keinen Fall. Ich verlasse mich nicht auf ein solches Produkt mit einer so höheren Qualität, weil ich für ein Unternehmen arbeite, das Unternehmen unterstützt, die Menschen mit Computern versorgen, die Microsoft Windows verwenden. Daran muss mein Code also arbeiten.
Praktikabilität / Benutzerfreundlichkeit erfordern, dass ich auf den Plattformen arbeite, die die Leute für nützlich halten, und das ist eine Plattform, die für die Sicherheit bekanntermaßen schlecht ist (obwohl seit den Anfängen des Jahrtausends enorme Verbesserungen vorgenommen wurden, bei denen die Produkte desselben Unternehmens viel schlechter waren). .
Zusammenfassung
Es gibt zahlreiche Gründe, warum Computerprogrammierung fehleranfälliger ist, und dies wird von der Gemeinschaft der Computerbenutzer akzeptiert. Tatsächlich wird der meiste Code in Umgebungen geschrieben, die keine fehlerfreien Bemühungen tolerieren. (Einige Ausnahmen, z. B. die Entwicklung von Sicherheitsprotokollen, sind in dieser Hinsicht möglicherweise etwas aufwändiger.) Abgesehen von den allgemeinen Überlegungen, wonach Unternehmen nicht mehr Geld investieren möchten und künstliche Fristen verpassen, um die Kunden zufrieden zu stellen, hat dies Auswirkungen auf Der technologische Aufschwung besagt einfach, dass Sie, wenn Sie zu viel Zeit verbringen, an einer veralteten Plattform arbeiten werden, da sich die Dinge innerhalb eines Jahrzehnts erheblich ändern.
Schon auf den ersten Blick kann ich mich daran erinnern, wie kurz einige sehr nützliche und beliebte Funktionen waren, als ich Quellcode für strlen und strcpy sah. Zum Beispiel könnte strlen so etwas wie "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}" gewesen sein.
Typische Computerprogramme sind jedoch viel länger. Viele moderne Programme werden auch anderen Code verwenden, der möglicherweise weniger gründlich getestet wurde oder sogar als fehlerhaft bekannt ist. Heutige Systeme sind weitaus ausgefeilter als das, was man sich leicht vorstellen kann, außer wenn man einen Großteil der Minutien als "Details, die von niedrigeren Ebenen verarbeitet werden" von Hand wegwedelt.
Diese zwingende Komplexität und die Gewissheit, mit komplexen und sogar falschen Systemen zu arbeiten, machen die Computerprogrammierung zu einer größeren Hardware, die überprüft werden muss, als die Mathematik, bei der die Dinge sich in der Regel auf viel einfachere Ebenen beschränken.
Wenn Sie in der Mathematik eine Aufschlüsselung vornehmen, erhalten Sie Einzelteile, die Kinder verstehen können. Die meisten Menschen vertrauen Mathe. zumindest Grundrechenarten (oder zumindest Zählen).
Wenn Sie die Computerprogrammierung wirklich kaputt machen, um zu sehen, was unter der Haube passiert, erhalten Sie defekte Implementierungen von defekten Standards und Code, die letztendlich elektronisch ausgeführt werden, und diese physische Implementierung ist nur einen Schritt unter dem Mikrocode, den die meisten an Universitäten ausgebildeten Informatiker verwenden wage es nicht zu berühren (wenn sie sich dessen überhaupt bewusst sind).
Ich habe mit einigen Programmierern gesprochen, die am College sind, oder mit Absolventen, die direkt gegen die Vorstellung sind, dass fehlerfreier Code geschrieben werden kann. Sie haben die Möglichkeit abgeschrieben, und obwohl sie anerkennen, dass einige eindrucksvolle Beispiele (die ich zeigen konnte) überzeugende Argumente sind, betrachten sie solche Proben als nicht repräsentative seltene Fehler und lehnen die Möglichkeit ab, zählen zu können auf solche höheren Standards. (Eine sehr viel andere Einstellung als die viel zuverlässigere, die wir in Mathe sehen.)