¿Es C un lenguaje de programación imperativo o declarativo?

9 minutos de lectura

unnamed file 103
Ashrith Gande

Es bastante confuso saber la diferencia entre la programación imperativa y declarativa. ¿Alguien puede explicar la diferencia entre ambos en términos del mundo real?

Por favor, aclare si C es un lenguaje imperativo o declarativo.

  • Se ha argumentado que C es un lenguaje puramente funcional

    – microterio

    24 de febrero de 2014 a las 4:07

  • stackoverflow.com/tags/c/info

    – dato

    24 de febrero de 2014 a las 4:33

unnamed file 104
Raúl Tripathi

C es un lenguaje de programación imperativo.

Una diferencia de una línea entre los dos sería programación declarativa es cuando dices lo que quieres, y lenguaje imperativo es cuando dices como conseguir lo que quieres. En programación declarativa el enfoque está en lo que la computadora debe hacer en lugar de cómo debe hacerlo (por ejemplo, SQL), mientras que en la programación imperativa el enfoque está en qué pasos debe tomar la computadora en lugar de lo que hará la computadora (por ejemplo, C, C ++, Java).

programación imperativa es un paradigma de programación que describe la computación en términos de declaraciones que cambian el estado de un programa

programación declarativa es un paradigma de programación, un estilo de construir la estructura y los elementos de los programas de computadora, que expresa la lógica de una computación sin describir su flujo de control

Muchos lenguajes de programación imperativos (como Fortran, BASIC y C) son abstracciones del lenguaje ensamblador.

los wiki dice:-

Como lenguaje imperativo, C usa sentencias para especificar acciones. La declaración más común es una declaración de expresión, que consta de una expresión que se va a evaluar, seguida de un punto y coma; como efecto secundario de la evaluación, se pueden llamar funciones y se pueden asignar nuevos valores a las variables. Para modificar la ejecución secuencial normal de sentencias, C proporciona varias sentencias de flujo de control identificadas por palabras clave reservadas. La programación estructurada es compatible con la ejecución condicional if(-else) y con do-while, while y para la ejecución iterativa (bucle). La sentencia for tiene expresiones separadas de inicialización, prueba y reinicialización, cualquiera de las cuales o todas pueden omitirse. break y continue se pueden usar para salir de la declaración de bucle más interna o pasar a su reinicialización. También hay una declaración goto no estructurada que se bifurca directamente a la etiqueta designada dentro de la función. switch selecciona un caso para ser ejecutado basado en el valor de una expresión entera.

unnamed file 16
kfmfe04

Advertencia

Estoy escribiendo con muchas generalidades, así que tengan paciencia conmigo.

En teoria

C es imperativo, porque el código se lee como una receta sobre cómo hacer algo. Sin embargo, si usa muchas funciones bien nombradas y punteros de función para el polimorfismo, es posible hacer que el código C parezca un lenguaje declarativo.

En imperativo idiomas, te centras en el algoritmo/implementación. La ingeniería es inherentemente imperativa, porque se centra en la eficiencia de un proceso: el costo de hacer algo en términos de tiempo o dinero (o memoria en CS) requerido.

Por el contrario, las Matemáticas son generalmente declarativo (pero escribir una prueba tiende a ser más imperativo). En matemáticas, le importa más la corrección y la definición de relaciones/operaciones invariantes, en lugar de la rapidez con la que puede obtener la respuesta.

Tenga en cuenta que muchos lenguajes funcionales tienden a ser de naturaleza declarativa (por ejemplo, R, Lisp).

¿Qué significa z = x + y? (Semántica)

en un imperativo lenguaje, significa leer de las ubicaciones de memoria x e y, sumar esos valores y colocar el resultado en la ubicación de memoria z, y hacerlo ahora mismo. Si asigna un valor diferente a x, tendrá que usar el z = x + y declaración de nuevo para volver a calcular z.

en un declarativo lenguaje (perezoso), significa que z es una variable cuyo valor es la suma de los valores de otras dos variables x e y. La operación de suma no se ejecuta hasta que intentas leer el valor de z. ¿Cuál es la implicación? Si lee de z, el valor siempre será la suma de xey en ese momento; no necesita volver a emitir la declaración. en puro declarativo lenguas donde no hay Variables¡una reedición en realidad puede ser detectada como un error!

Tenga en cuenta este ejemplo y verá por qué los matemáticos tienden a preferir declarativo idiomas Por ejemplo, puedo definir hipotenusa = sqrt (altura ^ 2 + longitud ^ 2) y nunca preocuparme por tener que volver a emitir esa declaración. La relación es un invariante que siempre se cumplirá, al igual que una verdad matemática siempre se cumple.

En la vida real (¿y por qué debería importarme?)

Los defensores de lenguajes declarativos afirmación: una solución eficiente que está mal (buggy) es inútil. Quieren funciones libres de errores, sin estado y sin efectos secundarios que puedan reutilizarse sin modificaciones.

Los defensores de idiomas imperativos afirmación: una solución correcta que tarda una eternidad en ejecutarse también es inútil. Quieren control sobre el intercambio de memoria/velocidad. Quieren poder optimizar en función de las limitaciones físicas y de tiempo.

