I linguaggi di programmazione stanno diventando più simili ai linguaggi naturali?


27

Possiamo studiare i linguaggi di programmazione nel contesto della linguistica? I linguaggi di programmazione si evolvono naturalmente in modo simile ai linguaggi naturali?

Sebbene la piena razionalità e la coerenza matematica siano essenziali per i linguaggi di programmazione, c'è ancora la necessità (specialmente i linguaggi moderni) di renderli leggibili e confortevoli per gli umani.

I linguaggi di programmazione si stanno evolvendo per diventare più linguistici e quindi più naturali? Ad esempio codice macchina, schede perforate e linguaggi di assemblaggio hanno lasciato il posto a linguaggi più leggibili come Ruby e Python ecc.

Quando dico che i linguaggi informatici stanno diventando più naturali, non intendo che contengono più "parole che abbiamo in inglese", intendo che sembrano diventare più simili a un linguaggio naturale, in termini di complessità grammaticale e capacità di esprimere significato (ad esempio, essere in grado di descrivere in modo eloquente una query da un database in modi comprensibili sia razionali che umani).

Cosa ne pensate? I linguaggi di programmazione stanno diventando più simili ai linguaggi naturali e diventando quindi applicabili alle leggi della linguistica?

O forse le lingue vivono in uno spettro, dove da una parte si hanno le lingue razionali estreme e dall'altra la più creativa. Forse, la programmazione e i linguaggi naturali sono identici ed entrambi giacciono su questo spettro linguistico (la loro unica differenza, forse essendo la "cosa" a cui stanno cercando di dare il loro significato).

