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
fuente
Respuestas:
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.
fuente
Point
's usando una matriz de matrices 2D. Pero, A tiene la ventaja de permitirme expresar aPoint
como un concepto más legible para los humanos. ¿Es A más expresivo?map
,filter
, de primera clase de tipos / métodos / funciones, tal vez un pocoeval
, dejar que la magia solo metaclase o tipos creados de forma dinámica, etc.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.
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:
Esto representa que la suma de valor de 3 y 4 se calcula y el valor asociado con una etiqueta
x
dentro 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:
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.
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.write
mientras 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.
fuente
fishies
de tipoFish
.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).
fuente
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.
fuente
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.
fuente
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_homework
ybring_down_trash
. Esto se escribe fácilmente en código:Esta solución parece bastante sencilla, pero en realidad
do_homework
ybring_down_trash
no está ordenada, también se podría escribir: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:
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 ++.
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.
fuente