C#.NET * C++ * JAVASCRIPT * PYTHON * DIVERSES
XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT



C#.NET / C#.NET Grundlagen / Grundlagen der Programmierung

Grundlagen der Programmierung

Grundlagen der Programmierung

➪ Es gibt mehrere Hundert Programmiersprachen, aber Ihr PC versteht letztlich nur eine: den Maschinencode.

Auf dieser Seite:

"Generationen" der Programmiersprachen

5. Generation Künstliche Intelligenz
4. Generation Funktionale deklarative Sprachen: SQL, XML, ...
3. Generation Problemorientierte Sprachen: C / C++, Java, C#.NET, ...
2. Generation Assembler
1. Generation Maschinencode

Anmerkungen

Ich habe etwas Mühe mit der häufig dargestellten Einteilung in verschiedene Generationen von Programmiersprachen. Die Einteilung ist recht willkürlich und keineswegs systematisch. Sie erweckt den oberflächlichen, fälschlichen Eindruck, dass "frühere" Generationen hoffnungslos "veraltet" sind, dass sich eine nähere Beschäftigung damit nicht mehr lohnt.

Die Realität zeigt aus meiner Sicht ein etwas anderes Bild: Obwohl sie durchaus leistungsfähig sind, werden die meisten der mehrere Hundert zählenden Sprachen nicht oder zu wenig nachgefragt. Trotz des vielfach propagierten sind Tausende erfahrene Programmierer arbeitslos, die lediglich Kenntnisse in einer sehr wenig nachgefragten Sprache aufzuweisen haben. Hinzu kommen die häufigen Jobverlagerungen ins kostengünstige Ausland, wenn die Programmierarbeit am Standort D zu teuer wird.

Tatsächlich besitzen z.B. etliche Sprachen, die ich der 3. Generation zuordnen würde, leistungsfähige Schnittstellen zu den Sprachen der 4. Generation (ja, sie sind teilweise sogar zwingende Voraussetzung, dass die Sprachen der 4. Generation überhaupt laufen). Ebenso werden die scheinbar "veralteten" (so zumindest der oberflächliche erste Eindruck) Sprachen nachhaltig weiter entwickelt, sie sind wesentliche Meilensteine für die Entwicklung der künstlichen Intelligenz.

Wikipedia versucht eine zeitliche Einteilung

"1. Generation": Maschinensprachen

Der interne Prozessor kann 0/1-Werte extrem schnell addieren und vergleichen. Nehmen Sie als Beispiel die Addition der beiden Zahlen 3 und 5. Beisde Wete werden in das duale Zahlensystem übertragen; hier findet die Berechnung statt.

3 0011
5 0101
8 1000

Bei der Subtraktion fängt die "Trickserei" schon an:

8 1000
3 Komplement 1100
Übertrag 0001
5 0101

Maschinensprachen (gemeint sind Sprachen zur maschinennahen Programmierung) beruhen auf dem Binärcode: nummerisch verschlüsselten Befehlen, die auf den jeweiligen Maschinen laufen. Vorteil: zeitkritische Anwendungen. Nachteil: die Programmierung und deren Wartbarkeit ist äußerst zeitaufwendig und damit teuer. Die ersten Maschinensprachen wurden ab etwa 1950 eingesetzt.

"2. Generation": Assembler

Ein Assembler bietet eine erste systematische Annäherung an menschliche Denkweise in Form sogenannter symbolischer (z.B. für Adressierung) oder auch modularisierter (z.B. für Sprunganweisungen) Mnemonics. Makroprozessoren zerlegen den Assemblercode in Maschinencode: auch eine teilweise Zerlegung ist möglich, die später über sog. Binder wieder zusammengesetzt werden. Vorteil: immer noch maschinennnah (aber nicht mehr direkt ausführbar!), sehr gut auch hier für zeitkritische Anwendungen. Nachteile: die Programmierung und deren Wartbarkeit hängt immer noch von der Hardware ab, ist äußerst zeitaufwendig und damit teuer.

Siehe https://de.wikipedia.org/wiki/Maschinensprache

"3. Generation": Prozedurale (höhere, problemorientierte) Sprachen

Die Sprachen der sogenannten "3. Generation" bieten eine wesentlich erweiterte Annährung an die menschliche Denkweise. Die Befehle der Maschinensprachen werden systematisch in symbolische Befehle übertragen, die in der Regel der englischen Sprache entstammen (if / else, while, ...) und in selbst deklarierten Funktionen besser zusammengefasst werden können. Vorteile: erheblich verkürzte Entwicklungszeit, erheblich leichtere Wartbarkeit, oft hardwareunabhängig. Nachteile: höherer Speicherbedarf, mehr Maschinenzeit.

Die Übersetzung in die Maschinensprache läuft in der Regel (im Rahmen des Betriebssystems) über einen Interpreter oder einen Compiler.

"3. Generation": Objektorientierte Sprachen

Hier wird die systematische Einteilung schon willkürlich und uneinheitlich. Einige Autoren rechnen die objektorientierten Sprachen den Sprachen der 3. Generation zu, andere den Sprachen der 5. Generation. Das liegt auch daran, dass der Begriff der Objektorientierung keineswegs zweifelsfrei klar ist.

