Wenn wir mit Python funktionale Programmierung durchführen können, benötigen wir eine bestimmte funktionale Programmiersprache? [geschlossen]


22

Mit Generatoren und Lambda können wir mit Python funktionale Programmierung durchführen. Mit Ruby können Sie dasselbe auch erreichen.

Die Frage ist also: Warum brauchen wir bestimmte funktionale Programmiersprachen wie Erlang, Haskell und Scheme? Gibt es etwas anderes, das diese spezifischen funktionalen Programmiersprachen bieten? Warum können wir Python nicht einfach für die funktionale Programmierung verwenden?


30
all diese waren schon da, bevor Python erstellt wurde
Mahmoud Hossam

51
Ein Ford Pinto ist ein Auto. Warum brauchen wir spezielle schnelle Autos wie Ferraris?
Martin York

11
Mit Klassen und Vorlagen können wir in C ++ alles OO machen. Warum wurden Java und Python jemals erstellt? Was fügen sie hinzu?
9000,

19
Alle Programmiersprachen (außer einigen rein akademischen Forschungssprachen) sind Turing-äquivalent. Was Sie also in Sprache A tun können, können Sie in jeder anderen Sprache tun. Nach diesem Gedankengang brauchen wir also nur eine vollständige Sprache für Turing - sagen wir sendmail.cf;) okmij.org/ftp/Computation/#sendmail-Turing
Maglob

17
Wenn Sie eine dieser Sprachen beherrschen, würden Sie nicht behaupten, dass Python gut funktioniert. Das tut es nicht. Es tut gut genug, um einen Teil der FP-artigen Dinge einzubeziehen, aber nicht besser.

Antworten:


20

Ich schätze die Frage, weil ich persönlich ein großer Fan von Python und funktionalem Programmierstil bin. Ich habe einen langen Hintergrund in Python und habe vor kurzem angefangen, Haskell zu lernen. Hier sind einige Punkte, die auf meinen persönlichen Erfahrungen mit den Unterschieden zwischen diesen Sprachen aus funktionaler Sicht basieren.

Reinheit

Auch wenn Sie sich nicht für die Reinheit der Funktionen interessieren (dh keine Nebenwirkungen haben), hat dies praktische Auswirkungen darauf, wie einfach es ist, Code und die Gründe dafür zu lesen. Selbst wenn Sie die Reinheit Ihrer eigenen Python-Funktionen beibehalten, besteht ein großer Unterschied darin, dass der Compiler die Reinheit erzwingt und vor allem die Standardbibliothek auf Reinheit und unveränderlichen Datenstrukturen basiert.

Performance

Die Leistung ist Ihnen je nach Anwendungsdomäne vielleicht egal oder auch nicht, aber statische Typisierung und garantierte Reinheit bieten dem Compiler im Vergleich zu Python und anderen dynamischen Sprachen viel mehr Möglichkeiten zum Arbeiten (obwohl ich zugeben muss, dass PyPy großartig ist Einbrüche, und zB grenzt LuaJIT an ein Wunder).

Tail-Call-Optimierung

Bezogen auf die Leistung, aber etwas anders. Auch wenn Sie sich nicht zu sehr für die Laufzeitleistung interessieren, schränkt die fehlende Tail-Call-Optimierung (insbesondere für die Tail-Rekursion) die Möglichkeiten ein, Algorithmen in Python zu implementieren, ohne die Stack-Grenzen zu überschreiten.

Syntax

Dies ist der Hauptgrund, warum ich angefangen habe, mir "echte" funktionale Sprachen anzuschauen, anstatt nur Python mit funktionalem Stil zu verwenden. Obwohl ich denke, dass Python im Allgemeinen eine sehr ausdrucksstarke Syntax hat, weist es einige Schwachstellen auf, die für die funktionale Codierung spezifisch sind. Beispielsweise:

  • Die Syntax für Lambda-Funktionen ist ziemlich ausführlich und begrenzt in dem, was sie enthalten können
  • Kein syntaktischer Zucker für die Funktionszusammensetzung dh f = g . hvs.f = lambda *arg: g(h(*arg))
  • Kein syntaktischer Zucker für teilweise Anwendung dh f = map gvs.f = functools.partial(map, g)
  • Kein syntaktischer Zucker für die Verwendung von Infixoperatoren in Funktionen höherer Ordnung , dh sum = reduce (+) lstvs.sum = reduce(operator.add, lst)
  • Keine Mustererkennung oder Schutzmechanismen für Funktionsargumente, die das Ausdrücken von Rekursionsendbedingungen und einigen Grenzfällen mit sehr lesbarer Syntax vereinfachen.
  • Klammern sind für Funktionsaufrufe niemals optional, und es gibt keinen syntaktischen Zucker für verschachtelte Aufrufe. Ich denke, das ist Geschmackssache, aber besonders im Funktionscode ist es üblich, Funktionsaufrufe zu verketten, und ich finde es y = func1 $ func2 $ func3 xleichter zu lesen, als y = func1(func2(func3(x)))wenn Sie mit dieser Notation vertraut sind.

