Philosophie des Programmierers. Zusammenfassung: Philosophische Aspekte der Programmierung
Lohnt es sich, Programmieren zu lernen?
„Programmieren“ ist ein sehr weit gefasster Begriff. Einige Programmiersprachen sind viel einfacher als andere. Einige Sprachen erfordern ein Verständnis dafür, wie das Programm mit dem Computer „kommuniziert“. Der wichtigste Teil des Erlernens von Codes ist die Pflege der richtige Schritt Denken. Es geht nicht darum, sich selbst zu sagen „Ich schaffe das“ oder die nötige Literatur zu lesen …
Der Punkt ist dieser...
Programmieren lernen oder nicht lernen?
Die Beherrschung jeder Computersprache, von einfachem HTML bis hin zu komplexem C++, erfordert Engagement nicht nur für die Technologie, sondern auch für ihre endlosen Veränderungen. HTML5 endet aus gutem Grund mit einer Zahl. Sobald genügend Webbrowser anfangen, HTML6 zu unterstützen, müssen Entwickler wieder etwas Neues lernen.
Mögliche Gründe, warum Sie sich auf einen neuen Lernprozess einlassen möchten:
- Gewinnen Sie Selbstvertrauen: Ich hatte mehrere Kunden, die das Gefühl hatten, Computer würden sie weniger einschüchtern, wenn sie eine Programmiersprache erlernten.
- Notwendigkeit: Technische Probleme können jederzeit auftreten.
- Nervenkitzel: Manche Menschen wollen einfach nur neue Fähigkeiten erlernen.
- Um zu verstehen, was möglich ist: Wenn ein Entwickler sagt: „Das geht nicht!“ Meint er, dass es wirklich nicht möglich ist, oder will er diese Kopfschmerzen einfach nicht ertragen?
Seien Sie immer neugierig
Niemand möchte ein Käfer auf seiner Windschutzscheibe sein. Für mich ist es nicht die Angst vor dem Scheitern, die den Menschen Angst macht, sondern die Angst vor der Möglichkeit, verloren zu gehen. Überwältigende Hoffnungslosigkeit fördert Minderwertigkeitsgefühle. Mut und Ausdauer sind kein Gegenmittel gegen das Gefühl der Überforderung, aber frühzeitig damit aufzuhören, bevor das Gefühl überhandnimmt, ist die beste Medizin.
Ich habe drei Ansätze zur Lösung eines Problems bei jedem Projekt:
- Finden Sie ein Thema, das Sie nervt
Konditionen und Bezahlung sind alle gut. Aber nichts löst einen stärkeren Ansturm aus als ein Juckreiz, den Sie nicht erreichen können. In einer vielversprechenden Zukunft sollte Programmieren kein Selbstzweck sein. Es sollte als Ihr „Schmiermittel gegen quietschende Türen“ dienen.
- Für zusätzliche Anstrengungen sollte man belohnt werden.
Nachdem sie den sprichwörtlichen Juckreiz entdeckt haben, sollten auch Menschen, die das Programmieren lernen, Erleichterung erfahren. Keine Tutorials, keine Tools, kein Lob helfen jedem, ein CODE-Meister zu werden. Erst nach den Worten „Ich habe das geschrieben und... schau, was ich getan habe!“ Sie werden das Gefühl haben, ein Hindernis überwunden zu haben. Es wird dumm klingen, bis Sie es selbst versuchen. Getesteter Code, der funktioniert, wird Ihnen einen Adrenalinschub bescheren und Ihnen das Gefühl geben, ein Meister der Computerprogrammierung zu sein.
- Ihr Projekt sollte erledigt werden, während Ihr Gehirn Appetit hat
Trainiere dein Gehirn. Beim Anstrengen ermutigen Trainer die Menschen, sich etwas mehr als ihre Grenzen anzustrengen. Lernen ist Hunger. Ihr Gehirn hat immer Appetit auf neues Wissen.
Übe täglich
Die einzige Möglichkeit, Programmieren zu lernen und sich für immer daran zu erinnern, besteht darin, jeden Tag zu üben. Wie beim Erlernen jeder neuen Fähigkeit werden Ihre Fähigkeiten durch einen konsistenten Zeitplan mit neuen Zielen nach und nach bis zur Perfektion verfeinert.
Immanuel Kant, der Schwindler der Philosophie, hat sich etwas Großes für den Angostizismus ausgedacht. Das sogenannte „Ding an sich“. Eine äußerst interessante Sache.
Der Trick besteht darin: Im üblichen erkenntnistheoretischen Prozess gibt es eine Objekt-Subjekt-Verbindung. Diese. Es gibt immer ein Objekt, das das Subjekt kennt.
Es gibt viele Ansichten, die wir kennen (Idealismus, Materialismus und ihre nachfolgenden Strömungen), aber Kant allein hat sie alle übertroffen.
Nach seinem Verständnis kann man etwas nur wissen, wenn es einem die Möglichkeit gibt, es zu tun. Wenn zum Beispiel ein Ding geschlossen bleiben möchte, werden Sie nie wissen, dass es aus Holz ist, selbst wenn Sie es gesehen haben.
Diese. er verleiht dem Objekt Willen und setzt es dem Subjekt gleich. Solange Sie also das Ding kennen, wird das Ding Sie kennen. Mehrstufige Beziehungen wurden zu einstufigen Beziehungen migriert.
Es scheint verrückt, aber eine Bestätigung dieser Hypothese kann überall gefunden werden. Zum Beispiel Malewitschs schwarzes Quadrat. Viele halten es nur für ein schwarzes Quadrat, aber für andere hat es eine tiefe Bedeutung.
Es ist gut möglich, dass sich der Platz für Sie einfach nicht geöffnet hat, sondern jemand anderes darin Einsicht gefunden hat. Und solche Fälle gibt es viele. Schließlich gehen oft viele Menschen an etwas vorbei, und dann macht einer plötzlich eine Entdeckung/Erfindung im wahrsten Sinne des Wortes einfache Dinge, die um uns herum lagen, wir aber „nicht bemerkt“ haben. Vielleicht liegt es nicht daran, dass wir sie nicht bemerkt hätten, sondern daran, dass uns die Dinge nicht offenbart wurden? Diese äußerst kontroverse und interessante Position hat eine sehr reale Chance, in der Realität zu existieren.
Wenn das Universum beispielsweise ein riesiges Programm wäre, würde der Ersteller dann verschiedene Klassen erstellen wollen, um verschiedene Objekte zu beschreiben? Natürlich nicht, denn jeder strebt nach einem Minimum an Energie, jeder ist so faul wie er kann. Um sich nicht zu sehr darum zu kümmern, erstellt der universelle Programmierer daher nur eine Klasse für alle Objekte. Und es muss nur eine Art von Objekt-Objekt-Interaktion verarbeiten. Und es ist durchaus möglich, dass ein Objekt gerade deshalb ein anderes Objekt erst dann versteht, wenn es sich dazu entschließt, sich ihm zu öffnen.
Die zweite interessante Beobachtung betrifft die Weltanschauung und die Werte.
Werte dieser Welt, prägen unsere Weltanschauung, die wiederum unsere Werte prägt.
Dieser Teufelskreis spiegelt sich leicht in der Programmierung wider:
Funktion Worldview(Values) Values = Algorithmus zur Berechnung von Werten() Rückgabewerte Ende der Funktion Hauptprogrammschleife (endlos wiederholen)( Values = Worldview(Values) ) Ende des Programms
Es gibt viele ähnliche interessante Zusammenhänge zwischen Philosophie und Programmierung.
Wie Sie wissen, ist ein Computer in der Lage, Wörter (Text) und Objekte (3D-Modelle, Bilder) aufzuzeichnen. Die einzige Lücke, die der Schaffung von KI im Wege steht, ist das Konzept. Diese. das, was Wort und Gegenstand verbindet. Wenn jemand herausfindet, wie man ein Konzeptsystem in eine Maschine einfügt, entsteht KI.
Dmitri Jakuschew
"Philosophie"
Programmierung in der Sprache C++
Zweite Auflage, erweitert und korrigiert
UDC 004.43 BBK 32.973.202
Yakushev D. M.
I49 „Philosophie“ der Programmierung in C++. / D. M. Yakushev. - 2. Aufl. - M.: Buk Press, 2006. - 320 S.
ISBN 5 9643 0028 6
Der Autor der C++-Sprache ist Bjarne Stroustrup, ein Mitarbeiter des berühmten Unternehmens AT&T. C++ (oder besser gesagt sein Vorgänger C mit Klassen) entstand unter dem Einfluss der Simula-Sprache (man muss sagen, dass diese Programmiersprache bereits 1967 erschien). Tatsächlich hatte C zu dem Zeitpunkt, als C++ erschien, bereits an Popularität gewonnen; Professionelle Programmierer schätzen es für seine Fähigkeit, die Vorteile einer bestimmten Architektur zu nutzen und gleichzeitig Programme in einer relativen Sprache zu schreiben hohes Level.
Derzeit ist C++ eine der beliebtesten (wenn nicht die beliebteste) Programmiersprache. Es ist C++, das es Ihnen ermöglicht, ein Programm mit objektorientierten Ansätzen zu schreiben (und die Programme, die dies erfordern, sind normalerweise sehr groß) und gleichzeitig ziemlich „schnell“ zu sein.
Dieses Buch führt den Leser in die „Philosophie“ und Grundlagen der Programmierung in C++ ein. Das Buch enthält viele Beispiele, die vom Autor zusammengestellt und getestet wurden.
UDC 004.43 BBK 32.973.202
Teil 1.
Kapitel 1. C++ ist eine Allzweck-Programmiersprache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
Kapitel 2. Wortschatz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Kapitel 3. Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Kapitel 4. Geltungsbereich. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Kapitel 5. Definitionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Kapitel 6. Layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Kapitel 7. Speicherklassen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Kapitel 8. Grundtypen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Kapitel 9. Abgeleitete Typen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Kapitel 10. Objekte und LVALUE (Adressen). . . . . . . . . . . . . . . . . . . . . . . . .15 Kapitel 11. Symbole und ganze Zahlen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 Kapitel 12. Transformationen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Kapitel 13. Ausdrücke und Operationen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Kapitel 14. Beschreibungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 Kapitel 15. Speicherklassenspezifizierer. . . . . . . . . . . . . . . . . . . . . .31 Kapitel 16. Deskriptoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Kapitel 17. Klassenbeschreibungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 Kapitel 18. Initialisierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51 Kapitel 19. Überladene Funktionsnamen. . . . . . . . . . . . . . . . . . . . .58 Kapitel 20. Beschreibung der Aufzählung. . . . . . . . . . . . . . . . . . . . . . . . . . . . .59 Kapitel 21. Beschreibung von Asm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60 Kapitel 22. Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61 Kapitel 23. Externe Definitionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66
Kapitel 24. Befehlszeilen Compiler. . . . . . . . . . . . . . . . . . . . .68 Kapitel 25. Typenübersicht. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 Kapitel 26. Überlegungen zur Mobilität. . . . . . . . . . . . . . . . . . . . . . . . . .75 Kapitel 27. Freier Speicher. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76
Teil 2. Turbo C++
Kapitel 1. Integrierte Entwicklungsumgebung. . . . . . . . . . . . . . . . . . . .78 Kapitel 2. Menüleiste und Menüs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Kapitel 3. TURBO C++-Fenster. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Kapitel 4. Arbeiten mit dem Bildschirmmenü. . . . . . . . . . . . . . . . . . . . . . . . . . . . .80
Kapitel 5. Dateistruktur, Datentypen und Ein-/Ausgabeoperatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87
Kapitel 6. Arithmetische, logische, relationale und Zuweisungsoperationen. . . . . . . . . . . . . . . . . . . . . . .91
Kapitel 7. Logische Organisation des Programms und einfachste Verwendung von Funktionen. . . . . . . . . . . . . . . . . . . . . . . . . .95
Kapitel 8. Logische Organisation eines einfachen Programms. . . . . . . . . . .95 Kapitel 9. Verwenden von Konstanten verschiedene Arten. . . . . . . . . . . . .96 Kapitel 10. Kontrollstrukturen. . . . . . . . . . . . . . . . . . . . . . . . . . . .98
Kapitel 11. Techniken zum Deklarieren und Zugreifen auf Arrays, Verwenden von Funktionen und der Define-Direktive
beim Arbeiten mit Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
Teil 3. Von der Theorie zur Praxis
Kapitel 1. Die „von rechts nach links“-Regel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103 Kapitel 2. STLport. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 Kapitel 3. Programmiersprache von Microsoft: C#. . . . . . . . . . . . . .106 Kapitel 4. C++ Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108 Kapitel 5. Verwendung „intelligenter“ Zeiger. . . . . . . . . . . . . . . . . . . . . .111 Kapitel 6. Diskussionen zum Thema „intelligente“ Zeiger. . . . . . . . . . . . . .116 Kapitel 7. Virtuelle Destruktoren. . . . . . . . . . . . . . . . . . . . . . . . . . . .122 Kapitel 8. Datenstrukturen in Binärdateien schreiben. . . . . . . . . . . .126
Kapitel 9. Der bedingungslose Sprungoperator „goto“. . . . . . . . . . . . . . . . . .132 Kapitel 10. Virtueller Konstruktor. . . . . . . . . . . . . . . . . . . . . . . . . . .136 Kapitel 11. Lesen von Quelltexten. . . . . . . . . . . . . . . . . . . . . . . . . . . .141 Kapitel 12. Die Funktion gets(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 Kapitel 13. Eigenschaften. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146 Kapitel 14. Kommentare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 Kapitel 15. Webprogrammierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . .154 Kapitel 16. Fehler bei der Arbeit mit dem Speicher. . . . . . . . . . . . . . . . . . . . . . . . . .158 Kapitel 17: Diagramme mit Ploticus erstellen. . . . . . . . . . . . . . .161 Kapitel 18. Automatisierung und Motorisierung der Anwendung. . . . . . . . . . .164 Kapitel 19. Übersicht über die C/C++-Compiler EMX und Watcom. . . . . . . . . .183 Kapitel 20. Verwendung der #import-Direktive. . . . . . . . . . . . . . . . . . .188
Kapitel 21: Systemfallen erstellen
Windows auf Borland C++ Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204 Fragen und Antworten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214
BELIEBTE WISSENSCHAFTLICHE VERÖFFENTLICHUNG
Jakuschew Dmitri Michailowitsch
„PHILOSOPHIE“ DER PROGRAMMIERUNG IN DER SPRACHE C++
Chefredakteur B.K. Leontyev
Chefredakteur A. G. Benetashvili
Originallayout von I. V. Tsarik
Künstler O. K. Alekhin
Kunstredakteur M. L. Mishin Technischer Redakteur K. V. Shapiro
Korrektoren L. S. Zimina, K. V. Tolkacheva
Unterzeichnet zur Veröffentlichung am 05.07.2006. Format 60x90/16. Newton-Schrift. Offsetpapier. Offsetdruck. Pech. l. 20. Auflage 3000.
Einführung in die Programmiersprache C++ | ||
Teil 1. Einführung in die Sprache
C++-Programmierung
C++ – Allzweck-Programmiersprache
Der Autor der C++-Sprache ist Bjarne Stroustrup, ein Mitarbeiter des berühmten Unternehmens AT&T. C++ (oder besser gesagt sein Vorgänger C mit Klassen) entstand unter dem Einfluss von Simula (man muss sagen, dass diese Programmiersprache bereits 1967 erschien). Tatsächlich hatte C zu diesem Zeitpunkt (als C++ erschien) bereits an Popularität gewonnen; Es genießt im Allgemeinen hohes Ansehen für seine Fähigkeit, die Fähigkeiten einer bestimmten Architektur zu nutzen und gleichzeitig eine relativ höhere Sprache zu verwenden. Normalerweise mögen sie ihn genau aus diesem Grund nicht. Natürlich gingen in diesem Fall einige Bestimmungen zur Programmerstellung verloren (oder wurden verfälscht); Beispielsweise gibt es in C praktisch keine Möglichkeit, modulare Programme zu erstellen. Nein, natürlich werden sie erstellt, aber mit Hilfe einiger „Krücken“ in Form der Verwendung von Präprozessordirektiven gibt es keine solche Modularität wie beispielsweise in Modula 2 oder Ada in C. In C++ ist dies übrigens immer noch nicht der Fall.
Von Anfang an wurde betont, dass C++ eine Weiterentwicklung der C-Sprache, möglicherweise eines Teils ihres Dialekts, ist. Dies wird durch die Tatsache belegt, dass der erste (noch existierende) Compiler cfront war, der C++-Quellcode in C-Quellcode übersetzte. Diese Meinung besteht immer noch und, das muss man sagen, sie ist immer noch nicht unbegründet; jedoch C und C++ - verschiedene Sprachen Programmierung.
Der Hauptunterschied zwischen C++ bei seinem ersten Erscheinen war die explizite Unterstützung eines objektorientierten Programmieransatzes. Sie müssen verstehen, dass Sie mit OOP und OOA überall programmieren können, auch wenn das Toolkit dies nicht explizit unterstützt; Als Beispiel können Sie die Benutzeroberflächenbibliothek nehmen
Einführung in die Programmiersprache C++ |
||
GTK+-Gesicht, das in „reinem“ C geschrieben ist und die Prinzipien des objektorientierten „Designs“ verwendet. Die Einführung von Tools zur Unterstützung von OOP in einer Programmiersprache bedeutet, dass in der Kompilierungsphase (und nicht in der Programmausführungsphase) die Kompatibilität von Typen, das Vorhandensein von Methoden usw. überprüft wird. Im Prinzip ist das recht praktisch.
Auch hier gilt: So wie C keine reine Programmiersprache auf hoher Ebene ist (weil sie zu viele Tricks zulässt), ist C++ streng genommen keine objektorientierte Programmiersprache. Dies wird durch Merkmale wie das Vorhandensein virtueller Funktionen behindert (denn wenn es um Polymorphismus geht, legt niemand jemals fest, dass einige Methoden daran teilnehmen und andere nicht), das Vorhandensein der Funktion main() usw. . Darüber hinaus gibt es in C++ keine Entitäten wie beispielsweise Metaklassen (obwohl sie wahrscheinlich nicht so dringend benötigt werden) und Schnittstellen (stattdessen wird Mehrfachvererbung verwendet). Allerdings ist C++ derzeit eine der beliebtesten (wenn nicht sogar die beliebteste) Programmiersprache. Warum? Ja, denn all diese „Monstrositäten“ machen es letztlich möglich, ein Programm mit objektorientierten Ansätzen (und die Programme, die das erfordern, sind meist sehr groß) und gleichzeitig recht „schnell“ zu schreiben. Dies wird gerade durch das Vorhandensein virtueller Funktionen erleichtert (d. h. das, was der Programmierer selbst während des Entwurfs aufteilt, wo er Polymorphismus benötigt und wo es ausreicht, einige Funktionen nach einem bestimmten Merkmal zu einer Gruppe zusammenzufassen), deren zwingende Anwesenheit ein Optimierer und so weiter. All dies ermöglicht es Ihnen, bei richtiger Anwendung, trotzdem ein funktionierendes Programm zu schreiben. Zwar gibt es häufig Beispiele für die Verwendung durch Analphabeten, wodurch die Wahl von C++ für die Projektumsetzung zur Qual für Programmierer und Management wird.
Derzeit gibt es einen Standard für die Programmiersprache C++, der unter anderem eine Standard-Template-Bibliothek umfasst. Vorlagen sind ein besonderes Thema; formal sind sie auch „Krücken“, um in der Kompilierungsphase sozusagen Polymorphismus zu erzeugen (und in dieser Funktion sind sie sehr nützlich), aber die Bibliothek
Zweifellos ist die Innovation von allen Seiten richtig. Endlich haben wir es dem Programmierer viel leichter gemacht, eine Liste portabel (also von Compiler zu Compiler) zu sortieren (zusätzlich zum Schreiben aller entsprechenden Unterroutinen und Datenstrukturen selbst). Es stimmt, dass viele Leute immer noch ein schlechtes Verständnis dafür haben, wie die STL funktioniert und wie sie verwendet wird (mit Ausnahme von std::cin und std::cout ).
Einführung in die Programmiersprache C++ | ||
Ein wichtiger Meilenstein in der Entwicklung der Programmierung war die Schaffung und weite Verbreitung der Sprache C++. Diese Sprache, die die Werkzeuge der C-Sprache (prozedural orientierte Sprache) beibehält, die zu einem allgemein anerkannten Standard für das Schreiben von System- und Anwendungsprogrammen geworden ist, wurde eingeführt
Möglichkeiten der Programmierpraxis für einen neuen technologischen Entwicklungsansatz Software, genannt „objektorientierte Programmierung“.
Die C++-Programmiersprache ist C*, erweitert durch die Einführung von Klassen, Inline-Funktionen, überladenen Operatoren, überladenen Funktionsnamen, Konstantentypen, Referenzen, Verwaltungsoperationen für freien Speicher und Überprüfung von Funktionsparametern.
Die Einführung eines objektorientierten Paradigmas in die Praxis des Programmschreibens führt zur Entwicklung neuer Bereiche der Informatik, einer deutlichen Steigerung der Herstellbarkeit der erstellten Software, einer Reduzierung der Kosten für die Entwicklung und Wartung von Programmen usw Wiederverwendung, Beteiligung am Prozess der Erweiterung der intellektuellen Fähigkeiten von Computern.
Der Objektansatz zur Informationsmodellierung von Fachgebieten wird zunehmend als Grundlage für die Strukturierung ihrer Informationsreflexionen und insbesondere Wissensbasen genutzt.
C++ ist eine Allzweck-Programmiersprache. Diese besondere Sprache ist für ihre Effizienz, Wirtschaftlichkeit und Portabilität bekannt.
Diese Vorteile von C++ gewährleisten eine gute Entwicklungsqualität nahezu aller Arten von Softwareprodukten.
Durch die Verwendung von C++ als Instrumentalsprache erhalten Sie schnelle und kompakte Programme. In vielen Fällen sind in C++ geschriebene Programme in ihrer Geschwindigkeit vergleichbar mit in Assembler geschriebenen Programmen.
Lassen Sie uns einige wesentliche Funktionen der C++-Sprache auflisten:
C++ bietet einen vollständigen Satz strukturierter Programmieroperatoren.
C++ bietet eine ungewöhnlich große Menge an Operationen;
Einführung in die Programmiersprache C++ |
||
Die Vielfalt der Operationen ermöglicht es Ihnen, verschiedene Sätze davon auszuwählen, um den resultierenden Code zu minimieren.
C++ unterstützt Zeiger auf Variablen und Funktionen;
Ein Zeiger auf ein Programmobjekt entspricht der Maschinenadresse dieses Objekts;
Durch den sinnvollen Einsatz von Zeigern können Sie Programme erstellen, die effizient laufen, weil... Mit Zeigern können Sie auf die gleiche Weise auf Objekte verweisen wie ein Computer.
C++ unterstützt Zeigerarithmetik und ermöglicht so den direkten Zugriff und die Manipulation von Speicheradressen.
Kapitel 2. Wortschatz
Es gibt sechs Klassen von Token: Bezeichner, Schlüsselwörter, Konstanten, Zeichenfolgen, Operatoren und andere Trennzeichen. Leerzeichen, Tabulatorzeichen, Zeilenumbrüche und Kommentare (gemeinsam „Leerzeichen“), wie unten beschrieben, werden ignoriert, es sei denn, sie dienen als Token-Trennzeichen.
Etwas Leerraum ist erforderlich, um Bezeichner, Schlüsselwörter und Konstanten zu trennen, die sich sonst berühren würden. Wenn der Eingabestream bis zu einem bestimmten Zeichen tokenisiert wird, wird davon ausgegangen, dass das nächste Token die längste Zeichenfolge enthält, die das Token bilden kann.
Kommentare
Die /*-Symbole kennzeichnen den Anfang eines Kommentars, der mit den */-Symbolen endet. Kommentare können nicht verschachtelt werden.
Die //-Zeichen beginnen einen Kommentar, der am Ende der Zeile endet, in der sie erscheinen.
Identifikatoren (Namen)
Viele C++-Operationen entsprechen Maschinenanweisungen und können daher direkt in Maschinencode übersetzt werden;
Bezeichner – eine Folge von Buchstaben und Zahlen beliebiger Länge; das erste Zeichen muss ein Buchstabe sein; Der Unterstrich „_“ gilt als der Buchstabe wu; Groß- und Kleinbuchstaben sind unterschiedlich.
Die signierten und flüchtigen Bezeichner sind für die zukünftige Verwendung reserviert.
Konstanten
Es gibt verschiedene Arten von Konstanten. Nachfolgend finden Sie eine kurze Zusammenfassung der Hardware-Eigenschaften, die sich auf ihre Größe auswirken.
Ganzzahlige Konstanten
Eine ganzzahlige Konstante, die aus einer Folge von Ziffern besteht, wird als oktal betrachtet, wenn sie mit 0 (Ziffer Null) beginnt, andernfalls als dezimal. Die Zahlen 8 und 9 sind keine Oktalziffern.
Eine Ziffernfolge mit vorangestelltem 0x oder 0X wird als hexadezimale Ganzzahl akzeptiert.
Zu den Hexadezimalziffern gehören die Buchstaben a oder A bis f oder F mit Werten zwischen 10 und 15.
Eine Dezimalkonstante, deren Wert größer als die größte vorzeichenbehaftete Maschinen-Ganzzahl ist, wird als lang betrachtet; Oktal- und Hexadezimalkonstante, deren Wert den größten übersteigt
Einführung in die Programmiersprache C++ | ||
Halsmaschine Ganzzahl mit Vorzeichen, gilt als lang; In anderen Fällen werden Ganzzahlkonstanten als Ganzzahlen behandelt.
Explizite lange Konstanten
Eine dezimale, oktale oder hexadezimale Konstante, unmittelbar gefolgt von l (lateinischer Buchstabe „el“) oder L, wird als lange Konstante betrachtet.
Zeichenkonstanten
Eine Zeichenkonstante besteht aus einem Zeichen, das von einfachen Anführungszeichen (Apostrophen) umgeben ist, z. B. „x“. Der Wert einer Zeichenkonstante ist der numerische Wert des Zeichens im Zeichensatz (Alphabet) der Maschine.
Zeichenkonstanten gelten als Daten vom Typ int . Einige nichtgrafische Zeichen, einfache Anführungszeichen und Backslash\, können gemäß der folgenden Liste von Escape-Sequenzen dargestellt werden:
Zeilenumbruchzeichen NL(LF) | ||
horizontale Registerkarte NT | ||
vertikale Lasche VT | ||
Kehren Sie zu Schritt BS zurück | ||
Wagenrücklauf CR | ||
Übersetzung des FF-Formats | ||
Backslash\ | ||
einfaches Anführungszeichen (Apostroph) „ | ||
Bit gesetzt 0ddd | ||
Bit gesetzt 0xddd |
Die Escape-Sequenz \ddd besteht aus einem Backslash gefolgt von 1, 2 oder 3 Oktalziffern, die den Wert des gewünschten Zeichens angeben. Ein Sonderfall dieses Konstrukts ist \0 (ohne darauffolgende Ziffern), der das leere Zeichen NULL angibt.
Die Escape-Sequenz\xddd besteht aus einem Backslash, gefolgt von 1, 2 oder 3 Hexadezimalziffern, die den Wert des gewünschten Zeichens angeben. Wenn das auf den Backslash folgende Zeichen nicht zu den aufgeführten gehört, wird der Backslash ignoriert.
Einführung in die Programmiersprache C++ |
||
Gleitkommakonstanten
Eine Gleitkommakonstante besteht aus einem ganzzahligen Teil, einem Dezimalpunkt, einer Mantisse, e oder E, und einem ganzzahligen Exponenten (möglicherweise, aber nicht unbedingt mit Vorzeichen). Der ganzzahlige Teil und die Mantisse bestehen beide aus einer Ziffernfolge. Der ganze Teil oder die Mantisse (aber nicht beide) können weggelassen werden; oder der Dezimalpunkt oder (E) zusammen mit dem gesamten Exponenten (jedoch nicht beide Teile gleichzeitig) können weggelassen werden. Die Gleitkommakonstante ist vom Typ double.
Enum-Konstanten
Als Enumeratoren beschriebene Namen sind Konstanten
na int.
Beschriebene Konstanten
Ein Objekt eines beliebigen Typs kann so definiert werden, dass es im gesamten Namensbereich einen konstanten Wert hat. Bei Zeigern wird dazu der Deklarator *const verwendet; Für Nicht-Zeigerobjekte wird der const-Deskriptor verwendet.
Eine Zeichenfolge ist eine in doppelte Anführungszeichen eingeschlossene Zeichenfolge: „…“. Die Zeichenfolge hat einen Zeichen-Array-Typ und die Speicherklasse static und wird mit den angegebenen Zeichen initialisiert.
Der Compiler fügt am Ende jeder Zeile ein Nullbyte \0 ein, damit ein Programm, das die Zeile durchsucht, das Ende finden kann.
In einer Zeile muss dem doppelten Anführungszeichen „ ein \ vorangestellt werden; außerdem können die gleichen Escape-Sequenzen verwendet werden, die für Zeichenkonstanten beschrieben wurden.
Und schließlich kann das Newline-Zeichen nur unmittelbar nach dem \; erscheinen. dann werden sowohl -\ als auch das Newline-Zeichen ignoriert.
Kapitel 3. Syntax
Aufnahmesyntax
Gemäß den syntaktischen Regeln der Aufzeichnung werden syntaktische Kategorien kursiv und wörtliche Wörter und Symbole in einer Schriftart mit konstanter Breite hervorgehoben.
Einführung in die Programmiersprache C++ | ||
Alternative Kategorien werden in verschiedene Zeilen geschrieben. Ein optionales Terminal- oder Nicht-Terminalsymbol wird durch den Index „opt“ angezeigt, sodass (opt) angibt, dass der Ausdruck in den geschweiften Klammern optional ist.
Namen und Typen
Ein Name bezeichnet (bezeichnet) ein Objekt, eine Funktion, einen Typ, einen Wert oder eine Bezeichnung. Der Name wird per Beschreibung in das Programm eingetragen. Ein Name kann nur innerhalb eines Bereichs des Programmtextes verwendet werden, der als sein Gültigkeitsbereich bezeichnet wird. Ein Name hat einen Typ, der seine Verwendung bestimmt.
Ein Objekt ist ein Speicherbereich. Ein Objekt verfügt über eine Speicherklasse, die seine Lebensdauer bestimmt. Die Bedeutung des in einem Objekt gefundenen Werts wird durch die Art des Namens bestimmt, mit dem darauf zugegriffen wird.
Sichtbereich
Es gibt vier Arten von Bereichen: lokal, Datei, Programm und Klasse.
Lokal
Ein in einem Block beschriebener Name ist für diesen Block lokal und kann nur innerhalb dieses Blocks nach der Deklarationsstelle und in den von ihm abgedeckten Blöcken verwendet werden.
Eine Ausnahme bilden Beschriftungen, die überall in der Funktion verwendet werden können, in der sie beschrieben werden. Namen formaler Funktionsparameter werden so behandelt, als wären sie deklariert
V der äußerste Block dieser Funktion.
Ein außerhalb eines Blocks oder einer Klasse deklarierter Name kann in der Datei, in der er definiert ist, nach der Deklarationsstelle verwendet werden.
Der Name eines Klassenmitglieds ist für seine Klasse lokal und kann nur in einer Mitgliedsfunktion dieser Klasse verwendet werden, nachdem die Operation > auf ein Objekt seiner Klasse oder nachdem die Operation > auf einen Zeiger auf angewendet wurde ein Objekt seiner Klasse.
Statische Klassenmitglieder und Funktionsmitglieder können auch mit dem Operator :: referenziert werden, wenn ihr Klassenname im Gültigkeitsbereich liegt.
Einführung in die Programmiersprache C++ |
||
Eine innerhalb einer Klasse deklarierte Klasse gilt nicht als Mitglied und ihr Name gehört zum umschließenden Bereich.
Ein Name kann ausgeblendet werden, indem derselbe Name explizit in einem Block oder einer Klasse definiert wird. Ein Name in einem Block oder einer Klasse kann nur durch den Namen verborgen werden, der im abgedeckten Block oder in der abgedeckten Klasse beschrieben ist.
Ein versteckter nicht-lokaler Name kann auch verwendet werden, wenn sein Gültigkeitsbereich durch den ::-Operator angegeben wird.
Ein Klassenname, der durch einen Namen verdeckt wird, der kein Typname ist, kann dennoch verwendet werden, wenn ihm class, struct oder union vorangestellt ist. Ein Aufzählungsname enum, der von einem Namen verdeckt wird, der kein Typname ist, kann weiterhin verwendet werden, wenn ihm enum vorangestellt ist.
Kapitel 5. Definitionen
Eine Deklaration ist eine Definition, es sei denn, sie beschreibt Funktionen ohne Angabe eines Funktionskörpers, wenn sie den Bezeichner extern(1) enthält und es keinen Initialisierer oder Funktionskörper gibt oder wenn es sich um eine Klassendeklaration handelt.
Kapitel 6. Layout
Ein dateibezogener Name, der nicht explizit als statisch deklariert ist, ist für jede Datei in einem Programm mit mehreren Dateien gleich. Dies ist auch der Name der Funktion. Man sagt, solche Namen seien äußerlich.
Jede Beschreibung externer Name in einem Programm bezieht sich auf dasselbe Objekt, dieselbe Funktion, dieselbe Klasse, dieselbe Enumeration oder denselben Enumeratorwert.
Die in allen externen Namensdeklarationen angegebenen Typen müssen identisch sein. Es kann mehr als eine Typdefinition, Aufzählung, Inline-Funktion oder nicht zusammengesetzte Konstante geben, vorausgesetzt, die Definitionen sind identisch, erscheinen in verschiedenen Dateien und alle Initialisierer sind konstante Ausdrücke.
Einführung in die Programmiersprache C++ | ||
In allen anderen Fällen muss es im Programm genau eine Definition für den externen Namen geben.
Eine Implementierung erfordert möglicherweise, dass eine zusammengesetzte Konstante, die verwendet wird, wenn keine Definition von Konstanten vorkommt, explizit als extern deklariert werden muss und genau eine Definition im Programm haben muss. Die gleiche Einschränkung kann für Inline-Funktionen gelten.
Kapitel 7. Speicherklassen
Es werden zwei Speicherklassen beschrieben:
Auto
statisch.
Automatische Objekte sind für jeden Blockaufruf lokal und werden beim Verlassen zurückgesetzt.
Statische Objekte existieren und behalten während des gesamten Programms ihren Wert.
Einige Objekte sind nicht mit Namen verknüpft und ihre Lebensdauer wird explizit durch die Operatoren new und delete gesteuert.
Kapitel 8. Grundtypen
Als Zeichen (char) deklarierte Objekte reichen aus, um jedes Element des Maschinenzeichensatzes zu speichern. Wenn ein zu diesem Satz gehörendes Zeichen in einer Zeichenvariablen gespeichert wird, entspricht sein Wert dem ganzzahligen Code dieses Zeichens.
Derzeit gibt es drei Ganzzahlgrößen, die als short int , int und long int bezeichnet werden. Lange Ints stellen mindestens so viel Speicher bereit wie kurze Ints, aber wenn sie implementiert werden, können entweder Long, Short oder beide einer regulären Ganzzahl entsprechen.
„Gewöhnliche“ Ganzheiten haben eine natürliche Größe, die durch die Architektur der Zentralmaschine bestimmt wird; Andere Größen werden speziell für spezielle Anforderungen gefertigt.
Einführung in die Programmiersprache C++ |
||
Jede Aufzählung ist eine Menge benannter Konstanten. Die Enum-Eigenschaften sind identisch mit den Int-Eigenschaften. Ganzzahlen ohne Vorzeichen, die als vorzeichenlos bezeichnet werden, gehorchen den Regeln der Modulo2n-Arithmetik, wobei n die Anzahl der Bits in ihrer Darstellung ist.
Gleitkommazahlen mit einfacher (float) und doppelter (double) Genauigkeit können in einigen Maschinenimplementierungen synonym sein.
Da Objekte der oben aufgeführten Typen leicht als Zahlen interpretiert werden können, werden wir sie als arithmetische Typen bezeichnen.
Die Typen char, int aller Größen und enum werden zusammenfassend als Integer-Typen bezeichnet. Die Float- und Double-Typen werden zusammenfassend als Floating-Typen bezeichnet.
Der void-Datentyp definiert einen leeren Satz von Werten. Der (nicht vorhandene) Wert eines void-Objekts kann in keiner Weise verwendet werden und es können weder explizite noch implizite Konvertierungen angewendet werden.
Da ein leerer Ausdruck einen nicht vorhandenen Wert bezeichnet, kann ein solcher Ausdruck nur als Ausdrucksoperator oder als linker Operand in einem Semikolon-Ausdruck verwendet werden. Ein Ausdruck kann explizit in den Typ void konvertiert werden.
Kapitel 9. Abgeleitete Typen
Zusätzlich zu den arithmetischen Grundtypen gibt es konzeptionell unendlich viele abgeleitete Typen, die wie folgt aus den Grundtypen aufgebaut sind:
Arrays von Objekten dieser Art;
Funktionen, die Argumente eines bestimmten Typs empfangen und Objekte eines bestimmten Typs zurückgeben;
Zeiger auf Objekte dieses Typs;
Konstanten, die Werte eines bestimmten Typs sind;
Einführung in die Programmiersprache C++ | ||
Strukturen, bei denen es sich um Klassen ohne Zugriffsbeschränkungen handelt;
Assoziationen, das sind Strukturen, die das können andere Zeit enthalten Objekte unterschiedlichen Typs.
IN Im Allgemeinen können diese Methoden zum Konstruieren von Objekten rekursiv verwendet werden.
Ein Objekt vom Typ void* (ein Zeiger auf void) kann verwendet werden, um auf Objekte unbekannten Typs zu zeigen.
Objekte und LVALUE (Adressen)
Ein Objekt ist ein Speicherbereich; lvalue (Adresse) ist ein Ausdruck, der auf ein Objekt verweist. Ein offensichtliches Beispiel für einen Adressausdruck ist der Name eines Objekts.
Es gibt Operationen, die Adressausdrücke erzeugen: Wenn E beispielsweise ein Zeigerausdruck ist, dann ist *E ein Adressausdruck, der auf das Objekt verweist, auf das E zeigt.
Der Begriff „lvalue“ kommt vom Zuweisungsausdruck E1=E2, bei dem der linke Operand E1 ein Wertausdruck sein muss.
Die folgende Diskussion gibt für jeden Operator an, ob er Adressoperanden benötigt und ob er einen Adresswert zurückgibt.
Kapitel 11. Zeichen und ganze Zahlen
Wenn eine Ganzzahl verwendet werden kann, kann ein Zeichen oder eine kurze Ganzzahl verwendet werden. In allen Fällen wird der Wert in eine Ganzzahl umgewandelt.
Die Konvertierung einer kurzen Ganzzahl in eine lange Ganzzahl erfordert immer eine vorzeichenbehaftete Erweiterung; Ganzzahlen sind vorzeichenbehaftete Größen. Ob die Zeichen ein Vorzeichenbit enthalten oder nicht, ist maschinenabhängig. Der explizitere unsigned char-Typ begrenzt den Wert von 0 auf ein maschinenabhängiges Maximum.
Auf Computern, auf denen Zeichen als signiert behandelt werden, sind die Zeichen des ASCII-Codesatzes positiv.
Einführung in die Programmiersprache C++ |
||
Eine durch die Oktalfolge esc angegebene Zeichenkonstante unterliegt jedoch einer Vorzeichenerweiterung und kann zu einer negativen Zahl werden; so hat beispielsweise „\377“ den Wert 1 .
Wenn eine lange Ganzzahl in eine kurze Ganzzahl oder in ein Zeichen umgewandelt wird, wird sie nach links abgeschnitten; Überschüssige Bits gehen einfach verloren.
Schweben und verdoppeln
Float-Ausdrücke können Gleitkommaarithmetik mit einfacher Genauigkeit ausführen. Konvertierungen zwischen Zahlen mit einfacher und doppelter Genauigkeit werden so mathematisch korrekt durchgeführt, wie es die Hardware zulässt.
Schwebend und ganz
Konvertierungen vom Typ „Float“ in „Integral“ sind in der Regel maschinenabhängig. Insbesondere die Richtung der Kürzung negativer Zahlen variiert von Maschine zu Maschine. Reicht der für den Wert vorgesehene Platz nicht aus, ist das Ergebnis undefiniert.
Das Konvertieren eines Integralwerts in einen Float-Typ funktioniert gut. Wenn der Hardware-Implementierung die erforderlichen Bits fehlen, kommt es zu einem gewissen Präzisionsverlust.
Zeiger und ganze Zahlen
Ein Ausdruck vom Typ Integer kann einem Zeiger hinzugefügt oder daraus entfernt werden. In einem solchen Fall wird die erste transformiert, wie in der Diskussion der Additionsoperation gezeigt.
Sie können eine Subtraktion über zwei Zeiger auf Objekte desselben Typs durchführen; In diesem Fall wird das Ergebnis je nach Maschine in den Typ int oder long konvertiert.
Bei der Kombination einer vorzeichenlosen Ganzzahl und einer regulären Ganzzahl wird die reguläre Ganzzahl in den Typ ohne Vorzeichen konvertiert und das Ergebnis ist vom Typ ohne Vorzeichen.
Der Wert ist die kleinste vorzeichenlose Ganzzahl, die einer vorzeichenbehafteten Ganzzahl (mod 2** (Wortgröße)) entspricht (d. h. mod2** (Wortgröße)). In der Komplement-Binärdarstellung ist diese Konvertierung leer und in der Binärdarstellung erfolgt keine wirkliche Änderung.
Unsere Programme simulieren die Welt. Wer sich die Postulate von OOP zu Herzen nimmt, wird schnell mit der Tatsache konfrontiert, dass der Modellierungsprozess im Rahmen dieser Methode grundsätzlich nichtdeterministisch ist. Lassen Sie uns das genauer besprechen.
Hier und weiter werde ich ein allgemeines Buchbeispiel mit Mitarbeitern eines Unternehmens betrachten; wir werden in etwas SI-ähnlichem schreiben. Die Employee-Klasse von der Person-Klasse zu erben, ist eine tolle Idee, insbesondere wenn Sie Daten ausschließlich im Speicher speichern: SQL hat einige Probleme mit der Tabellenvererbung, aber das ist nicht der Punkt – OOP bietet mit seiner Hierarchie, Aggregationen, Zusammensetzungen und Vererbungen das Ideal Art und Weise, Daten zu organisieren. Probleme mit Methoden.
Hinter jeder Geschäftslogikmethode steht eine Tatsache, die diese Methode (normalerweise nicht allein) modelliert. Programmierfakten sind Operationen: Von nun an werden wir sie so nennen. Indem wir eine Methode zu einem Mitglied einer Klasse machen, erfordert OOP, dass wir eine Operation an ein Objekt binden, was unmöglich ist, da eine Operation die Interaktion von Objekten (zwei oder mehr) ist, außer im Fall einer unären Operation, der reinen Reflexion . Die PaySalary-Methode kann den Klassen „Employee“, „Cash“ und „Account“ zugewiesen werden – alle haben das gleiche Eigentum. Das Dilemma über den Standort der Methoden begleitet den gesamten Entwicklungsprozess: Seine umständliche Lösung kann kritisch und sogar tödlich sein.
In Programmierbüchern geben ehrliche Autoren schüchtern zu, dass „Objekte sozusagen keine wirklichen Objekte sind“ und OOP nur eine Möglichkeit ist, Code zu organisieren, und kein Modellierungsmechanismus. Der springende Punkt ist jedoch, dass „die Welt eine Sammlung von Fakten ist, nicht von Dingen“ – daher die grundsätzliche Unfähigkeit, mithilfe von OOP ein angemessenes Modell in der von Lehrbuchautoren geforderten Form zu erstellen. Es ist wichtig zu verstehen: Es ist möglich, die Welt im Code zu modellieren, aber die Atome des Modells sollten Fakten und keine Objekte sein.
Die Amerikaner sind voll und ganz in die Weltliteratur investiert, und noch mehr in die englischsprachige Literatur. Es ist besser zu sagen, dass das sogenannte goldene Zeitalter der amerikanischen Fiktion eine der letzten Entwicklungsrunden der Weltliteratur ist, wenn nicht sogar die letzte.
Im Jahr 2015 haben Sie möglicherweise eine Veränderung in der Art und Weise bemerkt, wie JavaScript-Anwendungen entwickelt werden. Entwickler bewegen sich weg von unvorhersehbaren veränderlichen Zustandsarchitekturen hin zu vorhersehbareren unveränderlichen Anwendungsarchitekturen.
Bei Frameworks wie Backbone war es üblich, die Daten selbst und die Darstellung der Daten zu synchronisieren – dazu musste man die notwendigen Dom-Events manuell abonnieren. Diese Methode war fehleranfällig und erforderte zu viel Boilerplate-Code. Angular kam und löste dieses Problem mit einer automatisierten Zwei-Wege-Bindung.
Doch nun geht es in eine andere Richtung.
… aber es ist normal. Alles Design ist scheiße. Und es wird immer scheiße sein.
Wenn Sie mir nicht glauben, lassen Sie es mich erklären ...
Kein einziges Projekt übersteht die Begegnung mit der Umsetzung
Wenn Sie mit der Umsetzung Ihres Entwurfs beginnen, stoßen Sie in der Realität unweigerlich auf Dinge, die nicht Ihren ursprünglichen Erwartungen entsprechen.
Daten, von denen Sie erwartet haben, dass sie in der Antwort des externen Dienstes erforderlich sind, fehlen möglicherweise (oder sind ungültig). Die erwartete Einzigartigkeit ist in der Praxis möglicherweise überhaupt nicht eindeutig (selbst in sha1 kommt es manchmal zu Kollisionen). Prozesse, die eigentlich zuverlässig sein sollten, scheitern viel häufiger als erwartet.
Es ist in Ordnung.
In manchen Fällen kann es einfach zu einer Zeitüberschreitung kommen, eine Ausnahme auslösen oder auf andere Weise lautstark scheitern. In anderen Fällen ist eine Lockerung der Systemanforderungen erforderlich. Oder fügen Sie eine zusätzliche Filterschicht hinzu, die bereits „reinigt“ und überträgt Korrekte Möglichkeit Eingabedaten.
Fehlende Daten können optional gemacht oder standardmäßig ersetzt werden.
Falsche Daten können als fehlend behandelt werden, oder Sie können sie „wie sie sind“ schreiben und eine zusätzliche validierte Version hinzufügen, die nur vorhanden ist, wenn das Original gültig ist.
Die Eindeutigkeitsbeschränkung kann sein
Beim Lesen wurde ich an den berühmten Satz von Edsger Dijkstra erinnert: „Ich bete täglich, dass mehr meiner Programmierkollegen die Möglichkeit finden, sich davon zu befreien der Fluch der Kompatibilität") aus dem Buch The Humble Programmer (1972 sic!!!). Und später Eric Raymond mit seiner Cathedral and Bazaar (1997). Doch in Vinges Text geht es nicht nur um den Fluch der Kompatibilität; auf drei Seiten wird eine ganze Reihe von Fragen aufgeworfen (und in der Regel unbeantwortet gelassen):
- Das Problem der Kompatibilität im weitesten Sinne;
- Problem bei der Unterstützung von altem Code;
- Abhängigkeitsproblem Menschenleben„von emotionslosen Robotern“ (c), dem wir uns schnell nähern;
- Das Problem des Data Mining im Allgemeinen und das Finden einer fertigen Lösung in einem bodenlosen Fass an Rezepten im Besonderen (Github, Stack Overflow?);
- Das Problem, alten Code (sowohl schlechten als auch guten) „umzuschreiben“ – dieser Moment bringt mich dazu, ihn noch einmal zu lesen :);
- Das Problem der Unermesslichkeit der IT-Technologien. Manchmal heißt es, dass der letzte universelle Physiker in der Mitte des letzten Jahrhunderts lebte, also Lev Landau. Es sieht so aus, als würde die Zeit kommen (oder bereits gekommen sein), in der es nicht mehr möglich ist, einen universellen Programmierer zu finden;
- Der Text enthält weder im positiven noch im negativen Sinne das Wort Hacker. Es wird aber auch über Forscher geschrieben und über die Vorteile, die sich aus der Kenntnis bestimmter Hintertüren ergeben können, und darüber, welche Macht diese bieten können.
- und das ist wahrscheinlich noch nicht alles... :)
Man hat den Eindruck, dass dies von einer Person geschrieben wurde, die genau diese Probleme aus erster Hand erlebt hat.
Ich möchte darauf hinweisen, dass „Depth in the Sky“ 1999 geschrieben wurde, als vieles von dem, worüber Vinge schreibt, noch kein Problem darstellte oder gerade erst am Horizont erschien.
Als Kritikpunkt möchte ich anmerken, dass Vinge an der KI vorbeigegangen ist (sowohl stark als auch schwach, er ist völlig daran vorbeigegangen, er hat nicht einmal die neuronalen Netze berührt) und die Vorteile der IT auf die Produktivität reduziert. Auch die Präsenz von Megakonzernen ist im Text nicht zu spüren (obwohl „Depth in the Sky“ natürlich nicht zum Cyberpunk gehört), es sei denn, man zählt Keng-Ho dazu. Es gibt keine Patentkriege, die Frage des Urheberrechts und das Problem geschlossener Eigenentwicklungen, deren Quellcodes nie veröffentlicht wurden, werden nicht angesprochen.
Nicht um Programmierung, sondern um Standards
Später im selben Kapitel werden wir darauf eingehen höchst interessante Frage galaktischer Rundfunk zur Verbreitung eigener Technologien. Wofür? Standardisierung. Die Verbreitung unserer eigenen Sprache und unserer eigenen Standards und Technologien, die einerseits rückständige Zivilisationen auf ein für den Handel akzeptables Niveau bringen und andererseits die Kosten für Kommunikation und Gewährleistung der Kompatibilität senken und als Ergebnis, erleichtern den Handel und erhöhen die Margen. Ich frage mich, ob Vinge zum Zeitpunkt des Schreibens des Buches über die Standardisierung der Schiffsausrüstung in der englischen Flotte während der großen Eroberungen Bescheid wusste, die es ermöglichte, die Reparatur- und Wartungskosten zu senken. Und über den Vertrieb auf Englisch als Unternehmen, Wissenschaft usw.? Die Briten brachten den einheimischen Ureinwohnern ihre Sprache bei (zwangsmäßig?). Die Spanier und Franzosen taten dasselbe. Und mittlerweile sind Englisch, Spanisch, Französisch und Portugiesisch sehr verbreitet. Aber die Niederländer glaubten, dass den Ureinwohnern ihre Sprache nicht beigebracht werden musste. Gibt es neben Holland selbst noch viele Orte auf der Welt, an denen Niederländisch gesprochen wird?
Heutzutage wird der Englischunterricht auf der ganzen Welt eingeführt. Verwendung standardisierter Methoden und Lehrbücher, standardisierter Prüfungen und Notenskalen. Ist es nur ein privates Geschäft?
Unten finden Sie den interessantesten Auszug aus dem Text. Es gibt viele interessante Dinge in dem Roman, die nichts mit Programmierung zu tun haben; nicht umsonst wurde er mehrfach ausgezeichnet. Ich empfehle daher, es zu lesen, und die Übersetzung, die ich gefunden habe, ist nicht sehr gut.
Fröhliches Lesen:)
Niemand interessiert sich für meinen Code. Ich war schockiert, als mir das während meiner Arbeit als Programmierer klar wurde. Ich habe viel Zeit damit verbracht, meinen Code zu perfektionieren, bis mir klar wurde, dass sich niemand dafür interessierte, denn es zählte nicht der Code selbst, sondern das Produkt. Die Akzeptanz dieser Tatsache durch den Programmierer wird zu einer Steigerung der Produktivität und des Wertes seiner Arbeit führen.
Der Unterschied zwischen einem Produkt und einem Projekt besteht darin, dass es bei der Entwicklung eines Produkts um einen Plan geht, während bei der Entwicklung eines Projekts um Forschung geht. Wenn Sie ein ungelöstes Problem haben, sagen wir, Sie haben sich noch nicht entschieden, welche Datenbank Sie in Ihrem Projekt verwenden möchten, dann müssen Sie dieses Problem untersuchen, also recherchieren. Dies nennt man Technologieforschung. Forschung, das ist überhaupt nicht notwendig, etwas völlig Neues auf globaler Ebene. Wenn Sie eine Brücke bauen, müssen Sie den Boden an diesem bestimmten Ort untersuchen, und bis dieser Boden untersucht ist, wird die Brücke als Produkt existiert noch nicht, im Moment ist es ein Projekt. Es ist noch nicht bekannt, um welche Art von Boden es sich handelt, das heißt, es ist nicht bekannt, woraus die Brücke gebaut werden soll, wie man sie verstärkt, es ist unmöglich, das Budget zu berechnen und den Arbeitsplan zu planen.
Wer kopieren kann, weiß auch, wie man es macht. Leonardo da Vinci sagte das. Sie sehen, Sie gehen von Ihren Vorstellungen darüber aus, was XP, Windows und ein Betriebssystem sind. Die Leute reden so:
Ich war noch jung, ich hatte XP, das waren die goldenen Zeiten, aber jetzt ist nicht mehr wie früher. Neue Zeiten, moderne Software. Ich verstehe nicht, warum man sich durch alte Sachen wühlen sollte? Sie könnten zumindest einen Klon von Windows 10 erstellen, aber mit Ihrer Geschwindigkeit werden Sie es in 100 Jahren schaffen.
Aber wenn Menschen alte Software kopieren, heißt das nicht, dass sie Rückschritte oder Nekrophile sind. Erstens tun sie es jetzt, indem sie dabei sind moderne Verhältnisse, alle Trends und Richtungen kennend. Zweitens ist Software-Obsoleszenz im Allgemeinen eine äußerst kontraintuitive Sache. Beispielsweise gibt es in den modernsten Anwendungen Codeteile, die vor mehr als zwanzig Jahren geschrieben wurden, und beachten Sie, dass niemand sie neu schreiben wird. Dies sind Informationen, es nutzt sich nicht ab wie Metall oder Holz. Aber Menschen neigen dazu, ihre alltäglichen Wahrnehmungen in immaterielle Dinge zu übersetzen, die eine völlig andere Sichtweise erfordern. Verstehst du? Information. Es ist kein Ding. Vergleichen Sie mit Puschkins Gedichten.
Immer häufiger begann man zu sagen, die Philosophie habe sich als Wissenschaft verloren. Dass die Zeit von Aristoteles, Demokrit und Sokrates das Ende der Entwicklung der Philosophie war und dass sich die Menschen jetzt mit den exakten Wissenschaften beschäftigen und für die Philosophie kein Platz mehr ist. Aber Philosophie ist ein Blick auf die Dinge um uns herum und eine Definition von sich selbst in dieser Welt. Wegen technischer Fortschritt Der Mensch hat neue Möglichkeiten erhalten, die Welt um ihn herum zu studieren, sowie neue Möglichkeiten, die Welt und sich selbst zu beeinflussen. Wir Menschen müssen verstehen, welchen Platz wir im technologischen Fortschritt einnehmen, denn die Technologie eröffnet neue Möglichkeiten für die Entwicklung der gesamten Menschheit und birgt auch eine große Gefahr.
Programmierung wird oft mit Kunst verglichen. Begründet wird dies damit, dass mit der zunehmenden Komplexität von Programmen ein Bedarf an Menschen mit einer besonderen Ausbildung und vor allem einer besonderen Denkweise besteht, die einem immer komplexer werdenden elektronischen Gehirn „Leben einhauchen“ können. Das Konzept der „Information“ spielt eine wichtige Rolle beim Verständnis tiefer Programmierprozesse. Information ist Wissen, das ein Mensch von seinem Gehirn auf ein materielles oder elektronisches Medium übertragen hat.
Es ist auch schwierig, den umgekehrten Einfluss von Computern auf das menschliche Denken nicht zu berücksichtigen. Wie sich das Leben eines Menschen und seine spirituellen Werte unter dem Einfluss des technologischen Fortschritts verändern.
Eine interessante Tatsache ist, dass Programme nicht nur Sie und mich – Verbraucher elektronischer Produkte – beeinflussen, sondern auch die Programmierer selbst. Der Ersteller des Programms denkt bei seiner Arbeit in Maschinenkategorien und beginnt, dies auf die Menschen um ihn herum zu übertragen. Wenn ein Programmierer längere Zeit mit einem Computer arbeitet, entwickelt er eine besondere Denkweise. Der Computer benötigt genaue Anweisungen, um die angegebenen Vorgänge auszuführen.
Computerdenken
Beim Malen eines Bildes hat der Künstler einen Moment Zeit, in dem er den letzten Strich ausführt und damit das Gemälde fertigstellt. Dasselbe gilt auch beim Schreiben eines Programms. Und von dem Moment an, in dem der Programmierer das Programm ins „große“ Leben schickt, beginnt es selbstständig zu leben. Hier können wir ein solches Konzept als „künstliche Intelligenz“ bezeichnen; es ist sowohl mit dem Konzept „Gehirn“ als auch mit „Denken“ verbunden. Natürlich haben das menschliche Gehirn und ein Computer äußerlich nichts gemeinsam, es lassen sich jedoch Gemeinsamkeiten feststellen. .
Einzigartige menschliche Fähigkeiten, wie Sprach- und Musikhören, die Fähigkeit dazu abstraktes Denken sind Funktionen neurodynamischer Gehirnstrukturen, die relativ stabil sind. Es besteht völlige Ähnlichkeit zwischen der Arbeit des menschlichen Gehirns und der Aktivität von Computerprogrammprozessen. Beim Betrieb eines Computers werden elektrische Impulse verwendet, die Millionen von Transistoren durchlaufen (sowie Impulse, die Neuronen durchlaufen). Aber kann man diesen Prozess Denken nennen? Denn Denken ist ein aktiver Prozess der Reflexion der objektiven Welt in Konzepten, Urteilen, Theorien etc. im Zusammenhang mit der Lösung bestimmter Probleme.
Existiert gutes Beispiel einer Art sogenannter selbstlernender Systeme. Diese Systeme sammeln durch Versuch und Irrtum Informationen über eine positive Entscheidung und arbeiten anschließend mit diesen Informationen, um aus einer ähnlichen Situation korrekt herauszukommen. Wir können daraus schließen, dass selbstlernende Systeme die Welt „lernen“, aber neigen sie dazu, Schlussfolgerungen zu ziehen? Natürlich nicht. Das System arbeitet mit den gesammelten Erfahrungen, und wenn sich die Situation auch nur geringfügig von der Situation unterscheidet, in der sie sich befanden, „gerät“ es in eine Sackgasse. Sie haben keine Möglichkeit, einer bestimmten Situation auszuweichen, und egal wie gut das Programm geschrieben ist, es wählt nur eine Lösung, und wenn die Situation dem Computer nicht bekannt ist, schlägt es fehl.
Dies führt zu der Schlussfolgerung, dass sowohl Computerprogramme als auch Computer nicht denken können.
Die moralische Seite des Programmierens
Der Begriff „Computerviren“ hat sich fest in unserem Leben etabliert. Eine Person, die mit einem Computer in Berührung gekommen ist, hat diesen Begriff gehört, und jemand ist direkt auf seine zerstörerischen Auswirkungen gestoßen. Und doch, was sind diese Computerviren? Hierbei handelt es sich um speziell geschriebene Programme, die den Algorithmus anderer Programme ändern, Daten löschen und den Benutzer daran hindern, normal zu arbeiten.
Diese Programme werden von Menschen geschrieben, aber die Frage ist: Was motiviert diese Person?
Die meisten Viren wurden praxisgemäß nicht von Terroristen geschaffen, sondern von Menschen, die ihre Überlegenheit demonstrieren wollen, um zu zeigen, dass sie das können, was andere nicht können. Diese Menschen sind arbeitsfähig, aber oft tun sie es aus Untätigkeit. Diese Leute gehören zu den Leuten, die sich auf Vandalismus einlassen. Sie werden von widersprüchlichen Wünschen getrieben. Wenn diese Person über die erforderlichen Fähigkeiten verfügt, kann es durchaus sein, dass sie einen Computervirus schreibt.
Die ethischen Standards der Gesellschaft, in der menschliche moralische Erfahrungen generiert werden, stehen Vandalismus und dementsprechend Computerviren als Manifestation von Vandalismus ablehnend gegenüber. Und natürlich, wenn eine Person mit hohen moralischen Prinzipien, dann wird er vor jedem Programmcode mehrmals darüber nachdenken, ob dieses Programm anderen Menschen nützt, ob dieses Computerprogramm den Menschen ein Lächeln ins Gesicht zaubert und wann der Programmierer darauf reagieren wird Fragen, er wird sich an die Arbeit machen. Und nur solche Menschen werden zu professionellen Programmierern, die sich dafür einsetzen, etwas Gutes zu schaffen.
Abschluss.
Die in diesem Artikel behandelten Aspekte sind umfangreich und können nicht vollständig in einem Artikel abgedeckt werden. Programmierung als sich entwickelnde und junge Wissenschaft braucht philosophische Sichtweise. Die in diesem Artikel beschriebenen Probleme können als Teil der philosophischen Fragen im Zusammenhang mit dem wissenschaftlichen und technischen Fortschritt betrachtet werden. Diese und viele andere philosophische Fragen, die uns die wissenschaftliche und technologische Revolution stellt, erfordern immer noch philosophisches Verständnis und die große Aufmerksamkeit moderner Philosophen.
Literaturverzeichnis
- Varfolomeeva T.N., Ovchinnikova I.G. Lernprogramm zum Thema Programmierung. [Text]: Lehrbuch. Handbuch / Magnitogorsk: MaSU, 2005. Klassifiziert als UMO. – 104 s.
- Varfolomeeva T.N., Ovchinnikova I.G., Platonova O.I. Programmiermethoden. [Text]: Lehrbuch. Handbuch / Magnitogorsk: MaSU, 2007. – 204 S.
- Varfolomeeva, T.N. Laborworkshop zur objektorientierten Programmierung. [Text]: Lehrbuch. Zulage / T.N. Varfolomeeva, I. Yu. Efimova – Moskau, 2014. (2. Auflage, stereotyp)
- Varfolomeeva, T.N. Laborworkshop zur strukturierten Programmierung am Beispiel der Sprache PASCAL [Text]: Lehrbuch. Zulage / T.N. Varfolomeeva, S.A. Povitukhin. – Magnitogorsk: MaSU, 2013. – 123 S.
- Varfolomeeva, T.N. Ein Handbuch zur Vorbereitung auf das Einheitliche Staatsexamen und CT in Informatik [Text]: Lehrbuch. Handbuch in 2 Teilen, Bd. Teil 1. Algorithmen und Programmierung / T.N. Varfolomeeva, I.G. Ovchinnikova. – Magnitogorsk: MaSU, 2006. – 128 S.
- Varfolomeeva, T.N. Lehrbuch zur Vorbereitung auf zentralisierte Prüfungen in der Informatik [Text]: Lehrbuch. Zulage / T.N. Varfolomeeva, I.G. Ovchinnikova, N.G. Korneschtschuk Magnitogorsk: MaSU, 2002. – 205 S.
- Varfolomeeva, T.N. Pädagogisches und methodisches Handbuch zur Vorbereitung auf Aufnahmeprüfungen in Informatik [Text]: Lehrbuch. Zulage / T.N. Varfolomeeva, I.G. Ovchinnikova, E.N. Guseva Magnitogorsk: MaSU, 2002. – 116 S.
- Efimova, I.Yu. Computermodellierung [Text]: Sammlung praktische Arbeit 2. Auflage, stereotyp / I.Yu. Efimova, T.N. Varfolomeeva. – Moskau: Flinta LLC, 2014. – 67 S. ISBN: 978-5-9765-2039-4
- Efimova, I.Yu. Methoden und Technologien für den Informatikunterricht in Bildungsinstitutionen Berufsausbildung[Text]: Bildungsmethode. Handbuch 2. Auflage, stereotyp / I.Yu. Efimova, T.N. Varfolomeeva. – Moskau: Flinta LLC, 2014. – 41 S. ISBN 978-5-9765-2040-0
- Movchan I.N. Innovative Ansätze für die Informatiklehre an Universitäten // Modern Wissenschaftliche Forschung und Innovation. – 2014. – Nr. 5-2 (37). – S. 45.
- Movchan I.N. Einige Aspekte der Informationsausbildung für Universitätsstudenten // Sammlung wissenschaftliche Arbeiten Welt. – 2008. T.18. – Nr. 1. – S. 34-36.
- Movchan I.N. Pädagogische Kontrolle der Informationsaktivität eines Universitätsstudenten im Prozess der Berufsausbildung: dis. ... offen. Päd. Wissenschaften/Movchan Irina Nikolaevna; Staatliche Universität Magnitogorsk. – Magnitogorsk, 2009, – 205 S.
- Ovchinnikova I.G. Beurteilung der Wirksamkeit der Persönlichkeitsbildung [Text] / I.G. Ovchinnikova, V.A. Belikov, L.V. Kurzaeva // Sozialpartnerschaft in der Berufsbildung Tagungsband der Allrussischen wissenschaftlichen und praktischen Konferenz. FGOU SPO „Magnitogorsk State Vocational Pedagogical College“, Labor zur Erforschung von Problemen des Qualitätsmanagements der primären und sekundären Berufsbildung der Uraler Zweigstelle der Russischen Akademie für Pädagogik: Sammlung. wissenschaftlich Kunst. Magnitogorsk, 2010. – S. 178-187.
- Ovchinnikova, I.G. Problembuch-Workshop zum Thema Programmierung [Text]: Bildungsmethode. Zuschuss. / ICH G. Ovchinnikova, T.N. Varfolomeeva. – Magnitogorsk: MaSU, 2009. – 77 S.
- Sakhnova T.N., Ovchinnikova I.G. Suchalgorithmen in Informatikkursen weiterführende Schule[Text] // Informatik und Bildung. – 2010 – Nr. 11 – S. 79-83.
- Sakhnova T.N., Ovchinnikova I.G. Sortieralgorithmen zur Lösung von Programmierproblemen [Text] // Informatik und Bildung. – 2011. – Nr. 2 – S. 53-57
- Sakhnova, T.N. Grundlagen der Algorithmisierung [Text]: Lehrbuch. Handbuch, 2. Aufl., überarbeitet. und zusätzlich / T.N. Sachnowa, I.G. Ovchinnikova. – Magnitogorsk: MaSU, 2002. Unter dem Stempel der UMO. – 131 S.
- Sakhnova, T.N. Pädagogische Bedingungen für die Ausbildung professionellen Informationsdenkens von Hochschulstudenten [Text]: dis. ... offen. Päd. Naturwissenschaften: 13.00.08 / T.N. Sachnowa. – Magnitogorsk, 2003.
- Sakhnova, T.N. Ein Handbuch zur Vorbereitung auf das Einheitliche Staatsexamen und CT in Informatik [Text]: Lehrbuch. Handbuch in 2 Teilen, Bd. Teil 2. Grundkurs / T.N. Sachnowa, I.G. Ovchinnikova. – Magnitogorsk: MaSU, 2006. – 128 S.
- Chusavitina, G.N. Entwicklung eines Modells zum Management von Risiken, die durch den Remote-Einsatz entstehen Bildungstechnologien an der Universität [Text] / G.N. Chusavitina, M.O. Chusavitin, T.N. Varfolomeeva // Verbesserung der Ausbildung von IT-Spezialisten in Richtung „Angewandte Informatik“ für die innovative Wirtschaft: Inkasso. wissenschaftlich tr. Moskau, 2008. – S. 216-218.
Es könnte nützlich sein zu lesen:
- Wassermelonenschalenmarmelade mit Zitrone;
- Ein Mann entschuldigt sich Warum träumen Sie von einem Mann, der sich entschuldigt?;
- Lipide hoher Dichte 1;
- Abteilung für Sonderpädagogik und Psychologie Fernabteilung für Justizvollzugspädagogik und Sonderpsychologie;
- Forschungsaktivitäten von Studierenden im russischen Sprach- und Literaturunterricht;
- Projekt unvergleichliche Ähnlichkeit Forschungsarbeit Ähnlichkeit;
- Englische Phrasen „There is“ und „There are“.;
- Wie nennt man das Spiegelbild?;