Einige objektorientierte Sprachen bieten ein Mix aus rein prozeduralen Sprachelementen und einem erweiterten Konzept, das auf den Prinzipien der Datenkapselung, Vererbung und Polymorphie beruht. Ein gutes Beispiel für den Übergang bietet C++, das Sprachelemente aus C mit den beschriebenen Konzepten der Objektorientierung verbindet; die Ausführung beruht auf einem sogenannten 3-Stufen-Compiler: Präprozessor, Compiler, Binder/Linker.

Andere objektorientierte Sprachen (Java, C#.NET, ...) beruhen streng auf diesem Prinzip (die rein prozedurale Programmierung ist theoretisch konsequent ausgeschlossen, wird jedoch praktisch oft über sogenannte static-Klassenmethoden genutzt).

Demnach ist ein Objekt grundsätzlich an eine Klasse gebunden (das Objekt ist eine Instanz der jeweiligen Klasse). Die Klasse bildet einen allgemeinen Bauplan für beliebig viele Objekte. Jedes Objekt hat nur das aufzuweisen, was in der Klasse beschrieben ist: Nicht mehr und nicht weniger. Was in der Klasse (resp. deren Basisklassen) nicht definiert ist, kann das Objekt nicht liefern.

Andere objektorientierte Sprachen sehen dagegen in fast allem ein Objekt - und zwar ohne zwingende Bindung an eine spezielle Klasse. Beispiele: JavaScript, Python.

"4. Generation": Deklarativ-funktionale Sprachen

Bei den Sprachen der sogenannten "4. Generation" geht es im Kern um eine deklarative Anweisung, WAS gemacht werden soll. Sie beinhalten im Wesentlichen einen m.o.w. standardisierten Befehlssatz, der ausgeführt werden soll. Das WIE der Ausführung wird Sprachen anderer Generationen übertragen. Beispiele: Markup-Sprachen (HTML, XML), SQL.

Umgekehrt weisen zahlreiche Programmiersprachen anderer Ordnung leistungsfähige, in der Praxis oft unverzichtbare Schnittstellen zu den deklarativ-funktionalen Sprachen auf. Beispiele:

Den häufig behaupteten Nachteil des Performance-Verlustes der deklarativ-funktionalen Sprachen kann ich nicht nachvollziehen. Es kommt darauf an, welche hardwarenähere Logik die Anweisung letztlich ausführt.

"5. Generation": Künstliche Intelligenz

Bei den Sprachen der sogenannten "5. Generation" geht es um die deutlich erweiterte Annäherung und Nutzung der menschlichen Sprache, um maschinelles Lernen. Eine klare Trennung in Sprachen der 5. Generation gegenüber anderer Sprachgenerationen erweist sich als schwierig, weil z.B. Sprachen der 3. Generation eine nachhaltige Weiterentwicklung erfahren, um maschinelles Lernen zu ermöglichen. Beispiel: Python.

Das maschinelle Lernen beruht häufig auf der Analyse sehr großer Datenmengen mithilfe mathematischer Funktionen, die sich über die automatische Fehlerreduktion via Parameterkorrekturen laufend optinieren. Das funktioniert (zumindest teilweise) recht gut und verdient grundsätzlich Unterstützung.

Eine bedeutende Herausforderung liegt noch in der Behandlung jener zahlreichen Ausnahmefälle, die sich nicht aus den verfügbaren Daten ableiten lassen. Das optische und/oder akustische Erkennen realer Situationen, die von der verfügbaren Datenlage abweichen (speziell: nicht erwartetem (z.B. irrationalem) Verhalten), ist noch nicht durchweg gelöst.

Die professionelle Implementierung derartiger Algorithmen und deren laufende Wartung ist jedoch mit einem sehr hohen Zeit- und Kostenaufwand verbunden. Die (menschliche) Implementierung und Pflege einfacher, herkömmlicher Algorithmen ist dagegen erheblich kostengünstiger.

Da der Begriff künstliche Intelligenz sehr vage und schwammig definiert ist, sich andererseits aber einer hohen Nachfrage erfreut, wird so manche herkömmliche, teils simple oder gar fehleranfällige Software als KI dargestellt und verkauft. Für die Auswertung von Statistikdaten benötigen Sie keine Roboterintelligenz. Auch die programmgesteuerte Abbildung von Experten-Knowhow ist schwierig, weil nicht jeder Experte die Updates pflegt.

Das geht so weit, dass hinter der "automatischen" Softwareoptimierung für maschinelles Lernen tatsächlich Menschen aus Fleisch und Blut, stehen, die die entsprechenden Fälle manuell korrigieren. Durch deren Auslagerung in traditionelle Billiglohnländer wie Indien oder China wird das nochmal billiger.

Das gilt auch für sogenannte Chatbots: Statt hochprofessioneller, teurer und wartungsintensiver "selbstlernender" Software wird die tatsächliche Chatkommunikation mitunter von Menschen erledigt, die darin ihren Job gefunden haben.

Derlei (keineswegs seltene) Fälle verbessern nicht den Ruf künstlicher Intelligenz bzw. maschinellen Lernens.

wg / 3. Oktober 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/programmierung_Grundlagen.html