synopia hat geschrieben:wo ist der Sinn, sich über das ein oder andere Feature und den Vorteil selbiger einer Sprache zu streiten? Letztendlich ist das (fast) egal. Viel wichtiger ist doch das "Drumherum".
Nein. Das "Drumherum" ist nie wichtiger als die Sprache selbst. Ich kann kaum glauben, dass Du in Brainfuck programmieren wollen würdest, wenn man für Brainfuck die ultimative zahlentheoretische Bibliothek geschrieben hätte. Oder, dass Du in Shell-Skripting programmieren wollen würdest, wenn's für Shell-Skripte die ultimative Bibliothek für P3P-Applikationen gäbe. Oder, dass Du die Mathematica Skript-Sprache dazu benutzen wollen würdest, um die ultimative Anwendung zur Steuerung eines virtuellen Servers zu schreiben. Und das könnte man beliebig fortsetzen mit anderen Sprachen.
Jede Sprache hat, allein schon ohne die Bibliotheken, eine gewisse Ausrichtung und Spezialisierung. Das kommt mit den Paradigmen, für die sich eine Sprache entscheidet, das kommt mit den syntaktischen Konstrukten, für die sich eine Sprache entscheidet, das kommt mit sehr viel mehr als der Bibliothek die dahinter steht. So ist zum Beispiel die Mathematica-Skript-Sprache darauf ausgerichtet, mathematische Formeln/Berechnungen einfach darzustellen, während Shell-Skriptsprachen darauf ausgerichtet sind, eine schier unerschöpfliche Anzahl von möglichen Verknüpfungsmöglichkeiten "primitiver" Programme anzubieten, und mit einigen einfachen Kontrollflußmöglichkeiten zu kombinieren. Genauso hat Brainfuck seinen "Sinn und Zweck," über den wir hier nicht diskutieren müssen.
Python hat viele Paradigmen und syntaktische Konstrukte aus anderen Sprachen übernommen, und diese so gemischt, dass daraus etwas einmaliges herausgekommen ist. (ist außerdem gestern ein halbwegs interessanter Thread auf c.l.p draus geworden aus genau dieser Diskussion) Das ist mit ein Grund, warum man Python (genauso wie andere Sprachen) als eine Allround-Sprache beschreiben kann, aber nichtsdestotrotz auch hier wieder aufpassen muß, in welcher Gewichtung welches Paradigma eingeführt wurde; genau das macht eine Programmiersprache nämlich einmalig.
Nachdem die Syntax und Struktur einer Programmiersprache dem Aufgabenfeld angepasst ist, kann man dann über Bibliotheken reden. Zum Beispiel wäre Mathematica ohne die mathematischen Bibliotheken dahinter sicherlich keinen Pfifferling wert, aber erst durch die Syntax der Skriptsprache wird die Bibliothek brauchbar. Das bedingt sich
immer gegenseitig.
synopia hat geschrieben:Damit meine ich, ob es genügend bestehende (nicht-alpha-versionen) von Libraries, Tools und Frameworks gibt. Was nützt die beste Sprache, mit den meisten und tollsten Features, wenn es keine vernünftige Library für Aufgabe XYZ gibt? Klar kann man nun sagen, selbst ist der Mann (die Frau), aber es wird wohl unbestreitbar einige (und nicht wenige) Leute davon abhalten diese neue Sprache zu verwenden. Wodurch eben die Verbreitung nicht so groß ist und nicht so viele Projekte rund um die Sprache entstehen (also ein Teufelskreis).
Auch das ist ehrlich gesagt nicht nachvollziehbar für mich. Eine Sprache ist (und bleibt) nur solange gut, wie intelligente und vor allen Dingen eigenverantwortlich denkende Köpfe diese benutzen. Wenn jemand eine Sprache aufgrund Ihres Paradigmas auswählt (was zum Beispiel in meinem Fall bei Python geschehen ist), dann wird er auch bereit sein, sich die Arbeit zu machen, Dinge die nicht standardmäßig mit Python mitkommen zu implementieren, und in der heutigen Zeit von OSS diese auch als OSS zu veröffentlichen.
Eine Sprache wählt man wegen des Paradigmas aus, weil man sich eben jene Entwicklungsarbeit sparen will, die mit schwierigen Konstrukten, niedriger Ebene, umständlicher Implementierung (schon mal einen Top-Down-Parser
von Hand in Python geschrieben? Prolog ist da viel toller), oder ähnlichen Dingen einherkommt. Und, ehrlich gesagt, war das für mich in jedem Auftrag den ich bearbeitet hab, wichtiger, als mich anzupassen und meinen Kopf auszuschalten. Selbst wenn ich in Python etwas mehr implementieren mußte (in den seltensten Fällen), so hatte ich immer doch noch den Vorteil, dass der Code den ich geschrieben hatte mit meinen internen Paradigmen kompatibel war, und ich mich nicht auf etwas einschießen musste, was meinem inneren Denken völlig orthogonal läuft. Und, seltsamerweise, ist meißtens Code den ich schreibe auch mit den inneren Paradigmen von anderen Menschen die Python einsetzen kompatibel. Ich kann mich noch stark dran erinnern, dass genau das während meiner Zeit als CPAN-Contributor eigentlich nie der Fall war. (kann es sein, dass das eine sprachinhärente Eigenschaft ist? Für mich ein deutliches ja)
Den Teufelskreis, den Du beschreibst, ergibt sich nur bei den Programmiersprachen, zu denen Programmierer gezwungen werden. Wenn ich Java schreiben müsste und xyz nicht implementiert ist, wäre es für mich ein Gräuel, diese Funktionalität nachzuimplementieren. Ich gehe lieber als Chef los, kaufe eine halbwegs bescheiden programmierte Fassung einer Classlib irgendwo, benutze die, verstehe nicht was da läuft, kann Fehler nicht korrigieren, und komme so in einen Teufelskreis. Warum wird Java dann so gepusht? Weil's ein marketing hype ist. Sonst wegen nichts. Man
muß Java können, selbst wenn die Standardbibliothek scheiße und eingeschränkt ist (hier schon mal ein kleiner Verweis auf das IntelliJ, aber dazu später), man kauft andere Dinge hinzu, die genauso von Programmierern geschrieben ist die eigentlich keinen Bock haben, aber leben müssen, und wurstelt vor sich hin.
Dieses Phänomen hab ich mit Python noch nie gesehen. Python macht Spaß, zumindest einem Menschen, der halbwegs gerne intelligent denken mag, und Programmieren auch ein bisschen als Hobby, und nicht nur als Geldscheisserle ansieht. Auch hier wieder: das hat nix mit der Standardbibliothek zu tun, sondern mit dem Gefühl, dass die Sprache mir vermittelt. Muß es inhärent eklig und schwer sein zu programmieren?
Genau dieses Gefühl (eklig und schwer) wird über die Paradigmen und die Syntax mitvermittelt, sogar zum großen Teil. Zum Beispiel Perl: sieht aus wie Line-Noise, liest sich wie Line-Noise, verkauft sich wie Line-Noise. Hatte genauso wie Java einen marketing-hype unter Webentwicklern in den 90-ern, und wurstelt mittlerweilen, nachdem viele halb-intelligente Entwickler abgezogen sind (zu Rails, was genauso ein marketing hype ist), nur noch vor sich hin, oder wird von frustrierten System-Betreuern irgendwie gewartet, die sich wohl oder übel damit auseinandersetzen müssen.
Eine andere Sache ist die IDE. Ohne eine super IDE wird sich kaum eine Sprache im "Professionellen Umfeld" wirklich verbreiten. Ich kann hier aus eigner Erfahrung sprechen. Ich bin eigentlich ein Java Programmier, aber ich schau mich immer auch nach anderen Sprachen um (eigentlich weniger wegen der Sprachen, viel mehr wegen der teilweise genialen Frameworks, zb. turbogears oder Ruby on Rails). Meine Testprojekte scheitern aber zumeist daran, dass mir DIE perfekte IDE fehlt. Dann geh ich zurück zu Java (mit DER IDE: IntelliJ). Im übrigen sind die meisten der hier angebrachten Argumente für oder wider Python/Ruby völlig irrelevant, wenn man eine gute IDE nutzt. Z.B. die Keyword Argumente. Ja, das ist toll. Aber ne IDE zeigt mir an, welche Argumente die Methode möchte, wozu brauch ich das dann also? Also wozu brauch ich das UNBEDINGT? Am Ende isses einfach nur egal.
Ich hab vorhin schon gesagt, dass ich hierzu umbedingt noch was sagen wollte: warum
braucht man bei Java oder irgendeiner anderen Sprache sowas wie IntelliJ, damit man überhaupt irgendwie produktiv arbeiten kann? Viele der verfügbaren Bibliotheken verfolgen keine Standardparadigmen, und da (Basis-)Java eben nicht über High-Level-Datentypen verfügt, kocht hier wirklich jeder sein absolut eigenes Süppchen.
Ich denk da zum Beispiel an den Fall einer Liste von Vorname-Nachname Paaren. Wie übergebe ich das? Eine Funktion benutzt dazu einen Vektor von Vektoren, eine andere zwei Vektoren, eine dritte was ganz anderes (wie zum Beispiel einen Zeiger auf das erste Element, und die Länge, oder was auch immer). Java hat eben, dadurch dass sich die Syntax und Semantik der Grundsprache nicht mehr oder weniger direkt ergeben, eine unüberschaubare Vielfalt von Konventionen entwickelt, gerade bei Erweiterungsmodulen. Ohne, dass ich da irgendwie nachgucken kann welche Methode jetzt was von mir erwartet, und wie die Methode heißt (ich hab noch gar nicht darüber gesprochen, dass sich auch keiner an Namenskonventionen hält, und sowas wie Introspektion in Java immer noch verdammt neu ist), kann ich einen Scheißdreck mit dem vorprogrammierten Etwas anfangen. Also brauche ich eine Krücke wie IntelliJ, um mir die Arbeit einfacher zu machen.
Nimm Python: um die obige Datenstruktur darzustellen gibts in Python genau eine vernünftige Sache: eine Liste von Tupeln, oder auch eine Liste von Listen. Beide verhalten sich als iterierbare Container (die die Methode die aufgerufen wird ausliest) verdammt gleich; sprich, wenn irgendwo draufsteht dass eine Methode eine Liste von Vornamen und Nachnamen erwartet, kann ich davon ausgehen, dass diese Methode als Datum genau jene Datenstruktur nimmt, die ich erstellen wollte. Ohne, dass ich IntelliJ bemühen müsste um mir zu sagen, wie genau jetzt die Methode die Parameter erwartet. Das kann mir nämlich auch die integrierte Dokumentation sagen. Oder aber der interaktive Interpreter über Introspektion. Oder ein kurzer Blick in die Quellen, wenn's denn sein muß. Denn die hab ich bei Python im Normalfall immer dabei, bei Java in den seltensten Fällen.
Um jetzt auf dein letztes Argument zu kommen:
Jede gute IDE rückt den Code (ob nun mit oder ohne Klammern) korrekt ein. Wieso ist es nun besser, dass Einrücken als syntaktisches Element einzuführen?
Diese Diskussion brauchen wir nicht zu führen. Einrückung als stilistisches Mittel zur Formatierung von Code kennt mittlerweilen jeder, denke und hoffe ich. Einrückung als Mittel zur Blockformatierung gibts prinzipiell nur in Python (was die größeren Sprachen angeht). Sag mir mal bitte, was da der große Unterschied ist. Einrückung wird sowieso bei jedem selbstrespektierenden Programmierer gemacht (und zwar, man höre und staune,
blockweise!), warum soll die Programmiersprache meine Einrückung nicht auswerten? Und, wenn Du jetzt mit dem Argument kommst, dass es nach zwei Seiten Code nicht mehr nachzuvollziehen ist wo ein Block anfängt und wo er aufhört, dann kann ich dazu nur sagen: überleg Dir, ob Du in Python wirklich Funktionen schreiben willst, die zwei Seiten lang sind. Dass man das in Java muß ist mir klar, denn die Programmiersprache erlaubt nichts kürzeres, wenn die Funktion tatsächlich etwas machen soll. In Python
kann ich meinen Code aber, wenn ich denn ein bisschen Ahnung von Software-Design habe, immer in vernünftig große Blöcke aufteilen, die eben auf eine Bildschirmseite passen, und ich so (im Sinne der Einrückung) visuell nachvollziehen kann, wie der Kontrollfluß meiner Methode ist. Genauso wie's sein soll. Genauso, was mir Einrückung sagen soll.
So. Das reicht erst mal wieder.
Bevor mir irgendwer Überheblichkeit (wegen meines gebrauchs der Worte intelligent und halb-intelligent) vorwirft, so will ich einfach nur in den Raum werfen, dass es wirklich so ist, dass es sehr, sehr viele Leute gibt, die eine Programmiersprache nicht lernen weil diese sie anspricht, sondern weil die Programmiersprache ein erzwungenes Kriterium ist um einen Job zu bekommen. Und diese Leute programmieren nicht intelligent. Dazu braucht man nur ab und an mal auf "The Daily WTF" zu gucken. Und: wer zu dieser Klasse gehört, kann sich auch ruhig angesprochen fühlen wenn ich sage, dass er nicht intelligent programmiert.
--- Heiko.