Jaka jest różnica między „funkcją” a „procedurą”?


203

Mówiąc ogólnie, wszyscy słyszymy o funkcjach lub procedurach w językach programowania. Jednak właśnie dowiedziałem się, że używam tych terminów prawie zamiennie (co prawdopodobnie jest bardzo błędne).

Moje pytanie brzmi:

Jaka jest różnica pod względem funkcjonalności, przeznaczenia i zastosowania?

Przykład byłby mile widziany.



6
Myślę, że SICP robi to dobrze. Funkcje istnieją tylko w matematyce i reprezentują to, co jest wiedzą. Procedury istnieją w językach programowania (w tym funkcjonalnych) i reprezentują sposób wiedzy. Funkcja : sqrt (x) = y taki, że y ^ 2 = x. Procedura : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Odpowiedzi:


295

Funkcja zwraca wartość, a procedura po prostu wykonuje polecenia.

Funkcja imienia pochodzi od matematyki. Służy do obliczania wartości na podstawie danych wejściowych.

Procedura to zestaw poleceń, które można wykonać w kolejności.

W większości języków programowania nawet funkcje mogą mieć zestaw poleceń. Dlatego różnica polega tylko na zwracaniu części wartości.

Ale jeśli chcesz utrzymać funkcję w czystości (wystarczy spojrzeć na języki funkcjonalne), musisz upewnić się, że funkcja nie ma skutków ubocznych.


Jak można zapewnić brak skutków ubocznych w języku rozkazującym (java, c) lub deklaratywnym (scala, schemat)?
orlybg 10.10.2013

1
@orlybg, w językach deklaratywnych spójność wynika z implementacji języka. Ograniczenia ich zakresu zapobiegają skutkom ubocznym. Z drugiej strony języki imperatywne jawnie wykorzystują swoje skutki uboczne. Efekty uboczne nie zawsze są złe.
Tharindu Rusira

Czytam następujący samouczek Ada ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), w którym drugi akapit tej strony zaczyna się od „Procedury w Adzie są podobne do tych w Pascalu Procedura może zawierać instrukcje zwrotne. ”. Czy to błąd w tekście? Czy oznacza to, że może zawierać instrukcje return, ale nie zwraca żadnych wartości?
jviotti

3
W pascal procedury nie mają instrukcji return, tylko funkcje. Musi być błąd w tekście. Jednak procedura może zawierać instrukcję „exit”, która może działać jako instrukcja „return” bez argumentów, co oznacza brak wartości zwracanych.
Eric Fortier

funkcja może pobierać dane wejściowe i zwracać tylko dane wyjściowe. Procedura lub makro mogą uzyskać dane wejściowe i nie zwracać żadnych danych, wykonać tylko liczbę instrukcji. główna różnica polega na tym, że procedura nie może zwrócić żadnego typu danych.
EsmaeelE,

42

To zależy od kontekstu.

W językach podobnych do Pascala funkcje i procedury są odrębnymi jednostkami, różniącymi się tym, czy zwracają wartość, czy nie. Zachowują się inaczej. składnia języka (np. wywołania procedur tworzą instrukcje; nie można użyć wywołania procedury wewnątrz wyrażenia, a wywołania funkcji nie tworzą instrukcji, należy ich używać w innych instrukcjach). Dlatego programiści z Pascal rozróżniają te.

W językach podobnych do C i wielu innych współczesnych językach to rozróżnienie zniknęło; w językach o typie statycznym procedury są tylko funkcjami o zabawnym typie zwrotu. Prawdopodobnie dlatego są używane zamiennie.

W językach funkcjonalnych zwykle nie ma czegoś takiego jak procedura - wszystko jest funkcją.


a dokumentacja języków programowania może wywoływać funkcje i procedury, jak tylko zechce, ponieważ ludzie zaakceptują dowolne nazwisko, ponieważ tło tych nazw zostało już dawno wymyte.
Arne Babenhauserheide

18

Przykład w C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Chociaż należy zauważyć, że Standard C nie mówi o procedurach, tylko działa.


4
... Standard C nie mówi o procedurach, tylko o funkcjach. To dlatego, że ma tylko funkcje. Funkcja, która niczego nie zwraca, to void function. Kernighan & Ritchie Ch 1.7: „W C funkcja jest równoważna podprogramowi lub funkcji w Fortran lub procedurze lub funkcji w Pascal.” Innymi słowy ... ta odpowiedź jest błędna.
Mogsdad,