28

Das sind die wichtigsten Unterschiede:

Haskell

  • Faule Bewertung
  • Kompiliert nach Maschinencode
  • Durch die statische Typisierung werden reine Funktionen sichergestellt
  • Inferenz eingeben

Haskell und Erlang

  • Mustervergleich

Erlang

  • Akteurmodell von Nebenläufigkeiten, leichten Prozessen

Planen

  • Makros

Alle Sprachen

  • echte Abschlüsse (Ruby hat Abschlüsse, ob Python dies tut, kann diskutiert werden, siehe die Kommentare)
  • eine Standardbibliothek, die für einen funktionalen Programmierstil geeignet ist (unveränderliche Sammlungen, Karten, Filter, Falz usw.)
  • Schwanzrekursion (dies kann auch in einigen nicht-funktionalen Sprachen gefunden werden)

Außerdem sollten Sie sich Sprachen aus der ML-Familie wie SML, Ocaml und F # und Scala ansehen, die OO und funktionale Programmierung auf eine neue Art und Weise verschmelzen. Alle diese Sprachen haben einzigartige interessante Eigenschaften.


3
+1 guter Beitrag. Sie können Typinferenz für Haskell- und Lightweight-Prozesse für Erlang hinzufügen.
Jonas

1
Python hat Map, Filter und Fold (Verkleinern). In Bezug auf "echte Abschlüsse": Wenn Sie einen echten Abschluss als einen Abschluss definieren, der etwas anderes als einen einzelnen Ausdruck enthalten kann, hat Haskell auch keine echten Abschlüsse (aber natürlich hat Haskell einige Dinge, die keine Ausdrücke sind ...) . Der Punkt über unveränderliche Datenstrukturen ist jedoch gut, also +1 dafür. Außerdem: Schwanzrekursion (und im Allgemeinen kostengünstigere Rekursion).
5.

