Computerprogrammierung - Computer programming

Computerprogrammierung ist der Prozess des Entwerfens und Erstellens eines ausführbaren Computerprogramms , um ein bestimmtes Rechenergebnis zu erreichen oder eine bestimmte Aufgabe auszuführen. Die Programmierung umfasst Aufgaben wie: Analyse, Generierung von Algorithmen , Profilerstellung der Genauigkeit und des Ressourcenverbrauchs von Algorithmen und die Implementierung von Algorithmen in einer gewählten Programmiersprache (allgemein als Codierung bezeichnet ). Der Quellcode eines Programms ist in einer oder mehreren für Programmierer verständlichen Sprachen geschrieben und nicht in Maschinencode , der direkt von der Zentraleinheit ausgeführt wird . Der Zweck der Programmierung besteht darin, eine Abfolge von Anweisungen zu finden, die die Ausführung einer Aufgabe (die so komplex wie ein Betriebssystem sein kann ) auf einem Computer automatisieren , häufig zur Lösung eines bestimmten Problems. Professionelles Programmieren erfordert daher oft Fachwissen in mehreren verschiedenen Themenbereichen, einschließlich Kenntnissen der Anwendungsdomäne , spezialisierter Algorithmen und formaler Logik .

Aufgaben, die die Programmierung begleiten und mit ihr in Zusammenhang stehen, umfassen: Testen , Debuggen , Quellcode- Wartung, Implementierung von Build-Systemen und Verwaltung von abgeleiteten Artefakten , wie dem Maschinencode von Computerprogrammen. Diese können als Teil des Programmierungsprozesses betrachtet werden, aber oft wird der Begriff Softwareentwicklung für diesen größeren Prozess verwendet, wobei der Begriff Programmierung , Implementierung oder Codierung für das eigentliche Schreiben von Code reserviert ist. Software Engineering kombiniert Engineering- Techniken mit Softwareentwicklungspraktiken. Reverse Engineering ist ein verwandter Prozess, der von Designern, Analysten und Programmierern verwendet wird, um zu verstehen und neu zu erstellen/re-implementieren.

Geschichte

Ada Lovelace , deren Anmerkungen am Ende von Luigi Menabreas Aufsatz den ersten Algorithmus enthalten , der für die Verarbeitung durch eine Analytical Engine entwickelt wurde . Sie wird oft als erste Computerprogrammiererin der Geschichte anerkannt.

Programmierbare Geräte gibt es schon seit Jahrhunderten. Bereits im 9. Jahrhundert wurde ein programmierbarer Musiksequenzer von den Persern Banu Musa- Brüder erfunden , die im Book of Ingenious Devices einen automatisierten mechanischen Flötenspieler beschrieben . 1206 erfand der arabische Ingenieur Al-Jazari eine programmierbare Drum-Machine, bei der ein musikalischer mechanischer Automat dazu gebracht werden konnte, über Wirbel und Nocken verschiedene Rhythmen und Drum-Patterns zu spielen . 1801 konnte der Jacquard-Webstuhl durch Änderung des „Programms“ – einer Reihe von gelochten Pappkarten – ganz andere Webarten herstellen .

Auch Code-Breaking- Algorithmen gibt es seit Jahrhunderten. Im 9. Jahrhundert beschrieb der arabische Mathematiker Al-Kindi in A Manuscript on Deciphering Cryptographic Messages einen kryptografischen Algorithmus zum Entschlüsseln von verschlüsseltem Code . Er gab die erste Beschreibung der Kryptoanalyse durch Frequenzanalyse , den frühesten Code-Breaking-Algorithmus.

Das erste Computerprogramm ist in der Regel bis 1843 datiert, als Mathematiker Ada Lovelace einen veröffentlichten Algorithmus eine Folge von berechnen Bernoulli - Zahlen , bestimmt durch durchgeführt wird Charles Babbage ‚s Analytical Engine .

