Die Ideale Sprache
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Im ersten Halbjahr 2003 habe ich mich ein bisschen für die neue Programmiersprache D (SpracheD) engagiert. Diese ist noch soweit in Fluß dass eine laufende Diskussion über aktuelle und zusätzliche Sprachfeatures stattfindet. Dabei lassen sich bestimmte Gegensätzlichkeiten kaum überbrücken. Ich möchte diese Seite verwenden um mir über eine ideale Programmiersprache klar zu werden, bzw. mit allen, die daran Interesse haben, zu diskutieren. -- HelmutLeitner

Ausgangspunkte für eine ideale Sprache kann sein:

Grundsätzlich wird man immer folgende Features hineinreklamieren ("no na Features"): Alternativen: Schein-Alternativen: Grundsätzliche Features:
Diskussion

Über die generelle Einsetzbarkeit einer Sprache

Das ist ein gefährliches Terrain. Schauen wir uns mal SpracheCpp an, die als universale Sprache konzipiert wurde:

Es ist also gar nicht so leicht, denn selbst wenn man diese fundamentalen Sachen hinkriegt, fehlt einem noch immer Zugriff auf die tausenden C/Perl/xxx-Libraries die es bereits gibt.

Ich habe mal versucht, deinen Kommentar oben einzuarbeiten. -- hl
Gefällt mir


Mir gefällt der Begriff der lockeren Typisierung nicht. SpracheSmalltalk hat zwar "nur" dynamische Typprüfung, die ist aber mitnichten locker. Typfehler werden in Smalltalk beim ersten Aufruf einer unbekannten Methode erkannt und resultieren in einer Exception. Der Programmierer hat zwar den Freiraum, auch auf solche Fehler mit Exception-Handling zu reagieren und das kann dank Metaprogrammierung auch ziemlich heftige Formen annehmen, er macht dies dann aber unter bewusster Inkaufnahme möglicher Fehler.

Man könnte dagegen eine in C++ ohne weiteres mögliche Fehlinterpretation von Speicherbereichen als Typfehler werten. Da das vom C++ Laufzeitsystem nicht sicher erkannt wird, kann ich mich nicht dazu durchringen, hier von einer strengen Typprüfung zu sprechen ;-)

Ich denke, die Attribute statisch vs. dynamisch treffen es besser.

SaschaDördelmann

"Typfehler" werden in Smalltalk _nicht_ erkannt (und resultieren somit natürlich auch nicht in einer Exception). Wie Sascha richtig schreibt, wird ein Aufruf einer unbekannten Methode erkannt und resultiert in einer Exception (die ja auch dementsprechend heißt: MessageNotUnderstood). Ruft man eine Methode auf, die bekannt ist (und das kann wg. eines Programmierfehlers auch "typfalsch" geschehen), gibt es dazu logischerweise keine Exception. -/- In C++ ist (wenn der Compiler nicht kaputt ist) eine Fehlinterpretation von Speicherbereichen _nicht_ möglich, jedenfalls nicht - wie Sascha schreibt - "ohne weiteres". Sondern nur, wenn der Programmierer den Freiraum, zu "casten", anwendet (was ziemlich heftige Formen annehmen kann), er macht dies dann aber unter bewusster Inkaufnahme möglicher Fehler. ;-) -- VolkerGlave

Was ein Typ ist, kann mitunter schwer definiert werden. Was ist z. B. ein Typ in SpracheRuby, wo ich sogar die Schnittstelle von Instanzen verändern kann? Bei dynamischer Polymorphie wird der Typ eines Objekts ausschließlich über seine Schnittstelle und nicht durch seinen Platz in einer Klassenhierarchie bestimmt. Die statische Variante eines solchen Typbegriffs implementieren in C++ die Templates. Will man in Smalltalk explizit Typen definieren, kann man das über Spracherweiterungen wie Interfaces tun, was aber nach meiner Erfahrung eher unüblich ist.

Zu C++: Ich meinte eigentlich nicht die Casts sondern etwas viel profaneres. Was ist ein Speicherzugriffsfehler anderes als eine Fehlinterpretation des Speichers? Wenn ich mit einem Iterator oder Zeiger über das Ende meiner Collection laufe, zeigt dieser auf Speicherbereiche, die allenfalls zufällig Dinge enthalten, die noch irgendetwas mit dem Typ meines Zeigers zu tun haben. Wenn ich ein Objekt aus dem Speicher lösche, aber noch anderweitig darauf verweise, dann lügt der Verweis bzgl. dessen, was an dieser Stelle vorzufinden ist. Mir ist klar, dass diese Auffassung gewöhnungsbedürftig ist, daher auch der ;-) -- Sascha

Wo du recht hast, hast du recht. -- Volker

Ich glaub auch, du (Sascha) hast recht und hab das oben entsprechend geändert. -- HelmutLeitner


Den Punkt mit den Scheinalternativen finde ich essentiell. Gängige Smalltalk-Implementationen unterscheiden sich von Ruby u. a. durch den imagebasierten Ansatz: Das gesamte Objektgeflecht samt Prozessen und deren Status ist speicherbar. Das führt zu einer völlig neuen Entwicklungskultur ist aber eigentlich keine Eigenschaft der Sprache.

