Deklarative Programmierung

pumuckel

New Member
Hallo,

zur Zeit zeigt mein Mathematik-Lehrer uns im Unterricht verschiedene Beweise und Rätsel. Weil ich das ziemlich interessant finde, habe ich ihn gefragt wie ich vorgehen sollte, wenn ich mich damit etwas mehr beschäftigen möchte. Daraufhin hat er mir geraten das ganze ein wenig spielerisch anzugehen, indem ich im Internet nach den Themen suche, die mich interessieren, und mir die Seite Project-Euler empfohlen. Außerdem meinte er, dass es bei Project-Euler von Vorteil ist, wenn man ein wenig programmieren kann.
Da ich nicht programmieren kann, hat er mir empfohlen mir eine deklarative, das heißt funktionale und/oder logische, Programmiersprache auszusuchen. Als Beispiele hat er Prolog, Haskell und Lisp genannt. Außerdem hat er mir geraten eine kleine Sprache auszusuchen und diese mindestens ein Jahr, wenn nicht sogar zwei oder drei, ausschließlich zu benutzen, um sie gedanklich zu durchdringen, sowie mir bei meiner Wahl von jemandem zusätzlichen Rat zuholen, der sich mit dem Thema besser auskennt, weil er schon länger niemanden bei so etwas beraten hat.
Was denkt ihr darüber und welche Sprachen könnt ihr mir da empfehlen? Ich weiß, dass ich mich letztendlich entscheiden muss, aber ich kenne mich mit sowas nicht aus und möchte mich deshalb ein wenig umhören. Achso... Und die Sprache sollte auf FreeBSD laufen :D

Danke schon mal^^
 
Also grundsätzlich kann ich die Aussagen deines Lehrers unterstreichen. Projeke Euler ist wirklich gut um sich mit Knobeleien zu befassen und ja, hier ist die Kenntnis und Nutzung einer Programmiersprache grundsätzlich mehr als zu empfehlen. Ich empfehle die Seite auch immer gerne für Programmieranfänger. Auch die Aussage diese Sprache erst zu durchsteigen bevor man sich neuen Ufern auf macht kann ich unterstreichen. Ich hab mal gelernt "Basiswissen + Basiswissen = Mehr Basiswissen". Um tieferes Verständnis zu erlangen bringt es also nix wie wild Basiswissen anzuhäufen. Ob das nun aber gleich zwei oder drei Jahre sein müssen darüber kann man streiten. Das hängt halt stark von dir und deiner Nutzung ab.

Deine Frage nach der richtigen Sprache ist nun natürlich so eine Sache. Wenn das das Forum etwas durchsuchst wirst du feststellen, dass regelmäßig jemand nach der "Einstiegssprache" fragt und immer viele und vor allem viele unterschiedliche Meinungen bekommt.
Grundsätzlich kann man mit jeder Sprache einsteigen. Da ich mit keiner der von dir genannten Sprachen bisher selbst gearbeitet habe kann ich dazu leider nichts sagen.

Seh dich einfach mal um und entscheide dich dann für etwas. Ich denke für die Art der Fragestellung die du bearbeiten willst ist es wirklich relativ egal welches Sprache du wählst.
 
Konzeptionell gefällt mir Scheme-Lisp recht gut und hat eine gewisse Reputation auch als Lernsprache. Allerdings bin ich niemals über die Basics hinausgekommen da mir die vielen ((())) zu wenig visuelle Struktur zur Orientierung geben. Aber wer damit nicht wie ich überfordert ist, für den ist das gewiss eine interessant Option. Es gibt da eine ganze Menge an Implementationen, aber die folgenden sind wohl die wichtigsten.

Racket (Interpreter und JIT Compiler)
Chicken-Scheme (Compiliert nach C)
Gambit-Scheme (Interpreter und Compiler)

HTH

Peter
 
Meiner Meinung nach ganz klar Common Lisp, weil Common Lisp sozusagen die Grundlage anderer Sprachen wie Haskell, Scheme und Clojure darstellt; von Common Lisp ausgehend kannst du dann ja immer noch was anderes lernen. Tatsächlich halte ich Lisp für eine der am einfachsten zu lernenden Sprachen und finde es etwas schade, dass es an Hochschulen so selten zur Sprache kommt (wahrscheinlich, weil es in der Wirtschaft von Java und Python abgelöst wurde). Der hauptsächliche Unterschied zwischen Common Lisp und anderen Sprachen ist übrigens, dass du dir bei Common Lisp das Paradigma aussuchen kannst. Haskell ist meines Wissens ausschließlich deklarativ, Common Lisp muss es nicht bleiben.

Empfehlenswerte Anlaufstellen:

 
Die Empfehlung bei der ersten Sprache zu bleiben ist gut. Wenn Du eine Sprache ordentlich durchdrungen hast, fällt dir die Nächste deutlich leichter.

Ich empfand die funktionale Programmierung lange als unintuitiv und damit wenig zielführend. Aber das geht nicht jedem so und inzwischen habe ich keine Probleme damit zwischen den Paradigmen zu wechseln. Nur die Syntax vieler funktionaler Sprachen wirkt für mich recht bizarr. Aber das ist eine Gewohnheitsfrage.
 
Stimme auch zu. Dass er funktionale Sprachen empfohlen hat zeigt wohl allem voran, dass es sich um einen Mathe-Lehrer handelt. ;)

