Vorrei affrontare l'idea che molti manifesti hanno dato, che una tale lingua sarebbe "inutile". Forse sarebbe inutile per gli umani scrivere, manualmente, con l'intenzione di risolvere qualche compito particolare. Tuttavia, nonostante sia un caso d'uso di maggioranza per i linguaggi di programmazione, questo non è certamente l'unico caso d'uso. Vengono in mente diversi casi d'uso in cui tale lingua è utile e possiamo guardare a questi campi per esempi di tali lingue.
Innanzitutto, l'allusione di Cort Ammon alla genetica è esatta: la trasformazione del programma nella domanda (in sostituzione )
di 5
) può essere vista come una mutazione . Questo tipo di manipolazione è comune nel campo del calcolo evolutivo ; in particolare gli algoritmi genetici eseguono tali trasformazioni su stringhe , mentre la programmazione genetica trasforma i programmi . In entrambi i casi, di solito vogliamo assegnare un significato a ogni possibilità, poiché ciò produrrà lo spazio di ricerca più compatto.
Gli algoritmi genetici si basano su una sorta di funzione di valutazione per le stringhe; se utilizziamo un interprete del linguaggio di programmazione come nostra funzione di valutazione, allora abbiamo uno scenario in cui è utile un linguaggio di programmazione che assegni significato a tutte le possibili stringhe. Nella programmazione genetica, si presume che la nostra funzione di valutazione sia un interprete del linguaggio di programmazione, ma possiamo scegliere varie rappresentazioni per i nostri programmi; ad esempio, molti sistemi operano su alberi di sintassi astratti. Se scegliamo le stringhe come nostra rappresentazione, recuperiamo lo stesso scenario degli algoritmi genetici.
Un'altra situazione in cui si potrebbe desiderare che ogni stringa sia un programma valido è quando si elencano i programmi. Ciò è legato alla biiezione menzionata da CodesInChaos, ma potremmo preferire operare su stringhe piuttosto che su numeri naturali per diversi motivi:
- Se esiste una struttura nella lingua, ad es. possiamo assegnare un significato alle sottostringhe, ciò può andare perso durante la traduzione in numeri naturali. In questo caso potremmo preferire usare le stringhe, per ragionare e trasformare le sottostringhe localmente, piuttosto che rappresentare l'intero programma come un numero. Questo è analogo a come potremmo preferire usare operazioni bit per bit su espressioni int piuttosto che aritmetiche, quando ogni bit ha un significato individuale. Questa è fondamentalmente una generalizzazione dello scenario evolutivo.
- Potremmo voler generare i programmi su richiesta; per esempio, potremmo iniziare l'esecuzione di un programma che è completamente indeterminato e generare (es. casualmente) le singole istruzioni (es. caratteri) quando / se il puntatore dell'istruzione li raggiunge. Questo è comune nella teoria dell'informazione algoritmica, in cui il programma è un nastro di Turing e lo scopo è quello di caratterizzare il comportamento dei programmi generati casualmente. Ad esempio, possiamo formulare il Solomonoff prima di stringhe arbitrarie come la probabilità che una macchina di Turing universale con un nastro casuale emetta quella stringa.
In termini di linguaggi di esempio, molti sistemi di calcolo evolutivo si basano su linguaggi stack come la famiglia Push . Questi tendono a consentire flussi arbitrari di token (che potremmo rappresentare come singoli personaggi). A volte (come nell'esempio Brainfuck di BrainSlugs83) ci sono restrizioni sul bilanciamento delle parentesi; tuttavia, possiamo collegarlo a programmi di delimitazione automatica , in quanto una stringa come [
potrebbe non essere un programma valido , ma è un prefisso di programma valido . Se immaginiamo che un compilatore / interprete legga il codice sorgente da stdin, allora non rifiuterà una stringa come [
, semplicemente aspetterà più input prima di continuare.
Linguaggi come Logica combinatoria binaria e Calcolo lambda binario sono nati direttamente senza lavoro sulla teoria dell'informazione algoritmica, ad es. da http://tromp.github.io/cl/cl.html
La progettazione di un computer universale minimalista è stata motivata dal mio desiderio di elaborare una definizione concreta della complessità di Kolmogorov, che studia la casualità dei singoli oggetti.
You are a bimbo.