|
Page 1 of 2
Abbiamo già avuto modo di parlare del linguaggio D nell'articolo "Istallare il compilatore D sotto Windows XP", che ci ha dato l'opportunità di mettere direttamente mano al codice e al compilatore ufficiale sviluppato, come già sappiamo, da Walter Bright della Digital Mars. Vediamo adesso quale è il background "teorico" del linguaggio e quali sono le caratteristiche che lo rendono così interessante.
Dati generali
Il linguaggio D fa parte della famiglia dei linguaggi derivati dal C, come C++, Objective C, C#, Java, GLSL e molti altri. L'obbiettivo che questo linguaggio si prefigge di raggiungere è quello di unire la potenza, le performance e la flessibilità del C e del C++ con le doti di sicurezza, portabilità ed efficienza di sviluppo di linguaggi come Java, Ruby e Python. Il D infatti oltre ad essere multiparadigmatico (imperativo, object oriented, template metaprogramming) è un linguaggio di sistema, il che in parole povere significa che viene compilato in codice nativo e non interpretato e consente ad esempio di utilizzare puntatori, gestire "manualmente" la memoria (opzionale), inserire codice assembly nel codice D, definire l'allineamento in memoria di classi e strutture etc. Tutte cose più o meno insensate per linguaggi come Java, Ruby e Python. Un'altra caratteristica fondamentale del linguaggio D è quella di essere un linguaggio a tipazione statica, come Java e C++. Ciò significa che i tipi sono risolti a compile time e non a runtime, caratteristica dei linguaggi interpretati come Python, PHP etc. D'altra parte il D può essere considerato a tutti gli effetti un linguaggio ad alto livello. Infatti il D è fornito tra l'altro di un garbage collector per la gestione della memoria, gestisce array e stringhe come tipi fondamentali, dispone di strutture e operatori che operano su range o collezioni di oggetti, e molto altro. Il linguaggio D non è compatibile a livello di sorgenti ne con il C ne col C++ ma è compatibile a livello di ABI con il C a patto di disporre di un appropriato import file (gli "header" del D). Grazie a questa feature il D è virtualmente compatibile con tutti i programmi e librerie C esistenti. Oltre a ciò il D dispone di moltissime altre feature di cui parleremo tra poco. Il seguente programma è ripreso dal sito ufficiale e mostra alcune delle feature chiave del linguagio D.
|
#!/usr/bin/dmd -run
/* sh style
script syntax is supported */
/* Hello World in
D
To compile:
dmd hello.d
or to optimize:
dmd -O -inline -release hello.d
*/
import std.stdio;
void main(char[][] args)
{
writefln("Hello World, Reloaded");
// auto type inference and built-in
foreach
foreach (argc, argv; args)
{
// Object Oriented Programming
CmdLin cl = new CmdLin(argc, argv);
// Improved typesafe printf
writefln(cl.argnum, cl.suffix, " arg:
%s", cl.argv);
// Automatic or explicit memory
management
delete cl;
}
// Nested structs and classes
struct specs
{
// all members automatically initialized
int count, allocated;
}
// Nested functions can refer to outer
// variables like args
specs argspecs()
{
specs* s = new specs;
// no need for '->'
s.count = args.length; // get length of array with .length
s.allocated = typeof(args).sizeof; // built-in
native type properties
foreach (argv; args)
s.allocated += argv.length * typeof(argv[0]).sizeof;
return *s;
}
// built-in string and common string
operations
writefln("argc = %d, " ~ "allocated
= %d",
argspecs().count, argspecs().allocated);
}
class CmdLin
{
private int _argc;
private char[] _argv;
public:
this(int argc, char[] argv) // constructor
{
_argc = argc;
_argv = argv;
}
int argnum()
{
return _argc + 1;
}
char[] argv()
{
return _argv;
}
char[] suffix()
{
char[] suffix = "th";
switch (_argc)
{
case 0:
suffix = "st";
break;
case 1:
suffix = "nd";
break;
case 2:
suffix = "rd";
break;
default:
break;
}
return suffix;
}
}
|
<< Start < Prev 1 2 Next > End >> |