Wenn du dich an LISP (oder Scheme), bzw. Haskell oder Prolog hältst, dann wirst du sicher nichts falsches wählen. Ich würde von Prolog vielleicht etwas Abstand nehmen, einfach weil das mittlerweile noch viel weiter am Rande steht, als die Anderen. Ich kann mich da den Vorrednern nur anschließen. Sind alles tolle Projekte. Ich glaube den mit Abstand besten Einstieg wirst du mit Racket haben.

Der Grund dafür ist, dass du sowohl eine vor allem für den Anfang großartige Umgebung (DrRacket) gleich mitbekommst, als auch anständig Support an Libraries, Community, etc. dabei hast.

Was Kamikaze's Aussage betrifft ist es vielleicht als jemand, ohne Programmiersprache wohl leichter ist. War lange Zeit nur Vermutung, aber weiß mittlerweile von einer ganzen Reihe an Leuten, die LISP (oder Scheme) als erste Sprache hatten, dass das nicht der Fall ist. Insofern denke ich, dass wie vermutet der Paradigmenumstieg das Problem verursacht.
 
Meiner Meinung nach ganz klar Common Lisp, weil Common Lisp sozusagen die Grundlage anderer Sprachen wie Haskell, Scheme und Clojure darstellt; von Common Lisp ausgehend kannst du dann ja immer noch was anderes lernen.
Ganz so ist es nun wirklich nicht. CL und Scheme sind gleichberechtigte, wenn auch unterschiedliche Lisp Dialekte. Common Lisp ist aus dem Bemühen entstanden frühere Lisp Implementation aus unterschiedlichen Bereichen/Hochschulen zu vereinigen was mit Hilfe des ANSI-Standards auch gelungen ist. Insbesondere haben sie aus verschiedenen Vorläufern ein gemeinsames Objekt-System entwickelt (CLOS). Dabei hat CL von Scheme die (von Algol stammende) lexikalische Bindung der Variablen übernommen. In CL gibt es im Unterschied zu Scheme immer noch die dynamsiche Bindung der Variablen was aber m.W. selten oder auch nicht mehr genutzt wird.

Scheme hat noch einige andere Inovationen eingeführt die von denen einige in CL übernommen worden sind, andere nicht: Continuations (call/cc) als grundlegenden Mechanismus für Controllstrukturen, Hygiernische Macros und verpflichtende Tail-Call Optimisation. All das ist immer wieder Gegenstand heftiger - pseudo-religiöser ? - Kontroversen.:rolleyes:

Insgesammt kann man wohl sagen das CL eine "Große Sprache" die ist auch im kommerziellen Umfeld die Nase vorn hat während sich Scheme um Orthogonilität und einen gewissen Minimalismus bemüht, - in gewisser Weise mit C++ und C vergleichbar. Mit R6RS wurde versucht auch in Scheme eine kommerziell interessante, umfangreiche Standartisierung zu erreichen was abe nur von wenigen Implemetierungen unterstützt wird, die meisten bleiben wohl bei R5RS. Um dieses Schisma zu überwinden wird es wohl zukünftig einen umfangreichen (R6RS) und einen leichtgewichtigen Standart (R7RS) geben.

Der Punkt bei Lisp ist dass das extrem mächtige Macro-System die Implentierung unterschiedlichster Paradigmen erlaubt, und das Jahrzehnte vor C++ Templates und Co. Von daher ist jedes Lisp für die Forschung bestens geeignet. Allerdings sollte nicht übersehen werden dass Lisp die Mutter aller dynamischenschen Sprachen ist, von Smalltalk bis hin zu Python und Lua (Referenz-Semantik) was entweder Laufzeitnachteile oder eben extrem komplexe, optimierende Compiler erfodert. In diese Lücke sind dann ML und Haskel gestoßen die auf dezidierte Typen aufsetzen, allerdings mit Type-Inferenz. Insofern kann man ML und Haskel als typisierte Sprachen nicht unbedingt mit Lisp vergleichen.

Ich stimme Athabe zu das vermutlich Racket der beste Einstieg in Lisp ist. Und interessant und spannend sind solche Sprachen allemal. Wenn nur die vielen ((())) nicht wären ...:rolleyes:

Peter
 
Man kann zwei Sachen dazu sagen:

Wenn Du mit Schwerpunkt auf Mathe lernen willst, wenn es um Funktionen und Kategorien geht, dann empfehle ich Dir Haskell. Wobei, es ist zu beachten, dass sie gerade drastische Veränderungen an den APIs machen. Es ist auch interessant, diese zu verfolgen.

Wenn Du Mathe in Form von Logik bevorzugst, dann gibt es PROLOG, was aber nicht als eine allgemeine Sprache taugt, meines Wissens nach.

Aber allgemein gesagt, jede Programmiersprache, die Du lernst und beherrschst, bringt Dich ein ganzes Stück weiter, sogar BASIC.
 
BASIC hat den Nachteil, dass man das Wissen über es nur schwerlich auf andere Sprachen anwenden kann.
 
Das "B" bei BASIC steht für "Beginner". Und dabei sollte man es auch lassen. Man sollte aber nie sagen, dass man aus einer Sprache nichts lernt, weil das einfach nicht wahr ist.
 
Zurück
Oben