Daten und Anweisungen wurden einst auf externen Lochkarten gespeichert , die in Ordnung gehalten und in Programmdecks angeordnet wurden.

In den 1880er Jahren erfand Herman Hollerith das Konzept, Daten in maschinenlesbarer Form zu speichern . Später ermöglichte eine Steuertafel (Steckplatine), die seinem Tabulator vom Typ I von 1906 hinzugefügt wurde, die Programmierung für verschiedene Aufgaben, und in den späten 1940er Jahren wurden Geräteaufzeichnungsgeräte wie der IBM 602 und der IBM 604 von Steuertafeln in ähnlicher Weise programmiert übrigens, wie die ersten elektronischen Computer . Mit dem 1949 eingeführten Konzept des speicherprogrammierbaren Computers wurden jedoch sowohl Programme als auch Daten auf die gleiche Weise im Computerspeicher gespeichert und manipuliert .

Maschinensprache

Maschinencode war die Sprache der frühen Programme, geschrieben im Befehlssatz der jeweiligen Maschine, oft in binärer Notation. Bald wurden Assemblersprachen entwickelt, die es dem Programmierer ermöglichten, Anweisungen in einem Textformat (zB ADD X, TOTAL) mit Abkürzungen für jeden Operationscode und aussagekräftigen Namen für die Spezifizierung von Adressen zu spezifizieren. Da jedoch eine Assemblersprache kaum mehr als eine unterschiedliche Notation für eine Maschinensprache ist, haben zwei beliebige Maschinen mit unterschiedlichen Befehlssätzen auch unterschiedliche Assemblersprachen.

Kabelgebundenes Bedienfeld für eine IBM 402 Buchhaltungsmaschine .

Compilersprachen

Hochsprachen machten den Entwicklungsprozess eines Programms einfacher und verständlicher und weniger an die zugrunde liegende Hardware gebunden. Das erste Compiler-bezogene Werkzeug, das A-0 System , wurde 1952 von Grace Hopper entwickelt , die auch den Begriff „Compiler“ prägte. FORTRAN , die erste weit verbreitete Hochsprache mit funktionaler Implementierung, kam 1957 heraus, und viele andere Sprachen wurden bald entwickelt – insbesondere COBOL für die kommerzielle Datenverarbeitung und Lisp für die Computerforschung.

Diese kompilierten Sprachen ermöglichen es dem Programmierer, syntaktisch reichhaltigere Programme zu schreiben, die den Code besser abstrahieren können , was es leicht macht, über Kompilierungsdeklarationen und Heuristiken auf unterschiedliche Maschinenbefehlssätze abzuzielen. Compiler machten sich die Leistungsfähigkeit von Computern zunutze, um die Programmierung zu vereinfachen, indem sie es Programmierern ermöglichten, Berechnungen durch Eingabe einer Formel mit Infix-Notation anzugeben .

Quellcode-Eintrag

Programme wurden meist noch mit Lochkarten oder Papierstreifen eingegeben . In den späten 1960er Jahren wurden Datenspeichergeräte und Computerterminals so preiswert, dass Programme durch direktes Eintippen in den Computer erstellt werden konnten. Text - Editoren wurden auch entwickelt , dass erlaubt Änderungen und Korrekturen viel mehr gemacht werden leichter als mit Lochkarten.

Moderne Programmierung

Qualitätsanforderungen

