Verfasst: 18.04.2008 09:54
Zunächst musste ich Java im Studium lernen und bin mittlerweile ein
absoluter Fan davon. Hier eine Lobeshymne in Form von Gründen :
* die Objektorierentierung ist gut durchdacht, konsequent und an
sinnvollen Stellen restriktiv (z.B. keine Mehrfachvererbung). Dies erlaubt einen
gut strukturierten Weg von der Modellierung des Problems hin zum
Implementationscode. Außer der Klassenhierachie ist gerade die Package-Struktur
ist ein wichtiges Mittel, aber selbst darüber gibt es noch .jars als Ebene.
* wenn ein Programm kompiliert, so zeigt es immer das beabsichtigte
Verhalten (sofern man keine logischen Fehler einbaut), da alle
Blödsinnsfehler vom Kompiler abgefangen werden können und gut
verständlich ausgegeben werden
* Seit JIT-Compilern (Just In Time Compiler) ist Java
geschwindigkeitsmäßig mit Maschinencode gleichauf, könnte sogar
theoretisch schneller sein, da bspw. lange nicht veränderte Variablen als
Konstante kompiliert werden können.
* Auch komplexeste GUIs lassen sich eventgesteuert erstellen. Die blöden
Applets nutzen dafür meist AWT-Funktionen, Swing ist da schon
wesentlich besser (wenn man auch mehr Sachen beachten muss, um
performant zu bleiben) und wenns ne richtig komplexe Anwendung werden
soll nimm SWT, das nutzt die Betriebssystem-GUI-Funktionen.
* Multithreading ist in Java wunderbar zu nutzen. Insbesondere die
Monitorfunktionen und mit Semaphoren gesicherten
synchronize-Abschnitte sind direkt in der Sprache integiert, keine blöden
API-Aufrufe, etc. dafür nötig.
* Verteilte Anwendungen lassen sich einfach realisieren: Nachladen von
optionalen Programmfunktionen aus beliebigen Teilen des lokalen Netzes
oder Internets. Auch z.B. transparente Anbindung von Klassen auf
verschiedenen Rechnern mittels RMI.
* Kompilieren von zur Laufzeit erstellter Klassen möglich, z.B. um
komplexe mathematische Operationen zur Laufzeit zu konstruieren, dann
aber als Kompilat auszuführen.
* Sehr gute Anbindung an JavaScript, um bspw. Kunden komplexe
Programmfunktionen eigenständig programmieren und ins Programm
einbinden zu lassen. Auch eigene Sprachdefinitionen lassen sich mittels
formaler Grammatiken erzeugen. Die Ergebnisse können wiederum zur
Laufzeit kompiliert werden.
* Mittels JNI lassen sich DLLs/SOs ohne Probleme anbinden, wenn man
denn möchte.
* Es gibt so gut wie alle denkbaren Datenstrukturen und Funktionalitäten
bereits von Haus aus mitgeliefert. Zig zig weitere spezielle und
umfangreiche Bibliotheken gibt es (oft sogar als OpenSource) im Netz.
* Sehr gute Anbindung an Testtools, um z.B. Überdeckungstests des
Codes zu dokumentieren.
* Mit z.B. Eclipse eine geniale IDE, die eine eigene Lobeshymne verdiente
und bspw. direkt die javadoc-Anbindung einbaut (die Kommentare eigener
Funktionen erscheinen dann an gegebener Stelle, ähnlich
wie rudimentär in PB mit dem Semikolon hinter einer Procedure)
* Umfangreiche Analyse-Tools zum Profilen und zur
Programmstrukturanalyse um anhand gewisser Metriken wie Lokalität die
Güte des Programms und seiner Teile zu beurteilen
* Wenn man möchte kann man sein sonstwie komplexes Programm
als Applet bereitstellen.
* Es gibt (!) Pointer - jede Referenz ist eine. Ein Pointer kann auch auf
andere Objekte gesetzt werden, aber nicht (und das ist die
Einschränkung) mit arithmetischen Operationen modifiziert werden, wie +
*, etc. Denn dies ist eine böse und architekturabhängige Fehlerquelle, die
zudem nicht zur Kompilezeit gecheckt werden kann, dafür aber nirgendwo
wirklich notwendig ist, außer für handgemachte
(hardwareabhängige) Optimierungen, die nicht vom Kompiler als solche
erkannt werden. Dann könnte eine solche Funktion aber auch per JNI
eingebunden werden.
Alles in allem ist Java äußerst geeignet gerade für komplexe
Anwendungen, die später flexibel erweitert werden sollen und ggf.
dezentral laufen. Ich habe (wie auch zur Zeit) bereits an mehreren
Projekten mit > 100.000 LOC mitgearbeitet (gute Teamarbeit mit einem
CMS wie SVN möglich) und nutze auch privat mittlerweile sehr viel Java.
Und nochmal: Java ist kein JavaScript und die
Applets sind nur ein optionales Bonbon.
Aber keine Sorge, PB macht mir auch Spaß, auch wenn ich wohl nie
wieder ein komplexes Projekt damit realisieren werde... (Ein Versuch
reichte, der zwar gelungen ist, aber um nachträgliche Kundenwünsche für
Erweiterungen zu realisieren muss ich mich jedesmal in die strikte
Struktur von Includes und DLLs, etc. einarbeiten, um keine bösen Fehler
z.B. ins Multithreading einzubauen. OOP ist einfach ein 'Muss').
P.S.: Ich bin auch C/C++-Fan (gcc mit eclipse cdt) für spezielle
hardwareabhängige Programme oder assembleroptimierte Teile.
absoluter Fan davon. Hier eine Lobeshymne in Form von Gründen :
* die Objektorierentierung ist gut durchdacht, konsequent und an
sinnvollen Stellen restriktiv (z.B. keine Mehrfachvererbung). Dies erlaubt einen
gut strukturierten Weg von der Modellierung des Problems hin zum
Implementationscode. Außer der Klassenhierachie ist gerade die Package-Struktur
ist ein wichtiges Mittel, aber selbst darüber gibt es noch .jars als Ebene.
* wenn ein Programm kompiliert, so zeigt es immer das beabsichtigte
Verhalten (sofern man keine logischen Fehler einbaut), da alle
Blödsinnsfehler vom Kompiler abgefangen werden können und gut
verständlich ausgegeben werden
* Seit JIT-Compilern (Just In Time Compiler) ist Java
geschwindigkeitsmäßig mit Maschinencode gleichauf, könnte sogar
theoretisch schneller sein, da bspw. lange nicht veränderte Variablen als
Konstante kompiliert werden können.
* Auch komplexeste GUIs lassen sich eventgesteuert erstellen. Die blöden
Applets nutzen dafür meist AWT-Funktionen, Swing ist da schon
wesentlich besser (wenn man auch mehr Sachen beachten muss, um
performant zu bleiben) und wenns ne richtig komplexe Anwendung werden
soll nimm SWT, das nutzt die Betriebssystem-GUI-Funktionen.
* Multithreading ist in Java wunderbar zu nutzen. Insbesondere die
Monitorfunktionen und mit Semaphoren gesicherten
synchronize-Abschnitte sind direkt in der Sprache integiert, keine blöden
API-Aufrufe, etc. dafür nötig.
* Verteilte Anwendungen lassen sich einfach realisieren: Nachladen von
optionalen Programmfunktionen aus beliebigen Teilen des lokalen Netzes
oder Internets. Auch z.B. transparente Anbindung von Klassen auf
verschiedenen Rechnern mittels RMI.
* Kompilieren von zur Laufzeit erstellter Klassen möglich, z.B. um
komplexe mathematische Operationen zur Laufzeit zu konstruieren, dann
aber als Kompilat auszuführen.
* Sehr gute Anbindung an JavaScript, um bspw. Kunden komplexe
Programmfunktionen eigenständig programmieren und ins Programm
einbinden zu lassen. Auch eigene Sprachdefinitionen lassen sich mittels
formaler Grammatiken erzeugen. Die Ergebnisse können wiederum zur
Laufzeit kompiliert werden.
* Mittels JNI lassen sich DLLs/SOs ohne Probleme anbinden, wenn man
denn möchte.
* Es gibt so gut wie alle denkbaren Datenstrukturen und Funktionalitäten
bereits von Haus aus mitgeliefert. Zig zig weitere spezielle und
umfangreiche Bibliotheken gibt es (oft sogar als OpenSource) im Netz.
* Sehr gute Anbindung an Testtools, um z.B. Überdeckungstests des
Codes zu dokumentieren.
* Mit z.B. Eclipse eine geniale IDE, die eine eigene Lobeshymne verdiente
und bspw. direkt die javadoc-Anbindung einbaut (die Kommentare eigener
Funktionen erscheinen dann an gegebener Stelle, ähnlich
wie rudimentär in PB mit dem Semikolon hinter einer Procedure)
* Umfangreiche Analyse-Tools zum Profilen und zur
Programmstrukturanalyse um anhand gewisser Metriken wie Lokalität die
Güte des Programms und seiner Teile zu beurteilen
* Wenn man möchte kann man sein sonstwie komplexes Programm
als Applet bereitstellen.
* Es gibt (!) Pointer - jede Referenz ist eine. Ein Pointer kann auch auf
andere Objekte gesetzt werden, aber nicht (und das ist die
Einschränkung) mit arithmetischen Operationen modifiziert werden, wie +
*, etc. Denn dies ist eine böse und architekturabhängige Fehlerquelle, die
zudem nicht zur Kompilezeit gecheckt werden kann, dafür aber nirgendwo
wirklich notwendig ist, außer für handgemachte
(hardwareabhängige) Optimierungen, die nicht vom Kompiler als solche
erkannt werden. Dann könnte eine solche Funktion aber auch per JNI
eingebunden werden.
Alles in allem ist Java äußerst geeignet gerade für komplexe
Anwendungen, die später flexibel erweitert werden sollen und ggf.
dezentral laufen. Ich habe (wie auch zur Zeit) bereits an mehreren
Projekten mit > 100.000 LOC mitgearbeitet (gute Teamarbeit mit einem
CMS wie SVN möglich) und nutze auch privat mittlerweile sehr viel Java.
Und nochmal: Java ist kein JavaScript und die
Applets sind nur ein optionales Bonbon.
Aber keine Sorge, PB macht mir auch Spaß, auch wenn ich wohl nie
wieder ein komplexes Projekt damit realisieren werde... (Ein Versuch
reichte, der zwar gelungen ist, aber um nachträgliche Kundenwünsche für
Erweiterungen zu realisieren muss ich mich jedesmal in die strikte
Struktur von Includes und DLLs, etc. einarbeiten, um keine bösen Fehler
z.B. ins Multithreading einzubauen. OOP ist einfach ein 'Muss').
P.S.: Ich bin auch C/C++-Fan (gcc mit eclipse cdt) für spezielle
hardwareabhängige Programme oder assembleroptimierte Teile.