Quando novos projetos de C devem atingir padrões C muito antigos (> 20 anos, ou seja, C89)?

12

Ocasionalmente, vejo grandes projetos C de código aberto relativamente novos, visando padrões C muito antigos, normalmente o C89. Um exemplo é systemd. Esses projetos têm pessoas inteligentes à frente, então provavelmente têm uma boa lógica por trás dessa decisão que eu não conheço. Tirando esse benefício da dúvida, quase parece que a lógica é "mais antiga e padronizada é sempre mais portátil e melhor", o que é ridículo, porque a conclusão lógica seria que FORTRAN é melhor que C e COBOL é ainda melhor que FORTRAN.

Quando e por que é justificado que novos projetos C atinjam padrões C muito antigos?

Não consigo imaginar um cenário em que o sistema de um usuário não deva absolutamente atualizar seu compilador C, mas esteja livre para instalar um novo software. A versão LTS do Debian, por exemplo, possui um pacote gcc 4.6 que suporta C99 e parte do C11. Eu acho que esse cenário estranho deve existir e programas como o systemd estão direcionados a esses usuários.

O caso de uso mais razoável que posso imaginar é onde os usuários devem ter arquiteturas exóticas nas quais haja apenas um compilador C89 disponível, mas eles estão totalmente dispostos a instalar um novo software. Dado o declínio na diversidade de arquiteturas de conjuntos de instruções, parece um cenário excessivamente hipotético, mas não tenho certeza.

Praxeolitic
fonte
10
"Não consigo imaginar um cenário em que o sistema de um usuário absolutamente não deva atualizar seu compilador C, mas esteja livre para instalar um novo software". Você não fez trabalho incorporado suficiente ;-)
Philip Kendall
1
@PhilipKendall Eu não fiz nenhum trabalho incorporado. Convido você a me esclarecer com uma resposta!
Praxeolitic
2
Uma vez estabelecido, um padrão praticamente permanecerá para sempre. Às vezes, mais de 2000 anos .
Doc Brown
1
@DocBrown Mas observe que essa página explica que a alegação de que esse é um padrão de 2000 anos de idade é falsa.
Jesper
1
Quando você vê algo parecido com isto, a primeira pergunta que você deve fazer é: "Que plataforma (s) se destina a segmentar?", Seguida por "Que versão (s) de C pode ser compilada na (s) plataforma (s) )? " Em seguida, vem: "Quais versões de C fornecem a maior compatibilidade com os requisitos do projeto?" E o próximo provavelmente seria: "Com que versão (s) de C a maioria dos líderes do projeto está mais familiarizada?"
Justin Time - Restabelece Monica

Respostas:

14

... "mais antigo e padronizado é sempre mais portátil e melhor", o que é ridículo ...

Essa afirmação chegou a ser ridícula quando melhorou , o que é completamente subjetivo. Você não seleciona um idioma e padrão para um projeto, porque metade das pessoas no último encontro em que esteve foi usá-lo; você escolhe porque estudou e compreendeu o problema que está resolvendo e determinou que é a ferramenta certa para o trabalho.

Para os padrões em geral, existe um argumento a ser adotado em alguns projetos de portabilidade, e é aí que a seleção de um projeto mais antigo traz algum benefício. Isso é especialmente verdadeiro quando você está desenvolvendo bibliotecas como produtos, que são um meio para o fim de outra pessoa. A última coisa que você quer fazer é escrever algo que você não pode vender, pois requer um compilador que os clientes que você ainda não conheceu ainda não estejam disponíveis. O comentário de Philip Kendall sobre o mundo incorporado está no local; existe muito disso por aí, porque as pessoas ainda precisam escrever um novo código para plataformas antigas e estáveis ​​ou para aquelas que não se beneficiam dos recursos extras e não têm um compilador atualizado. Quando você está no controle completo de todos os aspectos do seu projeto, há "

Para C especificamente, há a questão do que você obtém em troca da adesão ao padrão mais recente. A transição do K&R para o C89 foi uma grande mudança que exigiu muito esforço para limpar o código antigo, mas acabou fazendo muito bem. As mudanças em C99 e C11são menores em comparação, e a maioria do encontro de IC desenvolvido recentemente ainda passaria no C89 porque não usa os novos recursos. É difícil argumentar que exigir C99 sobre C89 seria a coisa certa a fazer, pois suporta comentários de uma linha, possui um tipo de dados booleano nativo e pode fazer matrizes de tamanho variável. Os comentários e os booleanos têm soluções não-feias e os VLAs podem ser manipulados de outras maneiras um pouco menos eficientes. O C11 rebaixou os VLAs para opcionais, e isso pode ser justificativa para a escolha do C99 mais antigo, se eles aparecerem com destaque na sua implementação.

Blrfl
fonte
3
Bem, misturar declarações e declarações de variáveis ​​é muito bom para ser compreensível. Funções em linha, suporte unicode limitado e long longtambém são boas de se ter.
Deduplicator
Além disso, multithreading às vezes é bom ter ...
Deduplicator
@ Deduplicator Não discordo que o que está em C99 e C11 são melhorias. Você pode gravar todo o C11 que desejar, se puder fazer um caso de negócios para o valor dos bens que excedem o valor da portabilidade para ambientes mais antigos. Arquivo em "estude o problema e encontre a ferramenta certa para o trabalho".
Blrfl
2
Bem, o ponto era que você não mencionou exatamente as melhorias importantes .
Deduplicator
@ Deduplicator: eu estava escrevendo código multithread nos anos 90. O código que se baseia em recursos de encadeamento baseados em idioma pode ser inutilizável em implementações independentes que não suportam tudo o que o Padrão exige, enquanto aqueles que usam bibliotecas para agrupar as funções da plataforma que suportam a funcionalidade necessária precisam ser adaptáveis ​​a qualquer plataforma que suporte essas funções .
Supercat
10

