¿Cuál es la diferencia entre una "función" y un "procedimiento"?

203

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.

rpr
fuente
66
Creo que SICP hace esto bien. Las funciones solo existen en matemáticas, y representan lo que es conocimiento. Existen procedimientos en los lenguajes de programación (incluyendo los funcionales), y representan la forma de conocimiento. Función : sqrt (x) = la y tal que y ^ 2 = x. Procedimiento : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Respuestas:

296

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.

Toon Krijthe
fuente
¿Cómo puede asegurar que no haya efectos secundarios en un lenguaje imperativo (java, c) o declarativo (scala, esquema)?
orlybg
1
@orlybg, en lenguajes declarativos, la coherencia proviene de la implementación del lenguaje. Sus restricciones de alcance evitan que tengan efectos secundarios. Por otro lado, los lenguajes imperativos explotan sus efectos secundarios explícitamente. Los efectos secundarios no siempre son malos.
Tharindu Rusira
Estoy leyendo el siguiente tutorial de Ada ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), donde el segundo párrafo de esa página comienza con "Los procedimientos en Ada son similares a los de Pascal . Un procedimiento puede contener declaraciones de devolución ". ¿Es esto un error en el texto? ¿O significa que puede tener declaraciones de retorno pero no devolver ningún valor?
jviotti
3
En pascal, los procedimientos no tienen declaraciones de retorno, solo las funciones sí. Debe haber un error en el texto. Sin embargo, un procedimiento puede tener una declaración de "salida", que podría actuar como una declaración de "retorno" sin argumentos, lo que significa que no hay valores de retorno.
Eric Fortier
La función puede obtener entradas y devolver solo una salida. procedimiento o macro puede obtener entradas y no devolver ningún dato solo ejecuta el número de declaraciones. La principal diferencia es que el procedimiento no puede devolver ningún tipo de datos.
EsmaeelE
42

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.

jpalecek
fuente
y la documentación de lenguajes de programación puede llamar funciones y procedimientos a lo que quiera, porque las personas aceptarán cualquier nombre ya que el fondo detrás de esos nombres se ha borrado hace mucho tiempo.
Arne Babenhauserheide
18

Ejemplo en C:

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

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

Aunque debe tener en cuenta que el Estándar C no habla de procedimientos, solo de funciones.


fuente
44
... el Estándar C no habla de procedimientos, solo funciones. Eso es porque solo tiene funciones. Una función que no devuelve nada es a 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.
Mogsdad
8
La respuesta no es incorrecta, y es un buen ejemplo de la diferencia entre funciones y procedimientos puros. K&R llamó a cada subrutina una "función" para mantener las cosas simples, pero una subrutina con efectos secundarios es en realidad un "procedimiento", no una "función" en el sentido canónico de las matemáticas. C podría ser un mejor lenguaje si distinguiera las funciones reales de los procedimientos, esto ayudaría con el análisis estático, la optimización del rendimiento y la paralelización.
Sam Watkins,
12

En general, un procedimiento es una secuencia de instrucciones.
Una función puede ser la misma, pero generalmente devuelve un resultado.

HS.
fuente
11

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.

diente filoso
fuente
6

Diferencias básicas

  • Una función debe devolver un valor, pero en los procedimientos almacenados es opcional: un procedimiento puede devolver 0 o n valores.
  • Las funciones solo pueden tener parámetros de entrada, mientras que los procedimientos pueden tener parámetros de entrada / salida.
  • Para una función es obligatorio tomar un parámetro de entrada, pero un procedimiento almacenado puede tomar 0 a n parámetros de entrada.
  • Las funciones se pueden invocar desde un procedimiento, mientras que los procedimientos no se pueden invocar desde una función.

Diferencias avanzadas

  • Las excepciones se pueden manejar mediante bloques try-catch en un Procedimiento, mientras que un bloque try-catch no se puede usar en una Función.
  • Podemos optar por la gestión de transacciones en un procedimiento, mientras que en una función no podemos.

En SQL:

  • Un procedimiento permite SELECT, así como DML ( INSERT, UPDATE, DELETE) declaraciones en el mismo, mientras que la función sólo permite SELECTcomunicado en ella.
  • Los procedimientos no se pueden utilizar en una SELECTdeclaración, mientras que las funciones se pueden incrustar en una SELECTdeclaración.
  • Los procedimientos almacenados no se pueden usar en sentencias SQL en ningún lugar de un bloque WHERE(o a HAVINGo a SELECT), mientras que las funciones sí.
  • Las funciones que devuelven tablas se pueden tratar como otro conjunto de filas. Esto se puede usar en un JOINbloque con otras tablas.
  • Las funciones en línea pueden considerarse vistas que toman parámetros y pueden usarse en JOINbloques y otras operaciones de conjunto de filas.
