¿Qué quiere decir con la expresividad de un lenguaje de programación?


Veo mucha de la palabra 'expresividad' cuando la gente quiere enfatizar que un idioma es mejor que el otro. Pero no veo exactamente lo que quieren decir con eso.

  • ¿Es la verbosidad/sucintitud? Quiero decir, si un idioma puede escribir algo más corto que el otro, ¿eso significa expresividad? Por favor refiérase a mi otra pregunta - Artículo sobre la densidad del código como medida de la potencia del lenguaje de programación
  • ¿Es el poder del lenguaje? Paul Graham dice ese idioma es más poderoso que el otro en el sentido de que un idioma puede hacer lo que el otro no puede hacer (por ejemplo, LISP puede hacer algo con macro que el otro idioma no puede hacer).
  • ¿Es solo algo que hace la vida más fácil? La expresión regular puede ser uno de los ejemplos.
  • ¿Es una forma diferente de resolver el mismo problema: algo como SQL para resolver el problema de búsqueda?

¿ Qué opinas sobre la expresividad de una programación el lenguaje? ¿Puedes mostrar la expresividad usando algún código?

¿Cuál es la relación con la expresividad y el DSL? La gente viene con DSL para obtener la expresividad?

Author: Community, 2010-03-11

11 answers

Personalmente, siento que la "expresividad" de un lenguaje realmente se reduce a cuán claramente las construcciones del lenguaje pueden "expresar" las intenciones del desarrollador.

Por ejemplo, siento que C# (especialmente LINQ a través de C# 3+) se está volviendo mucho más expresivo. Esta declaración LINQ es un gran ejemplo:

var results = collection.Where(item => item > 5);

Sin conocer los detalles del lenguaje o la implementación que se está utilizando, la intención del desarrollador es (en mi opinión) muy clara en la declaración anterior.

Yo no piense que la verbosidad del lenguaje es igual a su expresividad, sin embargo, hay alguna correlación en su lugar. Si un lenguaje requiere mucho código para expresar una abstracción, es menos expresivo. Estos son dos conceptos relacionados, pero diferentes.

Lo mismo es cierto con el poder - aunque aquí las características de un lenguaje (es decir: poder) deben ser lo suficientemente completas como para expresar la abstracción claramente. Sin esto, la expresividad sufrirá. Dicho esto, un idioma puede ser muy "potente" en términos de características, pero no necesariamente expresivo, si el conjunto de características es difícil de entender.

 30
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:19:35

"Expresividad" significa la capacidad de decir solo lo que quieres que se haga:

bad_event = events.find(&:bad)

En lugar de cómo quieres que se haga:

i = 0
bad_event = nil
while i < events.size && bad_event.nil?
  event = events[i]
  if event.bad?
    bad_event = event
  end
  i += 1
end

Entre las cosas que contribuyen a la expresividad están:

  • Una falta de azúcar sintáctico requerido
  • Funciones de primera clase
  • Recolección de basura
  • Ya sea tipificación dinámica o inferencia de tipos
  • El núcleo del lenguaje no es servilmente minimalista
  • Buena funcionalidad en el estándar biblioteca

Hasta cierto punto, la expresividad de cualquier lenguaje se puede aumentar empujando tanto "cómo hacerlo" en subrutinas/objetos como sea posible para que la mayor parte del código restante sea "qué hacer"."La cantidad de código" cómo hacerlo " necesario en el código más abstracto es una medida de la expresividad de un lenguaje: Cuanto más se parezca el código a un pseudocódigo, más expresivo es la intención del programador.

Uno también puede pensar en la "meta-expresividad" de un lenguaje: ¿Qué tan expresivo es el lenguaje en la construcción de Lenguajes Específicos de Dominio?

 26
Author: Wayne Conrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-01 17:15:53

Me gusta la noción de poder expresivo de Matthias Felleisen, que es comparativa :

  • El lenguaje A es estrictamente más expresivo que el lenguaje B si ambas cosas son ciertas:

    • Cualquier programa escrito en el lenguaje B puede ser reescrito en el lenguaje A manteniendo intacta la estructura esencial del programa.
    • Algunos programas escritos en lenguaje A tienen que ser reestructurados violentamente para ser escritos en lenguaje B.

Normalmente queremos hacer estas comparaciones mirando algún tipo de "núcleo esencial" de un lenguaje-por ejemplo, puede que desee considerar un dialecto de C while y no también for y do...while. O tal vez queremos considerar un dialecto de Perl con solo un prefijo if forma y no unless forma. Pero a veces estas distinciones sintácticas superficiales son exactamente lo que entendemos por "poder expresivo"; para algunos programadores es importante say

