language agnostic - ¿Qué quiere decir con la expresividad de un lenguaje de programación?
language-agnostic programming-languages (11)
De Wikipedia : en informática, el poder expresivo (también llamado expresividad o expresividad) de un lenguaje es la amplitud de las ideas que se pueden representar y comunicar en ese lenguaje. Cuanto más expresivo es un lenguaje, mayor es la variedad y cantidad de ideas que se pueden usar para representar.
Por lo tanto, estoy de acuerdo. "Qué fácil, completo y composible es el lenguaje para que usted exprese sus intenciones". : Creo, esta es la medida de expresividad.
PREGUNTA: ¿Es la verbosidad / sucinta? Quiero decir, si un lenguaje puede escribir algo más corto que el otro, ¿eso significa expresividad?
No. Por ejemplo, ¿el lenguaje Brainfuck es expresivo? No lo creo. Mira un ejemplo de Hello World en Brainfuck:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
O bien: lenguaje hq9plus . Hola código mundial:
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 otro idioma no puede hacer (por ejemplo, LISP puede hacer algo con macro que el otro idioma no puede hacer).
No estoy de acuerdo con paul Como puede ver en los ejemplos anteriores, el lenguaje hq9plus está haciendo Hello World
con una sola letra: H
Considerando que, la mayoría de los otros idiomas lo harán con muchas más letras. Sin embargo, puede crear código composable y fácil de leer con otros idiomas. Si hq9plus está haciendo Hello World
con H
, ¿significa que es poderoso? Yo 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 el problema de búsqueda?
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 trabajando 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 describe su intención, no sus conocimientos , y las tecnologías subyacentes siempre pueden cambiar y optimizar, pero no dañarán su 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 sus intenciones. Y, lo más probable es que no cambie cuando cambien los mecanismos subyacentes.
Veo gran parte de la palabra ''expresividad'' cuando las personas quieren enfatizar que un idioma es mejor que el otro. Pero no veo exactamente lo que quieren decir con eso.
- ¿Es la verbosidad / sucinta? Quiero decir, si un lenguaje puede escribir algo más corto que el otro, ¿eso significa expresividad? Por favor, consulte mi otra pregunta: artículo sobre la densidad del código como medida del poder del lenguaje de programación.
- ¿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 otro idioma 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 un lenguaje de programación? ¿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?
"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 se encuentran:
- Falta de azúcar sintáctica requerida.
- Funciones de primera clase
- Recolección de basura
- Ya sea escritura dinámica o inferencia de tipo
- El núcleo del lenguaje no es servilmente minimalista
- Buena funcionalidad en la biblioteca estándar.
Hasta cierto punto, la expresividad de cualquier lenguaje se puede aumentar al empujar tanto "cómo hacerlo" en subrutinas u objetos como sea posible, de modo que la mayor parte del código restante sea "qué hacer". La cantidad de código de "cómo hacerlo" que se necesita en el código más abstracto es una medida de la expresividad de un lenguaje: cuanto más se parece el código a un pseudocódigo, más expresivo es el propósito del programador.
También se puede pensar en la "metaexpresividad" de un lenguaje: ¿Qué tan expresivo es el lenguaje al construir lenguajes específicos de dominio?
En general, con un lenguaje de programación que está completo, puedes hacer cualquier cosa que otro lenguaje completo pueda hacer. Dicho esto, algunos pueden hacerlo mucho mejor que otros.
Considero que la expresividad significa cuánto puedes decir fácilmente, y qué tan bien / claramente se puede decir. La capacidad de ser terso es parte de eso (un lenguaje muy poderoso y terso es uno como J ). Generalmente encuentro que ser conciso es un buen marcador de ser expresivo. Si 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 esto, la velocidad, la seguridad, la estabilidad, todas esas cosas también tienen en cuenta.
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)
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 se cumplen las dos condiciones siguientes:
- Cualquier programa escrito en el lenguaje B puede reescribirse en el idioma A, manteniendo intacta la estructura esencial del programa.
- Algunos programas escritos en el lenguaje A tienen que ser reestructurados violentamente para poder escribirse en el lenguaje B.
Por lo general, queremos hacer estas comparaciones observando algún tipo de "núcleo esencial" de un lenguaje; por ejemplo, tal vez queremos considerar un dialecto de C con solo 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 a unless
forma. Pero a veces estas distinciones sintácticas superficiales son exactamente lo que entendemos por "poder expresivo"; para algunos programadores es importante decir
die ("found no solutions") unless length(solutions) > 0;
en lugar de
if (length(solutions) == 0) { die("found no solutions"); }
Por lo tanto, debe establecer si está preguntando sobre el poder expresivo de la sintaxis de la superficie 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 idiomas que son definitivamente diferentes, pero ninguno es más expresivo que el otro.
Puede leer una exposición más detallada en las dos primeras páginas de su artículo En el poder expresivo de los lenguajes de programación . Después de eso viene una gran cantidad de teoría de cabeza puntiaguda :-)
Para mí, es la capacidad que tiene el lenguaje para expresar claramente mi lógica e ideas a través del código, de manera que alguien que lea el código que escribí pueda averiguar fácilmente en qué estaba pensando cuando lo hice.
Personalmente, siento que la "expresividad" de un lenguaje realmente se reduce a la claridad con la que el lenguaje construye puede "expresar" las intenciones del desarrollador.
Por ejemplo, creo 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.
No creo que la verbosidad del lenguaje sea igual a su expresividad, sin embargo, existe cierta correlación. Si un lenguaje requiere mucho código para expresar una abstracción, es menos expresivo. Estos son dos conceptos relacionados, pero diferentes.
Lo mismo ocurre con el poder, aunque aquí las características de un lenguaje (es decir, poder) deben ser lo suficientemente completas para expresar la abstracción con claridad. Sin esto, la expresividad sufrirá. Dicho esto, un lenguaje puede ser muy "poderoso" en términos de características, pero no necesariamente expresivo, si el conjunto de características es difícil de entender.
Precisión, concisión y legibilidad son los componentes principales en la expresividad.
Si desea una respuesta que sea un tanto teórica pero más rigurosa que la mayoría, puede buscar el poder expresivo de Matthias Felleisen en el poder expresivo de los lenguajes de programación . Estoy bastante seguro de que mirar un poco alrededor de la red mostrará al menos algunas copias.
Si desea una respuesta más práctica de lo que la mayoría de la gente realmente quiere decir cuando lo dicen, eso es, francamente, bastante diferente. Generalmente, al menos en mi experiencia, un lenguaje "expresivo" significa: "Me gusta el lenguaje, pero no puedo 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", claramente peyorativo, pero sin una definición significativa de lo que supuestamente es incorrecto.
Uno de los grandes problemas proviene de una diferencia fundamental de opinión. Hay al menos dos ideas generales fundamentalmente diferentes que las personas parecen tener acerca de la expresividad:
- La capacidad de expresar una gran variedad de ideas.
- 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 según el primer criterio: puede hacer prácticamente cualquier cosa en lenguaje ensamblador que pueda en un lenguaje de nivel superior, y puede hacer algunas cosas en lenguaje ensamblador que no puede Esencialmente en cualquier lenguaje de nivel superior.
Obviamente, el lenguaje ensamblador no parece tan bueno para la segunda medida, por lo general requiere una cantidad bastante grande de código bastante opaco para lograr casi cualquier cosa. Esta medida tendería a favorecer un lenguaje como Haskell o APL, para 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 lenguaje de su elección es el más expresivo.
Siempre consideré que era aproximadamente equivalente a lo alto que es un idioma. Si quisiera intentar cuantificar la expresividad, las unidades serían algo así como " instrucciones de código de máquina por declaración de idioma "
Un lenguaje más expresivo podría ser muy bueno para hacer bastante trabajo sin escribir mucho código. Sin embargo, probablemente sea más específico para un dominio y un poquito más lento para algunas tareas que una menos expresiva.
Tomemos por ejemplo LINQ. Te permite utilizar la 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 quiere que se haga en lugar de cómo hacerlo. Este es un claro ejemplo de expresividad.
Wikipedia tiene un poco sobre el concepto. Yo mismo entiendo que un lenguaje 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 ser porque Douglas Crockford introdujo esa idea en mi noggin) porque puede hacer mucho con solo unas pocas palabras clave. Por ejemplo, la palabra clave de function
es una función, así como un método, una clase y un lambda.
Alguna ilustración de código (dejando de lado algunos detalles por 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.