2010-09-01 18 views
23

Imagine que tiene 3 proyectos:¿Vale la pena el esfuerzo para aprender D?

  • Un editor de texto para programadores
  • un compilador
  • y una biblioteca de motores de búsqueda durante al menos 3 tipos de archivos html, xls y pdf.

usted tiene 3 opciones:

  • C++
  • Java
  • y C#
  • o se puede explorar la alternativa de hacerlo con D.

Entonces, usted pregunta a más programadores de wises: ¿Podría D darme una ventaja significativa en esta tarea, en las áreas de: modular la fijación de errores, el trabajo en equipo y la eficiencia de la máquina?

+7

Sin saber lo que quiere hacer, o los idiomas que ya conoce, es imposible responder. Además, las personas que están calificadas para hablar sobre D frente a otros idiomas están casi seguro de ser entusiastas de D, por lo que es poco probable que obtengas una respuesta equilibrada. –

+4

¿Cómo podríamos responder esto sin más detalles? Claramente vale la pena * * y no vale la pena para * otros *. ¿Qué esperas fuera del idioma? ¿Piensas desarrollar algo con él o es una experiencia de aprendizaje? ¿Has investigado lo que D ofrece? –

+0

Acerca de la pregunta de Michael Petrotta, sí, estoy interesado en lo que D ofrece, pero TODOS los idiomas ofrecen la base Heaven y The Paradise en esta o aquella característica. Quiero saber de personas que realmente han estado trabajando en cosas reales si estas características son tan maravillosas como dicen. – Nisanio

Respuesta

29

Tal como lo veo, D tiene las siguientes ventajas con respecto a otros idiomas "tradicionales" tipos estáticos:

  1. Enfermizamente potentes instalaciones metaprogramación tiempo de compilación. Por ejemplo, consulte std.algorithm o std.range en la biblioteca estándar D2. Es probable que pronto se incluya un módulo std.parallelism, y si/cuando lo está, será otro buen ejemplo. Estas instalaciones son lo suficientemente potentes como para que el lenguaje a veces se sienta como con tipo de pato, pero con el rendimiento de un lenguaje estáticamente tipado. También vea la pregunta sobre D SO metaprogramming: Examples of what D’s templates can be used for

  2. El modelo de concurrencia D2 predeterminado se basa en el paso de mensajes. Si no subvierte el sistema de tipos de manera obvia y greppable, no puede haber intercambio de datos implícito entre los hilos en D2. Por supuesto, si realmente desea compartir datos sin marcar, puede romper esto con un molde. Por ejemplo, el módulo std.parallelism que se encuentra actualmente en revisión lo hace para obtener el paralelismo multinúcleo de pedal a metal.

  3. D tiende a hacer que las cosas simples sean mucho más simples que C++ o Java. (No estoy tan seguro acerca de C#.) Por cosas simples, me refiero a cosas como la E/S básica de archivos o el patrón de estrategia que no requieren tanto texto repetitivo. De hecho, siento que una de las principales metas de diseño de D'fue desterrar el código repetitivo de la faz de la Tierra, ya que el diseño tanto del lenguaje como de la biblioteca estándar enfatiza la necesidad de evitarlo.

En relación con los lenguajes dinámicos, D tiene:

  1. El rendimiento de un idioma nativo compilado mientras que renunciar a mucho menos de conveniencia lo que cabría esperar, sobre todo debido a las instalaciones de metaprogramación impresionantes y su uso en el diseño de la biblioteca estándar.

  2. Comprobación estática. Su programa no se bloqueará un día porque ha escrito mal un nombre de variable o ha intentado asignar una cadena a un número entero.

  3. La capacidad de hacer el trabajo de bajo nivel. Por ejemplo, a excepción de algunos pequeños trozos de ensamblador en línea, recolector de basura D's está escrito completamente en D.

+0

Muchas gracias – Nisanio

+3

A su comentario sobre el código repetitivo también agregaría: cuando tiene que crear un texto repetitivo, a menudo puede hacerlo * en el idioma en sí * utilizando string mixins. Que también son verificados en tiempo de compilación. ¡En esencia, puedes usar el compilador D como un generador de código! –

7

Si quiere la "potencia" de C++ sin la incómoda sintaxis, o la "potencia" de C con características útiles como las cadenas y las cadenas adecuadas, diría que vale la pena. Si te gusta tener una API gigante para apoyarse (C#/Java), D probablemente no te guste. También asegúrese de usar D 1.0, ya que la biblioteca (wxD & otras librerías de GUI) y el compilador (GCD, LDC, cualquier cosa que no sea DMD) son terribles para D 2.0, aunque esa versión del lenguaje es una clara mejora.

+4

Si bien es cierto cuando se publicó en 2010, D2 está aquí con soporte gcc y LLVM. D1 es una reliquia de días pasados. –

6

Yo mismo estoy en el proceso de aprendizaje D, procedente de una C/C++ de fondo. D me atrajo por su elegancia, está bien pensado a través del diseño. Eso se siente como el cielo después de las esquinas intensivas, profundas y oscuras de C++.

Para mí, la gran desventaja de D es la falta de bibliotecas. Incluso la biblioteca estándar que no encuentro muy bien hecha. El lenguaje es genial, las bibliotecas no (todavía). Sin embargo, puedes usar C libs, que es un gran aprobado.

Aunque D parece tener muchos conocimientos técnicos y muchos aspectos del lenguaje, no es la mitad de lo que tiene C++. Así que yo diría que es notablemente más rápido de aprender (definitivamente porque el 90% proviene de C++ o idiomas relacionados). Entonces, aprender el idioma debería ser cuestión de semanas/meses.

Dado que todavía no hay grandes herramientas para las GUI, es posible que desee desarrollar el editor en otra cosa. Los otros dos proyectos son perfectamente adecuados para D.

+3

Debo agregar, después de 1,5 años, que la biblioteca estándar ha progresado significativamente. Es muy útil y se estabiliza rápidamente. El compilador también madura rápidamente. Los obstáculos actuales son la falta de documentación exhaustiva y pequeños errores de compilación de casos de esquina. Espero que esto último se resuelva con GDC integrado en el conjunto de herramientas del compilador de GNU. –

1

Daría +1 por eficiencia, 0 (sin pro o contra) por modularidad, 0 por trabajo en equipo y un enorme -1 por solución de errores.

El -1 proviene del hecho de que D no se usa realmente lo suficiente como para que las librerías estén completas y libres de errores. En estos casos, siempre perderá tiempo al arreglar código de terceros. También un gran -1 por la inexistencia de un buen depurador D.

Normalmente, como programador de Eiffel, otorgaría a D a +1 por tener un diseño por contrato, pero esto no se usa constantemente en la biblioteca estándar y el 95% de las bibliotecas adicionales no lo usa. Entonces no obtendrás muchos beneficios de esto.

+3

* no existe un buen depurador D * - gdb soportó D recientemente, y también mira [Visual D] (http://www.dsource.org/projects/visuald). – kennytm

+0

Sí, sabía que la gente mencionaría gdb, por eso escribí la inexistencia de un buen depurador. Y gracias, comprobaré Visual D la próxima vez que haga un proyecto D de tiempo libre otra vez – Lothar

0

Creo que D es sin duda el más adecuado para el compilador, y menos adecuado para las otras dos tareas.

+0

Creo que el lenguaje es adecuado para todos ellos, pero las bibliotecas carecen de parte de él. –

4

Me gustaría decir que me convertí en un entusiasta de D ayer, cuando aprendí cuánto mejor que C++, y he estado estudiando D durante dos días seguidos de puro amor. Oh, no es perfecto, ¿pero comparado con C++? No contestar. Lo mismo para Java. C# fue mi lenguaje preferido desde hace 3 días, pero hoy creo que ha bajado de rango.

Sin haber usado D para ningún trabajo serio todavía, podría estar equivocado. Pero D tiene una respuesta a todas las críticas principales que comúnmente se plantean en contra de C++, desde el tiempo de compilación hasta la seguridad de tipo deficiente, al dolor de cabeza de mantener archivos de encabezado, para ralentizar la compilación.D no es sólo una mejora evolutiva, que ha innovaciones que se encuentra en ninguno de los lenguajes populares del mundo:

  • Se dice que tienen uno de los compiladores más rápidos del mundo
  • Puede usar try/catch/finally y RAII, pero scope(exit) hace que el código de excepción sea más fácil de leer y escribir
  • Puede definir los cierres que el compilador puede alinear (¿algún compilador de C++ 11 hace eso? No estoy seguro, estoy atrapado en Visual C++ 2008 debido a una necesidad de compatibilidad con Windows CE)
  • La recolección de basura es estándar pero opcional, para que pueda escribir programas con garantías de baja latencia evitando las asignaciones de GC (¿pero cómo administrar la memoria? Sospecho que uno podría usar alias this hacer punteros inteligentes al estilo de C++?)
  • rebanadas, un mecanismo de acceso colección que es mucho más seguro que los iteradores de C++ y también mucho más conveniente, sin necesidad de repetir a sí mismo como en lower_bound(blobCollection.begin(), blobCollection.end(), blob)
  • genéricos son más flexible que en C++ y no producen páginas de mensajes de error
  • metaprogramación tiempo de compilación que enormemente supera a C++ (y, obviamente, C# también)
  • Compile-time reflection la que (espero, pero no puedo confirmar) se podría utilizar para construir un sistema de reflexión en tiempo de ejecución si uno quisiera
  • Un enfoque bien diseñado, de múltiples paradigmas h concurrencia con características interesantes para las arquitecturas de memoria compartida y de paso de mensajes
  • Compatibilidad incorporada para pruebas unitarias
  • Expresiones de matriz, p. ej. a [] = (b [] + c [])/2 (MATLAB hace esto de forma más concisa, pero entre los lenguajes de uso general este tipo de característica es raro)
  • Características superiores de coma flotante (por ejemplo, nextUp()/nextDown()/ulp(), flotantes hex, control de excepciones de hardware)

Para un compilador o una biblioteca de motor de búsqueda, D obviamente sería excelente. Y dado que D es muy similar a C++, no tendrías que perder mucho tiempo aprendiéndolo, ¿por qué no? Además, no debería ser tan difícil portar pequeños programas y bibliotecas desde C++. Tengo la impresión de que los enlaces de GUI también han mejorado, así que quizás D funcione bien para un editor de texto en estos días.

Es cierto que no estoy contento con todo. Todavía están atendiendo a la multitud C, por lo que todavía tiene que rellenar sus declaraciones switch con breaks, la palabra clave static se usa de manera confusa, las lambdas requieren llaves y una declaración de "retorno" (en oposición a la sintaxis más rápida de C# x -> x+1), todas las funciones y try/catch requiere llaves, pass-by-reference está implícito en el sitio de llamadas ... pero lo que D ofrece es demasiado bueno para dejarlo pasar.

Pero, por supuesto, mientras que la lengua D es claramente una maravilla, y la biblioteca estándar aparentemente ha madurado, las herramientas que rodean podrían no ser tan bueno: IDE, soporte para plataformas de teléfonos inteligentes, etc. El único IDE he intentado, Visual D (complemento IDE para Visual Studio) funciona bastante bien, incluida la depuración que parece funcionar tan bien como el depurador de Visual C++ y que puede ingresar a la biblioteca estándar (¡divertido!). Sin embargo, la finalización del código aún no funciona muy bien.

En comparación con C#, D es mejor en la mayoría de las áreas pero parece débil cuando se trata de vinculación dinámica y reflexión. Por ejemplo, su editor de texto podría tener fácilmente un sistema de complemento en .NET, pero no estoy tan seguro de que D.NET también ofrezca generación de código de tiempo de ejecución mientras que D no lo haga.Sin embargo, existe un research compiler para compilar D con código .NET. Dado que C++/CLI ya compila a .NET (C++/CLI), quizás algún día uno pueda usar D igualmente bien para código administrado y nativo (con un pequeño golpe de rendimiento en terreno administrado, por supuesto).

Interoperabilidad con C/C++ y .NET son bastante decentes. D se supone que interopera con las funciones de C++ y las clases heredadas individualmente a través de extern (C++) y C++ name mangling (pero que compilador name mangling?), Mientras que puedes crear fácilmente interfaces COM invocables desde .NET y otros lenguajes.