Lo que específicamente no poder expresivo se refiere?

34

Expresiva de energía es definido por Wikipedia como:

.. la amplitud de ideas que se pueden representarse y comunicarse en ese idioma.

Significa "Ideas" se refieren a las cosas (operaciones, estructuras, algoritmos, etc.?) Que se pueden comunicar a la máquina ? ¿O se refiere a los conceptos de "humanos" que se pueden capturar y se comunicó con la lengua a otros seres humanos?

¿Cómo se potencia expresiva evaluado y medido?

Por ejemplo, si tomamos un lenguaje como JavaScript y le impuso una restricción raro en los nombres de variables, como la variable debe ser un número de 8 dígitos precedidos por un guión, adaptación/^_[0-9]{8}$/ , podríamos perder fuerza expresiva?

¿O eso solamente absurdo y molesto?


Para aclarar:

Es poder expresivo medida por los generales las ideas inherentes a la lengua:

  • enteros y cadenas
  • bucles
  • condicionales

O el número de específica , ideas únicas que el lenguaje puede representar:

  • los números enteros 1, 2 ... 2 ^ 32
  • cadenas que contengan "¿Qué dice Fox?" y "wha pah pah pah pah pah prisionero de guerra"
  • para cada una rana en mi colección de ranas
  • si la rana es verde o algo y luego hacer algo
svidgen
fuente
3
Cabe señalar que limitar un programa a un máximo de 100 millones de variables en un alcance determinado impone algún límite a la expresividad. Puede que sea imposible implementar Firefox, por ejemplo. ;-)
R ..
1
Tenga en cuenta que si bien ha etiquetado estos "lenguajes de programación", los idiomas de programación no son el único tipo de lenguajes de computadora cuyo poder expresivo podría discutirse. De hecho, la página a la que enlaza tiene Lenguaje de ontología web como primer ejemplo.
Jon Hanna

Respuestas:

39

El documento histórico sobre expresividad es Sobre el poder expresivo de los lenguajes de programación por Matthias Felleisen (1991) . Contiene una definición matemáticamente rigurosa de la expresividad del lenguaje.

Intuitivamente, si todos los programas que pueden escribirse en el lenguaje A también pueden escribirse en el lenguaje B con solo transformaciones locales, pero hay algunos programas escritos en el lenguaje B que no pueden escribirse en el lenguaje A sin cambiar su estructura global (es decir, no solo con puramente transformaciones locales), entonces el lenguaje B es más expresivo que idioma A .

Una buena propiedad de esta definición es que admite la posibilidad de que haya pares de lenguajes donde hay programas en X que no se pueden expresar en Y y programas en Y que no se pueden expresar en X , y por lo tanto los lenguajes son distintos, pero tampoco El lenguaje es más expresivo que el otro. Esto encaja bien con nuestra experiencia en el mundo real de que hay algunos idiomas que son buenos en algunas cosas y algunos que son buenos en otras cosas, y ninguno es generalmente "mejor" que el otro.

