2012-06-09 18 views
6

Per molto tempo ho voluto progettare un linguaggio di programmazione che coniugasse estensibilità con efficienza (e sicurezza, facilità d'uso, ecc.) Recentemente ho riscoperto D e mi chiedo se D 2.0 sia praticamente la lingua che volevo rendermi Quello che amo di più è il potenziale di metaprogrammazione; in teoria, il sistema traits di D's abilita le seguenti funzionalità in fase di compilazione?È abbastanza potente per queste funzionalità?

  1. Riflessione in fase di esecuzione: le funzionalità di riflessione in fase di compilazione sono sufficienti per creare un sistema di riflessione in fase di esecuzione a la Java/.NET?

  2. Conversione codice: utilizzando un metaprogramma, creare C#/C++/ecc. versioni del tuo programma D ogni volta che lo compili (punto bonus se i commenti del doc possono essere propagati).

  3. Caratteri. Non intendo lo metaprogramming traits incorporato in D, intendo object-oriented traits for class composition. Un programma D indicherebbe un insieme di tratti da comporre e un metaprogramma li comporterà.

  4. Motore di inferenza unità: data una notazione per indicare facoltativamente unità, ad es. unit(value), un metaprogramma D può esaminare il seguente codice, dedurre le unità corrette ed emettere un messaggio di errore sull'ultima riga? (Ho scritto una cosa del genere per boo così vi posso assicurare che questo è possibile, in generale, il programma-wide):

    auto mass = kg(2.0); 
    auto accel = 1.0;      // units are strictly optional 
    auto force = mass*accel; 
    accel += metresPerSecondSquared(9.81); // units of 'force' and 'accel' are now known 
    force += pounds(3.0);     // unit mismatch detected 
    

risposta

7

di run-time di riflessione: sono il riflesso di compilazione dispone di sufficiente costruire un sistema di riflessione run-time alla Java/.NET?

Sì. È possibile ottenere tutte le informazioni necessarie al momento della compilazione utilizzando __traits e produrre le strutture dati di runtime necessarie per la riflessione runtime.

Conversione codice: utilizzando un metaprogramma, creare C#/C++/ecc. versioni del tuo programma D ogni volta che lo compili (punto bonus se i commenti del doc possono essere propagati).

No, semplicemente non è possibile, non importa quanto sia potente D. Alcune funzionalità semplicemente non si trasferiscono. Ad esempio, D ha un assemblatore in linea, che è impossibile al 100% convertire in C#. Nessuna lingua può essere convertita senza perdita in tutte le altre lingue.

Caratteri. Non intendo i tratti metaprogrammatici incorporati in D, intendo tratti orientati agli oggetti per la composizione di classe. Un programma D indicherebbe un insieme di tratti da comporre e un metaprogramma li comporterà.

Per questo è possibile utilizzare template mixins, sebbene non forniscano l'esclusione del metodo.

Motore di inferenza unità: data una notazione per indicare facoltativamente unità, ad es. unità (valore), un metaprogramma D può esaminare il seguente codice, dedurre le unità corrette ed emettere un messaggio di errore sull'ultima riga? (Ho scritto una cosa del genere per assicurarti che questo sia possibile in generale, a livello di programma):

Sì, questo è semplice in D.C'è già at least one implementation.

+0

Non intendevo suggerire al convertitore di supportare tutte le funzionalità incluso il linguaggio assembly :), ma solo l'idea che D potesse ispezionare il codice abbastanza profondamente da * tentare * una conversione. – Qwertie

+0

In questo modo è possibile scrivere un programma in D, C++ e C# simultaneamente limitandosi a un certo sottoinsieme di D. Ovviamente si dovrebbe ad es. convertire argomenti di template lambda in argomenti di runtime, o auto-replicare template con argomenti diversi, in base alle limitazioni della lingua di destinazione. Un tale strumento di conversione potrebbe rendere D più attraente per la scrittura di determinate librerie, in particolare algoritmi e strutture esotiche di dati, anche se riconosco che non è necessario eseguirlo con metaprogrammazione. – Qwertie

+0

È possibile, ma ciò richiederebbe un traduttore linguistico in fase di compilazione ... Sarebbe un progetto enorme ... – DejanLekic

Problemi correlati