E 'difficile rispondere a domande di tipo "è X un Y ", se i partecipanti dell'uso dibattito diverse definizioni di X e Y . Potrebbe essere che per alcune definizioni, la risposta sia "sì" e per alcune definizioni la risposta sia "no". Soprattutto se la risposta dipende da dettagli tecnici in cui le diverse definizioni differiscono. Anche questa discussione contiene alcune informazioni sbagliate, quindi per favore abbi pazienza con una risposta più lunga.
Cosa intendiamo per " linguaggio di programmazione "?
Una semplice risposta potrebbe essere "una lingua utilizzata per creare programmi". Certo, ma: che tipo di programmi? Che dire di una lingua che potrebbe essere utilizzata per creare alcuni tipi di programmi, ma non altri tipi di programmi? Ecco due esempi specifici per illustrare i casi estremi:
1) Un linguaggio immaginario chiamato M funziona così: Se il programma contiene la singola lettera "m", crea un gioco di Minesweeper. Tutto il resto è un errore di sintassi.
Intuitivamente, questo non è ciò che intendiamo dicendo "un linguaggio di programmazione". Ma il dipartimento marketing di M potrebbe sostenere che soddisfa tecnicamente la definizione, perché può essere utilizzato per creare un programma. Certo, il compilatore fa alcune parti critiche per te, ma è quello che fanno i compilatori, vero? Un compilatore del linguaggio C traduce anche alcune semplici parole in dozzine di istruzioni del processore. Il compilatore M va oltre e rende il tuo lavoro ancora più semplice.
2) Se installi la versione originale del famoso Turbo Pascal, puoi scrivere molti tipi di programmi. Ma non puoi scrivere un gioco che gira nel browser web, perché l'API necessaria semplicemente non c'è.
Quindi qual è esattamente la cosa che rende Turbo Pascal un linguaggio di programmazione, ma M non ce l'ha? In parole semplici, puoi fare di più in Pascal che in M. Ma immagina di avere un M.NET, che crea un gioco Minesweeper in esecuzione in un browser web. Quindi ora abbiamo qualcosa che Pascal può fare e M.NET non può, ma abbiamo anche qualcosa che M.NET può fare e Pascal non può. Perché dovremmo considerare importanti i vantaggi di Pascal e irrilevanti i vantaggi di M.NET?
La risposta è che puoi scrivere tutti i tipi di algoritmi in Pascal, ma non puoi scrivere algoritmi in M o M.NET. Certo, M compila il tuo comando "m" e C compila il tuo comando "strcmp". Ma puoi inserire "strcmp" in un contesto più ampio, ad esempio confrontare due file riga per riga oppure leggere migliaia di stringhe e ordinarle in ordine alfabetico o ... beh, milioni di altre cose. Ed è proprio questa capacità di utilizzare determinati comandi in qualsiasi algoritmo che costituisce l'essenza di un linguaggio di programmazione.
Che cos'è esattamente un algoritmo e, cosa più importante, che cos'è "qualsiasi algoritmo"? Nell'informatica usiamo le parole Turing-complete . L'idea è che esiste un insieme di linguaggi per computer, in cui ciascuno di essi è in grado di simularli tutti. Una di quelle lingue è la macchina di Turing, motivo per cui vengono chiamate così. Pascal è lì, C c'è, Java c'è, Python c'è, Lisp è presente, Smalltalk è presente, anche XSLT è presente. Le nostre ipotetiche M e M.NET non ci sono. Puoi saperne di più in qualsiasi università fornendo un decente corso di informatica, ma l'idea è che un linguaggio completo di Turing può fare qualsiasi cosache può fare un'altra lingua completa di Turing, se si fornisce loro l'API minima necessaria. (Se dai qualche API del browser Web a Pascal, puoi creare tutti i tipi di giochi nel browser Web. Se dai l'API del browser Web a M, sei ancora in grado di creare Minesweeper.) Potremmo dire metaforicamente che se rimuovi tutte le API da un linguaggio di programmazione, l'importante è ciò che rimane.
Cosa intendiamo con " espressioni regolari "?
Diversi linguaggi di programmazione li implementano in modo leggermente diverso. Ma l'idea originale era che le espressioni regolari esprimessero i cosiddetti linguaggi regolari . Nota che qui non parliamo di linguaggi di programmazione, ma di linguaggi (pseudo-) umani. Immagina di trovare una tribù esotica che parla una lingua composta solo da parole "ba", "baba", "bababa" e così via. Potresti descrivere verbalmente questo linguaggio come "una sillaba 'ba' ripetuta una o più volte" o usando un'espressione regolare come "(ba) +".
Le espressioni regolari dovrebbero esprimere: "niente", "questa lettera", "questo, seguito da quel", "questo o quello", "questo, ripetuto una o più volte", e "non questo". - Questa è la definizione matematica . Nient'altro è solo una comoda scorciatoia costruita dai componenti precedenti. Ad esempio "questo, ripetuto due o tre volte" può essere tradotto come "questo, seguito da questo, seguito da (questo o niente)", ma potrebbe essere più conveniente scrivere "ba {2,3}" rispetto a "baba (ba)?".
Nella vita reale, un'implementazione tipica di "espressioni regolari" implementa più di questo. Ad esempio, usando la definizione matematica, un linguaggio di "aba", "aabaa", "aaabaaa" e così via - qualsiasi numero di "a" s, seguito da una "b", seguito dallo stesso numero di "a "s - non è un linguaggio normale. Tuttavia, molte "espressioni regolari" utilizzate oggi potrebbero rilevarlo, usando il concetto aggiuntivo di "la stessa cosa che abbiamo trovato prima", scritto come "(a +) b \ 1". Usando questo concetto aggiuntivo, possiamo fare alcune cose interessanti, ad esempio rilevare parole costituite da un numero primo di lettere. Tuttavia, non possiamo fare alcun algoritmo ... per una spiegazione del perché,
Quindi, tornando all'argomento originale: le espressioni regolari (definite come: espressioni che descrivono i linguaggi regolari nella gerarchia di Chomsky; o come: la prima, più l'operazione \ 1) sono un linguaggio di programmazione (definito come: Turing-complete)? La risposta è no . No, non è possibile implementare alcun algoritmo utilizzando espressioni regolari e la capacità di implementare qualsiasi algoritmo è ciò che le persone che studiano informatica in genere comprendono come l'essenza del linguaggio di programmazione.
Naturalmente, chiunque può cambiare la risposta insistendo su una definizione diversa . Come ho scritto all'inizio, i dettagli tecnici sono importanti qui. Se sbagli, ottieni una risposta sbagliata.
E se siete non è interessato ai dettagli tecnici, la risposta potrebbe essere: È possibile utilizzare le espressioni regolari (e nient'altro) per fare un programma? No. Quindi perché chiamarlo un linguaggio di programmazione? (Tuttavia, una risposta come questa è stata scaricata ed eliminata qui, motivo per cui ho scritto questa versione più lunga.)
EDIT: Inoltre, chiunque può creare una libreria implementando la propria nuova variante di "espressioni regolari" con alcune nuove funzionalità aggiunte. Ad un certo momento, le nuove funzionalità potrebbero essere sufficienti affinché l'intero sistema diventi Turing completo. Un esempio banale sarebbe incorporare un linguaggio completo di Turing usando una nuova sintassi; ma può anche succedere meno ovviamente. Forse è già successo.