Wie auch immer der Entwicklungsansatz aussehen mag, das endgültige Programm muss einige grundlegende Eigenschaften erfüllen. Folgende Eigenschaften zählen zu den wichtigsten:

  • Zuverlässigkeit : wie oft die Ergebnisse eines Programms korrekt sind. Dies hängt von der konzeptionellen Korrektheit der Algorithmen und der Minimierung von Programmierfehlern ab, wie z. B. Fehlern in der Ressourcenverwaltung (z. B. Pufferüberläufe und Race-Bedingungen ) und logischen Fehlern (z. B. Division durch Null oder Fehler durch Eins ).
  • Robustheit : wie gut ein Programm Probleme aufgrund von Fehlern (nicht Bugs) antizipiert. Dazu gehören Situationen wie falsche, unangemessene oder beschädigte Daten, Nichtverfügbarkeit benötigter Ressourcen wie Arbeitsspeicher, Betriebssystemdienste und Netzwerkverbindungen, Benutzerfehler und unerwartete Stromausfälle.
  • Usability : die Ergonomie eines Programms: die Leichtigkeit , mit der eine Person , die das Programm für den vorgesehenen Zweck verwendet werden kann oder in einigen Fällen sogar unvorhergesehene Zwecke. Solche Probleme können seinen Erfolg sogar unabhängig von anderen Problemen ausmachen oder brechen. Dies beinhaltet eine breite Palette von Text-, Grafik- und manchmal auch Hardware-Elementen, die die Klarheit, Intuitivität, Kohärenz und Vollständigkeit der Benutzeroberfläche eines Programms verbessern.
  • Portabilität : Der Bereich von Computerhardware und Betriebssystemplattformen, auf denen der Quellcode eines Programms kompiliert / interpretiert und ausgeführt werden kann. Dies hängt von den Unterschieden in den Programmiermöglichkeiten der verschiedenen Plattformen ab, einschließlich Hardware- und Betriebssystemressourcen, erwartetem Verhalten der Hardware und des Betriebssystems und der Verfügbarkeit plattformspezifischer Compiler (und manchmal Bibliotheken) für die Sprache des Quellcodes.
  • Wartbarkeit : die Leichtigkeit, mit der ein Programm von seinen gegenwärtigen oder zukünftigen Entwicklern modifiziert werden kann, um Verbesserungen vorzunehmen oder anzupassen, Fehler und Sicherheitslücken zu beheben oder es an neue Umgebungen anzupassen. Gute Praktiken während der Erstentwicklung machen in dieser Hinsicht den Unterschied. Diese Qualität ist für den Endbenutzer möglicherweise nicht direkt ersichtlich, kann jedoch das Schicksal eines Programms auf lange Sicht erheblich beeinflussen.
  • Effizienz / Leistung : Maß für die Systemressourcen, die ein Programm verbraucht (Prozessorzeit, Speicherplatz, langsame Geräte wie Festplatten, Netzwerkbandbreite und teilweise sogar Benutzerinteraktion): Je weniger, desto besser. Dazu gehört auch ein sorgfältiger Umgang mit Ressourcen, beispielsweise das Bereinigen temporärer Dateien und das Beseitigen von Speicherlecks . Dies wird oft im Schatten einer gewählten Programmiersprache diskutiert. Obwohl die Sprache sicherlich die Leistung beeinträchtigt, können selbst langsamere Sprachen wie Python Programme aus menschlicher Sicht sofort ausführen. Geschwindigkeit, Ressourcennutzung und Leistung sind wichtig für Programme, die das System behindern, aber eine effiziente Nutzung der Programmierzeit ist ebenfalls wichtig und hängt mit den Kosten zusammen: Mehr Hardware kann billiger sein.

Lesbarkeit des Quellcodes

In der Computerprogrammierung bezieht sich Lesbarkeit auf die Leichtigkeit, mit der ein menschlicher Leser den Zweck, den Kontrollfluss und die Funktionsweise des Quellcodes verstehen kann . Es betrifft die oben genannten Qualitätsaspekte, einschließlich Portabilität, Benutzerfreundlichkeit und vor allem Wartbarkeit.

Lesbarkeit ist wichtig, weil Programmierer die meiste Zeit damit verbringen, zu lesen, bestehenden Quellcode zu verstehen und zu modifizieren, anstatt neuen Quellcode zu schreiben. Nicht lesbarer Code führt oft zu Fehlern, Ineffizienzen und dupliziertem Code . Eine Studie ergab, dass ein paar einfache Lesbarkeitstransformationen den Code kürzer machten und die Zeit zum Verständnis drastisch verkürzten.

Ein konsistenter Programmierstil hilft oft bei der Lesbarkeit. Lesbarkeit ist jedoch mehr als nur Programmierstil. Viele Faktoren, die wenig oder nichts mit der Fähigkeit des Computers zu tun haben, den Code effizient zu kompilieren und auszuführen, tragen zur Lesbarkeit bei. Einige dieser Faktoren umfassen:

Die Darstellungsaspekte davon (wie Einzüge, Zeilenumbrüche, farbliche Hervorhebungen usw.) werden oft vom Quellcode-Editor übernommen , aber die inhaltlichen Aspekte spiegeln das Talent und die Fähigkeiten des Programmierers wider.

Es wurden auch verschiedene visuelle Programmiersprachen entwickelt, um Bedenken hinsichtlich der Lesbarkeit zu lösen, indem nicht-traditionelle Ansätze zur Codestruktur und -anzeige übernommen werden. Integrierte Entwicklungsumgebungen (IDEs) zielen darauf ab, all diese Hilfen zu integrieren. Techniken wie Code-Refactoring können die Lesbarkeit verbessern.

Algorithmische Komplexität

Sowohl das akademische Feld als auch die Ingenieurpraxis der Computerprogrammierung befassen sich hauptsächlich mit der Entdeckung und Implementierung der effizientesten Algorithmen für eine bestimmte Klasse von Problemen. Zu diesem Zweck werden Algorithmen mittels der sogenannten Big-O-Notation in Ordnungen eingeteilt , die den Ressourcenverbrauch, wie zum Beispiel Ausführungszeit oder Speicherverbrauch, in Bezug auf die Größe einer Eingabe ausdrückt. Erfahrene Programmierer sind mit einer Vielzahl etablierter Algorithmen und deren jeweiliger Komplexität vertraut und nutzen dieses Wissen, um die für die Gegebenheiten am besten geeigneten Algorithmen auszuwählen.

Schachalgorithmen als Beispiel

"Programming a Computer for Playing Chess" war eine Veröffentlichung aus dem Jahr 1950, die einen "Minimax" -Algorithmus bewertete , der Teil der Geschichte der algorithmischen Komplexität ist; ein Kurs zu IBMs Deep Blue (Schachcomputer) ist Teil des Informatiklehrplans an der Stanford University .

Methoden

Der erste Schritt in den meisten formalen Softwareentwicklungsprozessen ist die Anforderungsanalyse , gefolgt von Tests, um die Wertmodellierung, Implementierung und Fehlerbeseitigung (Debugging) zu bestimmen. Für jede dieser Aufgaben gibt es viele verschiedene Ansätze. Ein beliebter Ansatz für die Anforderungsanalyse ist die Use-Case- Analyse. Viele Programmierer verwenden Formen der agilen Softwareentwicklung, bei denen die verschiedenen Phasen der formalen Softwareentwicklung eher in kurzen Zyklen integriert sind, die einige Wochen statt Jahre dauern. Es gibt viele Ansätze für den Softwareentwicklungsprozess.

Beliebte Modellierungstechniken sind objektorientierte Analyse und Design ( OOAD ) und modellgesteuerte Architektur ( MDA ). Die Unified Modeling Language ( UML ) ist eine Notation, die sowohl für OOAD als auch für MDA verwendet wird.

Eine ähnliche Technik für den Datenbankentwurf ist das Entity-Relationship Modeling ( ER Modeling ).

Implementierungstechniken umfassen imperative Sprachen ( objektorientiert oder prozedural ), funktionale Sprachen und logische Sprachen .

Sprachgebrauch messen