8
Odpowiedź nie jest zła i jest dobrym przykładem różnicy między czystymi funkcjami i procedurami. K&R nazwał każdą podprocedurę „funkcją” dla uproszczenia, ale podprogram z efektami ubocznymi jest w rzeczywistości „procedurą”, a nie „funkcją” w sensie kanonicznym z matematyki. C może być lepszym językiem, jeśli odróżnia rzeczywiste funkcje od procedur, pomogłoby to w analizie statycznej, optymalizacji wydajności i równoległości.
Sam Watkins,

12

Ogólnie procedura jest sekwencją instrukcji.
Funkcja może być taka sama, ale zwykle zwraca wynik.


11

Istnieje termin podprogram lub podprogram, który oznacza sparametryzowany fragment kodu, który można wywołać z różnych miejsc.

Funkcje i procedury są ich implementacjami. Zwykle funkcje zwracają wartości, a procedury nic nie zwracają.


6

Podstawowe różnice

  • Funkcja musi zwrócić wartość, ale w Procedurach składowanych jest opcjonalna: procedura może zwrócić 0 lub n wartości.
  • Funkcje mogą mieć tylko parametry wejściowe, podczas gdy procedury mogą mieć parametry wejściowe / wyjściowe.
  • W przypadku funkcji obowiązkowe jest przyjęcie jednego parametru wejściowego, ale procedura składowana może zająć od 0 do n parametrów wejściowych.
  • Funkcje mogą być wywoływane z procedury, podczas gdy procedury nie mogą być wywoływane z funkcji.

Zaawansowane różnice

  • Wyjątki mogą być obsługiwane przez bloki try-catch w procedurze, podczas gdy blok try-catch nie może być użyty w funkcji.
  • Możemy przejść do zarządzania transakcjami w procedurze, podczas gdy w funkcji nie możemy.

W SQL:

  • A Procedura pozwala SELECTrównież jako DML ( INSERT, UPDATE, DELETE) sprawozdania w nim, podczas gdy funkcja pozwala jedynie SELECToświadczenie w nim.
  • Procedury nie mogą być użyte w SELECTinstrukcji, podczas gdy Funkcje mogą być osadzone w SELECTinstrukcji.
  • Procedur przechowywanych nie można używać w instrukcjach SQL w żadnym miejscu bloku WHERE(lub a HAVINGlub a SELECT), podczas gdy Funkcje mogą.
  • Funkcje zwracające tabele można traktować jako inny zestaw wierszy. Można tego użyć w JOINbloku z innymi tabelami.
  • Funkcje JOINwbudowane mogą być traktowane jako widoki, które przyjmują parametry i mogą być używane w blokach i innych operacjach zestawu wierszy.

3
Ta odpowiedź jest bardzo specyficzna dla języka, podczas gdy pytanie było niezależne od języka. Nie wszystkie stwierdzenia tutaj są prawdziwe w ogólnym przypadku, ale byłoby pomocne, gdybyś wyjaśnił język lub środowisko, w którym się je twierdzi.
Mogsdad,

5

Ściśle mówiąc, funkcja f jest zgodna z właściwością, że f (x) = f (y), jeśli x = y, tzn. Oblicza ten sam wynik za każdym razem, gdy jest wywoływana z tym samym argumentem (a zatem nie zmienia stanu system.)

Zatem rand () lub print („Hello”) itp. Nie są funkcjami, lecz procedurami. Chociaż sqrt (2.0) powinien być funkcją: nie ma zauważalnego efektu ani zmiany stanu bez względu na to, jak często się go wywołuje i zwraca zawsze 1,41 i niektóre.


3
To użycie jest ponownie wprowadzone w kontekście programowania „funkcjonalnego”. Należy pamiętać, że wiele (często imperatywnych) języków, które nazywają swoje podprogramy „funkcjami”, nie wymaga tej właściwości.
dmckee --- były moderator kotek

1
Nie sugerowałem, że języki programowania wymagają tej właściwości. W każdym razie można pisać ścisłe funkcje w dowolnym języku i uważam, że dobrym nawykiem jest programowanie jak najwięcej w czystych funkcjach, a następnie sklejanie kawałków razem z jakąś główną procedurą.
Ingo