2
+1 für "statische Typisierung stellt sicher, dass Funktionen rein sind". Es ist sehr cool, ein Typensystem zu haben, das zwischen reinen und nicht reinen Funktionen unterscheidet. (C ++ 's const doe snot count. :)
Macke

1
@btilly: Ich würde es nicht als Abschluß betrachten, wenn Sie einer Variablen, die im Gültigkeitsbereich liegt, nichts zuweisen können. Ansonsten müsste man sagen, dass Java auch Closures hat, da man dort den gleichen Trick anwenden kann.
Kim

3
In einem Closure kann ich auf die gleiche Weise auf eine Variable zugreifen, wie ich es normalerweise kann. Dies gilt für die Schließungen von Haskell und Ruby, nicht jedoch für Pythons oder Javas arme Vertreter. Vielleicht kann uns jemand anderes über Erlang aufklären, ich weiß es nicht so gut.
Kim

19

Es ist schwierig, genau zu definieren, was eine "funktionale Sprache" ist - von den von Ihnen aufgelisteten Sprachen ist nur Haskell rein funktional (alle anderen verwenden einen hybriden Ansatz). Es gibt jedoch einige Sprachfunktionen, die für die funktionale Programmierung sehr hilfreich sind, und Ruby und Python haben nicht genug davon, um für FP sehr gute Umgebungen zu sein. Hier ist meine persönliche Checkliste in der Reihenfolge ihrer Wichtigkeit:

  1. Erstklassige Funktionen und Abschlüsse (Ruby, Python und alle anderen, die Sie aufgelistet haben).
  2. Garantierte Tail-Call-Optimierung (Erlang, Haskell, Scala und Scheme haben dies, aber (noch) nicht Python, Ruby oder Clojure).
  3. Unterstützung für Unveränderlichkeit in den Sprach- und Standardbibliotheken (dies ist eine große, die alle "funktionalen Sprachen" haben, die Sie aufgelistet haben (außer Schema), aber Ruby und Python nicht).
  4. Sprachunterstützung für referenziell transparente (oder reine) Funktionen (soweit ich weiß, hat dies derzeit nur Haskell).

Der Bedarf an (1) sollte offensichtlich sein - Funktionen höherer Ordnung sind ohne erstklassige Funktionen äußerst schwierig. Wenn Leute darüber reden, dass Ruby und Python gute Sprachen für FP sind, reden sie normalerweise darüber. Diese spezielle Funktion ist jedoch notwendig, aber nicht ausreichend, um eine Sprache für FP zu verbessern.

(2) ist seit der Erfindung von Scheme eine traditionelle Notwendigkeit für FP. Ohne TCO ist es unmöglich, mit tiefer Rekursion zu programmieren, was einer der Eckpfeiler von FP ist, da Stapelüberläufe auftreten. Die einzige "funktionale" Sprache (laut populärer Definition), die dies nicht bietet, ist Clojure (aufgrund der Einschränkungen der JVM), aber Clojure verfügt über eine Vielzahl von Hacks, um die Gesamtbetriebskosten zu simulieren. (Zu Ihrer Information, Ruby TCO ist implementierungsspezifisch , aber Python unterstützt es nicht speziell .) Der Grund, warum TCO garantiert werden muss, ist, dass tief rekursive Funktionen bei einigen Implementierungen nicht funktionieren, so dass Sie es nicht wirklich können benutze sie überhaupt.

(3) ist eine weitere große Sache, die moderne funktionale Sprachen (insbesondere Haskell, Erlang, Clojure und Scala) nicht haben, wie Ruby und Python. Ohne zu sehr ins Detail zu gehen, beseitigt die garantierte Unveränderlichkeit ganze Klassen von Fehlern, insbesondere in gleichzeitigen Situationen, und ermöglicht saubere Dinge wie dauerhafte Datenstrukturen . Es ist sehr schwierig, diese Vorteile ohne Sprachunterstützung zu nutzen.

(4) ist für mich das Interessanteste an rein funktionalen Sprachen (im Gegensatz zu Hybridsprachen). Betrachten Sie die folgende extrem einfache Ruby-Funktion:

def add(a, b)
  a + b
end

Dies sieht nach einer reinen Funktion aus, kann jedoch aufgrund der Überladung des Operators zu einer Veränderung der Parameter oder zu Nebenwirkungen wie dem Drucken auf der Konsole führen. Es ist unwahrscheinlich, dass jemand den +Bediener überlastet , um eine Nebenwirkung zu haben, aber die Sprache gibt keine Garantie. (Das Gleiche gilt für Python, auch wenn dies in diesem Beispiel möglicherweise nicht der Fall ist.)

In einer rein funktionalen Sprache hingegen gibt es Garantien auf Sprachebene, dass Funktionen referenziell transparent sind. Dies hat zahlreiche Vorteile: reine Funktionen können leicht gespeichert werden; Sie können einfach getestet werden, ohne auf irgendeinen globalen Zustand angewiesen zu sein. und Werte innerhalb der Funktion können träge oder parallel ausgewertet werden, ohne sich um Parallelitätsprobleme kümmern zu müssen. Haskell nutzt dies voll aus, aber ich weiß nicht genug über andere funktionale Sprachen, um zu wissen, ob sie es tun.

Trotzdem ist es möglich, FP-Techniken in fast jeder Sprache (sogar Java) einzusetzen. Zum Beispiel ist Googles MapReduce von funktionalen Ideen inspiriert, aber soweit ich weiß, verwenden sie keine "funktionalen" Sprachen für ihre großen Projekte (ich denke, sie verwenden hauptsächlich C ++, Java und Python).


2
+1 für die gründliche Erklärung - auch ich als FP-Außenseiter habe es verstanden. Vielen Dank! :-)
Péter Török

bisher wertvollste Antwort auf diese Frage. Gegründet auf Fakten und vielen Informationen. Gut gemacht.
Wirrbel