Bei der Konzeption einer Programmiersprache müsste man sich im Grunde also ständig fragen: Was baue ich in die Kernsprache hinein, was überlasse ich Bibliotheks- und Tool-Entwicklern. Ein Beispiel: In Eiffel oder D gehören Kontrakte zu den in die Sprache integrierten Features. Kann man Kontrakte auf die Sprache aufsetzen, ohne sie in die Sprache einzubauen? Muss man dann Einschränkungen in Kauf nehmen? Ist der Einbau in die Sprache hinreichend, oder wird es irgendwann zusätzliche Türmchen an meinem Sprachgebilde geben? Lassen sich Erweiterungen schwer oder leicht realisieren? Lässt sich das Feature ausstellen? Ein weiteres Beispiel: Ich habe einen Bytecodeinterpreter für meine Sprache. Ein anderer Anbieter hat eine VM mit JIT-Compiler und dort wird der gleiche Code 10 x schneller ausgeführt. Hat nichts mit der Sprache zu tun, beeinflusst aber maßgeblich deren Außenwirkung. Weiter: Ist die Anzahl der primitiven Methoden meiner VM eine Spracheigenschaft oder einfach nur eine Designentscheidung des Anbieters?

Mein persönlicher Eindruck ist, dass Sprachdiskussionen sich häufiger an "kulturellen" Unterschieden entzünden als an dem, was man als Kern der jeweiligen Sprachen bezeichnen könnte. Wenn dem aber so ist, dann sollte die Macht der Scheinalternativen nicht unterbewertet werden. Das was ich an Sprache XY toll finde, könnte man theoretisch ja auch in Sprache Z haben, hat man aber typischerweise nicht.

Meine ideale Spache wäre so einfach wie LISP, so schnell wie C, so typsicher wie D, so pragmatisch wie Ruby, so funktional wie Haskell, so sauber wie Eiffel und sie hätte einen Smalltalk-Debugger und jeder Browser, jeder Webserver, jedes Case-Werkzeug hätte ein Plugin dafür und natürlich würden alle Betriebssysteme eine superschnelle VM für meine Sprache und einen ENVY-Server für's Konfigurationsmanagement enthalten. ;-)

--- SaschaDördelmann


Wo ich das hier gerade lese, muss ich an eine Idee denken, die ich kürzlich hatte: Eine "wikifizierte Programmiersprache", die ähnlich Lisp nur einen minimalen Satz an Basisfunktionen besitzt, oberhalb dessen es keinen Unterschied zwischen built-in und user-defined gibt. Genaugenommen gibt es überhaupt kein built-in, sondern lediglich ein evolutionäres Framework, das komplett auf einem Wiki liegt - und entsprechend leicht geändert werden kann. Natürlich bräuchte man dann noch CVS-mäßig einen last-stable-build jedes Moduls und einiges mehr, z.B. ein System, dass alten Code nicht gleich inkompatibel macht. Lisp eignet sich als Ausgangsbasis für solch eine Sache sicher hervorragend ^^

Moin Benjamin. Meinst Du vielleicht soetwas wie eine Sprache, die in einem Wiki zum Einsatz kommt und so den Funktionsumfang desselben erweitert bzw. neue Applikationen damit ermöglicht? FlexWiki? ( http://www.flexwiki.com ) und IxWiki? (eigentlich XWiki, aber damit's CamelCase wird; http://www.xwiki.org ; Mischung aus Groovy und Velocity) bieten soetwas. -- bs

Hallo Bernd. Nein, ich meine eigentlich zwei Dinge auf einmal:

  1. Ein Wiki-System, dass alle Aufgaben eines CVS übernimmt und so im Prinzip Mitentwicklung von jedem Browser ermöglicht
  2. Eine Programmiersprache, die in diesem System von allen gemeinsam erst entwickelt wird im Stil von Lisp, wo Programmieren teilweise praktisch das Bauen/Erweitern eines Compilers ist. Die Sprachlogik könnte auch aus S-Expressions bestehen, zusätzlich sollten aber alle Aufsätze/Toolkits fast beliebig eigene Syntax drübersetzen können - auch wenn ich nicht weiß wie man mögliche Konflikte da vernünftig bereinigen kann.
---BenjaminTeuber?


Die ideale Sprache wird es schon deswegen nicht geben, weil Sprachen viel zu sehr nach dem Geschmack beurteilt werden. (Das ist nicht nur bei Programmiersprachen so.) Da gibt es so einige Ziele, bei denen viele Programmierer sofort zustimmen, dies aber auch schnell wieder vergessen, wenn es an die konkrete Umsetzung geht. Solche Ziele sind in der Regel: kompakter Sprachumfang, konsistente Syntax, damit einhergehend leichte Erlernbarkeit, Sicherheit, Flexibilität. In der Praxis wird aber der Einfachheit halber meistens irgendeine Sprache hergenommen, alles geändert, was dem Sprachschöpfer nicht passt und alles andere ungeprüft übernommen. (Welcher Durchschnittsprogrammierer kennt sich schon mit Fallstricken der Arithmetik oder der Zeitrechnung aus.) Oder aber es wird aus mehreren Sprachen zusammengeworfen, was dem Sprachentwickler gerade gefällt. Statt einer logischen Syntax wird es dann wieder nur C-Syntax die noch mit allerhand Schnickschnack beladen wird, statt einer konsistenten Standardbibliothek werden Funktionen der C-stdlib übernommen, statt Einfachheit wird nach dem Motto "viel macht viel" erweitert ohne Maß, und leichte Erlernbarkeit wird auf leichte Erlernbarkeit für C-Programmierer reduziert. So lange Sprachentwickler nicht ihre Eitelkeiten überwinden und ihrer Gewohnheit eine höhere Bedeutung beimessen als der Verfolgung der angestrebten Ziele, wird es so viele ideale Sprachen geben wie Entwickler. -- HenningThielemann


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 30. Mai 2005 12:56 (diff))
Suchbegriff: gesucht wird
im Titel
im Text