D | |
---|---|
Semántica | multi- paradigma : imperativo , orientado a objetos , funcional , contrato [1] , programación genérica |
clase de idioma | lenguaje de programación orientado a objetos , lenguaje de programación procedimental , lenguaje de programación funcional , lenguaje de programación genérico , lenguaje de programación paralelo [d] , lenguaje de programación multiparadigma , lenguaje de programación imperativo ,de programación compilado y lenguaje de programación |
tipo de ejecución | compilado |
Apareció en | 2001 |
Autor | Walter BrightAndrei Alexandrescu |
Desarrollador | Bright, Walter y la Fundación D Language [d] |
extensión de archivo | .d, o .dd_.di.def |
Liberar | 2.100.2 [2] ( 10 de septiembre de 2022 ) |
sistema de tipos | estricto, estático, con tipo de inferencia |
Implementaciones principales | Digital Mars D (implementación de referencia) , LDC , GDC |
sido influenciado | C , C++ , Python , Rubí , C# , Java , Eiffel |
influenciado | MiniD , DScript , Vala , Qore , Swift , Genie |
Sitio web | dlang.org |
Archivos multimedia en Wikimedia Commons |
D ( Di ) es un lenguaje de programación compilado de tipo estático multiparadigma creado por Walter Bright de Digital Mars . Desde 2006 , Andrei Alexandrescu también es coautor . D es un descendiente del lenguaje C++ , pero se ha mejorado significativamente en comparación con él. También toma prestados una serie de conceptos de los lenguajes de programación Python , Ruby , C# , Java , Eiffel .
D está disponible para los sistemas operativos Windows, Linux, macOS, FreeBSD. Se está trabajando para migrar a Android [3] .
En el prefacio del libro de A. Alexandrescu El lenguaje de programación D, Walter Bright escribe que comenzó a desarrollar este lenguaje en 1999. El proyecto se concibió como una reingeniería del lenguaje C++ para eliminar las deficiencias más significativas del lenguaje original e introducir en él soluciones arquitectónicas modernas. Al crear el lenguaje D se intentó combinar el desempeño de los lenguajes de programación compilados con la seguridad y expresividad de los dinámicos .
Inicialmente, el autor pretendía llamar al lenguaje "Mars", pero debido a la continuidad con respecto a C ++, el lenguaje se llamaba constantemente "D" en las discusiones, como resultado, se asignó este nombre al proyecto.
La versión 1.0 del compilador estable se lanzó el 2 de enero de 2007 [4] . Poco después del lanzamiento del compilador el 17 de junio de 2007, el autor cambió la versión 1 al modo de soporte y comenzó a desarrollar la versión 2.0, que inicialmente no garantizaba la compatibilidad con versiones anteriores [5] . Esta versión (la última versión en D mayor hasta la fecha) todavía se está desarrollando hasta el día de hoy.
El lenguaje D implementa muchas funciones y conceptos sintácticos que no se encuentran en C++: programación por contrato , pruebas unitarias integradas , módulos en lugar de archivos de encabezado (anteriores a C++20), compatibilidad con recolección de elementos no utilizados (manteniendo la disponibilidad de memoria manual ). gestión), matrices asociativas integradas, cierres , funciones anónimas , el motor de plantillas se ha rediseñado significativamente.
D pertenece a la familia de lenguajes tipo C, en términos generales, su sintaxis es similar a C/C++/C#, Java. Al desarrollar un lenguaje, se observa el principio: el código que es igualmente válido tanto en C como en D debe comportarse de la misma manera.
¡Hola mundo! » a D:
estándar de importación estudio _ void main () { writeln ( "¡Hola, mundo!" ); }Al igual que en C, una función main()es un punto de entrada.
Las construcciones if, for, while, se do-whileven y funcionan de manera similar a C/C++. La instrucción de opción múltiple switchse parece a C++, pero permite variables en etiquetas de rama casey requiere que cada rama casetermine con breako return; para pasar a la siguiente rama después de procesar la actual, debe usar la construcción especial goto case. switchLas estructuras sin una rama también están prohibidas default.
De las estructuras de control adicionales, se puede notar static if : una instrucción para la compilación condicional (la condición se verifica estáticamente y el contenido de la rama que le corresponde se incluye en el código), el operador de opción múltiple completo final switch : a diferencia del habitual switch, funciona solo con valores enum, y el compilador verifica estáticamente que la elección tenga en cuenta todas las opciones posibles y, de lo contrario, da un error. También hay un bucle de recogida foreach.
D tiene un sistema integrado para dividir un programa en módulos (paquetes), que proporciona una compilación separada y una importación y exportación controlada. El sistema de paquetes se parece al de Java o Go: los paquetes forman una estructura jerárquica que se asigna naturalmente al árbol del sistema de archivos. A diferencia de C++, D no tiene un espacio de nombres global, cada nombre se define en un paquete. Con la ayuda de la instrucción import, un módulo de programa puede importar un paquete, poniendo a disposición todas las definiciones que contiene. Se puede acceder a los nombres importados con la calificación: " имя_пакета.имя_объекта".
El lenguaje proporciona una serie de herramientas destinadas a proporcionar un trabajo conveniente con nombres importados. Es posible cambiar el nombre del paquete durante la importación, establecer un nombre alternativo (alias) del paquete importado, importar nombres específicos. Además, el idioma permite, sin instrucciones adicionales, el uso de nombres importados sin calificación por el nombre del paquete. Sin embargo, existe una limitación: si se encuentra más de una definición coincidente de un nombre en el programa en el ámbito, el compilador generará un error y requerirá que el nombre se califique explícitamente. Esto evita el llamado "secuestro de nombres" cuando, cuando se agrega un nuevo paquete a las listas de importación, el compilador comienza a asociar un determinado nombre en el programa con una definición diferente de la definición con la que estaba asociado previamente.
D implementa el mecanismo UFCS (Uniform function call syntax), que le permite llamar a funciones para cualquier objeto como si fueran sus métodos. Por ejemplo:
estándar de importación estudio _ estándar de importación algoritmo ; estándar de importación matriz ; vacío principal () { auto a = [ 2 , 4 , 1 , 3 ]; // los tres de los siguientes son correctos y funcionan de la misma manera writeln ( a ); // Versión "clásica" tipo C de un . escribirln (); // se llama a la función como si fuera un método del objeto "a" aunque no sea un . escribir ; // la función sin parámetros se puede llamar sin paréntesis // esto le permite usar cadenas de llamadas que son específicas de los lenguajes funcionales int [] e = a . ordenar (). inversa ; // También es posible el encadenamiento multilínea stdin . byLine ( KeepTerminator . yes ) . mapa !( a => a . idup ) . matriz _ ordenar ; }Las funciones en D se pueden definir con atributos opcionales adicionales que le permiten especificar explícitamente algunos aspectos del comportamiento de estas funciones. Por ejemplo, se garantiza que una función marcada con el atributo pure es funcionalmente pura (con algunas salvedades) [6] . La pureza funcional se comprueba en tiempo de compilación. Un ejemplo de una declaración de función con un atributo:
pure int sum ( int first , int second ) { return first + second ; } int sum ( int first , int second ) pure // Los atributos también se pueden especificar después del argumento list { return first + second ; }Ejemplos de atributos de función:
El lenguaje tiene un mecanismo integrado para iniciar subprocesos paralelos mediante una función integrada spawn()y el intercambio de datos entre fragmentos de código ejecutados en paralelo mediante el paso de mensajes (funciones send()y receive()/ receiveTimeout()). Los autores de D consideran que el uso de la mensajería es preferible al intercambio de datos a través de la memoria compartida.
Sin embargo, en los casos en que esto sea necesario (por ejemplo, cuando se transfieren grandes cantidades de datos entre rutinas), es posible utilizar el enfoque tradicional para lenguajes imperativos con áreas de memoria compartida y sincronización de acceso a través de semáforos y mutexes . Para apoyar dicho intercambio:
Para todas las herramientas de sincronización integradas, el compilador supervisa y prohíbe automáticamente los intentos de cambiar los datos no compartidos dentro del código sincronizado al que puede acceder más de un subproceso.
En D, las pruebas unitarias son parte del lenguaje y se pueden usar sin bibliotecas o marcos adicionales.
estándar de importación estudio _ int primero ( int [] arr ) { return arr [ 0 ]; } unittest { int [] arr1 = [ 1 , 2 , 3 ]; int [] arr2 = [ 10 , 15 , 20 ]; afirmar ( primero ( arr1 ) == 1 ); afirmar ( primero ( arr2 ) == 10 ); } vacío principal () { // ... }D implementa cinco paradigmas de programación principales: imperativo , programación orientada a objetos , metaprogramación , programación funcional y computación paralela ( modelo de actor ).
D utiliza un recolector de elementos no utilizados para la gestión de la memoria; sin embargo, el control manual también es posible mediante la sobrecarga del operador newy delete, así como el uso de malloc y free , similar a C. El recolector de elementos no utilizados se puede activar y desactivar manualmente, puede agregar y eliminar memoria áreas desde su visibilidad, forzar el inicio parcial o completo del proceso de montaje. Hay un manual detallado que describe varios esquemas de administración de memoria en D para casos en los que el recolector de basura estándar no es aplicable.
SafeD es el nombre de un subconjunto del lenguaje D, cuyo uso garantiza la seguridad del acceso a la memoria .
El lenguaje tiene un rico conjunto de tipos de datos definidos y facilidades para definir nuevos tipos. Los tipos en el lenguaje D se dividen en tipos de valor y tipos de referencia.
Tipos baseEl conjunto de tipos básicos se puede dividir en las siguientes categorías [7] :
A diferencia de C++, todos los tamaños de los tipos enteros están definidos por la especificación. Es decir, el tipo int siempre será de 32 bits. Los literales enteros se pueden escribir en decimal, binario (con el prefijo 0b) y hexadecimal (con el prefijo 0x). Se eliminó la notación de estilo C de literales en octal (es decir, con el prefijo 0), ya que es fácil confundir dicha notación con decimal. Si aún necesita usar el sistema octal, puede usar la plantilla std.conv.octal .
Tipos derivadosD tiene un mecanismo de inferencia de tipos. Esto significa que el tipo, por regla general, se puede calcular en tiempo de compilación y no tiene que especificarse explícitamente. Por ejemplo, la expresión: auto myVar = 10se convertirá en int myVar = 10. El uso de la inferencia de tipos tiene varias ventajas:
VeryLongTypeName var = VeryLongTypeName(/* ... */);
puede ser reemplazado por
auto var = VeryLongTypeName(/* ... */);
Los tipos sin nombre se denominan informalmente tipos Voldemort, en honor a Voldemort ( "El-que-no-debe-ser-nombrado"), el principal antagonista de la serie de Harry Potter [8] . La inferencia de tipos no debe confundirse con la tipificación dinámica porque, aunque el tipo no se especifica explícitamente, se calcula en tiempo de compilación, no en tiempo de ejecución.
Soporte para D en varios IDE , implementado mediante complementos:
IDE | enchufar | Plataformas |
---|---|---|
IDEA IntelliJ | DLenguaje | multiplataforma |
Eclipse | DDT | multiplataforma |
MonoDevelop/Xamarin | Mono-D | multiplataforma |
estudio visual | Visual-D | ventanas |
código de estudio visual | Código-D | multiplataforma |
código x | D para Xcode | Mac OS X |
IDE de Zeus | D para Zeus IDE | ventanas |
IDE nativos para lenguaje D:
D es compatible con muchos editores de texto: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate y otros [11] .
DUB es el administrador de paquetes oficial para D. DUB actúa como un repositorio de paquetes y se usa para la administración de dependencias y también como un sistema de compilación. El conjunto de dependencias, metadatos sobre el proyecto y las marcas del compilador se almacenan en formato JSON o SDL. Ejemplo de un archivo de proyecto simple (JSON):
{ "name" : "myproject" , "description" : "Un pequeño servicio web mío". , "autores" : [ "Peter Parker" ], "página de inicio" : "http://myproject.example.com" , "licencia" : "GPL-2.0" , "dependencias" : { "vibe-d" : " ~>0.7.23" } }rdmd es una utilidad que viene con el compilador DMD que le permite compilar y ejecutar archivos fuente D sobre la marcha. Esto permite que D se use para programas pequeños de manera similar a bash, perl y python:
// miprog.d # !/ usr / bin / env rdmd import std . estudio _ void main () { writeln ( "¡Hola, mundo con secuencias de comandos automáticas ejecutándose!" ); }Llamar al comando ./myprog.den la consola compilará y ejecutará automáticamente el programa.
DPaste [12] es un servicio en línea para ejecutar programas D en un navegador, similar a los servicios JSBin y CodePen .
run.dlang.io [13] es un compilador y desensamblador en línea.
La distribución del lenguaje D es limitada, pero se utiliza para el desarrollo de software industrial real. El sitio web oficial [14] proporciona una lista de 26 empresas que utilizan con éxito D en el desarrollo de sistemas de software que operan en una variedad de áreas, incluida la programación de sistemas, proyectos web, juegos y motores de juegos, software para cálculos científicos, utilidades para diversos fines. , y así. El lenguaje D es promovido, en particular, por la D Language Foundation, una organización pública que promueve el lenguaje D en sí mismo y el software de código abierto creado con él.
Según el índice TIOBE , el máximo interés por D se manifestó en el período 2007-2009, en marzo de 2009 el índice de lengua D alcanzó 1,8 (puesto 12), que es su máximo absoluto. Después de un declive en la primera mitad de la década de 2010, en 2016 llegó a un estado relativamente estable: el valor numérico del índice fluctúa en el rango de 1.0-1.4, en la clasificación el idioma se encuentra entre los diez terceros. En la calificación de popularidad , compilada en base a los resultados de la agregación de datos sobre las vacantes de desarrolladores, el idioma D no está incluido en la lista principal (top 20) ni en la general (top 43), lo que indica una baja demanda entre los empleadores.
¡Hola mundo! »
estándar de importación estudio _ void main () { writeln ( "¡Hola, mundo!" ); }Un programa que imprime los argumentos de la línea de comando con los que fue llamado
estándar de importación stdio : writefln ; void main ( cadena [] args ) { foreach ( i , arg ; args ) writefln ( "args[%d] = '%s'" , i , arg ); }Un programa que lee una lista de palabras de un archivo línea por línea y genera todas las palabras que son anagramas de otras palabras .
estándar de importación stdio , std . algoritmo , estándar . rango , estándar . cadena _ void main () { dstring [][ dstring ] signos2palabras ; foreach ( dchar [] w ; líneas ( Archivo ( "words.txt" ))) { w = w . morder (). a Inferior (); clave inmutable = w . tonto _ ordenar (). liberación (). idup ; signos2palabras [ clave ] ~= w . idup ; } foreach ( palabras ; signos2palabras ) { if ( palabras . longitud > 1 ) { writefln ( palabras . unir ( " " )); } } }
Lenguajes de programación | |
---|---|
|
lenguaje de programación c | |
---|---|
compiladores |
|
bibliotecas | |
Peculiaridades | |
algunos descendientes | |
C y otros lenguajes |
|
Categoría:Lenguaje de programación C |
,