Care este diferența între programare procedural și funcțional programare?

Am'am citit articole Wikipedia pentru ambele programare procedurală și funcțional programare, dar am'm mai ușor confuz. Ar putea cineva să se fierbe până la miezul?

Soluția

Un limbaj funcțional (în mod ideal) vă permite să scrieți o funcție matematică, adică o funcție care ia n argumente și returnează o valoare. Dacă programul este executat, această funcție este logic evaluate după cum este necesar.1

Un limbaj procedural, pe de altă parte, îndeplinește o serie de secvențială pași. (Nu's o modalitate de a transforma logica secvențială în logică funcțională numit continuare trece style.)

Ca o consecință, un caracter pur funcțional de a repeta mereu dă aceeași valoare pentru o intrare, și ordinea de evaluare nu este bine definit; ceea ce înseamnă că incert valori introduse de utilizator sau de valori aleatoare sunt greu de modelul pur de limbi funcționale.


1 Ca orice altceva în acest răspuns, asta e o generalizare. Această proprietate, evaluarea unui calcul atunci când rezultatul acesteia este nevoie, mai degrabă decât secvențial în cazul în care este numit, este cunoscut sub numele de "lene". Nu toate limbajele functionale sunt de fapt universal leneș, nici lene limitată la programare funcțională. Mai degrabă, descrierea prezentate aici oferă un "cadru mental" să se gândească la diferite stiluri de programare care nu sunt distincte și opuse categorii, ci mai degrabă de lichid de idei.

Comentarii (4)

În informatică, programare funcțională este o paradigmă de programare care tratează calcul ca evaluarea de funcții matematice și evită stat și mutabil de date. Se pune accentul pe aplicarea de funcții, în contrast cu stilul de programare procedural, care pune accentul pe schimbările în stat.

Comentarii (1)

Cred că procedurale/funcționale/obiectiv de programare sunt despre cum sa abordez problema.

Primul stil ar planifica totul în pași, și rezolvă problema de punere în aplicare cu un pas (o procedură) la un moment dat. Pe de altă parte, programare funcțională ar sublinia divide-and-conquer abordare, în cazul în care problema este divizată în sub-probleme, apoi fiecare sub-problema este rezolvată (crearea de o funcție pentru a rezolva subproblema), iar rezultatele sunt combinate pentru a crea răspunsul pentru întreaga problemă. În cele din urmă, Obiectivul de programare ar imita lumea reala de a crea o mini-lume în interiorul computerului cu mai multe obiecte, fiecare dintre care are o (oarecum) caracteristici unice, și interacționează cu ceilalți. Din aceste interacțiuni rezultatul va ieși la iveală.

Fiecare stil de programare are propriile sale avantaje și puncte slabe. Prin urmare, a face ceva, cum ar fi "pur programare" (de exemplu, pur procedurale - nimeni nu face acest lucru, apropo, care este un fel de ciudat - sau pur funcționale sau pur obiectiv) este foarte dificil, dacă nu imposibil, cu excepția unor probleme elementare special concepute pentru a demonstra avantajul de un stil de programare (prin urmare, facem apel ca cei care puritatea "weenie" :D).

Apoi, de la aceste stiluri, avem limbaje de programare, care este proiectat pentru a optimizat pentru unii fiecare stil. De exemplu, Ansamblul este vorba de procedură. Bine, mai devreme limbi sunt norme de procedură, nu numai Așm, cum ar fi C, Pascal, (și Fortran, eu am auzit). Apoi, avem toate celebre Java în obiectiv școală (de Fapt, Java și C# este, de asemenea, într-o clasă numită "bani-orientate," dar asta e subiect pentru altă discuție). De asemenea, obiectivul este de Smalltalk. Funcționale în școală, ne-ar fi "aproape funcționale" (unele le-a considerat a fi impur) Lisp și familia ML de familie și multe "pur funcționale" Haskell, Erlang, etc. Apropo, există multe generală limbaje cum ar fi Perl, Python, Ruby.

Comentarii (0)

Pentru a extinde pe Konrad's comentariu:

Ca o consecință, un caracter pur funcțional de a repeta mereu dă aceeași valoare pentru o intrare, și ordinea de evaluare nu este bine definit;

Din aceasta cauza, cod funcțional este, în general, mai ușor de a paraleliza. Din moment ce există (în general) nu are efecte secundare de funcții, și-au (în general) să acționeze doar pe argumentele lor, o mulțime de probleme de concurenta du-te departe.

Programare funcțională este, de asemenea, utilizat atunci când aveți nevoie pentru a fi capabil de a demonstrarea codul este corect. Acest lucru este mult mai greu de a face cu programare procedurală (nu-i ușor să funcțional, dar încă mai ușor).

Disclaimer: nu am't utilizate programare funcțională în ani, și doar recent a început să mă uit la el din nou, așa că ar putea să nu fie complet corecte aici. :)

Comentarii (0)

Limbaje procedurale au tendința de a ține evidența de stat (folosind variabile) și au tendința de a executa ca o secvență de pași. Pur limbi funcționale don't țineți evidența de stat, utilizarea imuabil de valori, și au tendința de a executa o serie de dependențe. În multe cazuri statutul de stiva de apel va deține informații care ar fi echivalentă cu cea care ar fi stocate în variabile de stat în codul de procedură.

Recursivitatea este un exemplu clasic de stil funcțional programare.

Comentarii (1)

Pentru a extinde pe Konrad's comentariu:

și ordinea de evaluare nu este bine-definite

Unele limbi funcționale au ceea ce se numește Leneș de Evaluare. Ceea ce înseamnă că o funcție nu este executat până la valoarea este nevoie. Până la acel moment funcția în sine este ceea ce este trecut în jurul valorii de.

Limbaje procedurale sunt pas 1 pas 2 pas 3... dacă la pasul 2 ați spune adaugă 2 + 2, o face chiar atunci. În lenes evaluare ai spune adaugă 2 + 2, dar dacă rezultatul nu este niciodată folosit, nu are adaos.

Comentarii (0)