Jörg W Mittag
fuente
Entonces, (sin haber mirado el documento todavía), ¿la expresividad se trata de lo que puede expresar a la máquina en lugar de los lectores de la fuente? ¿Es una medida de lo que puede indicarle al hardware que haga? ¿No es una medida de cuántas ideas "humanas" puede preservar o comunicar en código? ... Tal vez necesito hacer otra pregunta; pero, si ese es el caso, ¿en qué se diferencia de la "funcionalidad" de la que también hablamos?
svidgen
Quizás mi ejemplo en el OP es malo. Considere los idiomas A y B, ambos con matrices; pero, el lenguaje A también tiene estructuras. En cualquier idioma, puedo representar una serie de Point's usando una matriz de matrices 2D. Pero, A tiene la ventaja de permitirme expresar a Pointcomo un concepto más legible para los humanos. ¿Es A más expresivo?
svidgen
@svidgen Debido a que todos los lenguajes completos de Turing son computacionalmente equivalentes, el conjunto de posibles programas que se pueden escribir es teóricamente el mismo para todos ellos. Según la definición anterior, el lenguaje B es más expresivo que A si un programa escrito en B tiene que ser reorganizado para encajar en A. (No solo cambiando la sintaxis línea por línea, sino introduciendo nuevas clases, bucles, etc. Piense en reescribir un Python programa en Java 7 que utiliza lambdas, map, filter, de primera clase de tipos / métodos / funciones, tal vez un poco eval, dejar que la magia solo metaclase o tipos creados de forma dinámica, etc.
marczellm
@marczellm entonces, ¿las "ideas" a las que se refiere la expresividad son las construcciones del lenguaje en sí mismas? Por ejemplo, un condicional es una idea? Un bucle es una idea? ¿Una cuerda? ¿Número? Etc.?
svidgen
1
@ Jörg ¿Puedes poner un ejemplo en tu respuesta? Es una definición linda, pero realmente no hace mucho para responder la pregunta.
svidgen
10

Expresiva de energía es definido por Wikipedia como:

Volvamos a leer esa página. Una de las primeras cosas a tener en cuenta es que dice "lenguaje", no "lenguaje de programación", y la mayoría de sus ejemplos no son lenguajes de programación, por ejemplo, el primer ejemplo dado es una comparación de OWL2 EL y OWL2 RL, que son ontología idiomas

Se puede aplicar el concepto a los lenguajes de programación, pero también a los lenguajes de coincidencia de patrones, los lenguajes de marcado, los lenguajes de consulta, los idiomas de la hoja de estilo visual, las expresiones regulares (y todos los lenguajes regulares a los que se refieren), etc. Incluso se puede referir al poder expresivo de los idiomas naturales como el inglés, que a menudo se hace de manera informal, pero con más seriedad al considerar los problemas relacionados con el procesamiento del lenguaje natural.

¿Las "ideas" se refieren a las cosas (operaciones, estructuras, algoritmos, etc.) que podemos comunicar a la máquina? ¿O se refiere a los conceptos "humanos" que pueden capturarse y comunicarse con el lenguaje a otros humanos?

Se refiere a lo que se puede expresar en ese idioma, considerado puramente como una cosa en sí mismo.

Por ejemplo, (usaré javascript para mis ejemplos, porque su pregunta indica que es uno de los idiomas que conoce) considere la declaración de javascript:

var x = 3 + 4;

Esto representa que la suma de valor de 3 y 4 se calcula y el valor asociado con una etiqueta xdentro de un ámbito de espacio de nombres dado.

Si destruimos todas las computadoras del mundo y escribimos ese código en una hoja de papel, seguiría siendo que en JavaScript todavía tenía el mismo significado; no podríamos ejecutar dicho código en nada, pero la definición abstracta del lenguaje sigue siendo algo de lo que podríamos hablar.

Esto puede parecer pedante, pero en realidad es bastante importante que los idiomas sean cosas sobre las que se pueda razonar en abstracto sin tener en cuenta las computadoras reales. Por un lado, las personas que razonan sobre puntos teóricos de lenguajes de computadora que aún no eran factibles en la práctica es una de las cosas que nos han llevado a donde estamos hoy; las computadoras necesitan informática, pero la informática no necesita computadoras, solo la idea de un cálculo.

Por supuesto, usamos computadoras en el mundo real, y en estos días hay muchas personas que las usan en la práctica en lugar de unos pocos especialistas que las discuten en teoría. La página a la que enlazaste dice:

El término poder expresivo puede usarse con un rango de significado. Puede significar una medida de las ideas expresables en ese idioma:

  • independientemente de la facilidad (expresividad teórica)

  • concisa y fácilmente (expresividad práctica)

El primer sentido domina en áreas de matemática y lógica que se ocupan de la descripción formal de los lenguajes y su significado, como la teoría del lenguaje formal, la lógica matemática y el álgebra de procesos.

En las discusiones informales, el término a menudo se refiere al segundo sentido, o a ambos. Este suele ser el caso cuando se habla de lenguajes de programación. Se han realizado esfuerzos para formalizar estos usos informales del término

De estos dos usos del término, el impacto práctico del primero se relaciona únicamente con lo que se puede transmitir a la computadora.

El segundo se relaciona más con la comprensión humana tanto en lectura como en escritura, aunque el grado en que lo hace difiere mucho entre los usos, ya que son informales y, como tales, no están rigurosamente definidos.

Por ejemplo, si tomáramos un lenguaje como JavaScript e impusiéramos una restricción extraña a los nombres de variables, como la variable debe ser un número de 8 dígitos precedido por un guión bajo, coincidente /^_[0-9]{8}$/, ¿perderíamos poder expresivo?

Según la definición formal, no hemos perdido poder expresivo: estamos restringidos a 100,000,000 variables, pero si realmente lo necesitáramos, podríamos evitar esto creando objetos para contener más variables dentro del espacio de nombres recién creado. Como tal, cualquier programa escrito en JavaScript hoy podría reescribirse en esta nueva forma, por lo que son igualmente expresivos.

Según la definición informal, hemos perdido algo, pero cuánto depende de cuán informales seamos, lo que variará porque nuevamente no se puede decir cuál es "la regla" sobre un uso informal. Podríamos decir que hemos perdido una pequeña cantidad, porque los programas con más de 100,000,000 de variables en el mismo espacio de nombres deben reescribirse más allá de una simple sustitución. Un uso aún más informal nuevamente se referiría al impacto mental de tales nombres variables desgarbados en el ser humano integral.

También vale la pena señalar que las personas considerarán informalmente cosas que no son estrictamente parte del lenguaje. Considere los cambios en Javascript desde su creación hasta hoy.

Según la definición más formal, no ha habido cambios en la expresividad; Turing estaba completo para empezar, después de todo.

Por una definición más informal, se ha vuelto considerablemente más expresivo en ciertas cosas como la manipulación de matrices, el manejo de excepciones y (quizás sobre todo) en la inclusión de expresiones regulares. Estos no hacen nada que antes no se pudiera hacer en javascript, aunque a menudo pueden hacer algo en unas pocas líneas y en un tiempo de ejecución de un segundo que tomaría kilobytes de código para escribir en javascript 1.0 y mucho tiempo para ejecutarse.

Por una definición mucho más informal nuevamente, el cambio desde el primer uso de JavaScript en los navegadores (capaz de cambiar los valores de las entradas de formulario, document.writemientras que la página se analiza primero y se mueve a una nueva ubicación o retrocede o avanza en el historial, pero bastante mucho más) para eso hoy (capaz de cambiar casi cualquier cosa en la página, incluso sobre la base de los datos de las llamadas al servidor) es absolutamente inmenso, aunque la mayor parte no se relaciona con JavaScript sino con los modelos de objetos y las API realizadas disponible, en lugar del idioma (por ejemplo, vbscript en IE se benefició de esos cambios por igual).

En mi opinión, ese último uso es tan informal que no es realmente correcto, pero ese es el problema con las definiciones informales.

Según la definición formal, realmente no se ha vuelto más expresivo en absoluto.

Jon Hanna
fuente
2
"las computadoras necesitan informática, pero la informática no necesita computadoras" Me gusta eso
chbaker0
Con respecto a la restricción de nomenclatura variable, ¿la capacidad de referirse a ideas externas (nombres en lenguaje nativo para cosas) no está relacionada con la capacidad del lenguaje para representar ideas? ... Tal vez más a la raíz de la pregunta: ¿Las ideas de las que estamos hablando expresan solo las construcciones del lenguaje general ? Por ejemplo, suma, resta, negación, matrices, clases, etc. ¿A diferencia de las ideas particulares que podemos expresar con el lenguaje? Por ejemplo, matriz llamada fishiesde tipoFish .
svidgen
Puedes ver mi edición para más aclaraciones. ... Suena como si dijeras que es a la vez (refiriéndose a mi edición); pero que la primera lista es "formal" y la segunda lista es "informal". Si ese es el caso, ¿existe una norma sobre cómo se usa sin reservas en la conversación? O ... ¿tienden a pedir una aclaración?
svidgen
4

No creo que las reglas de nombres variables realmente capturen lo que se entiende por "expresividad". Creo que "expresividad" se refiere a cosas más fundamentales. Considere C # con Linq versus C # antes de Linq, por ejemplo. Después de la adición de Linq, se hizo posible escribir consultas similares a SQL directamente en C #. Esto es mucho más elegante que las alternativas anteriores, por ejemplo, poner SQL en literales de cadena y luego pasarlo al servidor, o iterar sobre una colección usando "for".

Otro buen ejemplo podrían ser los lenguajes con herencia basada en prototipos. En esos idiomas, es posible simplemente agregar nuevos métodos a una instancia o incluso a una clase (por cualquier nombre que una "clase" pueda ir en un idioma dado ...) en tiempo de ejecución. Realmente no puedes hacer eso en C ++ o C #. Carecen de este grado de expresividad en comparación con los lenguajes basados ​​en prototipos. (C # tiene el concepto de métodos de extensión, y ciertamente se podría decir que agregan expresividad).

usuario1172763
fuente
0

Como se menciona en el artículo de Wikipedia, el poder expresivo se refiere al conjunto de programas que se pueden expresar en el lenguaje. Todo lo que usted considera un "lenguaje de programación" (JavaScript, LISP, C #, Perl, etc.) está esencialmente completo, lo que significa que pueden expresar cualquier cosa que se considere "computable".

Sin embargo, debe quedar bastante claro que las expresiones regulares no son tan expresivas como el lenguaje de programación regular. Además, los comodines de shell son algo menos expresivos que las expresiones regulares.

Una versión de SQL con expresiones de tabla comunes es más expresiva que una versión sin ella porque los CTE le permiten representar consultas recursivas que de otro modo serían imposibles de expresar en SQL.

Gabe
fuente
0

Hay una manera más simple y directa de entender el poder expresivo, pero primero debemos establecer qué entendemos por idiomas. Hay dos disciplinas que estudian idiomas: lingüística y autómatas. Ambos estarían de acuerdo en que el lenguaje sea un conjunto de palabras (secuencias finitas) construidas a partir de un alfabeto finito utilizando la concatenación. Por lo general, los lenguajes interesantes (por interesante quiero decir aquellos que podemos interpretar de manera útil) también tienen un conjunto de reglas que rigen qué palabras están en el idioma y cuáles no. Tenga en cuenta que la expresividad solo puede existir cuando hay interpretación.

Por interpretación me refiero a la existencia de una función que, dada una palabra en un idioma, selecciona un objeto de un conjunto de objetos (esto es obviamente discutible para los lenguajes naturales).

Sin embargo, no se deje engañar por el uso de "palabra". Un programa Java es una palabra en el lenguaje Java (aunque puede abarcar múltiples archivos que contienen múltiples cadenas de caracteres separados por espacios).

Sería contraproducente usar lenguajes tan complicados como los lenguajes de programación modernos para lidiar con este concepto relativamente simple, por eso prefiero usar fórmulas matemáticas.

  • Definamos el lenguaje A como todas las fórmulas que involucran la suma de enteros.

  • Definamos el lenguaje B como el lenguaje de todas las fórmulas que involucran la multiplicación de enteros.

En ambos casos, no permitimos el uso del elemento de identidad. Así, el lenguaje A contiene las palabras "1 + 1", "1 + 2", "1 + 3", "2 + 3" y así sucesivamente. El lenguaje B contiene las palabras "2 * 2", "2 * 3", "2 * 4", "3 * 4" y así sucesivamente. También asignamos interpretaciones habituales a "*" y "+" (suma y multiplicación de enteros) a los símbolos respectivos. Entonces, la interpretación de "1 + 1" es 2, y la interpretación de "2 * 2" es 4.

Observe ahora que el lenguaje A es estrictamente más expresivo que el lenguaje B, ya que en los enteros es cierto que la multiplicación puede ser lanzada como suma repetida, pero no hay una manera de representar la suma como multiplicación en general.


Para resumir esto: se puede decir que el lenguaje A es más expresivo que el lenguaje B cuando sus funciones de interpretación comparten el codominio, pero la imagen de la función de interpretación de B es un subconjunto apropiado de la imagen de la función de interpretación de A.

wvxvw
fuente
-1

TLDR: si falta una característica pero se puede expresar de otras maneras, no es falta de expresividad. Si puede imaginar un algoritmo en su mente o incluso implementarlo en un idioma pero otro idioma está estructurado de alguna manera que hace imposible implementar el algoritmo, es un problema de expresividad *.

Las restricciones de nomenclatura variable no reducen la expresividad (a menos que haya tan pocos nombres que ya no se puedan expresar todos los algoritmos y no se puedan falsificar variables con algo así como matrices + índices).

Un ejemplo simple de falta de poder expresivo es este: tienes que do_homeworky bring_down_trash. Esto se escribe fácilmente en código:

do_homework();
bring_down_trash();

Esta solución parece bastante sencilla, pero en realidad do_homeworky bring_down_trashno está ordenada, también se podría escribir:

bring_down_trash();
do_homework();

Lo cual es igualmente impreciso porque no expresa que no teníamos la intención de hacer cumplir una orden. Tampoco queremos usar hilos. Queremos decir algo como esto:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

Hasta donde yo sé, esto es muy difícil o imposible de expresar en cualquier lenguaje de programación.

Un ejemplo que me fastidia infinitamente es que es imposible en Java tener una matriz de objetos. Puede hacer una matriz de punteros a objetos, pero eso no tiene el mismo diseño de memoria (eficiencia de voz).

Tomando un ejemplo de otra respuesta : C ++ no admite agregar métodos a una clase o una instancia . Esto es cierto, sin embargo, no limita la expresividad de C ++.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

Esta es una clase a la que puede agregar, eliminar y llamar a un número arbitrario de funciones miembro para instancias y la clase. Técnicamente, C ++ es probablemente más expresivo a este respecto que los lenguajes de programación que realmente admiten esta característica porque en C ++ puede elegir cómo almacenar las funciones (vector frente a matriz frente a lista de reenvío).

* Algunos idiomas tienen una falta de expresividad como característica. Por lo general, hacen que sea imposible escribir bucles infinitos. Esto puede resolver el problema de detención y permitir pruebas automáticas de corrección.

nwp
fuente
2
Estoy bastante seguro de que esto no es correcto, al menos no es lo que entiendo que sea. Escribir binario sin formato en el disco es expresivo según esta definición, lo cual es absurdo.
Telastyn
1
@Telastyn ¿Por qué sería absurdo? Por supuesto, escribir binarios en bruto en el disco no es expresivo, pero un lenguaje que puede hacerlo es más expresivo que uno que no puede hacerlo, todo lo demás es igual.
nwp
Quiero decir que el "lenguaje" de ustedes usando una interfaz de hardware para escribir bits sin procesar en la computadora es un ejemplo del lenguaje más expresivo, ya que, por definición, puede hacer cualquier cosa que la computadora pueda hacer. Puede expresar cualquier característica faltante de otras maneras. Me parece absurdo que por su definición, que es un lenguaje expresivo.
Telastyn
@Telastyn ¿Por qué sería ese el lenguaje más expresivo? No puede expresar datos de lectura o calcular nada o mostrar gráficos o hilos. Un lenguaje que solo puede escribir bits en la memoria y el disco tiene tan poca expresividad que cuestiono que tenga alguna utilidad.
nwp
1
"Por lo general, hacen que sea imposible escribir bucles infinitos. Esto puede resolver el problema de detención". Si no puede tener un bucle infinito, por definición, su programa debe detenerse.
Patrick Collins