Programmiersprachenfeatures - Was gibts?



  • Bei Datentypen könnte man noch sowas, wie discriminated Unions aufnehmen.

    Hauptsächlich aus der FP:
    Closures, Currying, Pattern Matching, List-Comprehensions, ...

    Join Calculus:
    Accords, ...

    Bei der Objektorientierung könnte man auch klassenbasierte und prototyp-Basierte OOP aufführen.
    Vielleicht auch sowas, wie schachteln/entschachteln wie z.B. in C# der Fall?

    Was ist mit Dingen, wie eager evaluation (by value, by reference, by copy-restore), lazy evaluation (by name, by need).

    Futures

    Die DbC-Sachen, wie preconditions, postconditions invariants
    ...



  • featuring schrieb:

    Christoph schrieb:

    featuring schrieb:

    Gibts Sprachen, bei denen man auch bei primitiven Typen Operatorüberladung anwenden kann?

    Klar, bei Smalltalk kannst du die Implementierungen aller Konstrukte anschauen und verändern. Die Addition von Integern gehört genauso dazu wie eine for-Schleife und eine if-Abfrage.

    Und wie sieht die Implementierung der Konstrukte aus? Basiert die wieder auf den oben genannten Features?

    Naja, du musst wissen, in Smalltalk ist alles ein Objekt. Alles! Also auch Codeblöcke, ...
    Ein Vergleich liefert entweder ein Objekt des Typs True oder ein Objekt des Typs False. Beide implementieren eine Methode "ifTrue:" Dieser kannst du einen Codeblock übergeben. die Implementierung von False sieht so aus, dass sie einfach nichts macht, die von True so, dass sie den Übergebenen Block ausführt.

    (1 < 2) ifTrue: [ "mach irgendwas" ].
    

    Allgemein sind Methoden in Smalltalk recht cool. z.B. hat die Klasse Dictionary die Methode "at:put:"

    map := Dictionary new.
    
    map at: 'foo' put: 'bar'.
    map at: 'baz' put: 'qux'.
    

    Selbst methoden mit vielen Argumenten bleiben so übersichtlich.



  • featuring schrieb:

    Christoph schrieb:

    featuring schrieb:

    Gibts Sprachen, bei denen man auch bei primitiven Typen Operatorüberladung anwenden kann?

    Klar, bei Smalltalk kannst du die Implementierungen aller Konstrukte anschauen und verändern. Die Addition von Integern gehört genauso dazu wie eine for-Schleife und eine if-Abfrage.

    Und wie sieht die Implementierung der Konstrukte aus? Basiert die wieder auf den oben genannten Features?

    An der Stelle wird bei Smalltalk etwas gemogelt. Die Standard-Implementierungen der Integer-Rechenoperationen sind zumindest bei Squeak sowas wie "<primitive #1234>", die verweisen also auf nicht näher beschriebene Funktionen der VM. Man könnte sicher manches ohne diese Primitiven implementieren, aber diese Implementierung hat natürlich auch Geschwindigkeitsgründe.
    Dennoch hat man vollen Zugriff auf den Code. Wenn man möchte, kann man also die Semantik von if verändern. Das macht man natürlich nicht, aber was sinnvoll ist, ist die Möglichkeit neue Schleifen-Typen zu erfinden, die syntaktisch vollkommen gleichwertig zu den vordefinierten while und for-Schleifen sind.

    featuring schrieb:

    Christoph schrieb:

    Mir ist nicht ganz klar worauf du hinaus willst; deine Feature-Liste scheint sehr auf C++ zugeschnitten zu sein. Die Unterscheidung Value/Pointer/Reference weist darauf hin. Dass Ablaufsteuerungen wie if, for, while, do von der Sprache bereitgestellt werden müssen, ist auch C++-spezifisch (schau dir nur Lisp, Haskell oder Smalltalk an).

    Ich will einfach wissen, was es alles gibt. Das mit if, for, do, while gilt ja auch für Java, Basic, Pascal,... Haben z.B. diese "KI Sprachen" spezielle Features für Fuzzy Logik oder so?

    Mit fuzzy logic kenn ich mich nicht gut aus, aber in Lisp und Haskell ist es recht einfach domain specific languages einzubauen. Daher kann es in diesen Sprachen einfacher sein fuzzy logic zu implementieren als in C++. Ich würde diese Sprachen aber nicht als KI-Sprachen, sondern als funktionale Sprachen bezeichnen. Abgesehen natürlich von Smalltalk, dessen Konzepte objekt-orientiert sind.



  • @Christoph:

    Das liest sich so als hättest Du einen guten Überblick über Sprachmerkmale und insbesondere Smalltalk! 👍

    Welche Smalltalk-Implementierung würdest Du unter Windows einsetzen?
    Und welche einem C++ Programmierer für den Einstieg empfehlen?
    Hab nichts konkretes damit vor; will lediglich mitreden können.

    Meine letzte Berührung damit verlief wenig erfreulich; ich versuchte "Hello World" zu schreiben und stellte fest dass zwar "Hello World" ausgegeben wurde aber irgendwelche Compiler-Messages den Inhalt meines Editor-Fensters überschrieben...
    Welche Implementierung das war weiss ich nicht mehr aber der Effekt könnte bekannt sein.

    Btw kennst Du noch andere Sprachen die Metaklassen anbieten ausser Smalltalk und Python (mit Perl geht's auch, wie wohl alles, aber das meine ich nicht 🙂 )?

    Grüsse

    *this



  • Gast++ schrieb:

    Welche Smalltalk-Implementierung würdest Du unter Windows einsetzen?
    Und welche einem C++ Programmierer für den Einstieg empfehlen?
    Hab nichts konkretes damit vor; will lediglich mitreden können.

    Ich hatte mal ein bisschen mit Squeak gespielt: http://www.squeak.org
    Diese Implementierung läuft gut unter Windows, aber auch auf anderen Betriebssystemen. Außerdem wird Squeak soweit ich weiß noch weiterentwickelt.

    Gast++ schrieb:

    ]Meine letzte Berührung damit verlief wenig erfreulich; ich versuchte "Hello World" zu schreiben und stellte fest dass zwar "Hello World" ausgegeben wurde aber irgendwelche Compiler-Messages den Inhalt meines Editor-Fensters überschrieben...
    Welche Implementierung das war weiss ich nicht mehr aber der Effekt könnte bekannt sein.

    Btw kennst Du noch andere Sprachen die Metaklassen anbieten ausser Smalltalk und Python (mit Perl geht's auch, wie wohl alles, aber das meine ich nicht 🙂 )?

    Ich meine dass Common Lisp mit CLOS etwas in der Richtung kann. Aber mit CLOS habe ich fast nichts gemacht, deswegen unter Vorbehalt.



  • Christoph schrieb:

    Ich hatte mal ein bisschen mit Squeak gespielt: http://www.squeak.org
    Diese Implementierung läuft gut unter Windows, aber auch auf anderen Betriebssystemen.

    Erstmal danke für den Link!

    Aber ich bin zu dumm dafür; ich habe jetzt hier gefunden wie ich 'Hello World' http://wiki.squeak.org/squeak/2230 schrieben können soll.
    Das habe ich auch getan und schon wieder seh ich dass 'Hello World' in meinen Source reingeworfen wird! 😕

    Christoph schrieb:

    Ich meine dass Common Lisp mit CLOS etwas in der Richtung kann. Aber mit CLOS habe ich fast nichts gemacht, deswegen unter Vorbehalt.

    Ja, klar. Danke! CLOS - Irgendwie hab Lisp-Dialekte systematisch verdrängt. Hab mich immer so "umklammert" gefühlt 🙂

    (und(Dank)(Gruesse(von-an(Gast++)(Christoph))))



  • Regulären Ausdrücken?
    großes Feature z.B. von Perl (jaja Ruby kanns auch teilweise, aber bestimmt noch mehr)



  • Policies, Prä- und Postkonditionen (Eiffel, letztere z.Zt. unter C++ mit Sentries nachzubilden)

    Btw Vielfach hört man dass Smalltalk die meistunterschäzte Sprache ist und in diversen Hypes zu Unrecht links liegen gelassen wurde. Da ich wie gesagt zu dumm für St bin (was mir allerdings auch etwas über die Sprache sagt) trifft für mich dies viel eher auf Eiffel zu - man betrachte ggf. mal die Features
    http://de.wikipedia.org/wiki/Eiffel_(Programmiersprache)#Aufbau_eines_Eiffel-Programms

    Und das hier

    http://www.eiffel.com/developers/faqs/eiffel-language.html#classic-compilestoc
    (oben) ist vielleicht nice to know.

    Grüsse

    *this



  • Continuations wurden glaube ich noch nicht genannt.
    Damit kann man auch ganz tolle Sachen machen.



  • featuring schrieb:

    Es gibt Sprachen bei denen Strings eingebaute Datentypen sind und nicht nur Klassen.

    Es gibt auch Sprachen, bei denen sind Arrays eingebaute Datentypen.
    Inwieweit sind "eingebaute Datentypen" ein besonderes Qualitätskriterium (und nicht viel eher eine Begrenzung von Generizität) ?

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Inwieweit sind "eingebaute Datentypen" ein besonderes Qualitätskriterium (und nicht viel eher eine Begrenzung von Generizität) ?

    Inwiefern schränken eingebaute Typen die "Generizität" ein?



  • Simon2 schrieb:

    featuring schrieb:

    Es gibt Sprachen bei denen Strings eingebaute Datentypen sind und nicht nur Klassen.

    Es gibt auch Sprachen, bei denen sind Arrays eingebaute Datentypen.
    Inwieweit sind "eingebaute Datentypen" ein besonderes Qualitätskriterium (und nicht viel eher eine Begrenzung von Generizität) ?

    In manchen Sprachen ist auch gar nicht so klar, wo die Grenze zwischen "eingebaut" und "nicht eingebaut" zu ziehen ist. In manchen Sprachen sind sogar Basis-Typen wie Int und Char in der Standard-Bibliothek definiert. Wenn man diese Datentypen als eingebaut ansieht, sind aber auch Arrays, Listen, Maps, Sets und vieles mehr eingebaut.

    Array, Listen und Maps gehören zum Sprachstandard von C++. In einem gewissen Sinn sind diese Typen also eingebaut.



  • message passing wurde iirc noch nicht erwähnt.



  • Helium schrieb:

    Simon2 schrieb:

    Inwieweit sind "eingebaute Datentypen" ein besonderes Qualitätskriterium (und nicht viel eher eine Begrenzung von Generizität) ?

    Inwiefern schränken eingebaute Typen die "Generizität" ein?

    Vielleicht nicht notwendigerweise, aber in den mir bekannten Sprachen sind sie das.
    Z.B. kann man von int nicht ableiten ... schade.
    Zumindestens in Java haben eingebaute Typen eine andere Semantik (andere Operationen, nicht als Referenzen übergebbar, ...) als "selbstgebaute Typen".

    Sind so zwei Beispiele, aber ich denke prinzipiell: Sobald zwischen "eingebauten/primitiven" und "selbstgemachten" Typen unterschieden wird/werden kann, bedeutet das, dass sie sich unterschiedlich verhalten .... und das ist IMO eine "Einschränkung der Generizität", weil man eben generischer Code diese Unterschiede berücksichtigen muss - und danmit nicht komplett generisch sein kann.

    Gruß,

    Simon2.



  • Das man von Integern ableiten kann gibts vielleicht in wenigen Sprachen, aber auch das gibt es. wobei fraglich sit, wie oft man das wirklich will.
    Die Unterscheidung in Java ist natürlich etwas doof. In C# ist es immerhin so, dass man auch wertartige Tyen definieren kann, die sich wie die eingebauten verhalten.



  • es ist durchaus praktisch - z.b. wenn man die erstellungs-semantik verändern will, oder die representation nach außen

    üblicherweise muss man dann die "ist ein" beziehung durch ein "hat ein" ausdrücken, was unschön ist



  • Die Idee dieses Thread gefällt mir, aber die Übersicht fehlt leider. Jemand da der die Liste freiwillig ergänzt?



  • Mal nen bissle neues aus der .Net Welt:

    Lambda Expressions
    Extension Methods
    Anonyme Typen
    Implizit typisierte lokale Variablen

    Gerade die letzten beiden Features sind was tolles. Volle Typsicherheit obwohl man gar keinen namentlich bekannten Typ verwendet 🙂



  • Zwergli schrieb:

    Mal nen bissle neues aus der .Net Welt:

    Lambda Expressions

    das ist aber nichts net spezifisches 😉



  • Zwergli schrieb:

    Mal nen bissle neues aus der .Net Welt:

    Lambda Expressions
    Extension Methods
    Anonyme Typen
    Implizit typisierte lokale Variablen

    Gerade die letzten beiden Features sind was tolles. Volle Typsicherheit obwohl man gar keinen namentlich bekannten Typ verwendet 🙂

    LOL, su meinst ein bischen uralten Kram, den .Net jetzt "wiederentdeckt" (war nie wirklich verschwunden).

    Lambda Expression => siehe z.B. Lisp aus den 1960ern. In jeder Funktionalen Sprache grundlage.

    Extension Methods => CLOS, Dylan, ...

    Anonyme Typen => OK, ich zeig dir jetzt mal ein wenig SML-code:

    type foo = {x:int, y:float, s:string ref}
    
    val bar = {x=0, y=3.14, s=ref ""}
    

    Kommt dir das bekannt vor? Vergleichbares geht in so gut wie jeder funktionalen Sprache.

    "Implizit typisierte lokale Variablen" => Zeig mir eine einzige funktionale Sprache, die keine Type deduction hat.

    Alles, was C# 3.0 jetzt als neu verkauft ist ein alter Hut (bis auf vielleicht Linq, wobei das ja nur eine nette Synthax für filter, mapping, etc. ist, so wie list comprehensions im Grunde auch.)


Anmelden zum Antworten