4

Jeśli jesteśmy tutaj niezależni od języka, procedura zwykle określa szereg działań wymaganych do rzetelnego i idempotentnego osiągnięcia określonego wyniku. Oznacza to, że procedura jest w zasadzie algorytmem.

Z drugiej strony funkcje to nieco niezależny fragment kodu w większym programie. Innymi słowy, funkcja jest implementacją procedury.


4

To dobrze znane stare pytanie, ale chciałbym podzielić się nieco więcej spostrzeżeniami na temat badań i projektowania współczesnego języka programowania.

Podstawowa odpowiedź

Tradycyjnie (w sensie programowania strukturalnego ) i nieformalnie procedura jest konstrukcją strukturalną wielokrotnego użytku, która ma „dane wejściowe” i umożliwia programowanie. Gdy trzeba coś zrobić w ramach procedury, możesz podać (rzeczywiste) argumenty do procedury w wywołaniu procedury zakodowanym w kodzie źródłowym (zwykle w rodzaju wyrażenia), a także działania zakodowane w treści procedury (pod warunkiem w definicji procedury) zostanie wykonana z podaniem argumentów na (formalne) parametry użyte w treści.

Funkcja jest większa niż procedura ponieważ wartości powrotne może być określony jako „Wyjście” w organizmie. Wywołania funkcji są mniej więcej takie same jak wywołania procedur, z tym wyjątkiem, że można również użyć wyniku wywołania funkcji, składniowo (zwykle jako podwyrażenie jakiegoś innego wyrażenia).

Tradycyjnie, wywołania procedur (a nie wywołania funkcji) są używane do wskazania, że ​​żadne wyjście nie musi być zainteresowane, i muszą istnieć skutki uboczne, aby uniknąć wywołania braku operacji, dlatego podkreślono paradygmat programowania imperatywnego . Wiele tradycyjnych języków programowania, takich jak Pascal, zapewnia zarówno „procedury”, jak i „funkcje” w celu rozróżnienia zamierzonej różnicy stylów.

(Żeby było jasne, wspomniane powyżej „dane wejściowe” i „dane wyjściowe” są uproszczonymi pojęciami opartymi na właściwościach składniowych funkcji. Wiele języków dodatkowo obsługuje przekazywanie argumentów do parametrów przez odniesienie / udostępnianie, aby umożliwić użytkownikom przesyłanie informacji zakodowanych w argumentach podczas wywołań Taki parametr można nawet nazwać po prostu „parametrem wejścia / wyjścia”. Ta funkcja opiera się na naturze obiektów przekazywanych w wywołaniach, która jest ortogonalna względem właściwości funkcji procedury / funkcji.)

Jeśli jednak wynik wywołania funkcji nie jest potrzebny, można go (przynajmniej logicznie) zignorować, a definicje funkcji / wywołania funkcji powinny być spójne z definicjami procedur / wywołaniami procedur w ten sposób. Języki podobne do ALGOL, takie jak C, C ++ i Java, wszystkie zapewniają w ten sposób funkcję „funkcji”: kodując typ wyniku voidjako specjalny przypadek funkcji wyglądających jak tradycyjne procedury, nie ma potrzeby zapewniania funkcji „procedur” „osobno. Zapobiega to wzdęciom w projektowaniu języka.

Ponieważ wspomniano o SICP, warto również zauważyć, że w języku schematu określonym przez R n RS procedura może, ale nie musi, zwracać wynik obliczeń. Jest to połączenie tradycyjnej „funkcji” (zwracanie wyniku) i „procedury” (nic nie zwracającej), zasadniczo identycznej z koncepcją „funkcji” wielu języków podobnych do ALGOL (i faktycznie udostępniających jeszcze więcej gwarancji, takich jak oceny aplikacyjne operandy przed wywołaniem). Jednak różnice w starym stylu wciąż występują nawet w dokumentach normatywnych, takich jak SRFI-96 .

