Las virtudes y defectos del lenguaje de programación D

Acostumbrados a movernos entre lenguajes de un nivel cada vez más alto, D viene a recordarnos las virtudes de los lenguajes de medio/bajo nivel.


Cualquiera que se inicie en el mundo de la programación hoy en día lo hace con lenguajes como Java o Python, ¿por qué? Como ya sabréis, Java y Python son lenguajes de alto nivel, esto quiere decir que el propio lenguaje se encarga de la gestión de algunos aspectos relacionados con el procesador, principalmente la gestión de memoria. Para los que hayais trabajado con lenguajes de bajo nivel, sabréis que la gestión de memoria es el aspecto más problemático a la hora de programar, ya que todos los exploits y vulnerabilidades suelen colarse por esta zona (ver Una demostración práctica de los errores del Stagefright bug).

Por esta y otras razones, la programación hoy en día se basa en lenguajes de alto nivel. De hecho muchas empresas han desarrollado sus propios lenguajes basados en máquinas virtuales como C# de Microsoft, Objective C/Swift de Apple, Java de Oracle, etc; estos lenguajes tienen la ventaja de que no necesitan una gestión de memoria explícita, además de que por lo general suelen ser interpretados por una entidad intermedia, la máquina virtual, que controla automáticamente muchos aspectos problemáticos.

Programación a alto nivel vs programación a bajo nivel


La programación a alto nivel permite desarrollar un código mucho más legible y sencillo. Además prácticamente todos los lenguajes de alto nivel llevan incorporados un recolector de basura, que es una entidad software que se encarga de liberar la memoria de recursos que ya no están siendo utilizados. Por todas estas razones los inicios actuales en la programación se basan en este tipo de lenguajes, ya que nos centraremos más en la lógica y los algoritmos y dejaremos de lado aspectos relacionados con la gestión del procesador.

Pero cuando queremos sacar el máximo partido a los recursos del sistema, como a la hora de programar máquinas embebidas o sistemas con recursos limitados, no podemos permitirnos el lujo de mantener en memoria una máquina virtual. Además para sistemas críticos, sistemas que requieran el uso intensivo de recursos hardware o simplemente sistemas que pretendemos optimizar al máximo es necesario utilizar lenguajes de medio/bajo nivel como C o C++.

Con lenguajes de medio/bajo nivel podremos distribuir los recursos de la manera más eficiente posible, ya que nos permiten trabajar con direcciones de memoria directamente, configurando aspectos como la reserva estática de espacio, punteros que funcionan directamente con direcciones virtuales o la liberación manual de recursos. Esto nos hace sacar el máximo partido a los recursos del sistema, pero a cambio nuestro código será mas complejo y difícil de entender.

Un poco de historia


Para ver los orígenes del lenguaje de programación D, debemos remontarnos a finales de los 60 y principios de los 70, cuando Bell Labs liberó el lenguaje de programación B. El lenguaje B fué básicamente una simplificación del lenguaje BCPL, utilizado para programar las microcomputadoras de la época, con la intención de hacerlo más sencillo y usable.

Unos años después, Dennis M. Ritchie de Bell Labs (uno de los responsables del desarrollo del lenguaje B), liberó una versión mejorada y refinada de su anterior lenguaje, que no es ni más ni menos que el clásico lenguaje C. Al igual que su predecesor, el enfoque de C era la implementación de sistemas operativos basados en Unix, pero a contrario que el anterior, C permitía trabajar con estructuras de más alto nivel conservando las características del bajo nivel.

A principios de los 80, con la expansión de los lenguajes orientados a objetos, C evolucionó naturalmente para dar soporte a este paradigma y nació C++ de la mano de Bjarne Stroustrup. Con C++ disponíamos de todas las ventajas de C pero con la mejora añadida de que ahora podíamos crear nuestros propios tipos de datos, estructuras funcionales complejas y el uso de herencia e interfaces. En conclusión, teníamos un lenguaje todo en uno: nos permitía el control de las características de bajo nivel y el uso de arquitecturas complejas de alto nivel a la vez.

