Alla ricerca di un paradigma di programmazione specifico [chiuso]

0

Sto cercando linguaggi di programmazione con un certo paradigma o il nome del paradigma che funziona come segue:

  1. Inizi a scrivere il codice sorgente di un programma o qualcosa di simile a uno script.
  2. Questo viene quindi eseguito dal "compilatore" (interpretato o appena compilato nel tempo) e produce un eseguibile effettivo.
  3. Esegui il codice macchina prodotto.

Quindi il compilatore non traduce solo il codice sorgente in codice macchina, ma fornisce anche un ambiente runtime mentre lo fa. Il codice viene eseguito dal compilatore in uno, senza interazione dell'utente, solo il codice sorgente come input (nessun ciclo Read-eval-print, console o simili).

Ad esempio, C ++ (11/14/17) quindi andare in questa direzione con cose come i modelli ricorsivi e constexpr, dove possono essere eseguite intere funzioni in fase di compilazione (non di runtime). Ma lo immagino ancora più generico e permettendo di riflettere (come Smalltalk, dove tutto è un oggetto). Potrebbe aiutare a ridurre la ridondanza del codice sorgente e consentire una maggiore astrazione.

Esempio di codice:

const char* names[] = { "a", "b", "c", ... };
template<int size>
struct S {
    assert(size < sizeof(names)/sizeof(void*));
    for(int i = 0; i < size; ++i)
        this.add_field(Type::float, names[i]);
}

Questo non può essere fatto in C / C ++, D ha un po 'più di funzioni come ifs statico e così via, ma nessuna lingua che conosco lo supporta.

Esiste un nome per questo paradigma e ci sono linguaggi che si basano strongmente su di esso?

    
posta Alexander Meißner 05.07.2015 - 16:10
fonte

2 risposte

2

Da ciò che descrivi, sembra che tu stia cercando un potente preprocessore per generare il codice che viene successivamente compilato. I preprocessori sono, naturalmente, vecchi quasi quanto i linguaggi informatici stessi, tuttavia, la maggior parte sono davvero limitati nelle estensioni e nelle capacità sintattiche. Afaik, ci sono fondamentalmente due tipi di preprocessori:

  • Preprocessori completi non turing che forniscono poco più dell'inclusione dell'intestazione e / o della compilazione condizionale. Questi non sono ciò di cui hai bisogno.

  • Preelaboratori completi di Turing. Puoi fare qualsiasi computazione in questi, tuttavia, la loro sintassi generalmente fa schifo quanto la sintassi dei non completi completi.

    Conosco due di questi preprocessori:

    • m4

    • Modelli C ++. Sebbene non siano esattamente un preprocessore (funzionano da qualche parte nel mezzo dell'analisi, piuttosto che fare trasformazioni di stringa sul testo di input), sono spesso abusati di fare calcoli complessi in fase di compilazione.

    m4 ha il vantaggio di consentire di ispezionare il codice risultante. Ciò rende più facile eseguire il debug dei programmi generati m4 rispetto ai programmi generati dai template. Ma, come ho detto, la sintassi fa schifo in entrambi i casi, quindi non è possibile scrivere programmi preprocessor complessi e aspettarsi che il codice rimanga leggibile.

Per compiti di pre-elaborazione complessi, guarderei un vero linguaggio interpretato come python o ruby per generare il codice sorgente. Fare una generazione di codice in un linguaggio del genere è un po 'maldestro perché devi scrivere esplicitamente il codice risultante in un file, ma la leggibilità è significativamente maggiore rispetto ai modelli m4 o C ++.

    
risposta data 05.07.2015 - 16:51
fonte
0

NIM link

Fornisce calcoli arbitrari in fase di compilazione con l'intero set di funzionalità del runtime.

    
risposta data 06.07.2015 - 01:16
fonte

Leggi altre domande sui tag