Esiste una connessione tra la separazione (effetto Babel Tower) dei linguaggi umani e delle lingue dei computer? Diventano più diversificati per le stesse ragioni (ovvero per risolvere problemi diversi all'interno di sistemi informatici / sistemi di cultura in continua evoluzione, ecc.)?


3
risposta breve: sì, sì lo sono.

17
Risposta breve: no, no non lo sono.


3
I linguaggi informatici tendono a fare bene con terseness e precisione, un po 'come la notazione matematica, che non ha mostrato alcuna particolare inclinazione a evolversi verso il linguaggio naturale (di cui sono a conoscenza) negli ultimi millenni. Dubito anche che se comunicassi con il tuo bambino esclusivamente a Haskell per i primi anni della sua vita, svilupperebbe una fluidità del linguaggio naturale. Quindi, penso che ci sia un contrasto piuttosto netto tra i linguaggi naturali e quelli informatici. Forse una più ampia diffusione delle tecniche di costruzione del linguaggio ha migliorato leggermente la "naturalezza" nel tempo, suppongo.

@ryanOptini: C #, JavaScript, Python o SQL assomigliano ai linguaggi naturali? Mentre tutti usano parole chiave della lingua inglese, nessuno di loro converge in un formato di lingua naturale. COBOL potrebbe essere stato il più vicino, ma non credo che molte persone stiano usando COBOL per i loro progetti greenfield.
Jim G.

Risposte:


32

Non proprio no. I linguaggi di programmazione sono diventati più simili ai linguaggi naturali solo nel senso di "parole che abbiamo in inglese" ( sic ).

Una caratteristica chiave dei linguaggi di programmazione è che non sono ambigui. Quando scrivi un programma ed eseguilo, ha un significato ben definito, che è il suo comportamento. Se vuoi scrivere un programma che funzioni come previsto (un obiettivo difficile), è importante che il comportamento¹ del programma sia il più prevedibile possibile. I linguaggi di programmazione non hanno fatto molta differenza nell'ampio divario con i linguaggi naturali.

Al contrario, c'è stato del lavoro per colmare il divario dall'altra parte: analizzare i linguaggi naturali con gli stessi strumenti dei linguaggi di programmazione. Questo campo è chiamato elaborazione del linguaggio naturale . Questi approcci sono stati praticamente scartati a favore dell'apprendimento automatico . Citerò un passaggio nell'articolo di Wikipedia che è direttamente rilevante qui:

Fino agli anni '80, la maggior parte dei sistemi di PNL erano basati su insiemi complessi di regole scritte a mano. A partire dalla fine degli anni '80, tuttavia, si è verificata una rivoluzione nella PNL con l'introduzione di algoritmi di apprendimento automatico per l'elaborazione del linguaggio. Ciò era dovuto sia al costante aumento del potere computazionale derivante dalla Legge di Moore sia alla graduale riduzione del dominio delle teorie della linguistica chomskyana (ad esempio grammatica trasformazionale), le cui basi teoriche scoraggiarono il tipo di linguistica corpus che sta alla base dell'approccio di apprendimento automatico a elaborazione del linguaggio.

Un modo in cui la programmazione si sta evolvendo è che mentre progettiamo sistemi sempre più grandi, il codice sorgente non è sempre un buon modo per capirli. Ad esempio, una CPU Intel è uno degli oggetti più complessi mai progettati da Man e il suo "codice sorgente" non è solo una raccolta di file di testo, tutt'altro. Ma il design completo non si sta evolvendo verso nulla che assomigli ad un linguaggio umano. Non so quali siano gli strumenti cognitivi o le metafore appropriati qui, e non credo che nessuno lo sappia ancora; chiedilo di nuovo tra un paio di secoli.

¹ O piuttosto l'insieme di possibili comportamenti annotato con le circostanze in cui si presentano, ma ciò aggiunge solo un passaggio di indiretta nella modellazione, quindi questo non è davvero rilevante qui.


Vale la pena notare che i tentativi di creare linguaggi "naturali" più simili ai linguaggi di programmazione non hanno avuto molto successo. Vedi Lojban come l'esempio più sviluppato.
Dougal,

il confronto tra architettura della CPU e programmazione è alquanto disonesto, la progettazione hardware è sempre stata in gran parte non basata su testo, in quanto ha problemi completamente diversi da risolvere, ad esempio problemi di posizionamento e routing 2D. (se qualcosa di hardware design si sta spostando verso un design più testuale con HDL)
jk.

2

I linguaggi informatici tendono a fare bene con terseness e precisione, un po 'come la notazione matematica, che non ha mostrato alcuna particolare inclinazione a evolversi verso il linguaggio naturale (di cui sono a conoscenza) negli ultimi millenni.

Dubito anche che se comunicassi con il tuo bambino esclusivamente a Haskell per i primi anni della sua vita, svilupperebbe una fluidità naturale del linguaggio. Quindi, penso che ci sia un contrasto piuttosto netto tra i linguaggi naturali e quelli informatici.

Forse una più ampia diffusione delle tecniche di costruzione del linguaggio ha migliorato leggermente la "naturalezza" nel tempo, dal momento che i programmatori "votano con quei piedi" usando linguaggi che sembrano più facili per loro e il numero di persone in grado di creare lingue è aumentato di più professionisti e strumenti migliori, ma questo è un piccolo effetto attorno ai bordi e non rappresenta una trasformazione fondamentale dei linguaggi di programmazione in linguaggi umani.


2

un caso di studio interessante in questo settore è Perl vs Ruby (e Python ). Perl è un linguaggio di scripting sviluppato nei primi anni '90 che ha aggiunto molte funzionalità rispetto ai precedenti linguaggi di scripting basati su Unix (ad esempio bash). l'autore Larry Wall ha dichiarato che il suo background in linguistica ha ispirato alcune caratteristiche linguistiche.

tuttavia Perl ha una sintassi imbarazzante e molti casi speciali che rendono la lingua un po 'come l'inglese in tutte le sue sottili idiosincrasie che ispirano vari livelli di critica . i linguaggi di scripting successivi come Ruby e Python, sviluppati da scienziati informatici, hanno molta più coerenza nella loro sintassi. il problema principale è che il linguaggio naturale ha una grande quantità di ambiguità (questo è studiato nel campo della linguistica.) Quindi il linguaggio naturale avrà un posto chiave sulle future interfacce uomo-computer come Siri, ma tali interfacce saranno intrinsecamente soggette a problemi di ambiguità.

quindi, ecco un caso in cui l'evoluzione dei linguaggi informatici è andata via da un'idea di linguaggio naturale. inoltre, la storia generale dei linguaggi di programmazione per computer è che sono stati sviluppati e modificati per rimuovere l' ambiguità (che è altamente inerente al linguaggio naturale). questo non è stato compreso all'inizio della storia dei compilatori (diciamo forse negli anni '70) e, ad esempio, le prime versioni del linguaggio Fortran avevano dichiarazioni con significati ambigui che dipendevano dall'implementazione del compilatore. parte della teoria del linguaggio CS correlata all'analisi è stata sviluppata in parte in risposta alla scoperta di ambiguità nell'analisi del linguaggio.


Hai sbagliato le date: Perl è stato rilasciato nel 1987, Bash nel 1989. È anche preoccupante leggere i tuoi messaggi a causa dei suoi errori di capitalizzazione.
tchrist,

1

Il linguaggio macchina è molto preciso, mentre un testo scritto di solito può essere interpretato in molti modi diversi (ad esempio un testo poetico).

Ciò che è sempre più evoluto è la corrispondenza dei modelli, ad esempio quando scrivi un brutto codice un compilatore può aiutarti a proporre diverse possibili soluzioni e quindi lanciare qualche avvertimento o errore che può aiutarti a scappare. (basato su modelli di codice comuni per esempio)

Esiste una ricerca specifica sui modelli di interazione / progettazione, anche T9 e SWYPE sono riconoscitori di schemi che ti aiutano molto (i programmi che registrano la tua voce e la convertono in testo sono anche riconoscitori di schemi).

Naturalmente un programma si basa su meccanismi precisi, quindi hai bisogno di linguaggi precisi (non naturali), mentre una semplice ricerca web su google è molto naturale, devi solo digitare poche parole e ottenere ciò che desideri.

Ogni compito e obiettivo diverso ha una sua lingua, non è una semplice "evoluzione della singola lingua", ci sono molte più lingue. Compiti precisi richiedono lingue precise e compiti rilassati richiedono lingue rilassate

È possibile scrivere lo stesso pezzo di codice C e quindi compilarlo con diversi compilatori diversi e (a meno che non sia stato corretto un compilatore) il risultato del codice sarà lo stesso anche se viene generato un assembly diverso, mentre per una ricerca Web si ottiene lo stesso le parole chiave per diversi motori di ricerca danno risultati diversi.


1

Alcuni anni fa io e mio figlio maggiore abbiamo sviluppato un sistema di programmazione e sviluppo in inglese semplice nell'interesse di rispondere alle seguenti domande:

  1. I programmi di basso livello (come i compilatori) possono essere scritti in modo conveniente ed efficiente in lingue di alto livello (come l'inglese)?

  2. I linguaggi naturali possono essere analizzati in modo relativamente "sciatto" e fornire comunque un ambiente abbastanza stabile per una programmazione produttiva?

  3. È più facile programmare quando non devi tradurre i tuoi pensieri in linguaggio naturale in una sintassi alternativa?

Ora possiamo rispondere a ciascuna di queste tre domande, per esperienza diretta, con un clamoroso "Sì".

Il nostro parser opera, pensiamo, qualcosa di simile al cervello umano. Ritenere. Un padre dice a suo figlio piccolo:

"Vuoi succhiare questa bottiglia, ragazzo?"

E il bambino sente

"blah, blah, SUCK, blah, blah, BOTTIGLIA, blah, blah."

Ma risponde correttamente perché ha una "foto" di una bottiglia sul lato destro della testa collegata alla parola "bottiglia" sul lato sinistro e un'abilità "preesistente" vicino alla parte posteriore del collo collegata al termine "succhiare". In altre parole, il bambino abbina ciò che può con le immagini (i tipi) e le abilità (routine) che ha accumulato, e semplicemente ignora il resto. Il nostro compilatore fa praticamente la stessa cosa, con nuove immagini (tipi) e abilità (routine) che vengono definite - non da noi, ma - dal programmatore, mentre scrive il nuovo codice dell'applicazione.

Una tipica definizione di tipo è simile alla seguente:

Un poligono è una cosa con alcuni vertici.

Internamente, il nome "poligono" è ora associato a un tipo di struttura allocata dinamicamente che contiene un elenco di vertici doppiamente collegati. "Vertice" è definito altrove (prima o dopo questa definizione) in modo simile; il plurale viene compreso automaticamente.

Una routine tipica si presenta così:

Per aggiungere un x coord e ay coord a un poligono: creare un vertice dato x e y. Aggiungi il vertice ai vertici del poligono.

Si noti che i nomi formali (nomi propri) non sono richiesti per parametri e variabili. Questo, crediamo, è una visione importante. La mia sedia e il tavolo del mondo reale non sono mai (in una normale conversazione) chiamati "c" o "myTable" - mi riferisco a loro semplicemente come "la sedia" e "il tavolo". Allo stesso modo qui: "il vertice" e "il poligono" sono i nomi naturali di tali cose.

Si noti inoltre che gli spazi sono consentiti nei "nomi" di routine e variabili (come "x coord"). Questo è il 21 ° secolo, sì? E anche i "soprannomi" sono consentiti (come "x" per "x coord"). E quei possessivi ("vertici poligonali") sono usati in modo molto naturale per fare riferimento a "campi" all'interno di "record".

Si noti, inoltre, che la parola "dato" avrebbe potuto essere "usando" o "con" o qualsiasi altro equivalente poiché la nostra analisi sciatta si concentra sulle immagini (tipi) e sulle abilità (routine) necessarie per la comprensione e ignora il più possibile, il resto.

Al livello più basso, le cose sembrano così:

Per aggiungere un numero a un altro numero: Intel $ 8B85080000008B008B9D0C0000000103.

Si noti che in questo caso abbiamo sia la più alta che la più bassa delle lingue - inglese e codice macchina (anche se in formato esadecimale) - in una singola routine. L'intuizione qui è che (come un tipico libro di matematica) un programma dovrebbe essere scritto principalmente in un linguaggio naturale, con frammenti appropriati in sintassi più convenienti come (e solo come) richiesto.

Puoi ottenere il nostro sistema di sviluppo qui: www.osmosian.com/cal-3040.zip. È un piccolo programma Windows, di dimensioni inferiori a un megabyte. Se inizi con il PDF nella directory "documentazione", prima di passare a dieci pagine dovrai ricompilare l'intero shebang in sé (in meno di tre secondi su un computer di fascia bassa di Walmart).

Domande e commenti devono essere indirizzati a gerry.rzeppa@pobox.com


Sei a conoscenza di trypto.ifi.uzh.ch/site/description english controllato? sembra che tu stia seduto tra quello e Inform7 en.wikipedia.org/wiki/Inform#Example_game_2
Pete Kirkham,

Mi piace l'idea, ma sembra che ci siano ancora alcuni cerchi di sintassi da saltare. Ad esempio, non penso che io o chiunque modellasse cose geometriche considereremmo che le coordinate X e Y vengano aggiunte separatamente, quindi "Aggiungere un x coord e ay coord ..." mi sembra davvero strano. Come fa "Crea un vertice dato x e y". Quasi perdonabile poiché in realtà legge principalmente come l'inglese, ma sembra ancora troppo severo. Forse sono troppo abituato a non pensare come un essere umano o qualcosa del genere, non lo so.
cHao,

1

La separazione delle lingue umane deriva dall'evoluzione (darwiniana?) In comunità isolate. La separazione dei linguaggi di programmazione deriva dalle variazioni delle necessità tecniche, dell'ideologia tecnica, dai cambiamenti nella comprensione tecnica e teorica, dai cambiamenti nella nostra capacità tecnica di attuazione. È un processo un po 'più consapevole, credo.

I linguaggi informatici potrebbero essere più simili ai linguaggi naturali? Probabilmente un po ', fino a un certo punto. Immagino che gran parte della complessità del linguaggio naturale derivi da una varietà di fenomeni di evoluzione simultanea che non hanno motivo di produrre un risultato coerente in un dato momento, anche se è probabile che le vecchie incongruenze vengano probabilmente eliminate progressivamente mentre ne appare una nuova . Non sono un esperto di linguistica diacronica. Ma vogliamo quel tipo di complessità nei linguaggi di programmazione.

La questione dell'ambiguità è importante, ma non come affermato dalla maggior parte delle persone. Un linguaggio è un mezzo di comunicazione e deve essere analizzato nel contesto di quella comunicazione (uomo-uomo, uomo-macchina, entrambi, tra luoghi o tra tempi, ... per dirlo un po 'semplicisticamente). Ciò che conta non è se puoi fare solo affermazioni non ambigue nella lingua, ma se puoi sempre assicurarti che la comunicazione sia chiara nel contesto previsto. Esiste un linguaggio di programmazione ben noto e ampiamente utilizzato, che consente di scrivere programmi ambigui (beh, lo ha fatto, ma non ho guardato le ultime versioni per un po '). In questo caso, il compilatore è abbastanza intelligente da rilevare l'ambiguità e chiedere chiarimenti, che possono essere incorporati nel programma per eliminare l'ambiguità. Si noti che il rilevamento dell'ambiguità non significa che solo una delle possibili scelte abbia un significato, lo fanno tutti. Il problema è se una delle entità comunicanti può rilevare l'ambiguità in modo che il mittente possa chiarirla. Gli esseri umani sono cattivi in ​​questo, ma i computer possono essere piuttosto bravi.

Formalismi e linguaggi di programmazione potrebbero avere una sintassi più ricca e flessibile. Credo che il motivo principale per cui non lo fanno sia il semplice conservatorismo. Gli strumenti sintattici utilizzati sono ancora molto spesso strumenti progettati trenta anni fa o più, per soddisfare i limiti dei computer di quel tempo. L'efficienza di analisi non è più un problema così critico nella compilazione e esistono tecniche più potenti.

È interessante notare che la base più ampiamente usata per la sintassi dei linguaggi di programmazione deriva dalla ricerca sul linguaggio naturale: la grammatica senza contesto. Gran parte della ricerca tecnica passò all'informatica / tecnica negli anni sessanta, per essere in qualche modo riscoperta nei primi anni ottanta da persone di linguaggio naturale (sto semplificando). Da allora, sono stati fatti molti progressi per la sintassi nei linguaggi naturali, mentre l'informatica sembra in gran parte bloccata con vecchi strumenti sintattici. Il pendolo del linguaggio naturale ora sta di nuovo oscillando verso tecniche statistiche, ma gli approcci algebrici per la sintassi non vengono dimenticati. Molto probabilmente, buoni approcci verranno da una combinazione di tecniche algebriche e statistiche.

La mia sensazione è che l'area critica sia la semantica e la transizione tra sintassi e semantica. Questo è ancora molto difficile da formalizzare per il linguaggio naturale, mentre abbiamo molte tecniche precise nel caso dei linguaggi di programmazione e dei sistemi formali. Poiché il gioco è lungi dall'essere giocato per i linguaggi naturali, è difficile dire quale impatto potrebbe avere sui linguaggi di programmazione in futuro.

Un altro punto è che molti progettisti di linguaggi di programmazione stanno provando a provare qualcosa o applicare un'ideologia tecnica. Così diventano estremamente prescrittivi nella loro progettazione per impedire agli utenti di discostarsi dai paradigmi previsti. Questo è purtroppo estremamente controproducente per la creatività. Il linguaggio più creativo mai progettato fu tra i primi: Lisp (1958). La libertà e la flessibilità che ha permesso è stata la fonte di notevole creatività. Il prezzo era che richiedeva autodisciplina e comprensione. Ma Lisp era davvero un metalinguaggio, una lingua per la creazione di lingue.

Ora, per prendere un'altra prospettiva, i programmi sono in realtà prove della loro specifica vista come una dichiarazione matematica (beh, sto semplificando di nuovo). Alcune persone (non ricordo riferimenti, mi dispiace) hanno giocato con dimostratori di teoremi per produrre prove che sembravano essere state scritte da un matematico in linguaggio naturale. Quindi immagino che l'idea di avere programmi che sembrano scritti in linguaggio naturale potrebbe non essere del tutto assurda.

Si può tuttavia notare che, anche se scritto in modo informale da un matematico, il discorso matematico sembra molto diverso dal discorso ordinario o da un libro di storia. Ciò è dovuto a una differenza significativa nell'universo del discorso interessato, i domini semantici di cui si parla. Quindi, mentre puoi immaginare linguaggi di programmazione che assomigliano più ai linguaggi naturali, c'è una limitazione naturale che è il dominio del discorso e le sue proprietà desiderabili. Molto probabilmente rimarrà essenzialmente superficiale, cioè prevalentemente sintattica. Il matematico può parlare di sistemi formali e di politica. Spero che i due discorsi non sembrino simili. I computer non possono (ancora?) Parlare di politica o capirla. Il giorno in cui lo faranno non sarà più programmazione.

Guardando indietro alla storia, le lingue di alto livello erano, fin dal primo (FORTRAN) un tentativo di avvicinarsi a una forma più naturale per esprimere compiti computazionali, ma questi compiti erano intesi come matematici o logici (Fortran 1957, Algol 1958, Lisp 1958 ) o più orientato al business (Cobol 1959). Entro 10 anni le persone si preoccupavano delle lingue più vicine, meglio adattate al problema attuale, e c'erano ricerche significative nel cosiddetto extensible languages, che copriva sia la sintassi che la semantica. Uno dei principali percorsi per esprimere i problemi in modo più naturale è stato l'emergere object orientation(a volte con altri nomi). Sebbene sia sempre difficile assegnare la genitorialità, probabilmente è emerso dal lavoro sull'intelligenza artificiale, principalmente in Lisp, e dalla linguaSimula 67(Famiglia Algol) che era stata concepita per esprimere problemi del mondo reale più naturali che dovevano essere simulati su un computer. Sembra tutto storicamente coerente.


0

Sebbene siano simili in quanto le domande poste sono simili, sono abbastanza distinte in termini di complessità. La differenza principale è che il linguaggio naturale è intrinsecamente ambiguo (anche a livello di parole). Non è nemmeno chiaro cosa si intende con una parola? Nel mondo dei linguaggi di programmazione, tuttavia, sono disponibili numerosi dispositivi di definizione. Guarda le grammatiche per l'analisi del linguaggio naturale e quelle per l'analisi dei linguaggi di programmazione, la differenza di dimensioni è sorprendente. Il fatto è che le grammatiche per i linguaggi di programmazione sono sistemi formali; quindi sono suscettibili di analisi matematica. Affrontare le ambiguità fa emergere molti problemi per i quali una soluzione nella controparte del linguaggio di programmazione sarebbe banale o semplice.

Forse il divario tra linguaggi naturali e linguaggi di programmazione si ridurrà se si riduce il divario tra scienziati informatici e persone "naturali".


0

Negli ultimi anni, l'interesse per (E) DSL e le interfacce fluide è in costante aumento, in una grande varietà di lingue: Haskell, i vari linguaggi di scripting, C #, Java e persino C ++ (pensa al sovraccarico di operator<<per fare output).

In una certa misura, consentono al codice di essere letto in modo più naturale. Illustrerò con un esempio EDSL in groovy. Il pacchetto groovy.time ti permette di scrivere

use ( TimeCategory ) {
    // application on numbers:
    println 1.minute.from.now
    println 10.days.ago

    // application on dates
    def someDate = new Date()
    println someDate - 3.months 
}

Se dovessi farlo tramite la classe java.util.Calendar dovresti scrivere qualcosa del genere per il primo esempio:

void demo() {
    Calendar date = new GregorianCalendar();
    date.add(Calendar.MINUTE, 1);
    System.out.println(date);
}

0

I linguaggi informatici (anche i linguaggi macchina rudimentali dei giorni passati) sono linguaggi umani, in quanto sono principalmente per la comunicazione con altri esseri umani, sono definiti dagli umani e sono usati solo secondariamente per trasmettere istruzioni a una macchina. Quindi si evolvono più o meno allo stesso modo in cui si evolvono i linguaggi "naturali" (basta cercare gli idiomi per la tua lingua preferita, controllare come ad esempio C si è evoluto da K&R C all'attuale ISO-C 2011. Ma esistono in un ambiente diverso, essi deve trasmettere un significato preciso (i computer sono ancora troppo stupidi per dare un senso e correggere ciò che viene loro chiesto) e c'è un vantaggio in termini di facilità di elaborazione (quindi la grammatica e il vocabolario anche di C ++, PL / 1 o APL sono molto più semplici che ad esempio l'inglese, che come le lingue naturali vanno è piuttosto semplice).

Si può dire più o meno la stessa cosa del formalismo della matematica o delle scienze in generale, o persino dei progetti (intrinsecamente 2D, non 1D come gli altri).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.