Por que as matrizes de comprimento variável foram opcionais no C 2011?

12

Quando os VLAs foram introduzidos em C 1999, eu pensei que era uma grande inovação para o idioma. No entanto, depois de saber que ele foi tornado opcional em C 2011, pergunto-me o que levou à sua mudança de status e se isso significa que o recurso está realmente voltado para a obsolescência. Em caso afirmativo, existe uma noção equivalente de gerenciamento automático de dados de tamanho dinâmico que está sendo considerado para substituí-lo?

Tentei encontrar o documento de justificativa do C 2011, mas ele ainda não parece ter sido publicado.

jxh
fonte
Falta de adoção?
Re
@RyanReich: Provavelmente, mas por que a resistência dos fornecedores?
precisa saber é

Respostas:

8

Ouvi lendas que variam de "deve ser opcional, pois alguns pequenos compiladores devem ser compatíveis com C11 sem VLAs" a "foi um erro em primeiro lugar". Eu nunca tive uma resposta verdadeira e definitiva para isso, no entanto. Por fim, não acredito que alguém realmente tenha um como o motivo (supondo - e esperando - que exista um) nunca ter sido divulgado (tanto quanto minhas antigas pesquisas).


Do capítulo 4 (página 13) da justificativa para o padrão internacional - linguagens de programação - C 5.10 (2003)

Ao definir implementações em conformidade em termos dos programas que eles aceitam, o Padrão deixa aberta a porta para uma ampla classe de extensões como parte de uma implementação em conformidade. Ao definir implementações independentes e hospedadas em conformidade, o Padrão reconhece o uso de C para escrever programas como sistemas operacionais e aplicativos baseados em ROM, bem como aplicativos hospedados mais convencionais. Além desse esquema de dois níveis, nenhum subconjunto adicional é definido para C, uma vez que o Comitê C89 sentiu fortemente que níveis demais diluem a eficácia de um padrão .

Ênfase minha. Observe que esta decisão é contrária à própria lógica. No entanto, outra coisa se tornou opcional. Agora você recebe __STDC_NO_VLA__suporte ou VLA. É uma decisão muito estranha.

Bernardo Sulzbach
fonte
@jxh Nem vi isso. Obrigado por apontar, ele foi alterado para uma redação mais clara e menos ambígua. Eu vi motivo como sinônimo de motivo e objetivo em alguns contextos, mas acredito que isso é comum apenas em cenários artísticos.
Bernardo Sulzbach
O problema de ter apenas um esquema de dois níveis é que existem muitos recursos e garantias úteis que são amplamente, mas não totalmente universais, e que podem permitir que alguns tipos de programas sejam escritos com muito mais eficiência do que seria possível. A falta de qualquer meio padrão de teste para a disponibilidade de tais recursos torna necessário que uma fração significativa, se não a maioria dos programas práticos em muitos campos, faça uso de garantias além daquelas incluídas no Padrão e dificulta a determinação com certeza de que algum particular ... #
318
... o programa funcionará com qualquer implementação específica. Definir uma variedade maior de recursos opcionais e garantias que implementações podem suportar ou recusar (rejeitando a compilação) tornaria possível uma maneira fácil e agradável de testar se um programa que especifica corretamente seus requisitos funcionará corretamente em uma plataforma: tente para construí-lo. Se construir, funcionará. Se não, obviamente não. Aumentando a fração de programas para os quais seria possível garantir que uma compilação bem-sucedida garantiria uma operação bem-sucedida ... #
21816
... pareceria muito mais valioso do que apenas maximizar o número de compiladores que podem lidar com a pequena fração de programas que não se beneficiariam de recursos e garantias além do que o Padrão exige.
Supercat
4

Tanto quanto eu posso determinar a partir dos documentos do comitê público (em particular N1395 ), uma das principais razões para tornar os VLAs (juntamente com aritmética e rosqueamento complexos) opcionais foi possibilitar a criação de compiladores C em conformidade para pequenos processadores embarcados.

A tendência era que os fornecedores de compiladores voltados para sistemas embarcados permanecessem no padrão C90, devido à introdução desses grandes recursos que seus clientes não estavam solicitando.

Bart van Ingen Schenau
fonte
Em muitos casos, "estavam pedindo para deixar de fora". Depois de observar as alterações na área de cobertura da RAM ao ativar esses recursos, fica óbvio o motivo pelo qual algumas pessoas não os querem. Pode dobrar o custo do processador, que pode ser a parte mais cara do sistema.
ღ uі
1
@ JerryCoffin: Sim, mas o código é gerado apenas quando sizeof () é realmente usado na matriz. O compilador precisa rastrear as informações para gerar o código correto, mas essas informações não precisam ser incorporadas à representação na memória do VLA.
JXH
2
@jxh: como originalmente previsto, implementações independentes e hospedadas usavam a mesma linguagem principal. As diferenças foram restritas à biblioteca. No caso dos VLAs, há uma diferença na própria linguagem que (pelo menos alguns fornecedores consideravam) não era realmente adequada para sistemas embarcados menores. No que diz respeito à incorporação do tamanho: não, provavelmente nunca é absolutamente necessário, mas pode ser a maneira mais fácil (por exemplo, alguns bytes de armazenamento para o tamanho podem evitar muitos bytes de código para calculá-lo).
Jerry Coffin
1
@ supercat: Eu posso ver a lógica de escolher a funcionalidade da biblioteca C, mas tornar os recursos de linguagem "opcionais" parece decididamente inútil para alguém que tenta escrever código C em várias plataformas. É usado para ser que C era a escolha óbvia para perto de sistemas de metal de programação que poderia facilmente ser redirecionada para um compilador diferente e plataforma de hardware diferente. Agora, não é tão óbvio.
Jxh # jxh
1
@supercat: Bombardear a pilha não é exclusivo do VLA. Objetos automáticos anormalmente grandes ou uma pilha de chamadas de função sem restrições terão problemas semelhantes. Se o padrão definir um meio de detectar falhas nesses casos, provavelmente funcionaria também para o VLA. Em termos de opcional, apenas torna mais difícil argumentar sobre o uso de novos recursos C no novo código C em novos projetos que são necessários para trabalhar em várias plataformas usando compiladores de vários fornecedores.
Jxh # jxh