Nie wiem zbyt wiele o dokładnych przyczynach rozbieżności, ale jak się przekonałem, wydaje się, że projektanci języków będą teraz szczęśliwsi bez rozdęcia specyfikacji. Oznacza to, że „procedura” jako samodzielna funkcja nie jest konieczna. Techniki takie jak voidtyp są już wystarczające, aby zaznaczyć zastosowanie, w którym należy podkreślić działania niepożądane. Jest to również bardziej naturalne dla użytkowników mających doświadczenie w językach podobnych do C, które są popularne od kilku dekad. Ponadto pozwala uniknąć zawstydzenia w przypadkach takich jak R n RS, gdzie „procedury” są w rzeczywistości „funkcjami” w szerszym znaczeniu.

Teoretycznie funkcję można określić za pomocą określonego typu jednostki jako typu wyniku wywołania funkcji, aby wskazać, że wynik jest szczególny. To odróżnia tradycyjne procedury (w których wynik połączenia jest niezainteresowany) od innych. Istnieją różne style projektowania języka:

  • Tak jak w R n RS, samo oznaczenie niezainteresowanych wyników jako „nieokreślonej” wartości (nieokreślonego typu, jeśli język musi o tym wspomnieć) i wystarczy zignorować.
  • Określanie niezainteresowana wynik jako wartość dedykowanego typu urządzenia (np Kernel „s #inert) również działa.
  • Kiedy ten typ jest kolejnym typem dolnym , można (miejmy nadzieję) statystycznie zweryfikować i zapobiec stosowaniu jako rodzaj wyrażenia. voidTypu w językach ALGOL-podobnych jest dokładnie przykładem tej techniki. ISO C11 _Noreturnjest podobny, ale bardziej subtelny w tym rodzaju.

Dalsza lektura

Jako tradycyjna koncepcja wywodząca się z matematyki, istnieje mnóstwo czarnej magii, której większość ludzi nie zawraca sobie głowy. Ściśle mówiąc, najprawdopodobniej nie wszystko wyjaśnisz zgodnie z książkami matematycznymi. Książki CS również mogą nie zapewniać dużej pomocy.

Jeśli chodzi o języki programowania, istnieje kilka zastrzeżeń:

  • Funkcje w różnych gałęziach matematyki nie zawsze są zdefiniowane i mają takie samo znaczenie. Funkcje w różnych paradygmatach programowania mogą być również całkiem różne (nawet czasami składnie wywołania funkcji wyglądają podobnie). Czasami przyczyny powodowania różnic są takie same, ale czasem nie są.
    • Idiomatyczne jest modelowanie obliczeń za pomocą funkcji matematycznych, a następnie implementacja obliczeń leżących u ich podstaw w językach programowania. Uważaj, aby nie zamapować ich pojedynczo, chyba że wiesz, o czym się mówi.
  • Nie należy mylić modelu z modelowaną jednostką.
    • Ten drugi jest tylko jednym z wdrożeń tego pierwszego. Może być więcej niż jeden wybór, w zależności od kontekstu (na przykład zainteresowane gałęzie matematyki).
    • W szczególności, mniej lub bardziej podobnie absurdalne jest traktowanie „funkcji” jako „mapowań” lub podzbiorów produktów kartezjańskich, takich jak traktowanie liczb naturalnych jako kodowania rzędnych Von-Neumanna (wyglądających jak zbiór {{{}}, {}}…) poza pewnymi ograniczonymi kontekstami .
  • Matematycznie funkcje mogą być częściowe lub całkowite . Różne języki programowania mają tutaj różne traktowanie.
    • Niektóre języki funkcjonalne mogą honorować wszystkie funkcje, aby zagwarantować, że obliczenia w wywołaniach funkcji zawsze kończą się w skończonych krokach. Jednak zasadniczo nie jest to metoda Turinga pełna, a zatem słabsza ekspresyjność obliczeniowa i mało widoczna w językach ogólnego przeznaczenia oprócz semantyki sprawdzania typów (która ma być całkowita).
    • Jeśli różnica między procedurami i funkcjami jest znacząca, czy powinny istnieć „procedury całkowite”? Hmm ...
  • Konstrukty podobne do funkcji w rachunku różniczkowym stosowane do modelowania obliczeń ogólnych i semantyki języków programowania (np. Abstrakcje lambda w obliczeniach lambda ) mogą mieć różne strategie oceny na operandach.
    • W tradycyjnych redukcjach czystego rachunku różniczkowego, a także w ocenie wyrażeń w czysto funkcjonalnych językach , nie występują żadne skutki uboczne zmieniające wyniki obliczeń. W rezultacie operandy nie muszą być oceniane przed treścią konstrukcji podobnych do funkcji (ponieważ niezmiennik definiujący „takie same wyniki” jest przechowywany przez właściwości takie jak równoważność β gwarantowana przez właściwość Church-Rosser ).
    • Jednak wiele języków programowania może mieć skutki uboczne podczas oceny wyrażeń. Oznacza to, że rygorystyczne strategie oceny, takie jak ocena aplikacyjna, nie są takie same, jak strategie oceny surowej, takie jak wezwanie na żądanie . Jest to istotne, ponieważ bez rozróżnienia nie ma potrzeby odróżniania makr funkcyjnych (tj. Używanych z argumentami) od funkcji (tradycyjnych). Ale w zależności od smaku teorii może to być artefakt. To powiedziawszy, w szerszym znaczeniu, makra funkcjonalne (szczególnie te higieniczne ) funkcjami matematycznymi z pewnymi niepotrzebnymi ograniczeniami (fazy składniowe). Bez ograniczeń rozsądnym może być traktowanie (pierwszej klasy) makr funkcji podobnych do procedur ...
    • Dla czytelników zainteresowanych tym tematem rozważ kilka współczesnych abstrakcji .
  • Procedury są zwykle uważane za nieobjęte zakresem tradycyjnej matematyki. Jednak w przypadku modelowania obliczeniowego i semantyki języka programowania, a także współczesnych projektów języka programowania, może istnieć całkiem spora rodzina pokrewnych pojęć o wspólnej „wywoływalnej” naturze. Niektóre z nich służą do wdrażania / rozszerzania / zastępowania procedur / funkcji. Istnieją jeszcze bardziej subtelne rozróżnienia.

3

W większości kontekstów: funkcja zwraca wartość, podczas gdy procedura nie. Oba są zgrupowanymi fragmentami kodu, aby zrobić to samo.

W kontekście programowania funkcjonalnego (gdzie wszystkie funkcje zwracają wartości) funkcja jest obiektem abstrakcyjnym:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Tutaj f jest taką samą funkcją jak g, ale jest inną procedurą.


3

Wewnątrz procedury możemy używać instrukcji DML (Wstaw / Aktualizuj / Usuń), ale w funkcji Inside nie możemy używać instrukcji DML.

Procedura może mieć oba parametry wejściowe \ wyjściowe, ale funkcja może mieć tylko parametr wejściowy.

Możemy użyć bloku Try-Catch w procedurze przechowywanej, ale w funkcji Nie możemy użyć bloku Try-Catch.

Nie możemy użyć procedury składowanej w instrukcji Select, ale w funkcji Możemy użyć instrukcji Select.

Procedura składowana może zwrócić 0 lub n wartości (maks. 1024), ale funkcja może zwrócić tylko 1 wartość, która jest obowiązkowa.

Procedura przechowywana nie może być wywołana z funkcji, ale możemy wywołać funkcję z procedury składowanej.

Możemy użyć transakcji w procedurze składowanej, ale w funkcji nie możemy użyć transakcji.

Nie możemy używać procedury składowanej w instrukcji Sql nigdzie w sekcji Where / Posing / select, ale w funkcji, której możemy użyć.

Nie możemy dołączyć do procedury składowanej, ale możemy dołączyć do funkcji.

aby uzyskać więcej .. kliknij tutaj ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Ta odpowiedź jest bardzo specyficzna dla języka, podczas gdy pytanie było niezależne od języka. Nie wszystkie stwierdzenia tutaj są prawdziwe w ogólnym przypadku, ale byłoby pomocne, gdybyś wyjaśnił język lub środowisko, w którym się je twierdzi.
Mogsdad,

Ta odpowiedź jest całkowicie niepoprawna w przypadku większości języków programowania. Procedury mają tylko parametry wejściowe, a funkcje zarówno wejściowe, jak i wyjściowe.
AStopher

2

Funkcja zwraca wartość, a procedura po prostu wykonuje polecenia.

Funkcja imienia pochodzi od matematyki. Służy do obliczania wartości na podstawie danych wejściowych.

Procedura to zestaw poleceń, które można wykonać w kolejności.

W większości języków programowania nawet funkcje mogą mieć zestaw poleceń. Dlatego różnica polega tylko na zwracaniu części wartości.

Ale jeśli chcesz utrzymać funkcję w czystości (wystarczy spojrzeć na języki funkcjonalne), musisz upewnić się, że funkcja nie ma skutków ubocznych.


1

Funkcji można używać w instrukcji sql, podczas gdy procedury nie można używać w instrukcji sql.

Instrukcje Wstaw, Aktualizuj i Utwórz nie mogą być włączone do funkcji, ale procedura może zawierać te instrukcje.

Procedura obsługuje transakcje, ale funkcje nie obsługują transakcji.

Funkcja musi zwrócić jedną i tylko jedną wartość (inna może zostać zwrócona przez zmienną OUT), ale procedura zwraca tyle zestawów danych i zwracanych wartości.

Plany wykonania funkcji i procedur są buforowane, więc wydajność jest taka sama w obu przypadkach.


1

Sprzeciwiam się czemuś, co ciągle widzę w większości tych odpowiedzi, że funkcja powoduje, że funkcja zwraca wartość.

Funkcja to nie tylko stara metoda, która zwraca wartość. Nie tak: aby metoda była funkcją rzeczywistą, musi zwracać tę samą wartość, zawsze podając określone dane wejściowe. Przykładem metody, która nie jest funkcją, jest randommetoda w większości języków, ponieważ chociaż zwraca wartość, nie zawsze jest taka sama.

Funkcja jest zatem bardziej zbliżona do mapy (np. Gdzie x -> x'dla funkcji jednowymiarowej). Jest to bardzo ważne rozróżnienie między zwykłymi metodami i funkcjami, ponieważ w przypadku funkcji rzeczywistych czas i kolejność ich oceny nie powinny mieć znaczenia, ponieważ nie zawsze tak jest w przypadku funkcji niefunkcjonalnych.

Oto kolejny przykład metody, która nie jest funkcją, ale w przeciwnym razie nadal zwróci wartość.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Dalej sprzeciwiam się twierdzeniu, że procedury nie zwracają wartości. Procedura jest tylko specyficznym sposobem mówienia o funkcji lub metodzie. Oznacza to, że jeśli metoda podstawowa, którą twoja procedura definiuje lub implementuje, zwraca wartość, to zgadnij, co ta procedura zwraca wartość. Weźmy na przykład następujący fragment kodu SICP :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Czy ostatnio słyszałeś o procedurach rekurencyjnych? Mówią o funkcji rekurencyjnej (funkcji rzeczywistej), która zwraca wartość i używają słowa „procedura”. Więc jaka jest różnica?

Cóż, innym sposobem myślenia o funkcji (oprócz znaczenia wspomnianego powyżej) jest abstrakcyjne przedstawienie ideału takiego jak cyfra 1. Procedura polega na tym, że rzeczywista implementacja tej rzeczy. Osobiście uważam, że są one wymienne.

(Uwaga: jeśli przeczytasz ten rozdział z linku, który podam, może się okazać, że trudniejszą koncepcją do zrozumienia nie jest różnica między funkcją a procedurą, ale proces i procedura. Czy wiesz, że procedura rekurencyjna może mieć proces iteracyjny?)

Analogiem do procedur są przepisy kulinarne. Na przykład; załóżmy, że masz maszynę o nazwie make-piesta maszyna pobiera składniki (fruit, milk, flower, eggs, sugar, heat)i ta maszyna zwraca a pie.

Może wyglądać reprezentacja tego komputera

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Oczywiście to nie jedyny sposób na zrobienie ciasta.

W tym przypadku możemy zobaczyć, że:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Ta analogia jest OK, ale załamuje się, gdy weźmie się pod uwagę, że w przypadku programu komputerowego wszystko jest abstrakcją. Tak więc, inaczej niż w przypadku przepisu na maszynę, porównujemy dwie rzeczy, które same są abstrakcjami; dwie rzeczy, które równie dobrze mogą być tym samym. I uważam, że są (dla wszystkich celów i celów) to samo.


2
Funkcja, która zawsze zwraca tę samą wartość dla danych argumentów, jest czasami nazywana „funkcją czystą”. W większości języków, w których rozróżnia się procedury i funkcje, funkcje nie muszą być czyste, a termin „funkcja” jest właściwie używany w odniesieniu do podprogramów, które mogą mieć skutki uboczne i które mogą zwracać różne wyniki przy kolejnych wywołaniach z tymi samymi argumentami. (A w językach podobnych do C nawet podprogramy, które nie zwracają wartości, są odpowiednio nazywane „funkcjami”.)
Keith Thompson

Zgadzam się, dlatego kończę twierdzenie, że słowa są wymienne.
dkinzer

1
Tak, ale zaczynasz od stwierdzenia, że ​​„Funkcja to nie tylko stara metoda, która zwraca wartość”, podczas gdy w wielu językach taka jest właśnie funkcja.
Keith Thompson

0

W kontekście db : procedura składowana jest prekompilowanym planem wykonania, w którym funkcje nie są.


0

Pod względem С # / Java funkcja jest blokiem kodu, który zwraca konkretną wartość, ale procedura jest blokiem kodu, który zwraca void (nic). W języku C # / Java zarówno funkcje, jak i procedury są częściej nazywane tylko metodami .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Procedury: 1.Procedury to zbiory instrukcji, które definiują sparametryzowane obliczenia. 2. Procedury nie mogą zwracać wartości.

3. Procedury nie mogą być wywoływane z funkcji.

Funkcje 1. Funkcje strukturalnie przypominają procedury, ale są semantycznie modelowane na funkcjach matematycznych. 2. Może zwracać wartości 3. Funkcja może być wywołana z procedur.


3. Procedury nie mogą być wywoływane z funkcji. W jakim języku to prawda? Żadne, w którym mam doświadczenie, nie ma tego ograniczenia.
Mogsdad,

To prawda. Jeśli wywołasz procedurę z funkcji, to nie jest to funkcja. Co do tego, który język to wymusza, to dobre pytanie, na które nie znam odpowiedzi. Może i jest funkcjonalny, ale nawet wtedy nie jestem pewien: czysta lista jest funkcjonalna (nie ma zestawu: brak wpływu na stronę), ale ponieważ ma lambdy, możliwe jest zaimplementowanie zestawu. Czy mógłbyś napisać kompilator, który nie wymusza użycia zestawu, musiałby wykryć wszystkie jego implementacje. Możesz usunąć lambdy z języka, ale byłoby gorzej.
ctrl-alt-delor

Ohh Właśnie pomyślałem o języku C ++: metoda const nie może wywoływać metody non const (chociaż będziesz potrzebować włączonych poprawnych sprawdzeń kompilatora i nie będziesz próbował się obejść.)
ctrl-alt-delor

-7

Obie procedury i funkcje są podprogramami, jedyną różnicą między nimi jest to, że procedura zwraca wiele (lub przynajmniej może to zrobić) wartości, podczas gdy funkcja może zwrócić tylko jedną wartość (dlatego w matematyce stosuje się notację funkcji, ponieważ zwykle znajduje się tylko jedna wartość w danym momencie), chociaż niektóre języki programowania nie przestrzegają tych zasad, są to ich prawdziwe definicje


Yyy ... nie. Procedura nic nie robi return. Mówisz o skutkach ubocznych, które są możliwe w obu przypadkach (jeśli pozwala na to język).
Mogsdad,

Procedura może zwrócić dowolną liczbę wartości, która może wynosić zero
2766296

Efektem ubocznym byłoby, gdyby a miał tablicę i przekazał ją do funkcji lub procedury, która znalazła największą wartość, tablica byłaby przekazana przez odwołanie, a po uruchomieniu podprogramu tablica jest sortowana, faktem, że jest ona posortowane jest efektem ubocznym, zwracana wartość jest największą wartością w tablicy
user2766296

Podoba mi się ta odpowiedź, a także lubię te z kilkoma głosami negatywnymi, ponieważ w pewnym sensie mają rację, więc paradoksalnie, aby uczynić ją bardzo popularną w SO, oddam jej głos. Procedura przechowywana w programie SQL Server zwraca zestaw wyników (tak zwane „wiele wartości”), podczas gdy funkcja może zwrócić tylko jedną wartość (co nie jest zbyt dokładne, ponieważ można również utworzyć funkcję o wartościach zgodnych z tabelą).
Ivanzinho,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.