die ("found no solutions") unless length(solutions) > 0;

En lugar de

if (length(solutions) == 0) { die("found no solutions"); }

Así que tienes que establecer si estás preguntando sobre el poder expresivo de la sintaxis superficial o la estructura más profunda.

La otra cosa que me gusta de la idea de Felleisen es que admite la noción de dos lenguajes que son definitivamente diferentes, pero ninguno es más expresivo que el otro.

Puedes leer una exposición más detallada en las dos primeras páginas de su artículo Sobre el Poder Expresivo de la Programación Idiomas. Después de eso viene una gran cantidad de teoría de cabeza puntiaguda: -)

 25
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 21:12:51

Si quieres una respuesta que sea algo teórica pero más rigurosa que la mayoría, es posible que quieras buscar la De Matthias Felleisen Sobre el Poder Expresivo de los Lenguajes de Programación. Estoy bastante seguro de que un poco de mirar alrededor de la red aparecerá al menos algunas copias.

Si quieres una respuesta más práctica de lo que la mayoría de la gente realmente quiere decir cuando lo dice, eso es, francamente, bastante diferente. Por lo general, al menos en mi experiencia, un lenguaje "expresivo" significa: "Yo al igual que el lenguaje, pero no puede citar ningún apoyo objetivo para hacerlo. Por el contrario, cosas como" menos expresivo "o" no expresivo "generalmente significan:" No me gusta el lenguaje [también], pero no puedo citar ningún apoyo objetivo para hacerlo."

"No expresivo" es a menudo similar a un político que acusa a otro de ser "fascista" clearly claramente peyorativo, pero sin ninguna definición significativa de lo que supuestamente está mal.

Uno de los grandes problemas proviene de una diferencia fundamental de opinión. Hay al menos dos ideas generales fundamentalmente diferentes que la gente parece tener sobre la expresividad:

  1. la capacidad de expresar una amplia variedad de ideas.
  2. la capacidad de expresar algunas ideas específicas claramente (y a menudo sucintamente).

Para considerar algunos ejemplos extremos, el lenguaje ensamblador calificaría como altamente expresivo por el primer criterio you puedes hacer esencialmente cualquier cosa en lenguaje ensamblador que puedas en un lenguaje de nivel superior, y puedes hacer algunas cosas en lenguaje ensamblador que no puedes hacer en cualquier lenguaje de nivel superior.

Obviamente, el lenguaje ensamblador no se ve tan bien en la segunda medida typically típicamente requiere una gran cantidad de código bastante opaco para lograr mucho de cualquier cosa. Esta medida tendería a favorecer un lenguaje como Haskell o APL, por dar solo un par de ejemplos.

Estas dos nociones de lo que significa "expresivo" son frecuentemente cercanas a diametralmente opuestas. El primero tiende a favorecer los idiomas de nivel "más bajo", mientras que el segundo tiende a favorecer el nivel" más alto". Al combinar los dos, es bastante trivial elegir una definición que "pruebe" que un idioma de su elección es el más expresivo.

 7
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-10 03:39:16

Wikipedia tiene un poco sobre el concepto. Yo mismo lo entiendo como que un idioma puede lograr más con menos (el llamado "uso informal" en el artículo de Wikipedia).

Considero que JavaScript es expresivo (aunque esto podría deberse a que Douglas Crockford perforó esa idea en mi cabeza) porque puede hacer mucho con solo unas pocas palabras clave. Por ejemplo, la palabra clave function es una función, así como un método, una clase y una lambda.

Alguna ilustración de código (dejando algunos detalles para la brevedad) en JavaScript. Es una clase de evento que escribí:

SJJS.util.Event = (function() {
    var _listeners = [];
    var _listenerReturns = [];

    return {
        addDomListener: function(element, eventName, listener) {
        },
        trigger: function(element, eventName) {
        },
        removeListener: function(eventlistener) {
        }
    }
})();

Con solo function, var, y algunas llaves y paréntesis hice una clase estática con métodos y variables privadas.

 3
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:24:24

Para mí es la capacidad que el lenguaje tiene para expresar claramente mi lógica e ideas a través del código, de una manera que alguien más que lea el código que he escrito puede fácilmente averiguar en qué estaba pensando cuando lo hice.

 3
Author: Andres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:38:53

Siempre pensé que era aproximadamente equivalente a cuán alto nivel es un idioma. Si desea tratar de cuantificar la expresividad, las unidades serían algo así como "instrucciones de código máquina por instrucción de idioma "