Es ist sehr schwierig, die beliebtesten modernen Programmiersprachen zu bestimmen. Zu den Methoden zur Messung der Popularität von Programmiersprachen gehören: Zählen der Anzahl der Stellenanzeigen, in denen die Sprache erwähnt wird, der Anzahl der verkauften Bücher und Kurse, in denen die Sprache unterrichtet wird (dies überschätzt die Bedeutung neuerer Sprachen) und Schätzungen der Anzahl der vorhandenen geschriebenen Codezeilen in der Sprache (dadurch wird die Anzahl der Benutzer von Geschäftssprachen wie COBOL unterschätzt).

Einige Sprachen sind für bestimmte Arten von Anwendungen sehr beliebt, während einige Sprachen regelmäßig verwendet werden, um viele verschiedene Arten von Anwendungen zu schreiben. COBOL ist zum Beispiel immer noch stark in Unternehmensrechenzentren, oft auf großen Mainframe-Computern , Fortran bei technischen Anwendungen, Skriptsprachen bei der Webentwicklung und C bei eingebetteter Software . Viele Anwendungen verwenden bei ihrer Erstellung und Verwendung eine Mischung aus mehreren Sprachen. Neue Sprachen sind rund um die Syntax einer vorherigen Sprache im Allgemeinen entworfen , um mit neuen Funktionen hinzugefügt, (zum Beispiel C ++ fügt Objektorientierung zu C und Java fügt Speicherverwaltung und Bytecode zu C ++, sondern als Folge verliert die Effizienz und die Fähigkeit , für niedrige -Manipulation).

Debuggen

Der erste bekannte tatsächliche Fehler, der ein Problem in einem Computer verursachte, war eine Motte, die in einem Harvard-Mainframe gefangen war und in einem Logbucheintrag vom 9. September 1947 aufgezeichnet wurde. "Bug" war bereits ein gebräuchlicher Begriff für einen Softwarefehler, als dieser Fehler gefunden wurde .

Das Debuggen ist eine sehr wichtige Aufgabe im Softwareentwicklungsprozess, da Fehler in einem Programm erhebliche Konsequenzen für seine Benutzer haben können. Einige Sprachen sind anfälliger für bestimmte Arten von Fehlern, da ihre Spezifikation nicht erfordert, dass Compiler so viele Prüfungen durchführen wie andere Sprachen. Die Verwendung eines statischen Codeanalysetools kann dabei helfen, einige mögliche Probleme zu erkennen. Normalerweise besteht der erste Schritt beim Debuggen darin, zu versuchen, das Problem zu reproduzieren. Dies kann eine nicht triviale Aufgabe sein, wie beispielsweise bei parallelen Prozessen oder einigen ungewöhnlichen Softwarefehlern. Außerdem können die spezifische Benutzerumgebung und der Verwendungsverlauf die Reproduktion des Problems erschweren.

Nachdem der Fehler reproduziert wurde, muss die Eingabe des Programms möglicherweise vereinfacht werden, um das Debuggen zu erleichtern. Wenn beispielsweise ein Fehler in einem Compiler beim Parsen einer großen Quelldatei zum Absturz führen kann, kann eine Vereinfachung des Testfalls, die nur wenige Zeilen aus der ursprünglichen Quelldatei ergibt, ausreichend sein, um denselben Absturz zu reproduzieren. Trial-and-Error/Divide-and-Conquer ist erforderlich: Der Programmierer versucht, einige Teile des ursprünglichen Testfalls zu entfernen und zu prüfen, ob das Problem weiterhin besteht. Beim Debuggen des Problems in einer GUI kann der Programmierer versuchen, einige Benutzerinteraktionen aus der ursprünglichen Problembeschreibung zu überspringen und zu überprüfen, ob die verbleibenden Aktionen ausreichen, damit Fehler auftreten. Scripting und Breakpointing sind ebenfalls Teil dieses Prozesses.

Debugging wird oft mit IDEs durchgeführt . Es werden auch eigenständige Debugger wie GDB verwendet, die oft eine weniger visuelle Umgebung bieten und normalerweise eine Befehlszeile verwenden . Einige Texteditoren wie Emacs ermöglichen den Aufruf von GDB über sie, um eine visuelle Umgebung bereitzustellen.

