Por que o C ++ ainda é "híbrido"

16

Em uma questão relacionada , foi esclarecido por que o C ++ não é compatível com o C em muitos aspectos. No entanto, o C ++ ainda é uma linguagem "híbrida" *. E, infelizmente, muitos programadores ainda consideram o C ++ como um "C com fluxos e seqüências incorporadas". Isso resulta em um código escrito muito ruim, que não é C ++ nem C. IMHO, seria melhor se a linguagem / compilador obrigasse, em certa medida, os programadores a escrever um código mais elegante. Portanto, existe uma justificativa para manter o híbrido C ++ moderno (por exemplo, C ++ 0x e versões futuras)?

* Por híbrido, quero dizer que cabe ao programador decidir se ele / ela usará: strings e fluxos padrão, classes, namespaces diferentes do padrão, etc.

sakisk
fonte
Existe alguma configuração de compilador / IDE existente que possa impor isso?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Não conheço nenhuma ferramenta que faça isso. Mas faria mais sentido escrever uma ferramenta desse tipo (compilador, IDE etc.) se esses recursos fizessem parte do C ++ padrão.
precisa saber é
2
A razão de ser do C ++ é a compatibilidade com versões anteriores e a possibilidade de usar todos os truques sujos que foram possíveis no C. Tire isso daqui, e é apenas mais um clone de C #, D ou Java. Se você queria isso, por que não usar apenas C #, D ou Java?
Nikie 8/03/12
5
@nikie: Hahahaha. Como modelos, tipos de valor, referências fortes, destruição determinística, herança múltipla, velocidade de execução, baixo uso de memória, essas coisas não existem.
DeadMG
2
@nikie: Exceto D também possui abominações como Objecte valores binários de cópia e matrizes associativas divinadas por idioma (por que ...) juntamente com outras decisões questionáveis ​​de design. Além disso, ele também possui efetivamente o mesmo paradigma do GC que os outros, então eu questionaria o baixo uso de memória.
23412 DeadMG

Respostas:

26

Sim, há uma forte lógica: o código C ++ quase sempre precisa chamar o código C existente. O melhor que podemos fazer é facilitar a escrita de um bom código. Não há nada que um designer de linguagem possa fazer para tornar impossível escrever código incorreto.

Kevin Cline
fonte
1
Claro, mas como isso é apenas para código herdado, por que as versões mais recentes do C ++ precisam permanecer compatíveis? O código legado ainda pode usar uma versão mais antiga do C ++.
precisa saber é
15
@faif, no meu trabalho, escrevo novo código C ++ o tempo todo que precisa interagir com o novo código C. Não é apenas uma questão herdada.
Karl Bielefeldt
5
@faif: as versões mais recentes do C ++ precisam ser compatíveis com versões anteriores - não apenas para oferecer suporte ao código C mais antigo, mas também a várias centenas de milhões de linhas do código C ++ existente. Se você deseja algo não compatível com versões anteriores, mas com um design melhor, você pode mudar para um idioma como D. A propósito, aqui está um artigo realmente bom sobre a necessidade de compatibilidade com versões anteriores de Joel Spolsky: joelonsoftware.com/items/2008 /03/17.html
Doc Brown
4
The best we can do is make it easy to write good code.- Estamos falando do mesmo C ++?
BlueRaja - Danny Pflughoeft
4
@ BlueRaja-DannyPflughoeft: Acho muito mais fácil escrever um bom código em C ++ do que em Java ou C #. Com o C ++, posso ler uma classe e, se todas as outras se comportarem, sei que a memória e os recursos não serão vazados. Com Java e C #, não posso fazer isso; Eu tenho que ir inspecionar as outras classes para ver se alguma delas exigiu finalização. Os modelos C ++ também me permitem secar o código que precisa ser repetido em Java.
precisa
20

IMHO, seria melhor se a linguagem / compilador obrigasse, até certo ponto, os programadores a escrever um código mais elegante.

Não, não seria. Em absoluto. Como uma demonstração trivial do porquê, defina elegante e depois aposto que dez pessoas vão discordar de você.

Os estilos de codificação impostos pelo idioma são muito, muito ruins. Sem mencionar todo o código legado que será quebrado.

Notavelmente, as classes String e stream Standard são realmente péssimas . std::stringnão tem suporte a Unicode e a pior interface inchada que você poderia imaginar. Os fluxos têm uma sobrecarga horrenda e um design ruim, mesmo recorrendo a herança virtual, indicadores de função const char*e feias como essa. Eu não penalizaria ninguém por substituir completamente as duas classes / grupos por classes personalizadas.