Un lenguaje más expresivo podría ser muy bueno para hacer mucho trabajo sin escribir mucho código. Sin embargo, probablemente sería más específico del dominio y un poco más lento para algunas tareas que una menos expresiva.

 1
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:54:23

Tomemos por ejemplo LINQ. Permite utilizar programación funcional.

La programación funcional enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativo, que enfatiza los cambios en el estado.

LINQ le permite expresar lo que desea hacer en lugar de cómo hacerlo. Este es un claro ejemplo os expresividad.

 1
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:58:24

En términos generales, con un lenguaje de programación que es turing complete se puede hacer cualquier cosa que otro lenguaje turing complete puede hacer. Dicho esto, algunos pueden hacerlo mucho mejor que otros.

Tomo expresividad para significar cuánto se puede decir fácilmente, y cuán bien / claramente se puede decir. La habilidad de ser conciso es parte de eso ( un lenguaje muy poderoso y conciso es uno como J ). Generalmente encuentro que ser conciso es un buen marcador de ser expresivo. Si el el lenguaje puede expresar una operación compleja de una manera simple, va en la dirección correcta.

En cuanto al poder, la expresividad no es todo el poder de un lenguaje. Si bien puede ser parte de ella, la velocidad, la seguridad, la estabilidad, todas esas cosas también influyen.

Ejemplo: la suma de una lista en Common lisp usando el operador de bucle es concisa y expresiva

(loop for x in list sum x)

 0
Author: zellio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:25:43

La precisión, la concisión y la legibilidad son los componentes principales de la expresividad.

 0
Author: Paul Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:34:09

De Wikipedia: En ciencias de la computación, el poder expresivo (también llamado expresividad o expresividad) de un lenguaje es la amplitud de ideas que pueden ser representadas y comunicadas en ese lenguaje. Cuanto más expresivo es un lenguaje, mayor es la variedad y cantidad de ideas que puede ser utilizado para representar.

Así que, estoy de acuerdo. "Qué fácil, completo y componible es el lenguaje para que expreses tus intenciones.": Creo que esto es la medida de la expresividad.


PREGUNTA: ¿Es la verbosidad/sucinta? Quiero decir, si un idioma puede escribir algo más corto que el otro, ¿eso significa expresividad?

No. Por ejemplo, es Brainfuck expresivo el lenguaje? No lo creo. Mira un ejemplo de Hello World en Brainfuck:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

O: hq9plus idioma. Código Hello World:

H

PREGUNTA: ¿Es el poder del lenguaje? Paul Graham dice que un idioma es más poderoso que el otro en el sentido de que un idioma puede hacer lo que el otro no puede hacer (por ejemplo, LISP puede hacer algo con macro que el otro idioma no puede hacer).

No estoy de acuerdo con Pablo. Como puede ver en los ejemplos anteriores, el lenguaje hq9plus está haciendo Hello World con una letra: H. Mientras que, la mayoría de los otros idiomas lo harán con muchas más letras. Pero, puede crear código componible y fácil de leer con otros idioma. Si hq9plus está haciendo Hello World con H, significa que es poderoso? Creo que no.


PREGUNTA: ¿Es solo algo que hace la vida más fácil? La expresión regular puede ser uno de los ejemplos.

Las expresiones regulares son grandes, pero a veces pierden su poder expresivo. A veces, depende del programador.


PREGUNTA: ¿Es una forma diferente de resolver el mismo problema: algo como SQL para resolver la búsqueda problema?

La mitad Sí. SQL es un lenguaje declarativo y muy expresivo. Porque los motores y tecnologías subyacentes pueden avanzar y cambiar sin que usted cambie sus consultas SQL. Esto lo hace muy expresivo. Hay muchas consultas que han estado funcionando durante décadas y la tecnología subyacente de las bases de datos cambia. Pero, sus consultas no necesitan. Creo que esto se debe al poder de su expresividad.

También creo que los lenguajes funcionales son muy expresivos. Porque solo describes tu intención, no tu cómo , y las tecnologías subyacentes siempre pueden cambiar y optimizar, pero no dañarán tu código expresivo .

Ejemplo:

// top 10 products with rating higher than 5
return products
  .sort(p => p.rating)
  .filter(p => p.rating > 5)
  .map(p => p.title)
  .take(10)

El programa anterior es expresivo, transmite tus intenciones. Y, lo más probable es que no cambie cuando cambien los mecanismos subyacentes.

 0
Author: Inanc Gumus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-27 10:47:10