Programmiersprachen

Verschiedene Programmiersprachen unterstützen verschiedene Programmierstile (so genannte Programmierparadigmen ). Die Wahl der verwendeten Sprache unterliegt vielen Überlegungen, wie beispielsweise der Unternehmenspolitik, der Eignung für die Aufgabe, der Verfügbarkeit von Drittanbieterpaketen oder individuellen Vorlieben. Idealerweise wird die für die jeweilige Aufgabe am besten geeignete Programmiersprache ausgewählt. Kompromisse bei diesem Ideal bestehen darin, genügend Programmierer zu finden, die die Sprache beherrschen, um ein Team aufzubauen, die Verfügbarkeit von Compilern für diese Sprache und die Effizienz, mit der Programme, die in einer bestimmten Sprache geschrieben wurden, ausgeführt werden. Sprachen bilden ein ungefähres Spektrum von "low-level" bis "high-level"; "Low-Level"-Sprachen sind typischerweise maschinenorientierter und schneller auszuführen, während "High-Level"-Sprachen abstrakter und einfacher zu verwenden sind, aber weniger schnell ausgeführt werden. Es ist normalerweise einfacher, in "High-Level"-Sprachen zu codieren als in "Low-Level"-Sprachen.

Allen Downey schreibt in seinem Buch How To Think Like A Computer Scientist :

Die Details sehen in verschiedenen Sprachen anders aus, aber ein paar grundlegende Anweisungen erscheinen in fast jeder Sprache:
  • Eingabe: Sammeln Sie Daten von der Tastatur, einer Datei oder einem anderen Gerät.
  • Ausgabe: Zeigen Sie Daten auf dem Bildschirm an oder senden Sie Daten an eine Datei oder ein anderes Gerät.
  • Arithmetik: Führen Sie grundlegende arithmetische Operationen wie Addition und Multiplikation durch.
  • Bedingte Ausführung: Prüfen Sie auf bestimmte Bedingungen und führen Sie die entsprechende Folge von Anweisungen aus.
  • Wiederholung: Führen Sie eine Aktion wiederholt aus, normalerweise mit einer gewissen Variation.

Viele Computersprachen bieten einen Mechanismus zum Aufrufen von Funktionen, die von gemeinsam genutzten Bibliotheken bereitgestellt werden . Vorausgesetzt, die Funktionen in einer Bibliothek folgen den entsprechenden Laufzeitkonventionen (zB Methode zur Übergabe von Argumenten ), dann können diese Funktionen in jeder anderen Sprache geschrieben werden.

Programmierer

Computerprogrammierer sind diejenigen, die Computersoftware schreiben. Ihre Aufgaben umfassen in der Regel:

Obwohl Programmieren in den Medien als ein eher mathematisches Thema dargestellt wurde, zeigen einige Untersuchungen, dass gute Programmierer starke Fähigkeiten in natürlichen menschlichen Sprachen haben und dass das Erlernen des Programmierens dem Erlernen einer Fremdsprache ähnlich ist .

Siehe auch

Verweise

Quellen

Weiterlesen

  • AK Hartmann, Praktischer Leitfaden für Computersimulationen , Singapur: World Scientific (2009)
  • A. Hunt, D. Thomas und W. Cunningham, The Pragmatic Programmer. Vom Gesellen zum Meister , Amsterdam: Addison-Wesley Longman (1999)
  • Brian W. Kernighan, Die Praxis des Programmierens , Pearson (1999)
  • Weinberg, Gerald M. , The Psychology of Computer Programming , New York: Van Nostrand Reinhold (1971)
  • Edsger W. Dijkstra , Eine Disziplin der Programmierung , Prentice-Hall (1976)
  • O.-J. Dahl, EWDijkstra , CAR Hoare, Strukturierte Programmierung , Academic Press (1972)
  • David Gries , Die Wissenschaft des Programmierens , Springer-Verlag (1981)

Externe Links