Não usar classes e espaços para nome é bom para código no estilo de quadro branco e existem muitas bibliotecas que fornecem funções que não estão em uma classe. A aula forçada é uma péssima idéia.

DeadMG
fonte
+1 para a abordagem um pouco mais realista (quando a conversa sobre o "código elegante" deve parar: /
Rook
2
"Os estilos de codificação impostos pelo idioma são muito, muito ruins." Voce pode dar alguns exemplos? Eu acho que mesmo coisas simples como a indentação de código forçada do Python aprimora a legibilidade do código.
Sakisk
3
Não tenho certeza se concordo com isso. O principal motivo para usar o CoffeeScript sobre JavaScript é porque o CoffeeScript foi projetado para reforçar a escrita de código mais elegante.
user16764
3
Não posso concordar com isso. Alguns designs de linguagem destinam-se a incentivar boas práticas, e a natureza abrangente e aparafusada de grande parte do C ++ geralmente impede isso. De fato, selecionar a linguagem, manter as partes boas e melhorar o resto é a principal motivação por trás da existência do C ++ 11 .
Robert Harvey
1
@ Ruby: "Escrever um programa feio que funciona é melhor do que escrever um programa bonito que não faz nada." Claro, eu posso concordar com isso. Mas este artigo vai muito além disso e parece argumentar que a feiúra é realmente uma virtude. E isso é ridículo.
Mason Wheeler
8

O C ++ é um híbrido, não porque permite escrever código no estilo C, mas porque suporta vários paradigmas de programação, como procedurais, orientados a objetos e genéricos. O C ++ não o força a uma maneira de fazer as coisas, e essa é a sua força, porque problemas diferentes podem ser resolvidos mais facilmente usando paradigmas diferentes.

IMHO, seria melhor se a linguagem / compilador obrigasse, até certo ponto, os programadores a escrever um código mais elegante.

Então você primeiro precisa definir o que significa elegante . Em seguida, é necessário verificar se sua definição de elegante é apropriada para todos os domínios e plataformas com problemas nos quais o C ++ é usado. Um estilo de codificação elegante para escrever um processador de texto para Windows pode não ser adequado para a gravação de um sistema incorporado.

Considere escrever código C ++ para executar em um DSP. Primeiro, o compilador C ++ para esse DSP pode simplesmente não suportar certos recursos do C ++, como fluxos. Segundo, você está severamente limitado pela velocidade da CPU e, possivelmente, pela memória, portanto alguns recursos do C ++ podem simplesmente prejudicar o seu desempenho. Por exemplo, você pode ter que evitar funções virtuais por uma questão de velocidade. Tais considerações mudariam radicalmente seu estilo de programação, comparado ao que você usaria em um PC, e o C ++ permite isso.

Para resumir, o C ++ é uma linguagem enorme e complicada, com muitos recursos. Há muitas razões pelas quais qualquer subconjunto desses recursos pode não ser aplicável a um projeto específico: velocidade, portabilidade, suporte ao compilador ou até mesmo experiência e familiaridade com o programador. Por esse motivo, o idioma para forçar o desenvolvedor a usar determinados recursos em oposição a outros para qualquer tarefa é uma má idéia. Pense em Java, onde a linguagem exige que todas as funções sejam o método de uma classe. Existem muitos casos em que a criação de uma classe apenas para envolver um método é incômoda e desnecessária, e você precisa fazer isso porque a linguagem o obriga.

Dima
fonte
1
Não poderia concordar mais. Eu pensaria que quando alguém disser "C ++ é flexível", pensaria assim porque suporta muito mais paradigmas que C.
Prelic
5

IMHO, seria melhor se a linguagem / compilador obrigasse, até certo ponto, os programadores a escrever um código mais elegante.

Ninguém está forçando alguém a usar C ++ em primeiro lugar. Se o idioma não combina com você, use um idioma diferente - há muitos idiomas cobrados como "C ++ sem C".

A filosofia de design do C ++ é deixar o programador decidir. Se eles querem dar um tiro no próprio pé, deixe-os. Isso permite que muitas coisas ruins sejam feitas, mas também permite uma grande flexibilidade. Por exemplo, é improvável que o Boost possa ser escrito em uma linguagem como Java, pois tira proveito dos recursos e práticas da linguagem geralmente evitados. Também é improvável que o C ++ cresça tão grande quanto hoje - ter acesso à vasta biblioteca C é uma grande vantagem, pegue ou largue.

A compatibilidade do C ++ com o C é definitivamente um dos pontos mais fracos, mas também lembre-se de que é um dos melhores.


Vou acrescentar uma maravilhosa citação de Jon Purdy, que considero extremamente relevante:

Tudo se resume ao pragmatismo versus elegância, e para mim, apesar da minha obsessão por códigos precisos e bonitos, escrever um programa feio que funciona é melhor do que escrever um programa bonito que não faz nada.

A remoção do híbrido pode melhorar a elegância, mas prejudica a capacidade.

Pubby
fonte
Você acredita que o pragmatismo e a elegância são contraditórios? Penso que Python, Ruby e Scala são bons exemplos de linguagens pragmáticas e elegantes.
precisa saber é
1
@faif: Não, mas a compatibilidade e a elegância anteriores são contraditórias. Isso também se aplica ao Python (2.x vs. 3.x).
dan04
4

Se o comitê tentasse forçar as pessoas a usar (a noção de alguém) de uma linguagem mais elegante, provavelmente seria ignorada. As pessoas continuariam a fazer o que quisessem e os fornecedores de compiladores seguiriam o mercado (mas os fornecedores de compiladores têm representação suficiente no comitê para evitar isso).

Muito do que você está defendendo é realmente uma questão de julgamento, com base no domínio do problema. Existem muitos programas pequenos que simplesmente não precisam (por exemplo) de namespaces. Tentar me forçar a usar um espaço para nome quando estou escrevendo um filtro de texto de 30 linhas seria uma tolice e arrogância. Mesmo que você tenha decidido que isso só se aplicaria quando mais de X linhas de código, funções Y ou o que quer que estivesse envolvido, ainda assim seria contraproducente. Os namespaces foram projetados por uma razão, para prevenir / curar problemas específicos. Tentar forçar seu uso na ausência desses problemas não traz nada de útil para ninguém.

Ao mesmo tempo, acho que vale a pena notar que algumas pessoas realmente gastam muito tempo e esforço tentando não apenas habilitar a elegância em C ++, mas também ensinam e levam as pessoas a usar esses recursos para escrever um código melhor (por exemplo, muitos colaboradores do Boost). Como tal, as pessoas que continuam insistindo em escrever seu código como "C com classes" ignoram praticamente o que está lá fora. Eu acho que eles ficariam tão confortáveis ​​em ignorar novos compiladores quanto em tudo que foi aprendido sobre como usar C ++ na última década ou mais (por exemplo, o Modern C ++ Design foi publicado há 11 anos - mas a maioria das pessoas você está falando sobre aparentemente não ouviu falar ainda, muito menos leu ou entendeu até as partes mais simples).

Jerry Coffin
fonte
2

Sua ideia constitui grande parte da lógica do design por trás do Java. O Java força você a usar classes, organizar a hierarquia de arquivos de acordo com a hierarquia de pacotes, capturar exceções, etc. As pessoas ainda conseguem escrever código semelhante a C nele.

Como programadores, às vezes esquecemos que a melhor solução pode não ser técnica. As revisões por pares são a solução mais conhecida nesse caso.

Karl Bielefeldt
fonte
0

C ++ não tem "um caminho verdadeiro"; toda abordagem tem pontos fortes e fracos. A solução pode ser escrita de cem maneiras diferentes.

Você, como desenvolvedor de software, precisa decidir qual abordagem é melhor para a tarefa em questão.

Codificador
fonte
0

Eu acho que o fato de todas as coisas listadas serem opcionais cria um potencial para mais elegância, não menos. Um recurso usado desnecessariamente é deselegante aos meus olhos.

Os problemas que precisamos resolver usando a programação são muito diferentes.
Alguns são bem resolvidos usando princípios OO (por exemplo, GUIs), outros se prestam melhor a um tratamento puramente funcional (por exemplo, coisas numéricas), enquanto outros são melhor expressos em uma linguagem de baixo nível "próxima ao silício".

Muitos softwares precisam resolver subproblemas que são resolvidos melhor de qualquer uma dessas maneiras. Forçar a solução em um formulário específico só levará a um código menos adequado ao seu objetivo (você pode até dizer "menos elegante").

É por isso que o hibridismo do C ++ é uma coisa boa - ele permite resolver uma vasta gama de problemas de uma maneira que se adapte ao problema , não ao dogma atual.
É claro que pode ser mal utilizado - sempre que você tem uma coisa flexível, corre-se o risco de entortá-la de maneira ruim - mas a elegância vem do pensamento e da experiência cuidadosos, não da adesão a qualquer que seja a moda do dia.

molbdnilo
fonte