Por supuesto, nada es 100% imperativo o declarativo. Imperativo el código correcto y bien escrito implica ciertas relaciones. OTOH, declarativo El código, con suficiente profundidad y junto con las especificaciones del lenguaje, describe esas relaciones lo suficientemente bien como para que el compilador/intérprete convierta su código en una serie de instrucciones de CPU.

Debido a que estamos tratando con computadoras, un declarativo el compilador/intérprete debe ser lo suficientemente inteligente como para hacer concesiones entre tiempo y memoria, mientras que en un lenguaje imperativo, depende del programador tomar esas decisiones de manera más explícita.

entonces un declarativo El lenguaje requiere que el programador se concentre en definir relaciones entre variables y otros invariantes. Depende del compilador/intérprete convertir esas relaciones en una serie de instrucciones/operaciones para la CPU. La mayoría de los compiladores/intérpretes declarativos son lo suficientemente inteligentes como para manejar la mayoría de los casos del mundo real, pero pueden tener problemas con los casos extremos. Desafortunadamente, en esas situaciones tendrá que persuadir al compilador/intérprete.

¿Cuál es mejor?

Los defensores de declarativo Los lenguajes afirman que dichos lenguajes permiten a los programadores concentrarse en el dominio y escribir código que se lee más fácilmente para los no programadores. Es más fácil escribir el código correcto, afirman los defensores. Sin embargo, la compensación es que persuadir al compilador/intérprete para que haga la compensación correcta entre memoria y velocidad puede requerir un conocimiento complejo del lenguaje. Comprenderá este problema si utiliza un lenguaje declarativo como R o SQL o LISP. Ciertamente, es posible definir un nuevo lenguaje declarativo que no tenga nada que ver con las computadoras (pero hacerlo puede hacer que sea más difícil para el escritor del intérprete/compilador). A muchos matemáticos e investigadores puros de CS les gustan los lenguajes declarativos.

Imperativo los lenguajes tienden a darle un control más detallado sobre la máquina. No hay duda de que estás programando una computadora. La trampa es que podemos terminar enfocándonos prematuramente en optimizaciones de velocidad innecesarias que dañan el mantenimiento y la legibilidad del código. En los primeros días de la informática, donde la velocidad o la memoria estaban severamente limitadas, necesitabas tener lenguajes imperativos para realizar un trabajo útil, optimizado correctamente para tu situación. Los ingenieros y los manitas tienden a gravitar hacia los lenguajes imperativos.

C es un lenguaje imperativo.

Un lenguaje imperativo especifica cómo para hacer lo que quieras Un lenguaje declarativo especifica qué quieres, pero no cómo hacerlo; el lenguaje resuelve cómo hacerlo. Prolog es un ejemplo de lenguaje declarativo.

Me gustaría comentar que algunos aspectos del lenguaje C serían, en ausencia de reglas explícitas, declarativos…

int i = 4;
int j = 5;

float f = i/j;

parecería significar que tiene la intención de que float sea .80 (y en un lenguaje declarativo lo sería, lo más probable) … pero dado que hay procedimientos bien definidos, int/int se evalúa como int usando la división de enteros (que en C es división de piso).

es el aspecto del comportamiento explícitamente definido lo que hace que C sea Imperativo.

existe el secreto debajo de la capa de C donde se pueden realizar optimizaciones, siempre que tengan la garantía de no cambiar la salida del programa, eso hace que el compilador tenga algún comportamiento declarativo, donde la declaración es el comportamiento del programa C de entrada , pero el resultado final puede ser cualquier cosa que coincida con ese programa C en funcionalidad

§5.1.2.3 parte 10:

Alternativamente, una implementación puede realizar varias optimizaciones dentro de cada unidad de traducción, de modo que la semántica real coincida con la semántica abstracta solo cuando se realizan llamadas de función a través de los límites de la unidad de traducción. En tal implementación, en el momento de cada entrada de función y devolución de función donde la función que llama y la función llamada están en diferentes unidades de traducción, los valores de todos los objetos vinculados externamente y de todos los objetos accesibles a través de punteros en ellos estarían de acuerdo con la semántica abstracta. . Además, en el momento de la entrada de cada función de este tipo, los valores de los parámetros de la función llamada y de todos los objetos accesibles a través de punteros estarían de acuerdo con la semántica abstracta. En este tipo de implementación, los objetos a los que hacen referencia las rutinas de servicio de interrupción activadas por la función de señal requerirían una especificación explícita de almacenamiento volátil, así como otras restricciones definidas por la implementación.

y un ejemplo concreto de la siguiente parte:

EJEMPLO 2 Al ejecutar el fragmento

char c1, c2; /* ... */
c1 = c1 + c2; 

las ”promociones de enteros” requieren que la máquina abstracta promueva el valor de cada variable a tamaño entero y luego sume los dos enteros y trunque la suma. Siempre que la adición de dos caracteres se pueda realizar sin desbordamiento, o con un ajuste de desbordamiento silencioso para producir el resultado correcto, la ejecución real solo necesita producir el mismo resultado, posiblemente omitiendo las promociones.

-> Programación imperativa: decirle a la “máquina” cómo hacer algo, y como resultado sucederá lo que usted quiere que suceda.

-> Programación declarativa: decirle a la “máquina” lo que le gustaría que sucediera y dejar que la computadora descubra cómo hacerlo.

Entonces podemos decir que C es un lenguaje imperativo.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad