En términos generales, todos escuchamos acerca de las funciones o procedimientos en lenguajes de programación. Sin embargo, me acabo de enterar de que uso estos términos casi indistintamente (lo que probablemente sea muy incorrecto).
Entonces, mi pregunta es:
¿Cuál es la diferencia en términos de su funcionalidad, su propósito y uso?
Un ejemplo sería apreciado.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Respuestas:
Una función devuelve un valor y un procedimiento solo ejecuta comandos.
La función de nombre proviene de las matemáticas. Se utiliza para calcular un valor basado en la entrada.
Un procedimiento es un conjunto de comandos que se pueden ejecutar en orden.
En la mayoría de los lenguajes de programación, incluso las funciones pueden tener un conjunto de comandos. Por lo tanto, la diferencia es solo en la devolución de una parte de valor.
Pero si desea mantener limpia una función (solo observe los lenguajes funcionales), debe asegurarse de que una función no tenga un efecto secundario.
fuente
Esto depende del contexto.
En lenguajes similares a Pascal, las funciones y procedimientos son entidades distintas, que difieren en si devuelven o no un valor. Se comportan de manera diferente wrt. la sintaxis del lenguaje (p. ej., el procedimiento llama a las declaraciones de formulario; no puede usar una llamada a procedimiento dentro de una expresión vs. las llamadas a funciones no forman declaraciones, debe usarlas en otras declaraciones). Por lo tanto, los programadores de Pascal diferencian entre ellos.
En lenguajes tipo C, y muchos otros lenguajes contemporáneos, esta distinción se ha ido; En lenguajes de tipo estático, los procedimientos son solo funciones con un tipo de retorno divertido. Probablemente por eso se usan indistintamente.
En los lenguajes funcionales, normalmente no existe un procedimiento, todo es una función.
fuente
Ejemplo en C:
Aunque debe tener en cuenta que el Estándar C no habla de procedimientos, solo de funciones.
fuente
void function
. Kernighan & Ritchie Ch 1.7: "En C, una función es equivalente a una subrutina o función en Fortran, o un procedimiento o función en Pascal". En otras palabras ... esta respuesta es incorrecta.En general, un procedimiento es una secuencia de instrucciones.
Una función puede ser la misma, pero generalmente devuelve un resultado.
fuente
Hay un término subrutina o subprograma que representa un fragmento de código parametrizado que se puede llamar desde diferentes lugares.
Las funciones y procedimientos son implementaciones de esos. Por lo general, las funciones devuelven valores y los procedimientos no devuelven nada.
fuente
Diferencias básicas
Diferencias avanzadas
En SQL:
SELECT
, así como DML (INSERT
,UPDATE
,DELETE
) declaraciones en el mismo, mientras que la función sólo permiteSELECT
comunicado en ella.SELECT
declaración, mientras que las funciones se pueden incrustar en unaSELECT
declaración.WHERE
(o aHAVING
o aSELECT
), mientras que las funciones sí.JOIN
bloque con otras tablas.JOIN
bloques y otras operaciones de conjunto de filas.fuente
Más estrictamente, una función f obedece a la propiedad de que f (x) = f (y) si x = y, es decir, calcula el mismo resultado cada vez que se llama con el mismo argumento (y, por lo tanto, no cambia el estado del sistema.)
Por lo tanto, rand () o print ("Hola"), etc. no son funciones sino procedimientos. Si bien sqrt (2.0) debería ser una función: no hay ningún efecto observable o cambio de estado sin importar la frecuencia con la que se llame y siempre devuelve 1.41 y algo.
fuente
Si no conocemos el idioma aquí, el procedimiento generalmente especifica una serie de actos necesarios para lograr cierto resultado de manera confiable e idempotente. Es decir, un procedimiento es básicamente un algoritmo.
Las funciones, por otro lado, son un código algo independiente dentro de un programa más grande. En otras palabras, la función es la implementación de un procedimiento.
fuente
Esta es una vieja pregunta bien conocida, pero me gustaría compartir algunas ideas más sobre la investigación y el diseño del lenguaje de programación moderno.
Respuesta básica
Tradicionalmente (en el sentido de la programación estructurada ) e informalmente, un procedimiento es una construcción estructural reutilizable para tener "entrada" y hacer algo programable. Cuando se necesita hacer algo dentro de un procedimiento, puede proporcionar argumentos (reales) al procedimiento en una llamada a procedimiento codificada en el código fuente (generalmente en una especie de expresión), y las acciones codificadas en el cuerpo de los procedimientos (siempre en la definición del procedimiento) se ejecutará con la sustitución de los argumentos en los parámetros (formales) utilizados en el cuerpo.
Una función es más que un procedimiento porque los valores de retorno también se pueden especificar como la "salida" en el cuerpo. Las llamadas a funciones son más o menos iguales a las llamadas a procedimientos, excepto que también puede usar el resultado de la llamada a funciones, sintácticamente (generalmente como una subexpresión de alguna otra expresión).
Tradicionalmente, las llamadas a procedimientos (en lugar de las llamadas a funciones) se usan para indicar que no debe interesarse ninguna salida, y debe haber efectos secundarios para evitar que la llamada sea no operativa, por lo tanto enfatizando el paradigma de programación imperativo . Muchos lenguajes de programación tradicionales como Pascal proporcionan "procedimientos" y "funciones" para distinguir esta diferencia intencional de estilos.
(Para ser claros, la "entrada" y la "salida" mencionadas anteriormente son nociones simplificadas basadas en las propiedades sintácticas de las funciones. Muchos idiomas también admiten pasar argumentos a parámetros por referencia / compartir, para permitir a los usuarios transportar información codificada en argumentos durante las llamadas Tal parámetro puede incluso llamarse simplemente como "parámetro de entrada / salida". Esta característica se basa en la naturaleza de los objetos que se pasan en las llamadas, que es ortogonal a las propiedades de la característica de procedimiento / función).
Sin embargo, si no se necesita el resultado de una llamada de función, se puede ignorar (al menos lógicamente) y las definiciones de función / llamadas de función deben ser consistentes con las definiciones de procedimiento / llamadas de procedimiento de esta manera. Los lenguajes similares a ALGOL como C, C ++ y Java, proporcionan la característica de "función" de esta manera: al codificar el tipo de resultado
void
como un caso especial de funciones que parecen procedimientos tradicionales, no hay necesidad de proporcionar la característica de "procedimientos" "por separado. Esto evita un poco de hinchazón en el diseño del lenguaje.Como se menciona el SICP, también vale la pena señalar que en el lenguaje de Esquema especificado por R n RS , un procedimiento puede o no tener que devolver el resultado del cálculo. Esta es la unión de la "función" tradicional (que devuelve el resultado) y el "procedimiento" (que no devuelve nada), esencialmente igual al concepto de "función" de muchos lenguajes similares a ALGOL (y en realidad comparte aún más garantías como evaluaciones aplicativas de operandos antes de la llamada). Sin embargo, las diferencias antiguas todavía ocurren incluso en documentos normativos como SRFI-96 .
No sé mucho acerca de las razones exactas detrás de la divergencia, pero como he experimentado, parece que los diseñadores de idiomas serán más felices sin la hinchazón de las especificaciones en la actualidad. Es decir, el "procedimiento" como característica independiente es innecesario. Técnicas como el
void
tipo ya son suficientes para marcar el uso donde se deben enfatizar los efectos secundarios. Esto también es más natural para los usuarios que tienen experiencias en lenguajes tipo C, que son populares durante más de unas décadas. Además, evita la vergüenza en casos como R n RS donde los "procedimientos" son en realidad "funciones" en un sentido más amplio.En teoría, una función puede especificarse con un tipo de unidad especificado como el tipo del resultado de la llamada de función para indicar que el resultado es especial. Esto distingue los procedimientos tradicionales (donde el resultado de una llamada no tiene interés) de otros. Hay diferentes estilos en el diseño de un lenguaje:
#inert
) también funciona.void
tipo en lenguajes similares a ALGOL es exactamente un ejemplo de esta técnica. ISO C11_Noreturn
es similar pero más sutil en este tipo.Otras lecturas
Como el concepto tradicional derivado de las matemáticas, hay toneladas de magia negra que la mayoría de las personas no se molestan en conocer. Estrictamente hablando, es probable que no aclare todo según sus libros de matemáticas. Los libros de CS tampoco pueden proporcionar mucha ayuda.
Con respecto a los lenguajes de programación, hay varias advertencias:
{{{}}, {}}
...) además de algunos contextos limitados .fuente
En la mayoría de los contextos: una función devuelve un valor, mientras que un procedimiento no. Ambos son fragmentos de código agrupados para hacer lo mismo.
En el contexto de programación funcional (donde todas las funciones devuelven valores), una función es un objeto abstracto:
Aquí, f es la misma función que g, pero es un procedimiento diferente.
fuente
Dentro del procedimiento podemos usar declaraciones DML (Insertar / Actualizar / Eliminar), pero dentro de la función no podemos usar declaraciones DML.
El procedimiento puede tener parámetros de entrada / salida, pero Function solo puede tener un parámetro de entrada.
Podemos usar el bloque Try-Catch en el procedimiento almacenado, pero en función no podemos usar el bloque Try-Catch.
No podemos usar el Procedimiento almacenado en la instrucción Select, pero en función podemos usar en la instrucción Select.
El procedimiento almacenado puede devolver 0 o n valores (máx. 1024), pero la función puede devolver solo 1 valor que es obligatorio.
El procedimiento almacenado no se puede llamar desde la función, pero podemos llamar a la función desde el procedimiento almacenado.
Podemos usar la transacción en Procedimiento almacenado, pero en la función no podemos usar la transacción.
No podemos usar el Procedimiento almacenado en la instrucción SQL en ninguna parte de la sección Dónde / Tener / seleccionar, pero podemos usar la función En.
No podemos unir Procedimiento almacenado, pero podemos unir la función.
para más información ... haga clic aquí ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
fuente
Una función devuelve un valor y un procedimiento solo ejecuta comandos.
La función de nombre proviene de las matemáticas. Se utiliza para calcular un valor basado en la entrada.
Un procedimiento es un conjunto de comandos que se pueden ejecutar en orden.
En la mayoría de los lenguajes de programación, incluso las funciones pueden tener un conjunto de comandos. Por lo tanto, la diferencia es solo en la devolución de una parte de valor.
Pero si desea mantener limpia una función (solo observe los lenguajes funcionales), debe asegurarse de que una función no tenga un efecto secundario.
fuente
La función se puede usar dentro de una declaración sql, mientras que el procedimiento no se puede usar dentro de una declaración sql.
Las declaraciones Insertar, Actualizar y Crear no se pueden incluir en la función, pero un procedimiento puede tener estas declaraciones.
El procedimiento admite transacciones, pero las funciones no admiten transacciones.
La función tiene que devolver uno y solo un valor (otro puede ser devuelto por la variable OUT) pero el procedimiento devuelve tantos conjuntos de datos y valores de retorno.
Los planes de ejecución de ambas funciones y procedimientos se almacenan en caché, por lo que el rendimiento es el mismo en ambos casos.
fuente
Objeto con algo que sigo viendo una y otra vez en la mayoría de estas respuestas, que lo que hace que una función sea una función es que devuelve un valor.
Una función no es un método cualquiera que devuelve un valor. No es así: para que un método sea una función real, debe devolver el mismo valor siempre dado una entrada específica. Un ejemplo de un método que no es una función es el
random
método en la mayoría de los idiomas, porque aunque devuelve un valor, el valor no siempre es el mismo.Por lo tanto, una función es más parecida a un mapa (por ejemplo, dónde
x -> x'
para una función unidimensional). Esta es una distinción muy importante entre los métodos y funciones regulares porque cuando se trata de funciones reales, el tiempo y el orden en que se evalúan nunca deberían importar dónde, ya que este no es siempre el caso con las no funciones.Aquí hay otro ejemplo de un método que no es una función pero que de lo contrario devolverá un valor.
Además, me opongo a la idea de que los procedimientos no devuelven valores. Un procedimiento es solo una forma específica de hablar sobre una función o método. Eso significa que si el método subyacente que su procedimiento define o implementa devuelve un valor, entonces adivine qué procedimiento devuelve un valor. Tomemos, por ejemplo, el siguiente fragmento del SICP :
¿Has oído hablar de procedimientos recursivos mucho últimamente? Están hablando de una función recursiva (una función real) y está devolviendo un valor y están usando la palabra "procedimiento". Entonces, ¿cuál es la diferencia?
Bueno, otra forma de pensar en una función (además del significado mencionado anteriormente) es como una representación abstracta de un ideal como el número 1. Un procedimiento es la implementación real de esa cosa. Personalmente, creo que son intercambiables.
(Tenga en cuenta que si lee ese capítulo desde el enlace que proporciono, puede encontrar que un concepto más difícil de comprender no es la diferencia entre una función y un procedimiento, sino un proceso y un procedimiento. ¿Sabía que un procedimiento recursivo puede tener un ¿proceso iterativo?)
Un análogo para los procedimientos son las recetas. Por ejemplo; supongamos que tiene una máquina llamada
make-pies
esta máquina que toma ingredientes de(fruit, milk, flower, eggs, sugar, heat)
y esta máquina devuelve apie
.Una representación de esta máquina podría verse así
Por supuesto, esa no es la única forma de hacer un pastel.
En este caso podemos ver que:
Esa analogía está bien, pero se rompe cuando se tiene en cuenta que cuando se trata de un programa de computadora todo es una abstracción. Entonces, a diferencia del caso de una receta con una máquina, estamos comparando dos cosas que son en sí mismas abstracciones; dos cosas que bien podrían ser lo mismo. Y sostengo que son (para todos los efectos) la misma cosa.
fuente
En el contexto de db : el procedimiento almacenado es un plan de ejecución precompilado donde las funciones no lo son.
fuente
En términos de С # / Java, la función es el bloque de código, que devuelve un valor particular, pero el procedimiento es el bloque de código que devuelve nulo (nada). En C # / Java, tanto las funciones como los procedimientos suelen denominarse solo métodos .
fuente
Procedimientos: 1. Los procedimientos son las colecciones de declaraciones que definen los cálculos parametrizados. 2. Los procedimientos no pueden devolver valores.
3. Los procedimientos no se pueden invocar desde la función.
Funciones 1. Las funciones se parecen estructuralmente a los procedimientos pero se modelan semánticamente en funciones matemáticas. 2. Puede devolver valores 3. Se puede llamar a la función desde los procedimientos.
fuente
Los procedimientos y las funciones son subrutinas, la única diferencia entre ellos es que un procedimiento devuelve valores múltiples (o al menos puede hacerlo) mientras que una función solo puede devolver un valor (es por eso que la notación de función se usa en matemáticas ya que generalmente se encuentra un solo valor en un momento dado) aunque algunos lenguajes de programación no siguen estas reglas, esta es su verdadera definición
fuente
return
nada. Estás hablando de los efectos secundarios, que son posibles con ambos (si el idioma lo permite).