17,99 €
Haben Sie auch schon mal den Wunsch verspürt, programmieren zu können? Oder wenigstens zu verstehen, wie Computer ticken, die unser Leben bestimmen? Dieses Buch führt in die Denkweise von Programmierern und die Funktionsweise von Programmen ein und zeigt Ihnen, worauf Sie beim Programmieren achten müssen: Geben Sie eindeutige Anweisungen, sichern Sie sich immer gegen alle Eventualitäten ab und kommen Sie mit den gegebenen, beschränkten Mitteln aus. Gut, dass der Computer wenigstens nicht murrt, wenn er monotone Tätigkeiten ausführen muss! Am Ende des Buches angelangt, haben Sie einen wichtigen Ausschnitt unserer Welt besser kennen gelernt und Einblicke in allgemeine Programmierkonzepte und zwei Programmiersprachen erhalten. Dann sind Sie in der Lage, fundiert zu entscheiden, ob und wie Sie Ihr Wissen weiter vertiefen wollen.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 588
Veröffentlichungsjahr: 2021
Programmieren lernen für Dummies
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
2. Auflage 2021
© 2021 WILEY-VCH GmbH, Weinheim
Wiley, die Bezeichnung »Für Dummies«, das Dummies-Mann-Logo und darauf bezogene Gestaltungen sind Marken oder eingetragene Marken von John Wiley & Sons, Inc., USA, Deutschland und in anderen Ländern.
Das vorliegende Werk wurde sorgfältig erarbeitet. Dennoch übernehmen Autoren und Verlag für die Richtigkeit von Angaben, Hinweisen und Ratschlägen sowie eventuelle Druckfehler keine Haftung.
Coverfoto: © Nadya Ustuzhantceva – stock.adobe.comKorrektur: Petra Heubach-Erdmann, Düsseldorf
Print ISBN: 978-3-527-71851-1ePub ISBN: 978-3-527-83356-6
Daniel Lorig programmiert bereits seit dem Ende seiner Schulzeit. Da er schnell Gefallen an der Programmierung fand, nahm er ein Informatik-Studium an der Universität des Saarlandes auf. 2010 schloss er dieses mit einem Mastertitel ab.
Nach einem knapp zweijährigen Intermezzo als Entwickler bei einem Software-Unternehmen wagte er den Schritt in die Selbstständigkeit, um fortan eigene Ideen umzusetzen. Hauptsächlich programmiert er nun eigene Webseiten, zudem hat er einige Programmierbücher geschrieben.
In seiner Freizeit reist er seitdem durch die Welt – begünstigt durch die neu gewonnene berufliche Freiheit und die Überwindung seiner jahrelangen Flugangst.
Cover
Titelblatt
Impressum
Über den Autor
Einleitung
Über dieses Buch
Konventionen in diesem Buch
Was Sie nicht lesen müssen
Törichte Annahmen über die Leser
Wie dieses Buch aufgebaut ist
Symbole, die in diesem Buch verwendet werden
Wie es weitergeht
Teil I: Grundlagen der Programmierung
Kapitel 1: Von der Idee zum Programm
Mensch vs. Maschine
Einen Algorithmus entwickeln
Mit dem Rechner kommunizieren
Das Wichtigste in Kürze
Übungen
Kapitel 2: Programmiersprachen: Ein Überblick
Variabel sollst du sein!
Die Evolution der Programmiersprachen
Populäre Programmiersprachen und ihre Unterschiede
Die perfekte Sprache für Programmieranfänger
Das Wichtigste in Kürze
Übung
Kapitel 3: So lernen Sie programmieren
Schritte beim Lernen einer Programmiersprache
Angebote zum Erlernen einer Programmiersprache
Das Wichtigste in Kürze
Kapitel 4: Was sich alles programmieren lässt
Anwendungsentwicklung für Desktop-Computer
Mobile Apps
Programmierung für das Internet
Hardware-Programmierung
Das Wichtigste in Kürze
Übungen
Kapitel 5: Algorithmen erstellen
Spaß mit Zahlen
Mathematische Probleme lösen
Probleme aus dem wahren Leben lösen
Das Wichtigste in Kürze
Übungen
Kapitel 6: Wichtige Konzepte in Programmiersprachen
Datentypen, Variablen und Zuweisungen
Arrays
Operatoren und Ausdrücke
Kontrollfluss
Das Wichtigste in Kürze
Übungen
Kapitel 7: Fortgeschrittene Programmiertechniken
Funktionen und Prozeduren
Objektorientierte Programmierung
Zeigerarithmetik und manuelle Speicherverwaltung
Das Wichtigste in Kürze
Übungen
Teil II: Programmieren mit Java
Kapitel 8: Compiler und Entwicklungsumgebung
Compiler
Entwicklungsumgebungen
Das Wichtigste in Kürze
Kapitel 9: Die ersten Schritte in der Java-Programmierung
Compiler und Entwicklungsumgebung installieren
Das »Hallo Welt«-Programm
Das Wichtigste in Kürze
Kapitel 10: Variablen und Datentypen in Java
Neue Variablen anlegen
Primitive Datentypen
Mit Variablen rechnen
Stolperfallen vermeiden
Werte konvertieren
Zeichen konvertieren
Abkürzungen beim Programmieren nehmen
Arrays
Das Wichtigste in Kürze
Übungen
Kapitel 11: Ablaufsteuerung in Java
Bedingte Ausführung
Schleifen
Mathematische Berechnungen
Das Wichtigste in Kürze
Übungen
Kapitel 12: Objektorientierte Programmierung in Java
Idee der objektorientierten Programmierung
Umsetzung in Java
Methoden und logische Operatoren
Statische Attribute und Methoden
Besonderheiten der Objektorientierung in Java
Zeichenketten als Objekte
Packages
Referenzen und Parameter
Interagierende Objekte
Das Wichtigste in Kürze
Übungen
Projekt
Kapitel 13: Weitere Features von Java
Aufzählungen
Vererbung
Die Basisklasse Object
Objekte vergleichen
Fehler abfangen
Generische Klassen
Anonyme Funktionen
Das Wichtigste in Kürze
Übungen
Kapitel 14: Die Klassenbibliothek von Java
Collections
Mit Streams arbeiten
Nebenläufige Programmierung
Das Wichtigste in Kürze
Übung
Kapitel 15: Grafische Benutzeroberflächen
Benutzeroberflächen für Java-Programme
Ablauf eines GUI-Programms
Eclipse für JavaFX fit machen
Das erste JavaFX-Programm
Eine Benutzeroberfläche erstellen
Die Benutzeroberfläche zum Leben erwecken
Weitere Möglichkeiten zur Erstellung von GUIs
Eine ausführbare Datei erstellen
Das Wichtigste in Kürze
Übungen
Teil III: Programmierung für das Web mit PHP
Kapitel 16: Einführung in HTML
Funktionsweise des World Wide Web
HTML als Dateiformat
Grundlagen von XML
Einfache HTML-Dokumente erstellen
Dynamische Webseiten erstellen
Das Wichtigste in Kürze
Übungen
Kapitel 17: Werkzeuge für die Webprogrammierung
Einen Webserver installieren
Eine Entwicklungsumgebung verwenden
Das Wichtigste in Kürze
Kapitel 18: Einstieg in die PHP-Programmierung
PHP als Skriptsprache
Die Struktur eines PHP-Programms
Unterschiede zu und Gemeinsamkeiten mit Java und Co.
Integrierte Funktionen
Eine Webseite mit PHP programmieren
Das Wichtigste in Kürze
Übungen
Kapitel 19: Datenbankprogrammierung
Was ist eine Datenbank?
Umsetzung mithilfe von SQL
Das Wichtigste in Kürze
Übungen
Kapitel 20: Dynamische Webseiten programmieren
SQL-Befehle in PHP-Skripten verwenden
Eine komplette Webseite erstellen
Dynamische Webseiten in der Praxis
Das Wichtigste in Kürze
Übungen
Teil IV: Werkzeuge für Programmierer
Kapitel 21: Fehler finden und beseitigen
Was ist ein Fehler?
Häufigkeit und Relevanz von Fehlern und Defekten
Fehlerhafte Programmläufe finden
Vom Fehler zum Defekt
Das Wichtigste in Kürze
Kapitel 22: Die Macht des Internets nutzen
Dokumentationen
Im Internet Hilfe finden
Das Wichtigste in Kürze
Kapitel 23: Versionskontrolle
Versionskontrolle – was ist das überhaupt?
Subversion
Das Wichtigste in Kürze
Teil V: Der Top-Ten-Teil
Kapitel 24: (Ungefähr) 10 externe Zusatzbibliotheken für Java
Apache Commons
Google Guava
JFreeChart
Apache Log4j
jsoup
Jackson-Databind
Apache POI
Kapitel 25: (Mehr als) 10 nützliche Webseiten für Programmierer
Die vollständige Referenz der Java-Klassenbibliothek
Die vollständige Referenz der Programmiersprache PHP
Eine vollständige Referenz aller HTML-Elemente
Referenz aller CSS-Befehle
Scene Builder
Die vermutlich größte Online-Community für Programmierfragen
Online-Java-Compiler
Online-PHP-Interpreter
Online-HTML-Editor
Maven hilft
Wenn Sie mal eine Pause brauchen
Stichwortverzeichnis
End User License Agreement
Kapitel 6
Tabelle 6.1: Die logischen Operatoren
Kapitel 19
Tabelle 19.1: Auflistung von Gebrauchtwagen
Tabelle 19.2: Erweiterte Tabelle
Tabelle 19.3: Die überarbeitete Tabelle »gebrauchtwagen«
Tabelle 19.4: Die neue Tabelle »anbieter«
Tabelle 19.5: Bedingungen mithilfe von SQL formulieren
Tabelle 19.6: Einige SQL-Abfragen
Tabelle 19.7: Ergebnisse der Abfragen aus Tabelle 19.6
Tabelle 19.8: Die Datenbanktabelle »auto«
Tabelle 19.9: Die Datenbanktabelle »person«
Tabelle 19.10: Das Ergebnis der Verknüpfung
Kapitel 1
Abbildung 1.1: Mensch vs. Maschine
Kapitel 6
Abbildung 6.1: Flussdiagramm des Fakultät-Algorithmus
Abbildung 6.2: Flussdiagramm einer while-Schleife
Kapitel 7
Abbildung 7.1: Folge von Anweisungen mit Dopplung
Abbildung 7.2: Folge von Anweisungen mit Prozedur
Abbildung 7.3: Flussdiagramm eines Programms mit einer Funktion
Abbildung 7.4: Variablen mit Zeigerarithmetik
Abbildung 7.5: Über einen Zeiger auf Feldinhalte zugreifen
Kapitel 8
Abbildung 8.1: Automatisches Vervollständigen in Eclipse
Abbildung 8.2: Vervollständigen mit Methoden einer Klasse
Abbildung 8.3: Eclipse erkennt fehlerhaften Code
Kapitel 9
Abbildung 9.1: Version auswählen
Abbildung 9.2: Download-Link anklicken
Abbildung 9.3: Installation von Amazon Corretto
Abbildung 9.4: Die Arbeitsoberfläche von Eclipse
Abbildung 9.5: Formatierungen festlegen
Abbildung 9.6: Die Eingabeaufforderung
Abbildung 9.7: Die automatisch generierte Quelltextdatei
Abbildung 9.8: Ausgabe des »Hallo Welt«-Programms
Kapitel 10
Abbildung 10.1: Konsolenausgabe des IntMaxTest-Programms
Abbildung 10.2: Gescheiterte Zuweisung
Kapitel 12
Abbildung 12.1: Paket beim Anlegen einer Klasse festlegen
Abbildung 12.2: Das Spielfeld
Kapitel 13
Abbildung 13.1: Information über eine Ausnahme im Eclipse-Tooltip
Kapitel 14
Abbildung 14.1: Methoden und Attribute einer Klasse erkunden
Abbildung 14.2: Ein Programm mit drei Threads
Kapitel 15
Abbildung 15.1: e(fx)clipse-Plug-in installieren
Abbildung 15.2: »Hallo Welt« als JavaFX-Anwendung
Abbildung 15.4: Die komplette Benutzeroberfläche
Abbildung 15.3: Entwurf der Benutzeroberfläche
Kapitel 16
Abbildung 16.1: Ein formatiertes HTML-Dokument
Kapitel 17
Abbildung 17.1: Das Kontrollzentrum
Abbildung 17.2: Die Startseite des XAMPP-Pakets
Abbildung 17.3: Das »Hallo Welt«-Programm im Webbrowser
Kapitel 18
Abbildung 18.1: Die aktuelle Uhrzeit im Webbrowser
Abbildung 18.2: Webseite mit Formular
Abbildung 18.3: Die fertige Webseite
Kapitel 19
Abbildung 19.1: Die Administrationsoberfläche des Datenbanksystems
Kapitel 20
Abbildung 20.1: Entwurf einer Nachrichten-Webseite
Kapitel 21
Abbildung 21.1: Ansicht der Ergebnisse einer Testklasse
Abbildung 21.2: Ganz links erkennbar: Haltepunkt in Eclipse gesetzt
Abbildung 21.3: Die Debug-Perspektive in Eclipse
Kapitel 23
Abbildung 23.1: Kontextmenü mit neuen Optionen
Abbildung 23.2: Datei ist für die Übertragung vorbereitet.
Abbildung 23.3: Übersicht aller Änderungen im SVN
Abbildung 23.4: SVN Update im Kontextmenü
Kapitel 24
Abbildung 24.1: Ein Beispiel-Diagramm
Cover
Inhaltsverzeichnis
Fangen Sie an zu lesen
1
2
5
6
7
21
22
23
24
25
26
27
29
30
31
32
33
34
35
36
37
38
39
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
447
448
449
450
453
454
455
456
457
458
459
Teil I
IN DIESEM TEIL …
Erfahren Sie, wie Computer funktionieren, was Programmierung ist und welche Möglichkeiten es gibt, programmieren zu lernenErhalten Sie einen Überblick über verschiedene Programmiersprachen sowie grundlegende Konzepte, die in vielen Sprachen vorhanden sindErfahren Sie, was sich heutzutage überhaupt alles (abgesehen von gewöhnlichen Computern) programmieren lässtKapitel 2
IN DIESEM KAPITEL
Variablen als zentrales Element von ProgrammiersprachenBytecode und MaschinencodeAutomatische und manuelle SpeicherverwaltungIn diesem Kapitel werden Sie ein bisschen mehr über Programmiersprachen erfahren. Ich werde Ihnen die grundsätzliche Funktionsweise von Programmiersprachen vorstellen. Danach werde ich Unterschiede zwischen einigen oft verwendeten Programmiersprachen zeigen und Vor- und Nachteile herausarbeiten.
Natürliche Sprachen sind solche wie Deutsch, Englisch, Spanisch oder Klingonisch, die im Laufe der Zeit auf natürlichem Wege entstanden sind und sich immer wieder den veränderten Lebenswelten anpassen. Sie verfügen über einen bestimmten Wortschatz und folgen in den meisten Fällen festgelegten Regeln, mit deren Hilfe einzelne Wörter zu Sätzen kombiniert werden können. Diese Regeln werden Grammatik genannt.
Natürliche Sprachen sind, sowohl was Wortschatz als auch Grammatik angeht, derart umfangreich, dass sie zur Beschreibung von beliebigen, sehr unterschiedlichen Arten von Sachverhalten geeignet sind.
Programmiersprachen sind dagegen künstlich erzeugte Sprachen, die meist nur eine kleine Anzahl an sogenannten Schlüsselwörtern als Wortschatz besitzen. Es gibt eine relativ überschaubare Anzahl an Regeln, wie man diese Schlüsselwörter miteinander zu Code-Konstrukten kombinieren kann. Bei Programmiersprachen spricht man in diesem Zusammenhang für gewöhnlich nicht von Grammatik, sondern von der Syntax.
Ein einzelnes Code-Konstrukt nennt man eine Instruktion (oder auch Anweisung). Durch die Aneinanderreihung von Instruktionen erhält man den sogenannten Quellcode. Anders als bei natürlichen Sprachen kann man den Quellcode nicht zur Beschreibung von beliebigen Sachverhalten verwenden. Er wird in der Regel zur formalen Beschreibung von Algorithmen genutzt. Die Instruktionen des Quellcodes repräsentieren dabei die einzelnen Schritte des Algorithmus.
Programmiersprachen besitzen zusätzliche Elemente, die es in dieser Form in natürlichen Sprachen nicht gibt: Variablen. Variablen sind Platzhalter für beliebige Elemente, zum Beispiel Zahlen, Buchstaben oder Wörter. Beim Anlegen einer Variablen muss man dieser lediglich einen Namen geben. Der Name kann (mit bestimmten Einschränkungen) beliebig gewählt werden, insbesondere muss (und darf) der Name einer Variablen nicht dem gewöhnlichen Wortschatz der Sprache (den Schlüsselwörtern) entstammen.
Sie können sich eine Variable als leere Kiste vorstellen. Diese kann zu jeder Zeit mit einem bestimmten Element gefüllt werden. Bei Bedarf kann das Element später wieder aus dem Platzhalter herausgeholt werden. Außerdem kann es durch ein anderes ersetzt werden.
Variablen sind damit die zentralen Bestandteile von Programmen. Durch sie wird der Quellcode erst lebendig, vielfältig und leistungsstark. Durch unterschiedliche Belegungen der Variablen können verschiedene Durchläufe desselben Programms deutlich voneinander abweichen.
Variablen werden in Programmen ähnlich wie bei Algorithmen dazu verwendet, um zum Beispiel Zwischenergebnisse abzuspeichern. Auch Endergebnisse von Berechnungen werden letztendlich in Variablen ausgeliefert.
Es dreht sich beim Programmieren also alles darum, Variablen anzulegen, zu ändern und wieder auszulesen. Im Programmierer-Jargon sagt man, Variablen werden manipuliert. Jeder einzelne Programmlauf wird durch eine bestimmte Anzahl von Variablen-Manipulationen charakterisiert.
Man spricht deshalb bei vielen Programmiersprachen von imperativer Programmierung. Das bezieht sich auf den grundlegenden Programmierstil: Ein Programm besteht aus einer Reihe von Anweisungen, die dem Computer »befehlen«, was er in welcher Reihenfolge tun soll.
Die weiteren Bestandteile einer Programmiersprache sind Werkzeuge, mit deren Hilfe die Variablen manipuliert werden können. Ganz grob lassen sich diese Werkzeuge in drei Gruppen einteilen:
Konstrukte, mit denen Variablen direkt manipuliert werden können.
Das können zum Beispiel mathematische Funktionen sein, die den Computer veranlassen, (Zahlen-)Variablen zu addieren oder zu subtrahieren.
Aber auch beliebige andere Manipulationen sind möglich. Insbesondere sind die Manipulationen nicht nur auf Zahlen-Variablen beschränkt. Auch Variablen, in denen Zeichen oder Wörter gespeichert werden, sind weit verbreitet und können auf verschiedene Weisen manipuliert werden – zum Beispiel indem zwei Variablen mit Wörtern darin zu einer einzigen zusammengefügt werden.
Konstrukte, mit denen sich Manipulationen von Variablen gruppieren und organisieren lassen.
Durch die Gruppierung von mehreren Manipulationen können diese beispielsweise sehr einfach mehrfach ausgeführt werden. Außerdem ist es mit diesen Konstrukten möglich, eine Liste von Manipulationen beim wiederholten Ausführen zu variieren oder dieselbe Gruppe von Manipulationen auf andere Variablen anzuwenden.
Man spricht dann von strukturierter Programmierung. Diese stellt gewissermaßen eine Erweiterung der imperativen Programmierung dar: Es werden zwar weiterhin Anweisungen angegeben, die der Computer der Reihe nach ausführen soll. Nun kann man aber zum Beispiel zusätzlich festlegen, dass ein Programmabschnitt 50-mal durchlaufen wird. Oder aber, dass ein Programmabschnitt nur dann überhaupt durchlaufen wird, wenn eine bestimmte Bedingung erfüllt ist.
Zu den Konstrukten, die dies in den Programmiersprachen ermöglichen, zählen die sogenannten Kontrollstrukturenund die Funktionen.
Konstrukte, mit denen Programmierer eigene Arten von Variablen anlegen und manipulieren können.
Variablen sind nicht darauf beschränkt, »gewöhnliche« Elemente wie Zahlen, Buchstaben oder Wörter zu speichern. Einige Programmiersprachen bieten Möglichkeiten, mit deren Hilfe Informationen über beliebige Arten von Elementen in Variablen gespeichert werden können. Variablen können dann vom Typ »Buch« oder vom Typ »Tier« sein.
Das nennt man objektorientierte Programmierung: Auf diese Weise können eigene Objekte erschaffen werden, die beliebige, vom Programmierer festgelegte Eigenschaften haben.
Für »Buch«-Objekte könnten diese Eigenschaften zum Beispiel Seitenanzahl und Erscheinungsjahr sein, für »Tier«-Objekte wären die Eigenschaften Größe, Gewicht und Tragezeit denkbar.
Innerhalb von Programmiersprachen wird diese Technik mithilfe der sogenannten Klassen umgesetzt.
Nimmt man all dies zusammen, so lassen sich mit modernen Programmiersprachen Algorithmen auf recht komfortable Weise realisieren.
Ist Ihnen aufgefallen, dass ich zuvor von Programmiersprachen meist im Plural geschrieben habe? Tatsächlich gibt es nicht die eine, universelle Programmiersprache, sondern ziemlich viele. Wie viele genau, weiß vermutlich niemand. Man munkelt, dass es mindestens 1500 sind, aber nichts Genaues weiß man nicht.
Doch warum gibt es überhaupt so viele Programmiersprachen? Zunächst einmal hat dies historische Gründe. Als im 20. Jahrhundert die ersten einfachen Computer entwickelt wurden, konnten diese zunächst nur über den primitiven, umständlichen Maschinencode instruiert werden. Natürlich war schnell klar, dass man komfortablere Möglichkeiten zur Programmierung brauchte. Mehr als eine Forschergruppe machte sich daran, Ideen für erste höhere Programmiersprachen zu finden und umzusetzen.
So geschah es, dass in der zweiten Hälfte des vorigen Jahrhunderts mehrere unabhängig voneinander geschaffene Programmiersprachen das Licht der Welt erblickten. Die Sprache Fortran, die im Jahr 1957 die Marktreife erlangte, gilt als erste höhere Programmiersprache, die von einem größeren Anwenderkreis genutzt wurde.
Dabei blieb es nicht. Zum einen wurden die vorhandenen Programmiersprachen immer weiterentwickelt. Außerdem wurden neue Programmiersprachen geschaffen, die teilweise von den vorhandenen Sprachen inspiriert wurden.
So entstand im Laufe der Zeit eine Vielzahl an unterschiedlichen Programmiersprachen. Neben öffentlich verfügbaren Sprachen entstanden auch private, die zum Beispiel von Firmen entwickelt und extra auf deren Bedürfnisse zugeschnitten wurden. Ein Beispiel für eine solche proprietäre Programmiersprache ist das von SAP entwickelte ABAP.
Die heute populären Programmiersprachen sind teilweise recht jung, Microsofts C# beispielsweise wurde erst im Jahr 2001 veröffentlicht. Im Vergleich zu den frühen Programmiersprachen sind die heute am häufigsten verwendeten sehr komfortabel und nehmen dem Programmierer viele Aufgaben ab.
Auch heute noch sind die Sprachen einem lebhaften Wandel unterworfen. Oft werden neue Funktionalitäten in vorhandene Sprachen eingefügt, die das Programmieren noch komfortabler machen sollen oder gänzlich neue Möglichkeiten eröffnen.
So haben sich die populären Programmiersprachen teilweise schon recht deutlich aneinander angeglichen. Wurde eine Sprache mit einem neuen, nützlichen Feature erweitert, wird dieses nicht selten auch in andere Sprachen übernommen. Für Sie als Programmieranfänger birgt dies einen gewaltigen Vorteil: Kennen Sie erst einmal eine Programmiersprache, wird es Ihnen sehr viel leichter fallen, weitere zu erlernen. Bestimmte Grundkonzepte sind in den meisten Sprachen enthalten.
In diesem Buch soll es weder um (vergleichsweise) uralte Programmiersprachen gehen, die heute kaum mehr eingesetzt werden, noch um Randgruppen-Sprachen, die keine weite Verbreitung gefunden haben. Stattdessen möchten Sie sicher mehr über aktuelle Programmiersprachen lernen, die auch tatsächlich im großen Stil verwendet werden. Dadurch schrumpft die Liste der wirklich relevanten Sprachen sehr, sodass gerade einmal eine zweistellige Anzahl übrig bleibt.
Für die Entwicklung von gewöhnlichen Anwendungen für Desktop-Computer werden die Sprachen C, C++, Java, Python und C# am häufigsten verwendet. Die Syntax dieser Sprachen ist recht ähnlich. Das heißt, viele Konzepte und Befehle sind in diesen Sprachen komplett deckungsgleich enthalten. Ich werde mich daher darauf konzentrieren, einige wichtige Unterschiede zwischen diesen Sprachen darzulegen.
In Kapitel 1 habe ich den groben Ablauf der Kommunikation mit dem Rechner skizziert: Der vom Programmierer geschriebene Quellcode wird mittels eines Compilers in den Maschinencode übersetzt, der vom Rechner ausgeführt werden kann. Das gilt so aber nicht für alle Programmiersprachen, in der Realität existieren einige Variationen davon.
Das Problem bei dieser Vorgehensweise ist nämlich, dass es den universellen Maschinencode gar nicht gibt, sondern dass unterschiedliche Rechner unterschiedliche Arten von Maschinencode verarbeiten. Der Maschinencode eines Windows-Rechners kann zum Beispiel nicht auf einem Linux-Rechner ausgeführt werden und umgekehrt. Man sagt deshalb, dass der Maschinencode plattformspezifisch ist.
Bei manchen Sprachen wird der Quelltext daher nicht direkt in den plattformspezifischen Maschinencode übersetzt, sondern es wird eine zusätzliche Zwischenstufe geschaffen. Diese wird meist als Bytecode bezeichnet. Ein vom Programmierer geschriebener Quelltext wird dann für gewöhnlich zunächst mal in den Bytecode übersetzt.
Der Bytecode ist plattformunabhängig. Daher kann man den Bytecode, den man auf einem Windows-Rechner erzeugt hat, auch auf anderen Plattformen nutzen, also zum Beispiel unter Linux oder Macintosh.
Um den Bytecode auszuführen, benötigt man dann aber noch ein zusätzliches Werkzeug: Jeder Rechner kann ja nur den plattformspezifischen Maschinencode ausführen und der Bytecode liegt in einer plattformunabhängigen Form vor. Daher muss der Bytecode je nach Plattform, auf der er ausgeführt werden soll, in den entsprechenden Maschinencode transformiert werden.
Meist wird dafür ein sogenannter Interpreter genutzt. Der Interpreter wandelt den Bytecode in den Maschinencode um und führt ihn in der Regel auch direkt aus. Das Programm wird also nicht im Maschinencode gespeichert, sondern der Transformationsschritt vom Bytecode zum Maschinencode wird jedes Mal bei der Ausführung des Programms erneut ausgeführt.
Der gesamte Ablauf der Kommunikation mit dem Rechner gestaltet sich in diesem Fall also wie folgt:
Der Programmierer verfasst den Quelltext in einer Programmiersprache.
Der Quelltext wird mithilfe eines Compilers in einen plattformunabhängigen Bytecode transformiert.
Der Bytecode kann auf unterschiedliche Plattformen verteilt werden.
Es wird ein plattformspezifischer Interpreter genutzt, um den Bytecode in den plattformspezifischen Maschinencode umzuwandeln und ihn dann direkt auszuführen.
Bei dieser Art der Programmerzeugung wird also neben dem Compiler noch ein zusätzliches Werkzeug benötigt: der Interpreter. Da auch der Interpreter (ebenso wie der Compiler) für gewöhnlich vom Herausgeber der Programmiersprache bereitgestellt wird, ändert sich für den Programmierer zunächst einmal nicht viel. Dennoch hat diese abgewandelte Art der Übersetzung sowohl Vorteile als auch Nachteile gegenüber dem traditionellen Verfahren. Zunächst die Vorteile:
Die Erstellung von plattformunabhängigen Programmen wird erleichtert.
Leider gibt es keine hundertprozentige Sicherheit, dass das Programm auf allen Plattformen fehlerfrei ausgeführt wird. In der Realität sollte man dies immer gründlich testen und wenn nötig Anpassungen vornehmen.
Komponenten, die in verschiedenen Programmiersprachen geschrieben wurden, können zu einem einzigen Programm zusammengefügt werden.
Das ist insbesondere ein Vorteil auf Microsofts Software- und Programmierplattform .NET.
Die wichtigsten .NET-Sprachen sind C# und Visual Basic. Da der Bytecode, in den der Quellcode beider Sprachen umgewandelt wird, für beide Sprachen identisch ist, können Programme dieser Sprachen beliebig miteinander kombiniert werden.
Es gibt aber auch Nachteile, die die Bytecode-Kompilierung mit sich bringt:
Programme, die direkt in Maschinencode übersetzt wurden, werden potenziell schneller ausgeführt als Programme, die nur als Bytecode vorliegen.
Der Rechner selbst kann nur Maschinencode ausführen. Wenn ein Programm nur als Bytecode vorliegt und von einem Interpreter ausgeführt wird, muss dieser während der Ausführung jede Bytecode-Instruktion in Maschinencode-Instruktionen umwandeln. Daher ist die Zwischenschaltung eines Interpreters grundsätzlich etwas langsamer als die direkte Maschinencode-Ausführung.
Als Abwandlung davon werden Bytecode-Programme manchmal auch gleich nach dem Start komplett in Maschinencode übersetzt. In diesem Fall dauert dann lediglich der Programmstart etwas länger, danach besteht aber kein Geschwindigkeitsnachteil mehr.
Die Interpreter für die populären Programmiersprachen wurden im Laufe der Zeit immer weiter optimiert, sodass der Geschwindigkeitsnachteil heute bei vielen Programmen nur noch sehr klein ist.
Programme, die im Bytecode vorliegen, können leichter dekompiliert werden als Maschinencode-Programme.
Spätestens wenn Sie mit Ihren selbst geschriebenen Programmen Geld verdienen möchten, werden Sie daran interessiert sein, Mechanismen in die Programme einzubauen, die sicherstellen, dass nur diejenigen, die auch dafür zahlen, die Programme nutzen und weiterentwickeln können.