Mudassar Shahbaz
fuente
3
Esta respuesta es muy específica del idioma, mientras que la pregunta era independiente del idioma. Las declaraciones aquí no son todas verdaderas en el caso general, pero sería útil si aclarara el idioma o el entorno para el que las afirma.
Mogsdad
5

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.

Ingo
fuente
3
Este uso es relevante en el contexto de la programación "funcional". Tenga en cuenta que muchos lenguajes (a menudo imperativos) que llaman a sus subprogramas "funciones" no requieren esta propiedad.
dmckee --- ex-gatito moderador
1
No sugerí que los lenguajes de programación requieran esta propiedad. De todos modos, uno puede escribir funciones estrictas en cualquier idioma, y ​​creo que es un buen hábito programar tanto como sea posible en funciones limpias, luego pegar las piezas con algún procedimiento principal.
Ingo el
4

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.

Anton Gogolev
fuente
4

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 voidcomo 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 voidtipo 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:

  • Al igual que en R n RS, simplemente marcar los resultados desinteresados ​​como un valor "no especificado" (de tipo no especificado, si el idioma tiene que mencionarlo) y es suficiente para ser ignorado.
  • Especificar el resultado desinteresado como el valor de un tipo de unidad dedicada (por ejemplo, Kernel 's #inert) también funciona.
  • Cuando ese tipo es otro tipo inferior , se puede (con suerte) verificar estáticamente y evitar que se use como un tipo de expresión. El voidtipo en lenguajes similares a ALGOL es exactamente un ejemplo de esta técnica. ISO C11 _Noreturnes 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:

  • Las funciones en diferentes ramas de las matemáticas no siempre se definen con los mismos significados. Las funciones en diferentes paradigmas de programación también pueden ser bastante diferentes (incluso a veces las sintaxis de las llamadas a funciones son similares). Algunas veces las razones para causar las diferencias son las mismas, pero otras no.
    • Es idiomático modelar la computación por funciones matemáticas y luego implementar la computación subyacente en lenguajes de programación. Tenga cuidado de evitar mapearlos uno a uno a menos que sepa de qué se está hablando.
  • No confunda el modelo con la entidad a modelar.
    • La última es solo una de las implementaciones de la primera. Puede haber más de una opción, dependiendo de los contextos (las ramas de las matemáticas interesadas, por ejemplo).
    • En particular, es más o menos similar absurdo tratar las "funciones" como "asignaciones" o subconjuntos de productos cartesianos, como tratar los números naturales como codificación de ordinales de Von-Neumann (parece un montón de {{{}}, {}}...) además de algunos contextos limitados .
  • Matemáticamente, las funciones pueden ser parciales o totales . Los diferentes lenguajes de programación tienen un tratamiento diferente aquí.
    • Algunos lenguajes funcionales pueden honrar la totalidad de las funciones para garantizar que el cálculo dentro de las llamadas a funciones siempre termine en pasos finitos. Sin embargo, esto no es esencialmente completo de Turing, por lo tanto, una expresividad computacional más débil y no se ve mucho en lenguajes de propósito general además de la semántica de la verificación de tipos (que se espera que sea total).
    • Si la diferencia entre los procedimientos y las funciones es significativa, ¿debería haber "procedimientos totales"? Hmm ...
  • Las construcciones similares a las funciones en los cálculos utilizados para modelar el cálculo general y la semántica de los lenguajes de programación (por ejemplo, abstracciones lambda en cálculos lambda ) pueden tener diferentes estrategias de evaluación en los operandos.
    • En las reducciones tradicionales de cálculos puros, así como en las evaluaciones de expresiones en lenguajes funcionales puros , no hay efectos secundarios que alteren los resultados de los cálculos. Como resultado, no se requiere que los operandos se evalúen antes del cuerpo de las construcciones tipo funciones (porque el invariante para definir "mismos resultados" se mantiene por propiedades como la equivalencia β garantizada por la propiedad de Church-Rosser ).
    • Sin embargo, muchos lenguajes de programación pueden tener efectos secundarios durante las evaluaciones de expresiones. Eso significa que las estrategias de evaluación estrictas, como la evaluación aplicativa , no son las mismas que las de evaluación no estricta, como la llamada por necesidad . Esto es significativo, porque sin la distinción, no hay necesidad de distinguir las macros de funciones (es decir, utilizadas con argumentos) de las funciones (tradicionales). Pero dependiendo del sabor de las teorías, esto todavía puede ser un artefacto. Dicho esto, en un sentido más amplio, las macros funcionales (especialmente las higiénicas ) son funciones matemáticas con algunas limitaciones innecesarias (fases sintácticas). Sin las limitaciones, podría ser sensato tratar las macros funcionales (de primera clase) como procedimientos ...
    • Para los lectores interesados ​​en este tema, considere algunas abstracciones modernas .
  • Los procedimientos generalmente se consideran fuera del alcance de las matemáticas tradicionales. Sin embargo, en el modelado de cálculos de la semántica del lenguaje de computación y programación, así como en los diseños de lenguajes de programación contemporáneos, puede haber una gran familia de conceptos relacionados que comparten la naturaleza "invocable". Algunos de ellos se utilizan para implementar / ampliar / reemplazar procedimientos / funciones. Hay distinciones aún más sutiles.
FrankHB
fuente
3

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:

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

Aquí, f es la misma función que g, pero es un procedimiento diferente.

xtofl
fuente
3

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

Mukesh Kumar
fuente
2
Esta respuesta es muy específica del idioma, mientras que la pregunta era independiente del idioma. Las declaraciones aquí no son todas verdaderas en el caso general, pero sería útil si aclarara el idioma o el entorno para el que las afirma.
Mogsdad
Esta respuesta es completamente incorrecta para la gran mayoría de los lenguajes de programación. Los procedimientos solo tienen parámetros de entrada y las funciones tienen entrada y salida.
AStopher
2

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.

OWOEYE GBENGA
fuente
1

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.

pulak
fuente
1

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 randommé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.

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

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 :

// 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))))))

¿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-piesesta máquina que toma ingredientes de (fruit, milk, flower, eggs, sugar, heat)y esta máquina devuelve a pie.

Una representación de esta máquina podría verse así

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

Por supuesto, esa no es la única forma de hacer un pastel.

En este caso podemos ver que:

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

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.

dkinzer
fuente
2
Una función que siempre devuelve el mismo valor para argumentos dados a veces se denomina "función pura". En la mayoría de los lenguajes que distinguen entre procedimientos y funciones, no se requiere que las funciones sean puras, y el término "función" se usa correctamente para referirse a subrutinas que pueden tener efectos secundarios y que pueden devolver resultados diferentes en llamadas sucesivas con los mismos argumentos. (Y en lenguajes tipo C, incluso las subrutinas que no devuelven valores se denominan correctamente "funciones".)
Keith Thompson
De acuerdo, por eso termino diciendo que las palabras son intercambiables.
dkinzer
1
Sí, pero comienza diciendo que "Una función no es cualquier método antiguo que devuelve un valor", mientras que en muchos idiomas eso es exactamente lo que es una función.
Keith Thompson
0

En el contexto de db : el procedimiento almacenado es un plan de ejecución precompilado donde las funciones no lo son.

Awais
fuente
0

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 .

    //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.");
    }