Quando a portabilidade em uma ampla variedade de plataformas é importante. Isso pode incluir plataformas obsoletas e muitos processadores incorporados para os quais apenas um compilador minimalista está disponível.

Há também um sentido em que C89 é o "menor denominador comum". Foi a primeira versão adequadamente padronizada e praticamente qualquer compilador em uso hoje pode implementar algum superconjunto do C89.

Há também o problema de que o Microsoft Visual C ++, apesar de relativamente bom em acompanhar os padrões C ++, permaneceu no C89 por um longo tempo no modo C. Portanto, qualquer pessoa que não esteja usando o Visual Studio mais recente pode estar limitada a C89.

Simon B
fonte
Sim, o argumento a favor é portabilidade, mas a questão é se realmente existem sistemas não hipotéticos que podem usar apenas um compilador C89, mas estão compilando novas distribuições de software. ou seja, se eu estivesse iniciando um novo projeto C, como decidir se a adesão ao C89 poderia aumentar o número de usuários em potencial? O ponto MSVC é bom.
Praxeolitic
1
@Praxeolitic É realmente uma questão de saber se você está criando um código que uma grande variedade de pessoas diferentes usará. Porque haverá muitas pessoas por aí usando compiladores antigos, porque não podem atualizar ou porque consideram muito risco e esforço atualizar.
Simon B
3

Devo admitir que ainda escrevo código pseudo-C89 (não totalmente compatível com C99) principalmente por causa da Microsoft. Eu me apóio muito no MSVC para o lado do Windows e eles ainda não são totalmente compatíveis com C99, em vez disso, colocando a maior parte de seu foco no C ++ 17 em diante.

Além disso, estou trabalhando em SDKs C contra os quais muitos desenvolvedores de plug-ins usam o MSVC para o desenvolvimento de plug-ins e alguns ainda o MSVC 2010. Portanto, ainda existem compiladores populares amplamente usados ​​em plataformas não tão exóticas (a menos que você considere Windows exótico) que ainda nem implementam completamente o C99. Quando você objetiva ampla compatibilidade com a maior variedade de compiladores (que é um dos principais motivos pelos quais o SDK é escrito em C e não em C ++), ainda há vários deles sendo amplamente utilizados (pelo menos MSVC), que estão atrasados quando se trata de suporte C. Faz quase duas décadas desde o C99 e ainda não temos VLAs, por exemplo, no MSVC AFAIK (ainda não fiz o check-in do MSVC 2017, mas, dada a posição da Microsoft em C, duvido que seja muito mais compatível com o C99) .

Infelizmente, ainda existem novos compiladores que são realmente bons com bons otimizadores e depuradores que ainda não são totalmente compatíveis com C99. Claro que se não fosse por isso, eu estaria pulando por todo o C11.

Além da compatibilidade de fontes com plug-ins e MSVC, também há interoperabilidade com outros idiomas. Alguns outros idiomas usam o SDK por meio de um FFI, e alguns deles compreendem apenas o C89. Eles podem não entender boolou _Boolcomo um exemplo simples ao importar funções de um dylib e entender apenas, digamos int,.

Sim, o argumento a favor é portabilidade, mas a questão é se realmente existem sistemas não hipotéticos que podem usar apenas um compilador C89, mas estão compilando novas distribuições de software. ou seja, se eu estivesse iniciando um novo projeto C, como decidir se a adesão ao C89 poderia aumentar o número de usuários em potencial?

Só notei este, mas meio que ecoando Blrfl , o ganho de produtividade usando C99 e C11 não é tão grande no meu caso, ao mesmo tempo em que perder a capacidade de permitir que as pessoas escrevam seus plugins no MSVC pode ser um custo enorme (principalmente porque o produto em que trabalho) on tem a maior participação de mercado, de longe, no lado do Windows e o usuário médio geralmente compra e baixa muitos plugins de terceiros). O tipo de produto no qual trabalho está quase na metade do caminho entre um ambiente de desenvolvimento para programadores / roteiristas e um produto final para artistas, pois muitas pessoas desejam desenvolver novas coisas para permitir novos recursos e obter efeitos especiais de um artista. pessoas gentis ainda não viram. Então, no meu caso, foi realmente uma decisão muito simples favorecer o C89 pelo menos para o SDK.

Suponho que você precise olhar os compiladores ao seu redor e tentar descobrir o seu público-alvo. Se você não está desenvolvendo uma arquitetura de plug-in para Windows ou está fazendo alguma programação incorporada ou tentando criar um kit de desenvolvimento de software que possa ser usado pela maior variedade de compiladores e idiomas existentes no mercado, certamente tornará as coisas mais fáceis de alcançar para o C99 + longe. Talvez considere também quanto de aumento de produtividade você obtém do formulário C99 em diante. Não me beneficio muito de coisas como VLAs, pois confio em maneiras simples o suficiente de usar a pilha quando os dados se ajustam e se acumulam.

Mas há muitas coisas por trás de compiladores populares como MSVC e FFI's em outros idiomas, que são legais no sentido de que eles podem importar e chamar funções C diretamente de um dylib, mas também podem estar um pouco atrasados ​​no vezes. Portanto, há coisas de negócios muito mais práticas a serem consideradas, dependendo do seu domínio, do que simplesmente favorecer antigas e padronizadas para algum tipo de estética.


fonte