Grin logo
de en es fr
Shop
GRIN Website
Publicación mundial de textos académicos
Go to shop › Ciencias de la computación - Software

Compliergestütztes Refactoring in der Softwareentwicklung

Wie Compiler den Programmierer unterstützen können Clean Code zu schreiben

Título: Compliergestütztes Refactoring in der Softwareentwicklung

Trabajo Escrito , 2024 , 28 Páginas , Calificación: 1,0

Autor:in: Johannes Pielmeier (Autor)

Ciencias de la computación - Software
Extracto de texto & Detalles   Leer eBook
Resumen Extracto de texto Detalles

Moderne Softwarelösungen werden immer größer und komplizierter. Mit steigender Komplexität wächst auch die Herausforderung, nicht nur funktionierende, sondern auch robuste und gut strukturierte Software zu schreiben. Umso wichtiger ist es, Werkzeuge zu haben, die den Entwickler bei dieser Aufgabe unterstützen. Eines dieser Tools ist der Compiler. Moderne Compiler können nicht nur Code in maschinenlesbaren Text übersetzen, sondern verfügen auch über zahlreiche weitere Funktionen, die den Programmierer bei seiner Arbeit unterstützen. In dieser Arbeit soll am Beispiel des Kotlin-Compilers untersucht werden, ob und wie moderne Compiler es schaffen, den Programmierer dabei zu unterstützen, robusteren und fehlerfreieren Code zu produzieren. Es soll gezeigt werden, dass Compiler dazu in der Lage sind. Laufzeitfehler in Softwareprojekten zu minimieren und dafür zu sorgen, dass Code wartbar bleibt. Zudem soll auf die Stärken und Schwächen von Compilern hingewiesen werden und aufgezeigt werden, wie Programmierer Compiler optimal einsetzen können.

Die vorliegende Arbeit untersucht die Fragestellung, inwiefern Compiler dazu beitragen können, dass Programmierer Clean Code schreiben. Des Weiteren wird dargelegt, welche Maßnahmen zu ergreifen sind, um eine optimale Zusammenarbeit mit dem Compiler zu gewährleisten.

Extracto


Inhaltsverzeichnis

  • 1 Einleitung
  • 2 Compiler Grundwissen
    • 2.1 Was ist ein Compiler?
    • 2.2 Kompilierzeitfehler versus Laufzeitfehler
  • 3 Wie der Compiler helfen kann
    • 3.1 Kontrollflussgraph
    • 3.2 Erreichbarkeitsanalyse
    • 3.3 Compiler garantiert return-Wert
    • 3.4 Initialisierung von Variablen
      • 3.4.1 Initialisierung von Variablen bei if- und when-Bedingungen
      • 3.4.2 Initialisierung von Klassenvariablen
    • 3.5 Typensysteme
      • 3.5.1 Starke und schwache Typensysteme
      • 3.5.2 Typensysteme zur Eigenschaftenkontrolle
    • 3.6 Compiler als TODO-Liste
  • 4 Schwächen des Compilers
    • 4.1 Fehler mit numerischen Datentypen
      • 4.1.1 Over-Underflow
      • 4.1.2 Arithmetische Fehler
    • 4.2 Arraygrenzen
    • 4.3 Probleme mit Threads
      • 4.3.1 Raceconditions
      • 4.3.2 Deadlocks
      • 4.3.3 Starving Threads
  • 5 What not TODO
    • 5.1 Dynamische Datentypen
    • 5.2 Casts
      • 5.2.1 Implizites Casting
      • 5.2.2 Explizites Casting
    • 5.3 Laufzeittypen
    • 5.4 Default-Werte
    • 5.5 Warnungen ignorieren
      • 5.5.1 Die Probleme
      • 5.5.2 Warnungen loswerden
  • 6 Fazit

Zielsetzung & Themen

