Cosa rende una lingua "ottimizzata" per un compito specifico?


15

Spesso ci sono linguaggi di programmazione specializzati per compiti specifici. Alcuni linguaggi di programmazione sono eccellenti nell'aritmetica dell'array (come le matrici e l'uso di array multidimensionali), ma alcuni sono molto meglio in matematica di livello superiore che è difficile da riprodurre in altri linguaggi (ma è comunque possibile lo stesso).

Che dire di una lingua lo rende migliore per un compito specifico o un obiettivo finale rispetto ad altre lingue, dato che la maggior parte semplicemente si compila comunque in assemblea?

Sto parlando delle lingue complete di Turing, quelle che sono equivalenti a Turing.


1
Questa è una domanda enciclopedica. Ti suggerisco di scomporlo in qualche modo, renderlo più specifico.
André Souza Lemos,

5
Sarebbe sbagliato dire "marketing"?
corsiKa

2
@corsiKa Sì, penso che sia più che un problema di marketing.
Jeremy West,

Risposte:


18

Ci sono alcune cose da considerare:

  • Astrazione: cosa considera la lingua "speciale"? I valori delle matrici sono di prima classe, come in Matlab, o li codifichi usando tipi più semplici come gli array, come in C? C ti fa pensare a come vengono implementate le matrici, Matlab no.

    Allo stesso modo, se hai un complicato sistema di comunicazioni asincrone, probabilmente vuoi funzioni di prima classe in modo da poter effettuare richiamate.

    Più funzionalità vengono aggiunte, più complessa diventa la lingua. Quindi, mentre ci sono alcuni linguaggi "multi-paradigma" come C ++ e D, la maggior parte delle lingue sceglie una nicchia, sceglie le cose che sono importanti per quella nicchia e dà priorità a quelle come loro principali astrazioni.

  • Prestazioni: tutta l'astrazione ha un costo, sia in fase di compilazione che in fase di esecuzione. Alcune lingue si limitano in un modo che le rende meno astratte ma più performanti.

    All'inizio Fortran non consentiva puntatori o ricorsioni, quindi era ottimo per lo scricchiolio dei numeri, più veloce di un linguaggio come C, dove stavi eseguendo molti loop. Ma è stato terribile nel codificare strutture di dati di grandi dimensioni, come alberi, in cui erano necessari puntatori per l'indirizzamento indiretto. (Nota che non so molto sul moderno Fortran.)

In sostanza, ci sono sempre dei compromessi. Più astratto significa tempo di esecuzione più lento o maggiore complessità in fase di compilazione. Più funzionalità significa un linguaggio più complesso. Alcune funzionalità rendono alcune cose veloci e altre lente, come i puntatori e la ricorsione. Non esiste un linguaggio perfetto, quindi ogni lingua raggiungerà una sorta di massimo locale nello spazio delle qualità linguistiche.


8

I vincoli di alcune lingue rendono più semplice l'implementazione di un codice più veloce (ad esempio Fortran vs C e aliasing puntatori) che è un compromesso tra prestazioni e possibilità predefinite).

Il linguaggio non è "ottimizzato" per compiti specifici, ma lo rendono l'implementazione, i compilatori e i vincoli che rendono più semplice la comprensione del codice da parte del compilatore. Il vero affare riguarda librerie specifiche, gli algoritmi implementati per accelerare il processo con switch a seconda della lunghezza del problema lo rendono ottimale.

Ad esempio, la moltiplicazione utilizza vari casi (vedi moltiplicazione GMP .

Quando il linguaggio specifica le operazioni matematiche di livello superiore, la sua implementazione è ottimale (efficiente in questo caso), ma non fa parte delle specifiche del linguaggio.

Dai un'occhiata al calcolo del rango di matrice in Matlab, Mathematica e Maple (al momento non posso eseguire tutti i test da solo, ma questi sono coerenti con i miei test). Tutti questi linguaggi (ambienti) implementano la stessa operazione di livello superiore ma i dettagli di implementazione differiscono, il che fornisce varie volte.

Quando alcune attività specifiche del dominio (qui anche la lingua specifica del dominio) sono orientate a calcoli particolari, vengono migliorate e ottimizzate (nel corso degli anni) per il pubblico di destinazione. Ma essere ottimali non è sempre il caso. Ad esempio, Perl ha una lunga storia di gestione delle stringhe, ma i PCRE (qui semplicemente le espressioni regolari di Perl) non sono quelli più veloci esistenti (e usano molta memoria), ma sono estremamente espressivi e potenti.

I vincoli del linguaggio fanno la differenza nel processo di compilazione, l'aliasing puntatore menzionato impedisce la possibilità di riordinare il codice e impone il ricaricamento delle variabili.


9
La maggior parte delle lingue sono Turing complete per specifica, in quanto non tutte specificano dimensioni di indirizzo fisse nelle loro specifiche. Ed è abbastanza limitante perdere la distinzione tra cose come C, che sono le dimensioni dell'indirizzo modulo Turing Complete, e cose come Coq, Agda o System F, che non sono affatto Turing Complete.
jmite,

1
@jmite grazie. Spero che questo non offuschi più le differenze
Evil

@Evil: Beh, penso che la tua affermazione sulle lingue non ottimizzata per le attività sia sbagliata. stai vedendo la parola ottimizzare dal punto di vista del computer. Ma alcune lingue sono progettate per semplificare solo il programmatore e consentire agli implementatori di capire come farlo funzionare.
theDoctor

Questo è dal punto di vista dell'efficienza, quindi non è sbagliato, ho appena preso questo angolo, potresti considerare l'altro (ottimizzato nel senso che è più facile scrivere alcuni compiti specifici in esso). "Che dire di una lingua lo rende migliore per un compito specifico o un obiettivo finale rispetto ad altre lingue [...]", sono molto fiducioso che: più facile da scrivere, più veloce, più economico ecc. Potrebbe essere incluso nel "migliore". L'autore non ha accettato alcuna risposta né incluso chiarimenti o commenti sul fatto che una qualsiasi delle risposte fornite non riguardi ciò che è stato chiesto. Oltre a ciò, è uno dei fattori, per alcune persone più importanti che per altre
Evil

5

A mio avviso, questo può effettivamente essere formulato in modo abbastanza preciso: uno strumento (ad esempio un linguaggio di programmazione insieme alle sue librerie standard) è lo strumento ottimale per una particolare classe di problemi quando minimizza, su tutti i possibili strumenti che potrebbero essere impiegati, il costo previsto per ottenere una soluzione sufficientemente corretta e performante, in cui l'attesa viene presa su una determinata distribuzione di probabilità su tutti i problemi nella classe problematica. Principalmente questo costo si presenta sotto forma di tempo del programmatore e comprende i tempi di progettazione previsti, i tempi di debug previsti, il tempo previsto necessario per educare qualcuno che non ha già familiarità con lo strumento, ecc.

In pratica, quasi nessuna di queste quantità può essere effettivamente misurata. Tuttavia, penso che sia il modo giusto di pensare al problema.


4

È un'ottima domanda e non è facile rispondere. C'è qualcosa nel linguaggio Erlang che lo rende adatto ad applicazioni di telecomunicazione in tempo reale? O è qualcosa del compilatore Erlang? O è qualcosa della comunità e dell'ecosistema Erlang? Forse è che le persone che sanno scrivere le applicazioni di telecomunicazione sono esperte in Erlang, e le persone che conoscono Erlang sono esperte in applicazioni di telecomunicazione? Sospetto che tutti questi fattori abbiano un ruolo.

Probabilmente ci sono due funzionalità in Erlang che lo rendono adatto a tali applicazioni (avvertenza: non ho mai usato il linguaggio da solo) - ha un buon supporto per la concorrenza e supporto per l'aggiornamento dinamico del software. Queste funzionalità sarebbero utili anche in molte altre aree, ma gli ingegneri delle telecomunicazioni sono fanatici del tempo di attività. Forse se le persone che costruiscono siti Web fossero tanto preoccupate per l'alta disponibilità quanto le persone che costruiscono centralini telefonici, anche Erlang sarebbe popolare lì.


3

Le altre risposte mancano il punto di ottimizzare una lingua per un'attività specifica: non si tratta solo di ciò che rende il codice più veloce su un determinato hardware; si tratta di come una lingua in modo chiaro e conciso ti permetta di esprimere la soluzione a un problema. Dipende molto dal dominio del problema e (insieme all'hype di marketing, all'ignoranza delle soluzioni esistenti e al viaggio dell'ego nella scrittura di una nuova lingua) è il motivo per cui abbiamo più lingue: l'obiettivo è che il programmatore scriva meno codice, che è meno soggetto a errori e più facile per il prossimo programmatore da leggere / comprendere / correggere / migliorare.

Ad esempio, sia C che C ++ possono essere utilizzati per la programmazione orientata agli oggetti - e in effetti la libreria GObject è un buon esempio di OO C. La struttura CA contenente puntatori di funzione può servire allo stesso scopo dei metodi virtuali su una classe C ++ e può eseguire meglio; la penalità di sviluppo è il codice di colla per allocare memoria, inizializzare i puntatori a funzione e scegliere una strategia per chiamare metodi "parent". Il più delle volte è più chiaro / più sicuro digitare Class klass * = new class()di struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....


Bene, la risposta del jmite fornisce un punto elenco delle cose che hai scritto mancano. Ho scritto su compiti specifici del dominio che sono ottimizzati per questo argomento. Mi piace C, conosco cose come OCC, ma non rende C Object Oriented (il compilatore non aiuta in questo e vengono impedite molte ottimizzazioni, non c'è garbage collector, ecc.). Non è possibile sovraccaricare le funzioni C come in C ++, ma ovviamente è possibile emulare qualsiasi comportamento (anche jmite ne ha scritto). Non vedo come questo risponda alla domanda dichiarata.
Evil

2
@Evil: la programmazione orientata agli oggetti e il linguaggio di programmazione orientata agli oggetti sono due concetti diversi. La programmazione orientata agli oggetti non richiede un linguaggio orientato agli oggetti. Probabilmente richiede solo l'esistenza di carta o lavagne in modo da poter realizzare il tuo design UML.
Slebetman,

@slebetman Non l'ho visto arrivare. Probabilmente non hai bisogno della carta e della lavagna, puoi solo immaginare oggetti e secondo alcune persone questo è il modo in cui pensiamo, ma questo non si avvicina ulteriormente al supporto linguistico dei concetti di OOP. Mi dispiace, ma questa è una disputa che non voglio scegliere.
Male

@Evil: Non sono così sicuro di essere in grado di tenere traccia di tutto mentalmente senza alcuna astrazione per aiutarti. Il mio primo lavoro è stato dato un grosso pezzo di codice C che assomigliava a tutte le matrici con puntatori a funzione (mi ci è voluto un po 'per capire cosa significasse la strana sintassi - allora niente google) e stavo lottando con esso fino a quando non ho iniziato a vedere uno schema e si rese conto che quelle matrici erano oggetti e quei puntatori di funzione erano metodi. Mi sono comprato una piccola lavagna e ho usato molta carta A4 ma alla fine sono riuscito a capire il codice
slebetman

1
@slebetman Dato che la programmazione orientata agli oggetti precede UML di almeno 20 anni, la tua affermazione che i progetti UML sono necessari per l'orientamento agli oggetti sembra completamente falsa.
David Richerby,
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.