Verfasst: Sonntag 21. Februar 2010, 20:14
Interessante Diskussion, zu der ich viel schreiben könnte, müsste ich nicht eigentlich Vortragsfolien ausarbeiten, mich davon aber immer wieder ablenke. Dennoch ein paar Statements.
Ich finde das Lernen einer neuen Sprachsyntax im Vergleich zum Lernen einer neuen Funktionsbibliothek vernachlässigbar einfach. Ich bringe mir gerade die Entwicklung von iPhone-Anwendungen bei. Die Sprache Objective-C ist harmlos, da ich in einem früheren Leben mal C-Hacker war und auch Smalltalk kenne. Die Klassenbibliothek hat es jedoch in sich. Jede Kleinigkeit muss ich nachgucken und die Entwicklung fühlt sich (noch) ungeheuer langsam an.
Somit halte ich das Argument, dass Boo wie Python aussieht, nicht für so entscheidend. Würde ich die CLR-Klassenbibliothek beherrschen und einfach nur ein bisschen Tipparbeit mit C# sparen wollen, sähe das vielleicht anders aus.
So plane ich, mir demnächst mal Duby anzuschauen, eine Variante von JRuby, die explizit ein Syntax-Skin für Java sein will, also ein Java mit Ruby-Syntax, das die Java-Klassenbibliothek benutzt. Diese beherrsche ich (aus dem FF) und somit könnte es spannend sein, zu schauen was ein bisschen Scripting a la Ruby besser macht. Dennoch bin ich skeptisch, dass es einen großen Vorteil gibt - Java-IDEs machen eigentlich auch das Arbeiten mit normalen Java-Quelltext durchaus erträglich.
Ich bin kein Experte für die CLR oder C#, aber wenn ich Mono und die JVM als Basis für Programmiersprachen vergleichen soll, dann würde ich immer die JVM als technisch überlegen vorziehen. Ich weiß, dass die JVM bei der Speicherverwaltung, Just-in-Time-Compilation und beim Multithreading einen großen Vorsprung hat. Außerdem ist das Ding rock-solid.
GUI-Programmierung, noch unter Linux, ist für mich kein wichtiger Punkt. Mono bringt wohl Bindings für GTK mit. Egal wie praktikabel das jetzt ist, mich würde (bei den Anwendungen, die ich im Kopf hätte) stören, dass das ein ziemlich primitives Rahmenwerk auf dem Stand von vor 20 Jahren ist. Wx und Tk, so wie ich das bei Python gesehen habe, sind da kein bisschen besser. Gleiches gilt für die WinForms der CLR. Swing ist da überlegen, auch wenn es den "Markel" hat, UIs selbst zu zeichnen. Ebenfalls (wie dynamische vs. statische Typisierung) ein uralter Streit. Anfang der 90er wurde für Smalltalk-80 (ObjectWorks später VisualWorks) ein UI entwickelt, das Vorbild für Swing (weil die Entwickler von ParcPlace zu Sun wechselten) und NextStep wurde und die selben Konzepte enthielt, die jetzt erst viele Jahre später bei WPF und Silverlight bzw. Flex einflossen. Diese beiden würde ich (neben Cocoa als Nachfolger von NextStep) dann auch als einigermaßen interessante UIs hervorheben. Tatsächlich wäre Silverlight für mich der Grund, mich mit diesem .NET-Subset zu beschäftigen. Damit ich dann aber da gerade nicht die CLR erlernen muss, würde ich auf IronRuby oder IronPython setzen.
Auch hier wäre meine Motivation nicht bessere Performance oder CLR-Kompatibilität, sondern die vertraute Sprache mit der vertrauten Funktionsbibliothek einsetzen zu können, um so nur das Minimum zu lernen, was notwendig wäre, um UIs zu bauen.
Übrigens, *objektive* Kriterien für die Sprachwahl gibt IMHO es sowieso nicht. Das ist alles immer und überall persönlicher subjektiver Geschmack. Bestenfalls kann man der Überzeugungskunst eines Evangelisten erliegen. Die Krux ist, das jeder andere *implizite* Kriterien hat, an denen er seine Bewertung und letztlich seine Entscheidung festmacht und da diese Kriterien nie genannt werden, kommt es regelmäßig zu erbitterten Wortgefechten.
Für mich ist die Gemeinde einer Sprache relativ wichtig. Sie muss zwar nicht groß, aber groß genug (zu groß kann wie im Fall von PHP auch ein Ausschlusskriterium sein) sein, damit ich nicht das Gefühl habe, ein totes Pferd zu reiten.
Als Nemerle neu war, hatte ich mir das mal angeschaut, aber es erschien mir einfach yet-another-functional-language irgendeiner Hochschule (Breslau, Polen) zu sein. Davon gibt es einfach zu viele. Interessant war z.B. auch Alice (Saarland, Deutschland) aber letztlich auch todgeweiht. Hinzu kommt, dass ich ML-artige Sprachen nicht so spannend finde.
Eine Sprache im selben Bereich wie Nemerle, die es geschafft hat, ist da Scala. Vielleicht weil sie genug Kompromisse eingegangen ist, was die bekannte imperative Programmierung angeht. Ist aber leider genau wie C# ein Sprachmonster mit sehr komplexerem Sprachstandard. Dazu kommt (im Gegensatz zu C#) noch ein verdammt kompliziertes ("verdammt kompliziert" liegt zwischen kompliziert (C#) und unglaublich kompliziert (Haskell) und ist eine offizielle Klassifizierung) Typsystem.
Übrigens kann man auch Scala "skripten", sprich, es gibt einen Modus, dass der Quelltext von einem Befehl sowohl übersetzt und dann gleich gestartet wird. Sogar eine interaktive Befehlzeile gibt es.
Eine andere interessante Sprache, die es wohl geschafft hat, ist IMHO Clojure. Man muss die Lisp-Syntax nicht mögen (ach würde doch dieser erzkonservative engstirnige Entwicklerhaufen nur einmal die geistige Flexibilität besitzen, auch eine andere Syntax als die mit geschweiften Klammern zu akzeptieren) aber die Konzepte sind interessant. Und so etwas finde ich wichtig. Persistente Datenstrukturen und konsequente Anpassung der Sprache an die Anforderungen der Programmierung für viele Prozessoren sind ein wichtiges Thema.
Auf Burlis Frage, ob es Astra oder Golf sein soll, ist IMHO sehr wohl auch die Antwort erlaubt, dass beide Autos nichts taugen und man mit dem Mini am besten fährt. Ich finde ihn jedenfalls schick. Eine Entweder-Oder-Antwort zu verlangen ist illusorisch. Und eine ergebnisoffene Diskussion ist sowieso spannender :)
Oh, und ich stimme BlackJacks Antwort auf Burli zu: "bei .NET vs. JVM gewinnt die JVM".
Die JNI-Schnittstelle bei Java ist zugegeben umständlich, aber plattformübergreifend. P/Invoke ist einfacher, aber gerade unter Windows die Einladung, Windows-spezifischen Code zu schreiben, der dann nicht mehr portabel ist. Für Java würde ich einen Blick auf JNA empfehlen. Ursprünglich für JRuby entwickelt und inzwischen auch von Jython und anderen JVM-Sprachen benutzt ist das ein ctypes-ähnliches FFI.
SWT ist übrigens ziemlich populär, genau wie Eclipse populär ist, nur sieht man davon mehr in der Windows-Welt als in der Linux Welt. Swing ist allerdings einfacher zu benutzen und die "reine" Lehre. Daher wird es gerne gerade von Opensource-Verfechtern vorgezogen. Tatsache ist aber, dass Java-Entwicklung meist in der Web- und Server-Welt stattfindet und nicht so sehr auf dem Client.
Aber ich denke, dass ist sowieso ein genereller Trend. Web-Anwendungen werden mittelfristig die meisten Desktop-Anwendungen ablösen und daher werden betriebssystemspezifische UI-Toolkits immer unwichtiger. Vielleicht, so denke ich mir manchmal, läuft einfach die Linux-Welt diesem Trend nur hinterher, da sie sich freut, mit Ubuntu endlich einen Desktop zu haben (und das nur 25 Jahre nach dem MacIntosh oder 15 Jahre nach Windows 95) während die restliche Welt schon mal Richtung Browser zieht.
Und ja, mir ist bewusst, dass z.B. native iPhone-Anwendungen auch keine reinen Browser-Anwendungen sind, sondern ein eigenes UI-Toolkit haben, doch dieses wiederum integriert einen WebView als UI, der in den meisten Anwendungen eingesetzt wird, wo komplexere Textdarstellungen notwendig sind und alternative Technologien wie z.B. Adobe AIR setzen reine Browser- bzw. Flash-Anwendungen dagegen, die flexiblere UIs erlauben, als wie es mit dem selben Aufwand in CocoaTouch möglich wäre.
Nochmal zu IronPython. Dies ist IMHO kein krampfhafter und gescheiterter Versuch, Python auf die .NET-Plattform zu heben (wie burli sagte) sondern eben eine weitere Sprache für die CLR, die nicht ein C#-Syntax-Skin ist, sondern eine alternative Semantik bietet, um .NET-Anwendungen zu schreiben. Es ist der Versuch (und Beweis?) das es möglich ist, die CLR als alternatives "Betriebssystem" (neben C) für einen Python-Interpreter zu benutzen und das die CLR, obwohl für statische C#-artige Programmiersprachen entwickelt, auch für dynamische Sprachen taugt.
Doch auch hier würde ich eher auf die JVM setzen. IronPython und Jython kann man leider nicht vergleichen, weil Jython nur hobbymäßig entwickelt wird und immer noch eine Implementation der ersten Generation ist, während IronPython die nächste Generation darstellt. Doch IronRuby und JRuby spielen in der selben Liga und hier hat IronRuby sogar die Gnade der späteren Geburt, sprich konnte von JRuby und IronPython lernen. Dennoch performt das Ding auf der JVM deutlich besser und wird nochmals mit Java 7 einen entscheidenen Geschwindigkeitsvorteil herausholen.
Zu Boo selbst habe ich jetzt gar nichts mehr gesagt, aber genug geschwafelt. Ich muss meine eigentliche Arbeit machen... Grummel.
Stefan
Ich finde das Lernen einer neuen Sprachsyntax im Vergleich zum Lernen einer neuen Funktionsbibliothek vernachlässigbar einfach. Ich bringe mir gerade die Entwicklung von iPhone-Anwendungen bei. Die Sprache Objective-C ist harmlos, da ich in einem früheren Leben mal C-Hacker war und auch Smalltalk kenne. Die Klassenbibliothek hat es jedoch in sich. Jede Kleinigkeit muss ich nachgucken und die Entwicklung fühlt sich (noch) ungeheuer langsam an.
Somit halte ich das Argument, dass Boo wie Python aussieht, nicht für so entscheidend. Würde ich die CLR-Klassenbibliothek beherrschen und einfach nur ein bisschen Tipparbeit mit C# sparen wollen, sähe das vielleicht anders aus.
So plane ich, mir demnächst mal Duby anzuschauen, eine Variante von JRuby, die explizit ein Syntax-Skin für Java sein will, also ein Java mit Ruby-Syntax, das die Java-Klassenbibliothek benutzt. Diese beherrsche ich (aus dem FF) und somit könnte es spannend sein, zu schauen was ein bisschen Scripting a la Ruby besser macht. Dennoch bin ich skeptisch, dass es einen großen Vorteil gibt - Java-IDEs machen eigentlich auch das Arbeiten mit normalen Java-Quelltext durchaus erträglich.
Ich bin kein Experte für die CLR oder C#, aber wenn ich Mono und die JVM als Basis für Programmiersprachen vergleichen soll, dann würde ich immer die JVM als technisch überlegen vorziehen. Ich weiß, dass die JVM bei der Speicherverwaltung, Just-in-Time-Compilation und beim Multithreading einen großen Vorsprung hat. Außerdem ist das Ding rock-solid.
GUI-Programmierung, noch unter Linux, ist für mich kein wichtiger Punkt. Mono bringt wohl Bindings für GTK mit. Egal wie praktikabel das jetzt ist, mich würde (bei den Anwendungen, die ich im Kopf hätte) stören, dass das ein ziemlich primitives Rahmenwerk auf dem Stand von vor 20 Jahren ist. Wx und Tk, so wie ich das bei Python gesehen habe, sind da kein bisschen besser. Gleiches gilt für die WinForms der CLR. Swing ist da überlegen, auch wenn es den "Markel" hat, UIs selbst zu zeichnen. Ebenfalls (wie dynamische vs. statische Typisierung) ein uralter Streit. Anfang der 90er wurde für Smalltalk-80 (ObjectWorks später VisualWorks) ein UI entwickelt, das Vorbild für Swing (weil die Entwickler von ParcPlace zu Sun wechselten) und NextStep wurde und die selben Konzepte enthielt, die jetzt erst viele Jahre später bei WPF und Silverlight bzw. Flex einflossen. Diese beiden würde ich (neben Cocoa als Nachfolger von NextStep) dann auch als einigermaßen interessante UIs hervorheben. Tatsächlich wäre Silverlight für mich der Grund, mich mit diesem .NET-Subset zu beschäftigen. Damit ich dann aber da gerade nicht die CLR erlernen muss, würde ich auf IronRuby oder IronPython setzen.
Auch hier wäre meine Motivation nicht bessere Performance oder CLR-Kompatibilität, sondern die vertraute Sprache mit der vertrauten Funktionsbibliothek einsetzen zu können, um so nur das Minimum zu lernen, was notwendig wäre, um UIs zu bauen.
Übrigens, *objektive* Kriterien für die Sprachwahl gibt IMHO es sowieso nicht. Das ist alles immer und überall persönlicher subjektiver Geschmack. Bestenfalls kann man der Überzeugungskunst eines Evangelisten erliegen. Die Krux ist, das jeder andere *implizite* Kriterien hat, an denen er seine Bewertung und letztlich seine Entscheidung festmacht und da diese Kriterien nie genannt werden, kommt es regelmäßig zu erbitterten Wortgefechten.
Für mich ist die Gemeinde einer Sprache relativ wichtig. Sie muss zwar nicht groß, aber groß genug (zu groß kann wie im Fall von PHP auch ein Ausschlusskriterium sein) sein, damit ich nicht das Gefühl habe, ein totes Pferd zu reiten.
Als Nemerle neu war, hatte ich mir das mal angeschaut, aber es erschien mir einfach yet-another-functional-language irgendeiner Hochschule (Breslau, Polen) zu sein. Davon gibt es einfach zu viele. Interessant war z.B. auch Alice (Saarland, Deutschland) aber letztlich auch todgeweiht. Hinzu kommt, dass ich ML-artige Sprachen nicht so spannend finde.
Eine Sprache im selben Bereich wie Nemerle, die es geschafft hat, ist da Scala. Vielleicht weil sie genug Kompromisse eingegangen ist, was die bekannte imperative Programmierung angeht. Ist aber leider genau wie C# ein Sprachmonster mit sehr komplexerem Sprachstandard. Dazu kommt (im Gegensatz zu C#) noch ein verdammt kompliziertes ("verdammt kompliziert" liegt zwischen kompliziert (C#) und unglaublich kompliziert (Haskell) und ist eine offizielle Klassifizierung) Typsystem.
Übrigens kann man auch Scala "skripten", sprich, es gibt einen Modus, dass der Quelltext von einem Befehl sowohl übersetzt und dann gleich gestartet wird. Sogar eine interaktive Befehlzeile gibt es.
Eine andere interessante Sprache, die es wohl geschafft hat, ist IMHO Clojure. Man muss die Lisp-Syntax nicht mögen (ach würde doch dieser erzkonservative engstirnige Entwicklerhaufen nur einmal die geistige Flexibilität besitzen, auch eine andere Syntax als die mit geschweiften Klammern zu akzeptieren) aber die Konzepte sind interessant. Und so etwas finde ich wichtig. Persistente Datenstrukturen und konsequente Anpassung der Sprache an die Anforderungen der Programmierung für viele Prozessoren sind ein wichtiges Thema.
Auf Burlis Frage, ob es Astra oder Golf sein soll, ist IMHO sehr wohl auch die Antwort erlaubt, dass beide Autos nichts taugen und man mit dem Mini am besten fährt. Ich finde ihn jedenfalls schick. Eine Entweder-Oder-Antwort zu verlangen ist illusorisch. Und eine ergebnisoffene Diskussion ist sowieso spannender :)
Oh, und ich stimme BlackJacks Antwort auf Burli zu: "bei .NET vs. JVM gewinnt die JVM".
Die JNI-Schnittstelle bei Java ist zugegeben umständlich, aber plattformübergreifend. P/Invoke ist einfacher, aber gerade unter Windows die Einladung, Windows-spezifischen Code zu schreiben, der dann nicht mehr portabel ist. Für Java würde ich einen Blick auf JNA empfehlen. Ursprünglich für JRuby entwickelt und inzwischen auch von Jython und anderen JVM-Sprachen benutzt ist das ein ctypes-ähnliches FFI.
SWT ist übrigens ziemlich populär, genau wie Eclipse populär ist, nur sieht man davon mehr in der Windows-Welt als in der Linux Welt. Swing ist allerdings einfacher zu benutzen und die "reine" Lehre. Daher wird es gerne gerade von Opensource-Verfechtern vorgezogen. Tatsache ist aber, dass Java-Entwicklung meist in der Web- und Server-Welt stattfindet und nicht so sehr auf dem Client.
Aber ich denke, dass ist sowieso ein genereller Trend. Web-Anwendungen werden mittelfristig die meisten Desktop-Anwendungen ablösen und daher werden betriebssystemspezifische UI-Toolkits immer unwichtiger. Vielleicht, so denke ich mir manchmal, läuft einfach die Linux-Welt diesem Trend nur hinterher, da sie sich freut, mit Ubuntu endlich einen Desktop zu haben (und das nur 25 Jahre nach dem MacIntosh oder 15 Jahre nach Windows 95) während die restliche Welt schon mal Richtung Browser zieht.
Und ja, mir ist bewusst, dass z.B. native iPhone-Anwendungen auch keine reinen Browser-Anwendungen sind, sondern ein eigenes UI-Toolkit haben, doch dieses wiederum integriert einen WebView als UI, der in den meisten Anwendungen eingesetzt wird, wo komplexere Textdarstellungen notwendig sind und alternative Technologien wie z.B. Adobe AIR setzen reine Browser- bzw. Flash-Anwendungen dagegen, die flexiblere UIs erlauben, als wie es mit dem selben Aufwand in CocoaTouch möglich wäre.
Nochmal zu IronPython. Dies ist IMHO kein krampfhafter und gescheiterter Versuch, Python auf die .NET-Plattform zu heben (wie burli sagte) sondern eben eine weitere Sprache für die CLR, die nicht ein C#-Syntax-Skin ist, sondern eine alternative Semantik bietet, um .NET-Anwendungen zu schreiben. Es ist der Versuch (und Beweis?) das es möglich ist, die CLR als alternatives "Betriebssystem" (neben C) für einen Python-Interpreter zu benutzen und das die CLR, obwohl für statische C#-artige Programmiersprachen entwickelt, auch für dynamische Sprachen taugt.
Doch auch hier würde ich eher auf die JVM setzen. IronPython und Jython kann man leider nicht vergleichen, weil Jython nur hobbymäßig entwickelt wird und immer noch eine Implementation der ersten Generation ist, während IronPython die nächste Generation darstellt. Doch IronRuby und JRuby spielen in der selben Liga und hier hat IronRuby sogar die Gnade der späteren Geburt, sprich konnte von JRuby und IronPython lernen. Dennoch performt das Ding auf der JVM deutlich besser und wird nochmals mit Java 7 einen entscheidenen Geschwindigkeitsvorteil herausholen.
Zu Boo selbst habe ich jetzt gar nichts mehr gesagt, aber genug geschwafelt. Ich muss meine eigentliche Arbeit machen... Grummel.
Stefan