Die vorliegende Arbeit untersucht am Beispiel des Kotlin-Compilers, inwiefern moderne Compiler Softwareentwickler dabei unterstützen können, robusten, fehlerfreien und wartbaren Code zu erstellen. Sie beleuchtet, wie Compiler Laufzeitfehler minimieren und optimal eingesetzt werden können, und zeigt deren Stärken sowie Schwächen auf.

  • Grundlagen und Funktionsweise von Compilern.
  • Unterstützung durch Compiler zur Vermeidung von Fehlern (z.B. Erreichbarkeit, Typensysteme).
  • Grenzen und Schwächen moderner Compiler (z.B. Threads, numerische Datentypen).
  • Best Practices und zu vermeidende Vorgehensweisen im Umgang mit Compilern.
  • Minimierung von Laufzeitfehlern und Verbesserung der Code-Wartbarkeit.
  • Optimaler Einsatz von Compilern und ergänzenden Analysetools.

Auszug aus dem Buch

Compiler Grundwissen

Bevor tiefer in die Materie der Compilerunterstützung eingestiegen wird, soll zunächst das Grundkonzept Compiler ein wenig genauer erläutert werden, um nachfolgende Kapitel besser verstehen zu können.

2.1 Was ist ein Compiler?

Allgemein gehalten ist ein Compiler ein Programm, welches in einer bestimmten Program- miersprache geschriebene Programme in eine andere Programmiersprache übersetzt. Oft handelt es sich bei ersterem um Code, der in einer Hochsprache wie C++ oder Kotlin ge- schrieben wurde. Dieser wird dann in eine maschinennahe Sprache übersetzt, so dass der Computer den Code verstehen kann (vgl. [3] S. V). Bei der Übersetzung des Programmes durchläuft der Compiler verschiedene Schritte. Der erste Schritt ist die sogenannte lexi- kalische Analyse. Hierbei unterteilt der Compiler den eingehenden Code in 'Tokens' wie zum Beispiel Variablen, Operatoren oder Keywörter (vgl. [3] S. VI). Im zweiten Schritt der syntaktischen Analyse wird geprüft, ob der Code den von der Programmiersprache vorgegebenen Syntaxregeln entspricht. Hierbei wird ein Syntaxbaum erstellt, der dann als Input für die semantische Analyse verwendet wird (vgl. [3] S. VI). In der semantischen Analyse überprüft der Compiler die semantischen Zusammenhänge des Codes. Beispiels- weise wird hier geprüft, ob Variablen, deren Werte in einer Operation verwendet werden, vorher initialisiert wurden (vgl. [3] S. VI). Es folgen weitere Phasen des Compilers, die dazu dienen, den Code schlussendlich in Maschinencode zu übersetzen (vgl. [3] S. VII).

Für jede Programmiersprache gibt es verschiedene Compiler, die genutzt werden können. So ist es für Kotlin zum Beispiel IntelliJ IDEA, der in dieser Arbeit genutzt wird, und für JavaScript WebStorm oder Visual Studio Code (vgl. [4]). Jeder Compiler hat seine eigene Implementierung mit eigenen Regeln. Es hängt stark von der Wahl des Compilers ab, welche Regeln in der semantischen und syntaktischen Analyse angewendet werden. Während ein JavaScript Compiler es ignoriert, wenn versucht wird einen String und ein Integer zu addieren, lässt der Kotlin Compiler eine solche Operation nicht zu. Aus diesem Grund sind auch nicht alle in dieser Arbeit aufgezeigten Beispiele auf alle Programmier- sprachen und Compiler anwendbar. Die meisten grundlegenden Konzepte bleiben jedoch gleich.

2.2 Kompilierzeitfehler versus Laufzeitfehler