Scala hat eine Schwanzrekursion und wird, wie bei Scheme, automatisch ausgeführt, wenn sich ein rekursiver Aufruf in der Schwanzposition befindet (im Gegensatz zu Clojure, wo er explizit angefordert werden muss). Es gibt sogar eine Anmerkung , so können Sie überprüfen , dass der Compiler wird Schwanz rekursive Code generieren. Was es nicht hat, ist die allgemeinere TCO von Scheme. Ich nehme an, Sie wissen das, aber da Sie über die meisten anderen Dinge so ausführlich vorgegangen sind, schien das eine merkwürdige Entlassung / Unterlassung zu sein.
itsbruce

@itsbruce Dieser Beitrag ist ziemlich alt, IIRC Scala hatte ihn zu diesem Zeitpunkt nicht (oder ich habe mich einfach geirrt;). Aktualisiert.
Shosti

Ich habe Scala von Anfang an nicht benutzt, aber es hatte 2008 eine Schwanzrekursion, als ich mich dafür interessierte ;-) Ich verweise Leute, die zu diesem Thema fragen, auf diese spezielle SO-Frage, weil sie einige gute Antworten hat und ich nur bemerkte diese Kuriosität, so der Vollständigkeit halber kommentiert.
itsbruce

11

Die Sprachen, die Sie erwähnen, sind sehr unterschiedlich.

Während Python und Ruby dynamisch typisierte Sprachen sind, ist Haskell statisch typisiert. Erlang ist eine konkurrierende Sprache, die das Actor-Modell verwendet und sich von allen anderen von Ihnen erwähnten Sprachen stark unterscheidet.

Python und Ruby haben viele imperative Konstrukte, während in einer reineren funktionalen Sprache wie Haskell alles etwas zurückgibt oder mit anderen Worten, alles eine Funktion ist.


@kRON: Nun, das Typensystem ist eine wichtige Eigenschaft einer Sprache, und er fragte: "Gibt es etwas anderes, das diese spezifischen funktionalen Programmiersprachen bieten?". Natürlich können Sie das Actor-Modell mit anderen Sprachen verwenden, aber Erlang hat es in die Sprache integriert. Erlang verwendet Lightweight-Prozesse und verfügt über integrierte Sprachkonstrukte für die verteilte Programmierung - eine "gleichzeitige" Sprache.
Jonas

8

Wie immer zu spät zur Party, aber ich werde sowieso Dinge sagen.

Eine funktionale Programmiersprache ist keine Sprache, die eine funktionale Programmierung ermöglicht. Wenn wir uns an diese Definition halten, dann ist so ziemlich jede Sprache irgendwo eine funktionale Programmiersprache. (Dies gilt übrigens auch für OOP. Sie können in C in einem OOP-Stil schreiben, wenn Sie möchten. Entsprechend Ihrer Logik ist C also eine OOP-Sprache.)

Was macht eine funktionale Programmiersprache ist nicht das, was es erlaubt , Ihnen zu Programm wie, es ist , was es lässt Sie wie programmieren leicht . Das ist der Schlüssel.

Also, Python hat Lambdas (die unglaublich anämische schließungsähnliche Vorgänge sind) und bietet Ihnen ein paar Bibliotheksfunktionen, die Sie in funktionalen Bibliotheken sehen werden, wie "map" und "fold". Dies ist jedoch nicht genug, um es zu einer funktionalen Programmiersprache zu machen, da es schwierig bis unmöglich ist, darin konsequent einen geeigneten funktionalen Stil zu programmieren (und die Sprache erzwingt diesen Stil mit Sicherheit nicht!). Im Kern ist Python eine imperative Sprache, die sich mit Zuständen und Zustandsmanipulationsoperationen befasst, und dies steht einfach im Widerspruch zu dem Ausdruck und der Ausdrucksbewertungssemantik einer funktionalen Sprache.

Warum haben wir also funktionale Programmiersprachen, wenn Python (oder Ruby (oder fügen Sie die Sprache Ihrer Wahl ein)) "funktionale Programmierung" durchführen kann? Da Python et al. Keine ordnungsgemäße funktionale Programmierung durchführen können. Deshalb.


6