usuario2771704
fuente
-3

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.

Safi ur Rehman
fuente
3. Los procedimientos no se pueden invocar desde la función. ¿En qué idioma es esto cierto? Ninguno en el que tengo experiencia tiene esta restricción.
Mogsdad
Es verdad. Si llama a un procedimiento desde una función, entonces no es una función. En cuanto a qué idioma hace cumplir esto, esa es una buena pregunta, a la que no sé la respuesta. Puede ser funcional, pero aun así no estoy seguro: la lista pura es funcional (no hay conjunto: no afecta a ningún lado), pero como tiene lambdas es posible implementar el conjunto. ¿Podría escribir un compilador que no imponga el uso de set? Tendría que detectar todas las implementaciones del mismo. Podría eliminar lambdas del idioma, pero eso sería peor.
ctrl-alt-delor
Ohh, solo pensé en un lenguaje C ++: un método const no puede llamar a un método no const (aunque necesitará activar las comprobaciones correctas del compilador y no tratar
de evitarlo
-7

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

usuario2766296
fuente
Mmm no. Un procedimiento no hace returnnada. Estás hablando de los efectos secundarios, que son posibles con ambos (si el idioma lo permite).
Mogsdad
Un procedimiento puede devolver cualquier cantidad de valores, esa cantidad puede ser cero
user2766296
Un efecto secundario sería si a tuviera una matriz y la pasara a una función o procedimiento que encontrara el valor más grande, la matriz se pasaría por referencia y después de que la subrutina se haya ejecutado, la matriz se clasifica, el hecho de que es ordenado es un efecto secundario, el valor devuelto es el mayor valor en la matriz
user2766296
Me gusta esta respuesta, y también me gustan las que tienen varios votos negativos porque de alguna manera son correctas, así que, paradójicamente, para que sea muy popular en SO, le daré un voto negativo. Un procedimiento almacenado en SQL Server devuelve un conjunto de resultados (lo que usted denominó "valores múltiples"), mientras que una función solo puede devolver un valor (que no es muy preciso ya que también puede crear una función con valores de tabla).
Ivanzinho