2010-12-22 6 views

Antwort

9

Es gibt zwei gemeinsame (*) models of computation: das Lambda Calculus (LC) Modell und das Turing Machine (TM) Modell.

Lambda-Kalkül nähert sich der Berechnung, indem sie es unter Verwendung eines mathematischen Formalismus darstellt, in dem Ergebnisse durch die Zusammensetzung von Funktionen über eine Domäne von Typen erzeugt werden. LC steht auch in Zusammenhang mit Combinatory Logic, was als allgemeinerer Ansatz für dasselbe Thema gilt.

Die Turing Machine Modell nähert sich der Berechnung, indem es als die Manipulation von Symbolen auf idealisierten Speicher mit einem Körper von grundlegenden Operationen (wie Addition, Mutation, etc.) gespeichert darstellt.

Diese verschiedenen Berechnungsmodelle sind die Grundlage für verschiedene Programmiersprachenfamilien.Lambda Calculus hat zu Sprachen wie ML, Scheme und Haskell geführt. Das Turing-Modell hat zu C, C++, Pascal und anderen geführt. Als Verallgemeinerung haben die meisten functional programming Sprachen eine theoretische Basis in der Lambda-Kalkül.

Aufgrund der Natur der Lambda-Kalkül, sind bestimmte Beweise über das Verhalten von Systemen basierend auf seinen Prinzipien möglich. Tatsächlich ist die Beweisbarkeit (dh correctness) ein wichtiges Konzept in LC und ermöglicht bestimmte Arten von Schlussfolgerungen und Schlussfolgerungen über LC-Systeme. LC steht auch in Zusammenhang mit der Typentheorie und der Kategorientheorie.

Im Gegensatz dazu beruhen Turing-Modelle weniger auf der Typentheorie und mehr auf der Strukturierung der Berechnung als einer Reihe von Zustandsübergängen im zugrundeliegenden Modell. Turing Machine Modelle der Berechnung sind schwieriger Aussagen zu machen und eignen sich nicht für die gleichen mathematischen Beweise und Manipulationen, die LC-basierte Programme tun. Dies bedeutet jedoch nicht, dass eine solche Analyse nicht möglich ist - einige wichtige Aspekte von TM-Modellen werden bei der Untersuchung von Virtualisierung und statischer Analyse von Programmen verwendet.

Da die funktionale Programmierung auf einer sorgfältigen Auswahl der Typen und der Transformation zwischen den Typen beruht, kann FP als "mathematischer" Vorgang angesehen werden.

(*) Andere Berechnungsmodelle existieren ebenfalls, aber sie sind weniger relevant für diese Diskussion.

+1

Es ist wichtig zu erwähnen, dass diese beiden Modelle gleichwertig sind. –

4

Ich denke, ein Hauptgrund ist, dass reine funktionale Sprachen keine Nebenwirkungen haben, d. H. Kein veränderbarer Zustand, sie bilden nur Eingangsparameter zu Ergebniswerten ab, was genau eine mathematische Funktion ist.

0

Die logischen Strukturen der funktionalen Programmierung ist schwer . Während es nicht scheint, mathematisch zu sein, nur auf algebraischen Formen der Mathematik basierend, wird es very easily from discrete mathematics geschrieben.

Im Gegensatz zur imperativen Programmierung schreibt es nicht genau vor, was zu tun ist, sondern was zu tun ist. Dies spiegelt die Topologie wider.

+2

Ich denke _This reflektiert topology._ verdient eine Erklärung! –

+0

Das ist fair! Topologie ist die Untersuchung von Eigenschaften eines Objekts, die unter kontinuierlichen Deformationen des Objekts erhalten bleiben. Es betrifft typischerweise die Räume, die Funktionen von und nach abbilden, aber nicht die Funktionen selbst - es gilt für alle möglichen Funktionen, die eine solche Karte bereitstellen. In der funktionalen Programmierung werden die zugewiesenen und nicht zugeordneten Leerzeichen angegeben, nicht jedoch die Algorithmen selbst. Imperative gibt die Algorithmen an und hofft, dass sie dem richtigen Raum zugeordnet werden. –

0

Das mathematische Gefühl der funktionalen Programmiersprachen kommt von ein paar verschiedenen Funktionen. Am offensichtlichsten ist der Name; "funktional", d.h. unter Verwendung von Funktionen, die für die Mathematik grundlegend sind. Der andere wichtige Grund ist, dass funktionales Programmieren beinhaltet, eine Sammlung von Dingen zu definieren, die immer wahr sind, die durch ihre Interaktionen die gewünschte Berechnung erreichen - ähnlich wie mathematische Beweise.

8

Reine funktionale Programmiersprachen sind Beispiele für eine functional calculus und so in der Theorie in einer funktionalen Sprache geschriebene Programme können im mathematischen Sinne gedacht werden. Idealerweise möchten Sie in der Lage sein zu "beweisen", dass das Programm korrekt ist.

In der Praxis ist eine solche Argumentation sehr schwierig, außer in trivialen Fällen, aber es ist immer noch zu einem gewissen Grad möglich. Möglicherweise können Sie bestimmte Eigenschaften des Programms nachweisen, z. B. können Sie möglicherweise nachweisen, dass die Ausgabe bei allen numerischen Eingaben für das Programm immer innerhalb eines bestimmten Bereichs eingeschränkt ist.

In nicht-funktionalen Sprachen mit veränderlichem Zustand und Nebenwirkungen sind Versuche, über ein Programm nachzudenken und "Korrektheit" zu beweisen, im Moment zumindest unmöglich. Mit nicht-funktionalen Programmen können Sie das Programm durchdenken und davon überzeugen, dass Teile davon korrekt sind, und Sie können Komponententests ausführen, die bestimmte Eingaben testen, aber es ist normalerweise nicht möglich, strenge mathematische Beweise über das Verhalten des Programms zu erstellen.

+0

Das ist genau das, die Fähigkeit, die Logik zu beweisen, stammt direkt aus der Mathematik. –