¿Por qué las matrices de longitud variable se hicieron opcionales en C 2011?

12

Cuando se introdujeron los VLA en C 1999, pensé que era una gran innovación para el lenguaje. Sin embargo, habiendo aprendido que se hizo opcional en C 2011, me pregunto qué llevó a su cambio de estado, y si significa que la característica en realidad se dirige a la obsolescencia. Si es así, ¿existe una noción equivalente de gestión automática de datos de tamaño dinámico que se considere reemplazarla?

Intenté encontrar el documento de justificación de C 2011, pero parece que aún no se ha publicado.

jxh
fuente
¿Falta de adopción?
Ryan Reich
@RyanReich: Probablemente, pero ¿por qué la resistencia de los vendedores?
jxh

Respuestas:

8

He escuchado que las leyendas varían de "debería ser opcional, ya que algunos compiladores pequeños deberían poder cumplir con C11 sin VLA" a "fue un error en primer lugar". Sin embargo, nunca obtuve una respuesta verdadera y definitiva a esto. En última instancia, no creo que nadie realmente tenga uno, ya que la razón (suponiendo, y esperando, que haya uno) nunca se reveló (en lo que respecta a mis búsquedas anteriores).


Del Capítulo 4 (página 13) de Justificación de la Norma Internacional - Lenguajes de programación - C 5.10 (2003)

Al definir implementaciones conformes en términos de los programas que aceptan, el Estándar deja abierta la puerta a una amplia clase de extensiones como parte de una implementación conforme. Al definir implementaciones independientes tanto alojadas como conformes, el Estándar reconoce el uso de C para escribir programas tales como sistemas operativos y aplicaciones basadas en ROM, así como aplicaciones alojadas más convencionales. Más allá de este esquema de dos niveles, no se define ningún subconjunto adicional para C, ya que el Comité C89 consideró firmemente que demasiados niveles diluyen la efectividad de un estándar .

El énfasis es mío. Tenga en cuenta que esta decisión va en contra de su propia lógica. Sin embargo, otra cosa hecha opcional. Ahora obtienes __STDC_NO_VLA__o soporte VLA. Es una decisión muy extraña.

Bernardo Sulzbach
fuente
@jxh Ni siquiera vi eso. Gracias por señalarlo, se ha cambiado a una redacción más clara y menos ambigua. He visto el motivo como sinónimo de motivo y objetivo en algunos contextos, pero creo que solo es común en escenarios artísticos.
Bernardo Sulzbach el
El problema de tener solo un esquema de dos niveles es que hay muchas características y garantías útiles que son ampliamente compatibles pero que no son del todo universales, y que pueden permitir que algunos tipos de programas se escriban de manera mucho más eficiente de lo que sería posible de otra manera. La falta de cualquier medio estándar para probar la disponibilidad de tales características hace que sea necesaria una fracción significativa, si no la mayoría de los programas prácticos en muchos campos para hacer uso de garantías más allá de las incluidas en el Estándar, y hace que sea difícil de determinar con certeza si alguna particular ...
supercat
... el programa funcionará con cualquier implementación particular. La definición de una mayor variedad de características opcionales y garantías de qué implementaciones pueden admitir o rechazar (al rechazar la compilación) permitiría tener una forma estándar y fácil de probar si un programa que especifica adecuadamente sus requisitos funcionará correctamente en una plataforma: intente para construirlo Si se construye, funcionará. Si no, obviamente no lo hará. Aumentar la fracción de programas para los cuales sería posible garantizar que una compilación exitosa garantizaría una operación exitosa ...
supercat
... parecería mucho más valioso que simplemente maximizar la cantidad de compiladores que pueden manejar la pequeña fracción de programas que no se beneficiarían de características y garantías más allá de lo que requiere el Estándar.
supercat
4

Por lo que puedo determinar a partir de los documentos del comité público (en particular N1395 ), una de las principales razones para hacer que los VLA (junto con la aritmética compleja y el subprocesamiento) sean opcionales fue hacer posible la creación de compiladores C conformes para pequeños procesadores integrados.

La tendencia era que los proveedores de compiladores que apuntan a sistemas integrados permanecían en el estándar C90, debido a la introducción de esas grandes características que sus clientes no pedían.

Bart van Ingen Schenau
fuente
En muchos casos, "pedían haber quedado fuera". Una vez que observa el cambio de huella de RAM cuando habilita esas funciones, resulta obvio por qué algunas personas no las quieren. Puede duplicar el costo del procesador, que puede ser la parte más costosa del sistema.
1
@JerryCoffin: Sí, pero el código solo se genera cuando sizeof () se usa realmente en la matriz. El compilador necesita rastrear la información para poder generar el código correcto, pero esa información no necesita ser incrustada en la representación en memoria del VLA.
jxh
2
@jxh: Como se imaginó originalmente, las implementaciones independientes y alojadas utilizaron el mismo lenguaje central. Las diferencias se restringieron a la biblioteca. En el caso de los VLA, hay una diferencia en el lenguaje en sí mismo que (al menos algunos proveedores consideraron) no era realmente adecuado para sistemas integrados más pequeños. En cuanto a incrustar el tamaño: no, probablemente nunca sea absolutamente necesario, pero puede ser la forma más fácil (por ejemplo, unos pocos bytes de almacenamiento para el tamaño podrían evitar muchos bytes de código para calcularlo).
Jerry Coffin
1
@supercat: Puedo ver la lógica de elegir la funcionalidad de la biblioteca C, pero hacer que las características del lenguaje sean "opcionales" parece decididamente inútil para alguien que intenta escribir código C multiplataforma. Se utilizó ser que C era la opción obvia para cerca de sistemas metálicos de programación que podrían ser fácilmente reorientarse a un compilador diferente y la plataforma de hardware diferente. Ahora, no es tan obvio.
jxh
1
@supercat: Bombardear la pila no es exclusivo de VLA. Los objetos automáticos anormalmente grandes o una pila de llamadas de función sin restricciones tendrán problemas similares. Si el estándar define un medio para detectar fallas en esos casos, probablemente también funcionaría para VLA. En términos de opcional, simplemente hace que sea más difícil argumentar el uso de nuevas características de C en el nuevo código de C en nuevos proyectos que se requieren para trabajar en múltiples plataformas utilizando compiladores de múltiples proveedores.
jxh