Eu não sei muito sobre D, mas muitos programadores de C ++ que eu conheço detestam bastante, e eu pessoalmente tenho que concordar - eu não gosto da aparência de D e não levarei mais perto.
Para entender por que D não está ganhando mais força, você precisa entender o que atrai as pessoas para C ++. Em uma palavra, a razão número um é o controle. Quando você programa em C ++, tem total controle sobre seu programa. Deseja substituir a biblioteca padrão? Você pode. Deseja fazer lançamentos de ponteiros inseguros? Você pode. Deseja violar a correção constante? Você pode. Deseja substituir o alocador de memória? Você pode. Deseja copiar a memória bruta sem considerar seu tipo? Se você realmente quer. Deseja herdar de várias implementações? É o seu funeral. Inferno, você pode até obter bibliotecas de coleta de lixo, como o coletor Boehm. Então você tem problemas como desempenho, que seguem de perto o controle - quanto mais controle um programador tiver, mais otimizado ele poderá criar seu programa.
Aqui estão algumas coisas que eu vi ao fazer uma pequena pesquisa e falar com algumas pessoas que tentaram:
Hierarquia de tipo unificado. Os usuários de C ++ usam herança muito raramente, a maioria dos programadores de C ++ prefere composição e os tipos só devem ser vinculados por herança se houver uma boa razão para fazê-lo. O conceito de objeto viola fortemente esse princípio, vinculando todos os tipos. Além disso, está violando um dos princípios mais básicos do C ++ - você só usa o que deseja. Não ter a opção de herdar do Object, e os custos que o acompanham, são muito fortes contra o que o C ++ representa como uma linguagem em termos de dar ao programador controle sobre seu programa.
Ouvi falar de problemas com funções e delegados. Aparentemente, D tem funções e delegados como tipos de função que podem ser chamados em tempo de execução, e eles não são os mesmos, mas são intercambiáveis ou ... alguma coisa? Meu amigo teve alguns problemas com eles. Definitivamente, esse é um downgrade do C ++, que apenas possui std::function
e pronto.
Então você tem compatibilidade. D não é particularmente compatível com C ++. Quero dizer, nenhuma linguagem é compatível com C ++, vamos ser sinceros, exceto C ++ / CLI, que é meio trapaceiro, mas como barreira à entrada, isso precisa ser mencionado.
Então, existem outras coisas. Por exemplo, basta ler a entrada da Wikipedia.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
é uma das funções mais inseguras já criadas, na mesma família de grandes problemas, como gets
na antiga biblioteca C Standard. Se você procurá-lo no Stack Overflow, encontrará muitas e muitas perguntas relacionadas ao uso indevido. Fundamentalmente, printf
é uma violação do DRY- você está dando o tipo na string de formato e, em seguida, novamente quando você argumenta. Uma violação do DRY onde, se você errar, coisas muito ruins acontecem - por exemplo, se você alterou um typedef de um inteiro de 16 bits para um de 32 bits. Também não é extensível - imagine o que aconteceria se todos inventassem seus próprios especificadores de formato. Os iostreams do C ++ podem ser lentos, e sua escolha de operador pode não ser a melhor, e sua interface pode funcionar, mas eles são fundamentalmente garantidos como seguros, e o DRY não é violado e pode ser facilmente estendido. Isso não é algo que se possa dizer printf
.
Nenhuma herança múltipla. Essa não é a maneira C ++. Os programadores de C ++ esperam ter controle completo sobre seus programas e a linguagem que impõe o que você não pode herdar é uma violação desse princípio. Além disso, torna a herança (ainda mais) frágil, porque se você altera um tipo de uma interface para uma classe porque deseja fornecer uma implementação padrão ou algo assim, de repente todo o código do usuário é quebrado. Isso não é uma coisa boa.
Outro exemplo é string
e wstring
. No C ++, já é bastante doloroso ter que converter entre eles, e essa biblioteca suporta Unicode, e essa antiga biblioteca C usa apenas e precisa const char*
escrever versões diferentes da mesma função, dependendo do tipo de argumento de string que você deseja. Notavelmente, os cabeçalhos do Windows, por exemplo, possuem algumas macros extremamente irritantes para lidar com o problema que geralmente pode interferir no seu próprio código. A adição dstring
à mistura só vai piorar as coisas, já que agora, em vez de dois tipos de string, você precisa gerenciar três. Ter mais de um tipo de string aumentará os problemas de manutenção e introduzirá códigos repetitivos que lidam com strings.
Scott Meyers escreve:
D é uma linguagem de programação criada para ajudar os programadores a enfrentar os desafios do desenvolvimento moderno de software. Isso é feito ao promover módulos interconectados por meio de interfaces precisas, uma federação de paradigmas de programação totalmente integrados, isolamento de encadeamento imposto por idioma, segurança de tipo modular, modelo de memória eficiente e muito mais.
O isolamento de encadeamento imposto pelo idioma não é um plus. Os programadores de C ++ esperam ter controle total sobre seus programas, e a linguagem que força alguma coisa definitivamente não é o que o médico ordenou.
Também vou mencionar a manipulação de strings em tempo de compilação. D tem a capacidade de interpretar o código D em tempo de compilação. Isto não é uma vantagem. Considere as enormes dores de cabeça causadas pelo pré-processador relativamente limitado de C, bem conhecido por todos os programadores veteranos de C ++, e então imagine o quanto esse recurso será mal utilizado. A capacidade de criar código D em tempo de compilação é excelente, mas deve ser semântica , não sintática.
Além disso, você pode esperar um certo reflexo. D tem coleta de lixo, que os programadores de C ++ associarão a linguagens como Java e C #, que são bastante diretamente opostas a ela nas filosofias, e as semelhanças sintáticas também as lembrarão. Isso não é necessariamente objetivamente justificável, mas é algo que certamente deve ser observado.
Fundamentalmente, ele não oferece tanto que os programadores de C ++ já não podem fazer. Talvez seja mais fácil escrever um metaprograma fatorial em D, mas já podemos escrever metaprogramas fatoriais em C ++. Talvez em D você possa escrever um traçador de raios em tempo de compilação, mas ninguém realmente quer fazer isso de qualquer maneira. Comparado às violações fundamentais da filosofia C ++, o que você pode fazer em D não é particularmente notável.
Mesmo que essas coisas sejam apenas problemas na superfície, tenho certeza de que o fato de que D na superfície não se parece com C ++ é provavelmente uma boa razão para que muitos programadores de C ++ não estejam migrando para D. Talvez D precise fazer um trabalho melhor anunciando a si mesmo.