# Übung 2: Programmierparadigmen (03.11.2023) ## Programmiersprachen: ### Java * Objekt orientiert, unterstützt auch imperative und funktionale Programmierung. * Klassenbasiert * Zugriff wird klar definiert * Vererbung/Polymorphismus * Strikt typisiert. * Ähnlichkeiten zu C++ * Standard Bibliotheken und Frameworks. * Langsamerer Start im Vergleich zu kompilierten Sprachen. * Funktionale Anteile seit neueren Java-Versionen * Anwendung: Web-Applikationen, Desktop-Anwendungen ### C * Imperativ, strukturiert. * Protedural * Statisch typisiert * Direkter Spreicherzugriff * Nutzung auf ziemlich allen Systemen * Fehlende abstrakte Konzepte im Vergleich zu moderneren Sprachen. * Manuelle Verwaltung des Speichers erforderlich. * Anwendung: Hardwarenahe Programmierung, Spielenentwicklung ### Python * Multiparadigma (Objektorientiert, Imperativ, Funktional). * Dynamisch typisiert. * Klare und lesbare Syntax. * Große Community und zahlreiche Bibliotheken. * Geringere Leistung im Vergleich zu kompilierten Sprachen. * Begrenzt in Echtzeitanwendungen aufgrund der Garbage Collection. * Anwendung: KI und maschinelles Lernen, Automatisierung und Skripting ### Go * Cross Platform Compilation * Imperativ / OOP aber keine Klassen / Vererbung. * Nebenläufig, kompiliert. * Einfach / lesbar * Effizient * Statisch typisiert. * Leistung vergleichbar mit C/C++ bei einfacherer Syntax. * Native Nebenläufigkeit mit Goroutinen und Kanälen. * Weniger Standardbibliotheken im Vergleich zu älteren Sprachen. * Weniger verbreitet in Unternehmen im Vergleich zu Java. * Anwendung: Cloud-basierte Anwendungen, Netzwerkanwendungen. ### Javascript * Multiparadigma (hauptsächlich imperativ und objektorientiert). * Dynamisch typisiert. * Einfach zu erlernen und schnelle Iteration. * Typisierungsprobleme können in größeren Projekten auftreten. * Keine natürliche Unterstützung für nebenläufige Programmierung. * Anwendung: Webentwicklung und Client-Seite. ### Typescript * Multiparadigma (basiert auf JavaScript, fügt statische Typen hinzu). * Statisch typisiert (optional dynamisch). * Fügt statische Typisierung zu JavaScript hinzu, verbessert die Robustheit. * Kompatibel mit dem vorhandenen JavaScript-Ökosystem. * Höhere Lernkurve für diejenigen, die nur mit JavaScript vertraut sind. * Erhöhte Komplexität der Entwicklung aufgrund der Hinzufügung von Typen. * Anwendung: Webentwicklung, Serverseitige Entwicklung. ## Weitere Programmierprinzipien: ### Logische Programmierung (LP) * Definition: Programmierung basierend auf mathematischer Logik. * Beispiel: Prolog. * Ursprung: Entwickelt für die künstliche Intelligenz. * Vorteile: * Natürliche Repräsentation von Wissen. * Deutliche Trennung von Daten und Prozess. * Nachteile: * Performanceprobleme bei großen Datenmengen. * Komplexität für Anfänger. ### Reaktive Programmierung (RP) * Definition: Manipulation und Verbreitung von Zustandsänderungen. * Beispiele: RxJava, React.js. * Ursprung: Entwickelt für ereignisgesteuerte Systeme. * Vorteile: * Schnelle Reaktion auf Zustandsänderungen. * Vereinfachte Handhabung von asynchronen Operationen. * Nachteile: * Komplexität bei der Verfolgung von Zustandsänderungen. * Lernkurve für Entwickler. ### Agentenorientierte Programmierung (AOP) * Definition: Design von autonom handelnden Softwareagenten. * Beispiele: Robotersteuerung, Multi-Agenten-Systeme. * Ursprung: Forschung im Bereich der Künstlichen Intelligenz. * Vorteile: * Autonome Entscheidungsfindung. * Skalierbarkeit durch verteilte Agenten. * Nachteile: * Komplexität in der Agenteninteraktion. * Schwierigkeiten bei der Koordination großer Agentenmengen.