Sie können funktionale Programmierung in Java durchführen (siehe zB http://functionaljava.org/ ). Sie können in C auch objektorientiert programmieren . Es ist einfach nicht so idiomatisch.

Wir brauchen also nicht unbedingt Erlang, Haskell, Scheme oder eine bestimmte Programmiersprache, aber alle stehen für unterschiedliche Ansätze und Kompromisse, was einige Aufgaben einfacher und andere schwieriger macht. Was Sie verwenden sollten, hängt davon ab, was Sie erreichen möchten.


4

Diese Frage kann auf eine unendliche Anzahl von Sprachen und Paradigmen angewendet werden.

  • Warum brauchen wir andere Allzwecksprachen, da jeder C ++ verwendet?
  • Warum gibt es andere OO-Sprachen, weil Java so eine großartige OO-Sprache ist?
  • Warum brauchen wir Python, da Perl eine erstaunliche Skriptsprache ist?
  • Yatta, Yatta, Yatta

Die meisten, wenn nicht alle Sprachen existieren aus einem bestimmten Grund. Sie existieren, weil jemand ein Bedürfnis hatte, das nicht oder nur unzureichend mit der aktuellen Sprache gefüllt war. (Dies gilt natürlich nicht für jede Sprache, aber ich denke, es gilt für die meisten bekannten Sprachen.) Beispielsweise wurde Python ursprünglich für die Schnittstelle mit dem Amoeba-Betriebssystem [ 1 , 2 ] entwickelt und Erlang wurde als Hilfe entwickelt bei der Entwicklung von Telefonieanwendungen [ 3 ]. Also eine Antwort auf die Frage "Warum brauchen wir eine andere funktionale Sprache?" kann einfach sein, weil [Name-von-jemand-einfügen-,-der-weiß-wie-zu-Design-Sprachen] die Art und Weise, wie Python es tat, nicht mochte.

Das fasst ziemlich genau zusammen, was ich denke, die Antwort ist. Während Sie mit Python alles tun können, was Sie mit einer funktionalen Sprache tun können, möchten Sie das wirklich? Alles, was Sie in C tun können, können Sie in der Montage tun, aber möchten Sie? Verschiedene Sprachen sind immer am besten in der Lage, verschiedene Dinge zu tun, und so sollte es auch sein.


2

Bei der funktionalen Programmierung geht es sowohl um ein Designparadigma als auch um spezifische Sprachmerkmale. Oder anders ausgedrückt, Lambdas und eine Kartenfunktion machen keine funktionierende Programmiersprache aus. Python und Ruby haben einige Funktionen, die von funktionalen Programmiersprachen inspiriert sind, aber Sie schreiben Code im Allgemeinen immer noch auf eine sehr zwingende Weise. (Es ähnelt C: Sie können OO-ähnlichen Code in C schreiben, aber niemand betrachtet C ernsthaft als OO-Sprache.)

Schauen Sie: Bei der funktionalen Programmierung geht es nicht nur um Lambdas oder mapFunktionen höherer Ordnung. Es geht um Design . Ein in einer "wahren" funktionalen Programmiersprache geschriebenes Programm löst Probleme über die Zusammensetzung von Funktionen. Während Programme, die in Ruby oder Python geschrieben wurden, möglicherweise FP-ähnliche Funktionen verwenden, lesen sie sich im Allgemeinen nicht wie eine Reihe zusammengesetzter Funktionen.


0

Jede von Ihnen erwähnte funktionale Sprache passt sehr gut in eine bestimmte Nische, und aufgrund der jeweils ermutigenden idiomatischen Muster eignen sie sich sehr gut für bestimmte Aufgaben, die in Python nicht möglich wären, wenn Sie nicht eine riesige Bibliothek von Hilfsmodulen erstellt hätten. Das offensichtlichste Beispiel für eine solche Nischenleistung ist das Erlang-Modell der Parallelität. Die anderen haben ähnliche Stärken.


0

Jedes Konzept, das in Lambda-Calculus, LISP und Scheme verfügbar ist, ist in Python verfügbar. Sie können also funktionale Programmierung darin durchführen. Ob es bequem ist oder nicht, ist eine Frage des Kontexts und des Geschmacks.

Sie können in Python (Ruby, Scala) problemlos einen LISP-Interpreter (oder eine andere funktionale Sprache) schreiben (was bedeutet das?). Sie können einen Interpreter für Python mit rein funktionalen Funktionen schreiben, aber es würde viel Arbeit erfordern. Sogar "funktionale" Sprachen sind heutzutage ein Multiparadigma.

Dieses alte und schöne Buch enthält die meisten (wenn auch nicht alle) Antworten darauf, was das Wesen der funktionalen Programmierung ausmacht.


@Arkaaito Aber stimmen Sie zu, dass jedes in Lambda Calculus, LISP und Scheme verfügbare Konzept in Python verfügbar ist?
Mark C

Sind Sie sicher, dass jedes Lisp-Konzept in Python verfügbar ist? Makros, Code ist Daten?
SK-logic

@ SK-logic Makros sind nicht im Lambda-Kalkül, aber ja, sie sind in Python verfügbar, allerdings nicht mit diesem Namen. Python bietet eine eval()Funktion, die benötigt wird, um Code in Daten umzuwandeln , aber es geht noch weiter: Sie können damit den größten Teil der Laufzeitumgebung wie in LISP ändern.
Apalala

@Apalala, dynamische Sprachen eval()ist eine Laufzeit-Metaprogrammierung. Manchmal ist es nützlich, aber es ist extrem teuer. Lisp-Makros sind unterschiedlich, es ist eine Metaprogrammierung zur Kompilierungszeit. Es ist in Python in keiner verwendbaren Form verfügbar.
SK-logic

@ SK-logic Diese Art von Makros unterbricht die Prämisse von Code-is-Data , da Programme Makros nicht ändern können (oder sogar wissen, dass sie existieren). In Python haben Programme zur Laufzeit Zugriff auf ihre eigenen Analysebäume, wenn sie diese benötigen. Makros (statische Vorverarbeitung) funktionieren überhaupt nicht.
Apalala

-5

Denn Python kann auch in einem nicht funktionalen Stil programmieren, und das ist für den FP-Puristen nicht gut genug. Pragmatischere Programmierer können jedoch die Vorteile des funktionalen Stils genießen, ohne dogmatisch zu sein:

„Der funktionierende Programmierer klingt eher wie ein mittelalterlicher Mönch, der sich die Freuden des Lebens verweigert, in der Hoffnung, dass es ihn tugendhaft macht. Für diejenigen, die mehr an materiellen Vorteilen interessiert sind, sind diese „Vorteile“ nicht sehr überzeugend. Funktionale Programmierer argumentieren, dass es große materielle Vorteile gibt… [aber] das ist einfach lächerlich. Wenn das Weglassen von Zuweisungsanweisungen solch enorme Vorteile gebracht hätte, hätten es FORTRAN-Programmierer seit zwanzig Jahren getan. Es ist eine logische Unmöglichkeit, eine Sprache leistungsfähiger zu machen, indem Funktionen weggelassen werden, egal wie schlecht sie auch sein mögen. “

- John Hughes, Warum funktionale Programmierung wichtig ist


6
Genau. Jede Sprache ohne gotoist schrecklich.
Anon.

2
@Anon: Oder seine großen Geschwister call-with-current-continuation.
Chris Jester-Young

4
Mason, das Papier, das Sie zitieren, sagt genau das Gegenteil. Ihr Zitat ist nur ein Fragment aus einigen Abschnitten eines Papiers, das eine andere Geschichte erzählt. Wenn Sie beide Absätze als Ganzes zitieren würden, würden sie eindeutig eine andere Bedeutung haben.
Marco Mustapic

2
@Mason: Ja, der Autor behauptet, Modularisierung und verzögerte Evaluierung seien die wahren Vorteile. Beachten Sie jedoch, dass Ihr ursprüngliches Zitat aus dem Zusammenhang geraten ist - Sie scheinen zu vermuten, dass der Autor etwas gegen FP behauptet, als Sie tatsächlich einen Absatz aus einem Papier zitierten, mit der Schlussfolgerung, dass FP großartig ist, nur nicht aus dem irreführenden Grund von " weniger ist mehr". Der Titel des Papers zeigt die Absicht des Autors ziemlich deutlich: "Warum funktionale Programmierung wichtig ist" ;-) Es unterstützt sicherlich nicht Ihre Behauptung, dass die reineren FP-Sprachen "ein Ärgernis sind".
Andres F.

6
@ Mason Wheeler: Hybride Sprachen gehen Python um ein Vielfaches voraus. Lisp zum Beispiel stammt aus dem Jahr 1959 und ist in der Tat eine Multiparadigmasprache. Es unterstützt vollständig funktionale Ansätze, prozedurale Ansätze und objektorientierte Ansätze zur Programmierung. Mit den richtigen Makropaketen können Sie auch ganz einfach Logikprogramme erstellen. Schema geht auch Python (und diesem Artikel) voraus. Es geht auf das Jahr 1975 zurück. Vielleicht sollten Sie irgendwann einen Blick auf diese Zeitleiste der Programmiersprachen werfen.
NUR MEINE STELLUNGNAHME
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.