C++ fué el rey de los lenguajes junto con C, los demás lenguajes eran implementados con C/C++ por debajo. Aunque existían otros lenguajes, estos se distribuían para campos concretos, mientras que C++ permitía un desarrollo todo-terreno. Pero en 1995 apareció algo que cambiaría la historia de la programación, el lenguaje Java. Este lenguaje de alto nivel, inicialmente desarrollado para programar lavadoras, tenía un increíble potencial que como todos sabéis, se ha propulsado con el tiempo.

Tras la maduración de Java su uso se extendió de manera exponencial. Al trabajar bajo una máquina virtual, la gestión de las características de bajo nivel eran controladas por la misma y el programador puede abstraerse de ellas. Además, la implementación en distintas plataformas hace que su código puede ejecutarse en infinidad de sistemas sin siquiera recompilar.

Empezó entonces la expansión de los lenguajes interpretados (o semi interpretados) y se empezaron a dar de lado a los lenguajes de medio/bajo nivel, dejando estos para la programación de microcontroladores y sistemas embebidos principalmente. Pero en 2001 Walter Bright decide liberar D, un híbrido con las ventajas de lenguajes como C/C++ sumadas a las de los lenguajes de alto nivel.

El lenguaje de programación D


El lenguaje de programación D toma las bases de C++ y las complementa con los conceptos más útiles de los lenguajes de alto nivel. Es un lenguaje de propósito general con una sintaxis similar a la de C/C++, aunque el código no es compatible debido a que algunas características son eliminadas de este lenguaje. D es un lenguaje "de la antigua escuela", ya que compila los programas directamente a lenguaje máquina, sin el uso de máquina virtual. Además está optimizado para que su utilización en proyectos de gran envergadura sea más limpia que si utilizamos C/C++.

Aunque las bases son muy parecidas, hay muchas diferencias entre C/C++ y D, vamos a ver un listado con las más importantes:

- D utiliza módulos en vez de namespaces. Esto permite agrupar funciones, tipos y demás estructuras en un sólo fichero, que a la hora de compilar es mucho más rápido que C++. Una clase perteneciente a un módulo tiene acceso a las demás clases pertenecientes al mismo, cosa que no ocurre con su predecesor. A la hora de importar librerías, el compilador buscará módulos en vez de paquetes.

- D dispone de un recolector de basura, una entidad software que se encarga de la liberación de recursos cuando se detecta que estos no van a ser utilizados. Esto simplifica enormemente un aspecto crucial como la gestión de memoria. A su vez, D permite el uso de destructores para la gestión manual de los recursos, lo que le da una gran versatilidad al lenguaje.

- D tiene otras características como el uso de plantillas más simples, tipos inmutables y estructuras de datos, funciones lambda y clausuras.

D es además un lenguaje multiplataforma, ya que existen distintos compiladores para plataformas como Mac, Windows y GNU/Linux. Aunque no existe un IDE oficial para el lenguaje, Microsoft ha incluido un plugin en su Visual Studio que permite el desarrollo con este lenguaje. En plataformas como Mac o GNU/Linux existe un IDE basado en Eclipse llamado DDT enfocado a D.

Otra de las grandes ventajas de D es que puede utilizar las APIs de C de manera directa. D tiene correspondencia con todos los tipos estándar de C, lo que simplifica de gran manera la inclusión de librerías de código abierto escritas en este último lenguaje (que son muchísimas). Además D también posibilita la ejecución de instrucciones en lenguaje ensamblador.

Como conclusión podemos decir que D es la evolución natural de C++ y viene a solventar muchos problemas presentes en el mismo. Permite un desarrollo flexible multiplataforma y su popularidad está creciendo en los últimos años. Todo esto lo hace perfecto para el desarrollo de videojuegos y plataformas similares. ¿Qué opinas sobre C?
COMPARTE ESTA NOTICIA

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +