No sé mucho acerca de D, pero a muchos, muchos programadores de C ++ que conozco les disgusta mucho, y personalmente tengo que estar de acuerdo: no me gusta el aspecto de D y no voy a tomar uno más cercano.
Para entender por qué D no está ganando más tracción, debe comenzar por comprender qué atrae a las personas a C ++. En una palabra, la razón número uno es el control. Cuando programa en C ++, tiene control total sobre su programa. ¿Quiere reemplazar la biblioteca estándar? Usted puede. ¿Quieres hacer lanzamientos de punteros inseguros? Usted puede. ¿Quieres violar la corrección const? Usted puede. ¿Quiere reemplazar el asignador de memoria? Usted puede. ¿Desea copiar alrededor de la memoria sin tener en cuenta su tipo? Si de verdad quieres. ¿Quieres heredar de múltiples implementaciones? Es tu funeral. Demonios, incluso puedes obtener bibliotecas de recolección de basura, como el recolector Boehm. Luego tiene problemas como el rendimiento, que sigue de cerca el control: cuanto más control tiene un programador, más optimizado puede hacer su programa.
Aquí hay algunas cosas que he visto al investigar un poco y hablar con un par de personas que lo han probado:
Jerarquía de tipos unificada. Los usuarios de C ++ usan la herencia muy raramente, la mayoría de los programadores de C ++ prefieren la composición, y los tipos solo deben vincularse a través de la herencia si hay una muy buena razón para hacerlo. El concepto de Objeto viola este principio fuertemente al vincular cada tipo. Además, está violando uno de los principios más básicos de C ++: solo usa lo que desea. Al no tener la opción de heredar de Object, y los costos que conlleva, están muy en contra de lo que C ++ representa como lenguaje en términos de dar al programador control sobre su programa.
He escuchado sobre problemas con funciones y delegados. Aparentemente, D tiene funciones y delegados como tipos de función invocables en tiempo de ejecución, y no son lo mismo pero son intercambiables o ... ¿algo? Mi amigo tuvo bastantes problemas con ellos. Esta es definitivamente una degradación de C ++, que simplemente tiene std::function
y ya está.
Entonces tienes compatibilidad. D no es particularmente compatible con C ++. Quiero decir, ningún lenguaje es compatible con C ++, seamos sinceros, excepto C ++ / CLI, que es una especie de trampa, pero como barrera de entrada, hay que mencionarlo.
Entonces, hay algunas otras cosas. Por ejemplo, solo lea la entrada de Wikipedia.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
es una de las funciones menos seguras jamás desarrolladas, en la misma familia que los grandes problemas, como los gets
de la antigua biblioteca C Standard. Si lo busca en Stack Overflow, encontrará muchas, muchas preguntas relacionadas con su mal uso. Fundamentalmente, printf
es una violación de DRY- está dando el tipo en la cadena de formato, y luego lo vuelve a dar cuando le da un argumento. Una violación de DRY donde, si se equivoca, suceden cosas muy malas, por ejemplo, si cambia un typedef de un entero de 16 bits a uno de 32 bits. Tampoco es extensible, imagínese lo que sucedería si todos inventaran sus propios especificadores de formato. Los iostreams de C ++ pueden ser lentos, y su elección de operador puede no ser la mejor, y su interfaz podría usar el trabajo, pero están fundamentalmente garantizados para ser seguros, y DRY no se viola, y se pueden extender fácilmente. Esto no es algo de lo que se pueda decir printf
.
Sin herencia múltiple. Esa no es la forma de C ++. Los programadores de C ++ esperan tener un control completo sobre su programa y el lenguaje que impone lo que no puede heredar es una violación de ese principio. Además, hace que la herencia (aún más) sea frágil, porque si cambia un tipo de una interfaz a una clase porque desea proporcionar una implementación predeterminada o algo así, de repente se rompe el código de su usuario. Eso no es algo bueno.
Otro ejemplo es string
y wstring
. En C ++ ya es bastante doloroso tener que convertir entre ellos, y esta biblioteca admite Unicode, y esta antigua biblioteca C solo usa const char*
, y tener que escribir diferentes versiones de la misma función dependiendo del tipo de argumento de cadena que desee. En particular, los encabezados de Windows, por ejemplo, tienen algunas macros extremadamente irritantes para hacer frente al problema que a menudo puede interferir con su propio código. Agregar dstring
a la mezcla solo empeorará las cosas, ya que ahora, en lugar de dos tipos de cadenas, debe administrar tres. Tener más de un tipo de cadena aumentará los dolores de mantenimiento e introducirá código repetitivo que trata con cadenas.
Scott Meyers escribe:
D es un lenguaje de programación creado para ayudar a los programadores a abordar los desafíos del desarrollo moderno de software. Lo hace fomentando módulos interconectados a través de interfaces precisas, una federación de paradigmas de programación estrechamente integrados, aislamiento de subprocesos impuesto por el lenguaje, seguridad de tipo modular, un modelo de memoria eficiente y más.
El aislamiento de hilos forzado por el lenguaje no es una ventaja. Los programadores de C ++ esperan un control total sobre sus programas, y el lenguaje que obliga a algo definitivamente no es lo que ordenó el médico.
También voy a mencionar la manipulación de cadenas en tiempo de compilación. D tiene la capacidad de interpretar el código D en tiempo de compilación. Esto no es una ventaja. Considere los dolores de cabeza masivos causados por el preprocesador relativamente limitado de C, conocido por todos los programadores veteranos de C ++, y luego imagine cuán gravemente se abusará de esta característica. La capacidad de crear código D en tiempo de compilación es excelente, pero debe ser semántica , no sintáctica.
Además, puede esperar un cierto reflejo. D tiene recolección de basura, que los programadores de C ++ asociarán con lenguajes como Java y C # que se oponen bastante directamente a ella en filosofías, y las similitudes sintácticas también los recordarán. Esto no es necesariamente objetivamente justificable, pero es algo que ciertamente debe tenerse en cuenta.
Básicamente, no ofrece mucho que los programadores de C ++ no puedan hacer. Quizás sea más fácil escribir un metaprograma factorial en D, pero ya podemos escribir metaprogramas factoriales en C ++. Tal vez en D pueda escribir un rastreador de rayos en tiempo de compilación, pero nadie quiere hacerlo de todos modos. En comparación con las violaciones fundamentales de la filosofía de C ++, lo que puede hacer en D no es particularmente notable.
Incluso si estas cosas son solo problemas en la superficie, entonces estoy bastante seguro de que el hecho de que, en la superficie, D no se parezca a C ++ en absoluto, es probablemente una buena razón por la que muchos programadores de C ++ no están migrando a D. Quizás D necesita hacer un mejor trabajo publicitándose.