De manière générale, nous entendons tous parler des fonctions ou procédures des langages de programmation. Cependant, je viens de découvrir que j'utilise ces termes de manière presque interchangeable (ce qui est probablement très faux).
Donc, ma question est:
Quelle est la différence en termes de fonctionnalité, d’objectif et d’utilisation?
Un exemple serait apprécié.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Réponses:
Une fonction renvoie une valeur et une procédure exécute simplement des commandes.
La fonction de nom vient des mathématiques. Il est utilisé pour calculer une valeur basée sur l'entrée.
Une procédure est un ensemble de commandes qui peuvent être exécutées dans l'ordre.
Dans la plupart des langages de programmation, même les fonctions peuvent avoir un ensemble de commandes. Par conséquent, la différence ne concerne que le retour d'une partie valeur.
Mais si vous aimez garder une fonction propre, (regardez simplement les langages fonctionnels), vous devez vous assurer qu'une fonction n'a pas d'effet secondaire.
la source
Cela dépend du contexte.
Dans les langages de type Pascal, les fonctions et les procédures sont des entités distinctes, différant selon qu'elles renvoient ou non une valeur. Ils se comportent différemment. la syntaxe du langage (par exemple, la procédure appelle des instructions de formulaire; vous ne pouvez pas utiliser un appel de procédure dans une expression et les appels de fonction ne forment pas d'instructions, vous devez les utiliser dans d'autres instructions). Par conséquent, les programmeurs de race Pascal font la différence entre ceux-ci.
Dans les langages de type C et dans de nombreux autres langages contemporains, cette distinction a disparu; dans les langages typés statiquement, les procédures ne sont que des fonctions avec un type de retour amusant. C'est probablement pourquoi ils sont utilisés de manière interchangeable.
Dans les langages fonctionnels, il n'y a généralement pas de procédure - tout est fonction.
la source
Exemple en C:
Même si vous devez noter que la norme C ne parle pas de procédures, elle fonctionne uniquement.
la source
void function
. Kernighan & Ritchie Ch 1.7: "En C, une fonction est équivalente à un sous-programme ou une fonction en Fortran, ou une procédure ou une fonction en Pascal." En d'autres termes ... cette réponse est fausse.En général, une procédure est une séquence d'instructions.
Une fonction peut être la même, mais elle renvoie généralement un résultat.
la source
Il y a un terme sous - programme ou sous - programme qui représente un morceau de code paramétré qui peut être appelé à partir de différents endroits.
Les fonctions et procédures sont des implémentations de celles-ci. Les fonctions renvoient généralement des valeurs et les procédures ne renvoient rien.
la source
Différences fondamentales
Différences avancées
En SQL:
SELECT
ainsi que DML (INSERT
,UPDATE
,DELETE
) déclarations qu'elle, alors que la fonction ne permetSELECT
déclaration en elle.SELECT
instruction, tandis que les fonctions peuvent être intégrées dans unSELECT
instruction.WHERE
(ou unHAVING
ou unSELECT
bloc ), contrairement aux fonctions.JOIN
bloc avec d'autres tables.JOIN
blocs et d'autres opérations d'ensemble de lignes.la source
Plus strictement, une fonction f obéit à la propriété que f (x) = f (y) si x = y, c'est-à-dire qu'elle calcule le même résultat chaque fois qu'elle est appelée avec le même argument (et donc qu'elle ne change pas l'état de la système.)
Ainsi, rand () ou print ("Bonjour"), etc. ne sont pas des fonctions mais des procédures. Alors que sqrt (2.0) devrait être une fonction: il n'y a pas d'effet observable ni de changement d'état quelle que soit la fréquence à laquelle on l'appelle et il renvoie toujours 1.41 et certains.
la source
Si nous sommes indépendants de la langue ici, la procédure spécifie généralement une série d'actes nécessaires pour atteindre de manière fiable et idempotente un certain résultat. Autrement dit, une procédure est essentiellement un algorithme.
Les fonctions, d'autre part, sont un morceau de code quelque peu indépendant dans un programme plus vaste. En d'autres termes, la fonction est la mise en œuvre d'une procédure.
la source
C'est une vieille question bien connue, mais j'aimerais partager quelques idées sur la recherche et la conception d'un langage de programmation moderne.
Réponse basique
Traditionnellement (dans le sens d' une programmation structurée ) et informelle, une procédure est une construction structurelle réutilisable pour avoir une «entrée» et pour faire quelque chose de programmable. Lorsque quelque chose doit être fait dans une procédure, vous pouvez fournir des arguments (réels) à la procédure dans un appel de procédure codé dans le code source (généralement dans une sorte d'expression), et les actions codées dans le corps des procédures (fournies dans la définition de la procédure) sera exécuté avec la substitution des arguments dans les paramètres (formels) utilisés dans le corps.
Une fonction est plus qu'une procédure car les valeurs de retour peuvent également être spécifiées comme "sortie" dans le corps. Les appels de fonction sont plus ou moins identiques aux appels de procédure, sauf que vous pouvez également utiliser le résultat de l'appel de fonction, syntaxiquement (généralement comme sous-expression d'une autre expression).
Traditionnellement, les appels de procédure (plutôt que les appels de fonction) sont utilisés pour indiquer qu'aucune sortie ne doit être intéressée, et il doit y avoir des effets secondaires pour éviter que l'appel ne soit sans opération, mettant ainsi l'accent sur le paradigme de programmation impératif . De nombreux langages de programmation traditionnels comme Pascal fournissent à la fois des "procédures" et des "fonctions" pour distinguer cette différence intentionnelle de styles.
(Pour être clair, les "entrées" et les "sorties" mentionnées ci-dessus sont des notions simplifiées basées sur les propriétés syntaxiques des fonctions. De nombreux langages prennent également en charge la transmission d'arguments aux paramètres par référence / partage, pour permettre aux utilisateurs de transporter des informations encodées en arguments pendant les appels. Un tel paramètre peut même être appelé simplement "paramètre d'entrée / sortie". Cette caractéristique est basée sur la nature des objets passés dans les appels, qui est orthogonale aux propriétés de la caractéristique de procédure / fonction.)
Cependant, si le résultat d'un appel de fonction n'est pas nécessaire, il peut être simplement (au moins logiquement) ignoré, et les définitions de fonction / appels de fonction doivent être cohérentes avec les définitions de procédure / appels de procédure de cette manière. Les langages de type ALGOL comme C, C ++ et Java fournissent tous la fonctionnalité de "fonction" de cette manière: en codant le type de résultat
void
comme un cas spécial de fonctions ressemblant à des procédures traditionnelles, il n'est pas nécessaire de fournir la fonctionnalité de "procédures" "séparément. Cela empêche certains ballonnements dans la conception du langage.Puisque SICP est mentionné, il convient également de noter que dans le langage Scheme spécifié par R n RS , une procédure peut ou non avoir à renvoyer le résultat du calcul. Il s'agit de l'union de la "fonction" traditionnelle (renvoyant le résultat) et de la "procédure" (ne renvoyant rien), essentiellement identique au concept de "fonction" de nombreux langages de type ALGOL (et partageant en fait encore plus de garanties comme des évaluations applicatives des opérandes avant l'appel). Cependant, des différences à l'ancienne se produisent encore, même dans des documents normatifs comme SRFI-96 .
Je ne sais pas grand-chose sur les raisons exactes de la divergence, mais comme je l'ai expérimenté, il semble que les concepteurs de langage seront plus heureux sans un gonflement des spécifications de nos jours. Autrement dit, la «procédure» en tant que fonction autonome n'est pas nécessaire. Des techniques comme le
void
type sont déjà suffisantes pour marquer l'utilisation où les effets secondaires doivent être accentués. Cela est également plus naturel pour les utilisateurs ayant des expériences sur les langages de type C, qui sont populaires depuis plus de quelques décennies. De plus, cela évite l'embarras dans des cas comme R n RS où les "procédures" sont en fait des "fonctions" au sens large.En théorie, une fonction peut être spécifiée avec un type d'unité spécifié comme type du résultat de l'appel de fonction pour indiquer que le résultat est spécial. Cela distingue les procédures traditionnelles (où le résultat d'un appel n'est pas intéressé) des autres. Il existe différents styles dans la conception d'une langue:
#inert
) fonctionne aussi.void
type dans les langages de type ALGOL est exactement un exemple de cette technique. ISO C11_Noreturn
est similaire mais plus subtile dans ce genre.Lectures complémentaires
Comme le concept traditionnel dérivé des mathématiques, il existe tonnes de magie noire que la plupart des gens ne se soucient pas de savoir. À strictement parler, vous ne pourrez probablement pas tout clarifier selon vos livres de mathématiques. Les livres CS pourraient ne pas fournir beaucoup d'aide non plus.
Concernant les langages de programmation, il y a plusieurs mises en garde:
{{{}}, {}}
...) en plus de certains contextes limités .la source
Dans la plupart des contextes: une fonction renvoie une valeur, contrairement à une procédure. Les deux sont des morceaux de code regroupés pour faire la même chose.
Dans un contexte de programmation fonctionnelle (où toutes les fonctions renvoient des valeurs), une fonction est un objet abstrait:
Ici, f est la même fonction que g, mais est une procédure différente.
la source
Procédure interne, nous pouvons utiliser des instructions DML (Insert / Update / Delete), mais la fonction Inside nous ne pouvons pas utiliser des instructions DML.
La procédure peut avoir les deux paramètres d'entrée / sortie, mais la fonction ne peut avoir qu'un paramètre d'entrée.
Nous pouvons utiliser le bloc Try-Catch dans la procédure stockée, mais en fonction, nous ne pouvons pas utiliser le bloc Try-Catch.
Nous ne pouvons pas utiliser la procédure stockée dans l'instruction Select, mais dans la fonction, nous pouvons utiliser dans l'instruction Select.
La procédure stockée peut renvoyer 0 ou n valeurs (max 1024), mais la fonction ne peut renvoyer qu'une seule valeur qui est obligatoire.
La procédure stockée ne peut pas être appelée depuis la fonction, mais nous pouvons appeler la fonction depuis la procédure stockée.
Nous pouvons utiliser la transaction dans la procédure stockée, mais en fonction, nous ne pouvons pas utiliser la transaction.
Nous ne pouvons pas utiliser la procédure stockée dans l'instruction SQL n'importe où dans la section Où / Avoir / Sélectionner, mais la fonction Dans nous pouvons utiliser.
Nous ne pouvons pas rejoindre la procédure stockée, mais nous pouvons rejoindre la fonction.
pour en savoir plus ... cliquez ici ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
la source
Une fonction renvoie une valeur et une procédure exécute simplement des commandes.
La fonction de nom vient des mathématiques. Il est utilisé pour calculer une valeur basée sur l'entrée.
Une procédure est un ensemble de commandes qui peuvent être exécutées dans l'ordre.
Dans la plupart des langages de programmation, même les fonctions peuvent avoir un ensemble de commandes. Par conséquent, la différence ne concerne que le retour d'une partie valeur.
Mais si vous aimez garder une fonction propre, (regardez simplement les langages fonctionnels), vous devez vous assurer qu'une fonction n'a pas d'effet secondaire.
la source
La fonction peut être utilisée dans une instruction sql alors que la procédure ne peut pas être utilisée dans une instruction sql.
Les instructions Insert, Update et Create ne peuvent pas être incluses dans la fonction mais une procédure peut avoir ces instructions.
La procédure prend en charge les transactions mais les fonctions ne prennent pas en charge les transactions.
La fonction doit renvoyer une et une seule valeur (une autre peut être renvoyée par la variable OUT) mais la procédure renvoie autant d'ensembles de données et de valeurs de retour.
Les plans d'exécution des fonctions et des procédures sont mis en cache, de sorte que les performances sont identiques dans les deux cas.
la source
Je m'objecte avec quelque chose que je ne cesse de voir dans la plupart de ces réponses, que ce qui fait d'une fonction une fonction, c'est qu'elle renvoie une valeur.
Une fonction n'est pas n'importe quelle ancienne méthode qui renvoie une valeur. Ce n'est pas le cas: pour qu'une méthode soit une fonction réelle, elle doit renvoyer la même valeur, toujours avec une entrée spécifique. Un exemple de méthode qui n'est pas une fonction est la
random
méthode dans la plupart des langues, car bien qu'elle renvoie une valeur, la valeur n'est pas toujours la même.Une fonction est donc plus proche d'une carte (par exemple, où
x -> x'
pour une fonction unidimensionnelle). Il s'agit d'une distinction très importante entre les méthodes et les fonctions régulières, car lorsqu'il s'agit de fonctions réelles, le moment et l'ordre dans lesquels elles sont évaluées ne devraient jamais avoir d'importance, car ce n'est pas toujours le cas pour les non fonctions.Voici un autre exemple d'une méthode qui n'est pas une fonction mais qui, sinon, renverra toujours une valeur.
Je m'oppose en outre à l'idée que les procédures ne renvoient pas de valeurs. Une procédure n'est qu'une manière spécifique de parler d'une fonction ou d'une méthode. Cela signifie donc que si la méthode sous-jacente que votre procédure définit ou implémente renvoie une valeur, devinez ce que cette procédure renvoie une valeur. Prenons par exemple l'extrait suivant du SICP :
Avez-vous entendu parler des procédures récursives ces derniers temps? Ils parlent d'une fonction récursive (une fonction réelle) et cela renvoie une valeur et ils utilisent le mot "procédure". Alors, quelle est la différence, alors?
Une autre façon de penser une fonction (en plus du sens mentionné ci-dessus) est comme une représentation abstraite d'un idéal comme le chiffre 1. Une procédure est cette implémentation réelle de cette chose. Je pense personnellement qu'ils sont interchangeables.
(Remarque: si vous lisez ce chapitre à partir du lien que je fournis, vous constaterez peut-être qu'un concept plus difficile à saisir n'est pas la différence entre une fonction et une procédure, mais un processus et une procédure. Saviez-vous qu'une procédure récursive peut avoir un processus itératif?)
Un analogue pour les procédures sont les recettes. Par exemple; supposons que vous ayez une machine appelée
make-pies
cette machine absorbe les ingrédients de(fruit, milk, flower, eggs, sugar, heat)
et cette machine retourne apie
.Une représentation de cette machine pourrait ressembler
Bien sûr, ce n'est pas la seule façon de faire une tarte.
Dans ce cas, nous pouvons voir que:
Cette analogie est correcte, mais elle se décompose lorsque vous tenez compte du fait que lorsque vous avez affaire à un programme informatique, tout est une abstraction. Donc, contrairement au cas d'une recette à une machine, nous comparons deux choses qui sont elles-mêmes des abstractions; deux choses qui pourraient tout aussi bien être la même chose. Et je soutiens qu'ils sont (à toutes fins utiles) la même chose.
la source
Dans le contexte de db : la procédure stockée est un plan d'exécution précompilé où les fonctions ne le sont pas.
la source
En termes de С # / Java, la fonction est le bloc de code, qui retourne une valeur particulière, mais la procédure est le bloc de code qui retourne void (rien). En C # / Java, les fonctions et les procédures sont plus souvent appelées méthodes simples .
la source
Procédures: 1. Les sont les collections d'instructions qui définissent les calculs paramétrés. 2. Les procédures ne peuvent pas renvoyer de valeurs.
3. Les procédures ne peuvent pas être appelées à partir de la fonction.
Fonctions 1. Les fonctions ressemblent structurellement aux procédures mais sont sémantiquement modélisées sur des fonctions mathématiques. 2.Il peut renvoyer des valeurs 3. La fonction peut être appelée à partir de procédures.
la source
Les procédures et les fonctions sont toutes deux des sous-routines, la seule différence entre elles est qu'une procédure renvoie plusieurs valeurs (ou du moins peut le faire) alors qu'une fonction ne peut renvoyer qu'une seule valeur (c'est pourquoi la notation de fonction est utilisée en mathématiques car généralement une seule valeur est trouvée à un moment donné) bien que certains langages de programmation ne suivent pas ces règles, ce sont leurs véritables définitions
la source
return
rien. Vous parlez d'effets secondaires, qui sont possibles avec les deux (si la langue le permet).