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.
Respostas:
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.
fonte
long long
também são boas de se ter.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.
fonte
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
bool
ou_Bool
como um exemplo simples ao importar funções de um dylib e entender apenas, digamosint
,.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