Bei Kompilierzeitfehlern beziehungsweise Kompilierzeitwarnungen handelt es sich um Feh- ler und Warnungen, die der Compiler während des Kompiliervorgangs wirft. Ein Kom- pilierzeitfehler verhindert ein Ausführen des geschriebenen Programms. Der Compiler zwingt den Programmierer diesen Fehler zu beseitigen. Während dieses Verhalten für den Programierer im ersten Moment lästig erscheint, hilft es dabei Fehlverhalten des Programms zu minimieren und besseren und vor allem robusteren Code zu produzieren. Laufzeitfehler hingegen treten nach dem Kompilieren und während der Laufzeit des Pro- gramms auf. Diese können entweder zu unterwünschtem oder verwirrendem Verhalten der Software führen oder im schlimmsten Fall sogar zum Absturz des Programms. Die Auf- gabe eines Programmierers sollte darin bestehen, die Laufzeitfehler durch möglichst gutes Programmieren auf ein Minimum zu reduzieren und so eine möglichst fehlerfreie Software zu erzeugen.

Zusammenfassung der Kapitel

1 Einleitung: Diese Arbeit befasst sich mit der Rolle moderner Compiler bei der Entwicklung komplexer, robuster und wartbarer Software. Es wird untersucht, wie Compiler Entwickler unterstützen, Laufzeitfehler zu minimieren, und deren optimale Nutzung sowie Grenzen aufgezeigt.

2 Compiler Grundwissen: Dieses Kapitel erläutert die grundlegenden Konzepte eines Compilers, seine Funktionsweise durch verschiedene Analysephasen und den Unterschied zwischen Kompilierzeit- und Laufzeitfehlern.

3 Wie der Compiler helfen kann: Hier wird detailliert dargestellt, wie Compiler den Programmierer durch Funktionen wie Kontrollflussgraphanalyse, Erreichbarkeitsanalyse, Garantie von Rückgabewerten, Variableninitialisierung und Typensysteme dabei unterstützen, besseren Code zu schreiben.

4 Schwächen des Compilers: Dieses Kapitel beleuchtet die Grenzen moderner Compiler, insbesondere bei der Erkennung von Fehlern in numerischen Datentypen, Arraygrenzen und komplexen Thread-Problemen wie Raceconditions, Deadlocks und Starving Threads.

5 What not TODO: Es werden Verhaltensweisen und Programmierpraktiken beschrieben, die vermieden werden sollten, da sie die Unterstützung durch den Compiler behindern oder deaktivieren, wie die Verwendung dynamischer Datentypen, unbedachtes Casting und das Ignorieren von Warnungen.

6 Fazit: Zusammenfassend wird festgehalten, dass Compiler ein unverzichtbares Werkzeug für robusten und wartbaren Code sind, jedoch an Grenzen stoßen. Diese Schwachstellen können durch den Einsatz zusätzlicher Analysetools ausgeglichen werden.

Schlüsselwörter

Compiler, Softwareentwicklung, Refactoring, Kompilierzeitfehler, Laufzeitfehler, Typensysteme, Kontrollflussgraph, Erreichbarkeitsanalyse, Variableninitialisierung, Thread-Probleme, Raceconditions, Deadlocks, Starvation, dynamische Datentypen, Codequalität.

Häufig gestellte Fragen

Worum geht es in dieser Arbeit grundsätzlich?

Diese Arbeit untersucht, wie moderne Compiler Entwickler beim Schreiben von robustem, fehlerfreiem und wartbarem Softwarecode unterstützen, und beleuchtet dabei sowohl ihre Stärken als auch ihre Schwächen.

Was sind die zentralen Themenfelder?

Die zentralen Themenfelder umfassen die Grundlagen von Compilern, deren unterstützende Funktionen zur Fehlervermeidung, ihre Grenzen bei komplexen Problemen wie Threading und numerischen Fehlern, sowie bewährte Praktiken und häufige Fallstricke im Umgang mit ihnen.

Was ist das primäre Ziel oder die Forschungsfrage?

Das primäre Ziel ist es, exemplarisch am Kotlin-Compiler herauszustellen, ob und wie moderne Compiler Programmierer dabei unterstützen, robusteren und fehlerfreieren Code zu produzieren, Laufzeitfehler zu minimieren und Code wartbar zu halten.

