Wednesday, 20 August 2008 arrowHome Add to Technorati Favorites
Main menu
Home
Articoli
RSS news
Saputello
Segnalazioni
Info
The Four Keys
Info sullo speciale
Approfondimenti sul codice
C++, STL, Design Pattern
OpenGL, SDL e Computer Graphics
Artwork




Panoramica sul linguaggio D E-mail

 

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;

    }

}



 
< Prev



I più letti
Suggerimenti Google
Novità
© 2006-2007 Michele Bosi
E' vietata la riproduzione, anche parziale, di contenuti e grafica
Ottimizzato per Firefox 2.0 ed Internet Explorer 6.0