Welche wissenschaftliche Methode wird verwendet?

Die Arbeit basiert auf einer exemplarischen Analyse am Kotlin-Compiler und nutzt Konzepte der Programmiersprachen und Softwareentwicklung, untermauert durch Referenzen aus der Fachliteratur.

Was wird im Hauptteil behandelt?

Der Hauptteil behandelt die grundlegenden Funktionen von Compilern, ihre Fähigkeit, bei der Code-Qualität und Fehlervermeidung zu helfen, sowie ihre Schwächen, insbesondere bei komplexen concurrency- oder numerischen Problemen. Zudem werden Best Practices im Umgang mit Compilern diskutiert.

Welche Schlüsselwörter charakterisieren die Arbeit?

Die Arbeit wird durch Schlüsselwörter wie Compiler, Softwareentwicklung, Refactoring, Kompilierzeitfehler, Laufzeitfehler, Typensysteme, Raceconditions und Codequalität charakterisiert.

Wie hilft ein Compiler bei der Vermeidung von uninitialisierten Variablen?

Der Compiler prüft konservativ, ob jede mögliche Ausführungspfad eines Programms eine Variable vor ihrem ersten Zugriff initialisiert. Dies verhindert Laufzeitfehler, die durch den Zugriff auf undefinierte Werte entstehen könnten, auch wenn dies manchmal zu Fehlern führt, die semantisch gesehen nicht auftreten würden.

Welche Rolle spielen Typensysteme bei der Arbeit des Compilers?

Typensysteme sind eine Kernstärke von Compilern, da sie sicherstellen, dass Variablen und Objekte nur mit den für ihren Datentyp definierten Funktionen und Operationen verwendet werden. Starke Typensysteme erkennen die meisten Typfehler bereits zur Kompilierzeit, was die Anzahl der Laufzeitfehler reduziert.

Warum sollte man Compiler-Warnungen nicht ignorieren?

Das Ignorieren von Warnungen kann zur "Alarmmüdigkeit" führen, die Code-Unübersichtlichkeit erhöht und potenzielle Laufzeitfehler oder Sicherheitslücken übersehen lässt. Warnungen, z.B. bei deprecated Funktionen, weisen auf zukünftige Probleme oder unsichere Praktiken hin, die ernsthafte Auswirkungen haben können.

Welche zusätzlichen Tools können Compiler-Schwächen im Bereich Codequalität und Sicherheit ausgleichen?

Zusätzliche Analysetools wie IBM Security oder SonarQube können eingesetzt werden, um die Grenzen von Compilern bei der Erkennung von potenziellen Sicherheitslücken (z.B. in Java-Code) oder zur Verbesserung der allgemeinen Codequalität zu überwinden und somit Schwachstellen zu beseitigen, die Compiler nicht abfangen.

Final del extracto de 28 páginas  - subir

Detalles

Título
Compliergestütztes Refactoring in der Softwareentwicklung
Subtítulo
Wie Compiler den Programmierer unterstützen können Clean Code zu schreiben
Universidad
University of Applied Sciences Kempten
Calificación
1,0
Autor
Johannes Pielmeier (Autor)
Año de publicación
2024
Páginas
28
No. de catálogo
V1670923
ISBN (PDF)
9783389164518
ISBN (Libro)
9783389164525
Idioma
Alemán
Etiqueta
Softwareentwicklung Refactoring Compiler CleanCode
Seguridad del producto
GRIN Publishing Ltd.
Citar trabajo
Johannes Pielmeier (Autor), 2024, Compliergestütztes Refactoring in der Softwareentwicklung, Múnich, GRIN Verlag, https://www.grin.com/document/1670923
Leer eBook
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
  • Si ve este mensaje, la imagen no pudo ser cargada y visualizada.
Extracto de  28  Páginas
Grin logo
  • Grin.com
  • Envío
  • Contacto
  • Privacidad
  • Aviso legal
  • Imprint