Tutte le lingue sono sostanzialmente le stesse?

38

Recentemente, ho dovuto capire il design di un piccolo programma scritto in una lingua di cui non avevo idea ( ABAP , se devi saperlo). Potrei capirlo senza troppe difficoltà.

Mi rendo conto che padroneggiare una nuova lingua è un gioco di palla completamente diverso, ma la semplice comprensione dell'intento del codice (in particolare il codice standard di produzione, che non è necessariamente complesso) in qualsiasi lingua è semplice, se già conosci un paio di lingue (preferibilmente una procedura / OO e una funzionale).

Questo è generalmente vero? Tutti i linguaggi di programmazione sono costituiti da costrutti simili come loop, istruzioni condizionali e passaggio di messaggi tra le funzioni? Ci sono linguaggi non-esoterici che un tipico programmatore Java / Ruby / Haskell non sarebbe in grado di dare un senso? Tutte le lingue hanno un'origine comune?

    
posta Anirudh 28.07.2009 - 04:49
fonte

7 risposte

87

Le basi della maggior parte dei linguaggi procedurali sono praticamente le stesse.

Offrono:

  • Tipi di dati scalari: in genere booleani, numeri interi, caratteri e caratteri
  • Tipi di dati composti: matrici (le stringhe sono casi speciali) e strutture
  • Costrutti del codice di base: aritmetica su scalari, accesso a matrice / struttura, assegnazioni
  • Strutture di controllo semplici: if-then, if-then-else, while, for loops
  • Pacchetti di blocchi di codice: funzioni, procedure con parametri
  • Ambiti: aree in cui gli identificatori hanno significati specifici

Se capisci questo, hai una buona padronanza del 90% delle lingue sul pianeta. Ciò che rende queste lingue leggermente più difficili da capire è l'incredibile varietà di sintassi dispari che le persone usano per dire le stesse cose di base. Alcuni usano la notazione concisa che implica la punteggiatura dispari (l'APL è un estremo). Alcuni usano molte parole chiave (COBOL è un rappresentante eccellente). Non importa molto. Ciò che importa è se la lingua è già abbastanza completa da sola per svolgere compiti complessi senza farti strappare i capelli. (Provate a codificare un serio hacking delle stringhe nello script della shell DOS di Windows: è in grado di fare Turing ma è veramente pessimo per tutto).

Offerta linguaggi procedurali più interessanti

  • Ambiti nidificati o lessicali, spazi dei nomi
  • Puntatori che consentono a un'entità di fare riferimento a un'altra, con allocazione di memoria dinamica
  • Confezione del codice correlato: pacchetti, oggetti con metodi, tratti
  • Controllo più sofisticato: ricorsione, continuazioni, chiusure
  • Operatori specializzati: operazioni su stringhe e array, funzioni matematiche

Pur non essendo tecnicamente una proprietà della lingua, ma una proprietà dell'ecosistema in cui vivono tali lingue, sono le librerie che sono facilmente accessibili o fornite con la lingua come parte dello strumento di sviluppo. Avere una vasta gamma di servizi di libreria semplifica / accelera la scrittura delle applicazioni semplicemente perché non è necessario reinventare ciò che fanno le librerie. Sebbene Java e C # siano ampiamente considerati come buoni linguaggi in sé e per sé, ciò che li rende veramente utili sono le enormi librerie che vengono con sé e le librerie di estensione facilmente ottenibili.

Le lingue che sono più difficili da capire sono quelle non procedurali:

  • Linguaggi puramente funzionali, senza compiti o effetti collaterali
  • Linguaggi logici, come Prolog, in cui si verificano computazione simbolica e unificazione
  • Lingue di corrispondenza del modello, in cui specifichi le forme che corrispondono al problema e spesso le azioni vengono attivate da una corrispondenza
  • Linguaggi di vincoli, che consentono di specificare le relazioni e di risolvere automaticamente le equazioni
  • Linguaggi descrizione hardware, in cui tutto viene eseguito in parallelo
  • Linguaggi specifici del dominio, come SQL, reti di Petri colorate, ecc.

Esistono due principali stili di rappresentazione per le lingue:

  • Basato sul testo, in cui gli identificatori denominano entità e flussi di informazioni sono codificati implicitamente in formule che utilizzano gli identificatori per denominare le entità (Java, APL, ...)
  • Grafico, in cui le entità vengono disegnate come nodi e le relazioni tra le entità vengono disegnate come archi espliciti tra tali nodi (UML, Simulink, LabView)

I linguaggi grafici spesso consentono i sottolinguaggi testuali come annotazioni nei nodi e sugli archi. I linguaggi grafici di Odder consentono ricorsivamente grafici (con testo :) nei nodi e negli archi. I linguaggi grafici realmente dispari permettono ai grafici di annotazione di puntare ai grafici che sono annotati.

La maggior parte di questi linguaggi si basa su un numero molto piccolo di modelli di calcolo:

  • Il calcolo lambda (base per Lisp e tutti i linguaggi funzionali)
  • Sistemi di post (o tecniche di riscrittura di stringhe / alberi / grafi)
  • Macchine di Turing (modifica dello stato e selezione di nuove celle di memoria)

Dato l'interesse della maggior parte dell'industria sui linguaggi procedurali e sulle strutture di controllo complesse, sei ben servito se impari bene una delle lingue più interessanti di questa categoria, specialmente se include qualche tipo di orientamento all'oggetto.

Consiglio vivamente lo schema di apprendimento, in particolare da un libro davvero meraviglioso: Struttura e interpretazione dei programmi per computer . Questo descrive tutti questi concetti di base. Se conosci questa roba, le altre lingue sembreranno piuttosto semplici tranne la sintassi goofy.

    
risposta data 28.07.2009 - 05:02
fonte
6

I linguaggi di descrizione dell'hardware sono linguaggi di programmazione, ma concettualmente molto diversi. Prova VHDL o Verilog on per dimensioni. Sono comuni per la programmazione di FPGA. (Ok, quindi non sono processori, ma sono dispositivi informatici per uso generico, e dovrebbero essere considerati hardware valido per argomenti di informatica). Devi fare in modo che le cose accadano in modo esplicito in serie. È un modello completamente diverso. Hai pensato a cose che si verificano in parallelo come la regola, non l'eccezione. I loop in verilog si espandono nell'hardware parallelo. Quindi il comportamento "atteso" potrebbe non essere quello che ti aspetti.

    
risposta data 28.07.2009 - 05:02
fonte
4

Dipende da cosa intendi per "in pratica". Tutte le lingue di qualsiasi flessibilità sono complete di Turing. In questo senso: sì, sono praticamente tutti uguali.

A un livello basso, tutti eseguono sequenze di operazioni simili e tutte le cose di Windows, Linux e (recenti) di OS X vengono eseguite su processori Intel compatibili utilizzando gli stessi set di istruzioni. In questo modo sono anche sostanzialmente uguali.

Mi rendo conto che tu hai definito "fondamentalmente" nella tua domanda, ma per rispondere veramente, questa definizione dovrà essere molto più raffinata. In molti modi sono tutti uguali. In molti modi sono distinti. È fin troppo facile dire "dipende". Se si prende l'estremo, la domanda probabilmente non risponderà a ciò che si intende fare in modo che il punto in cui viene tracciata sia cruciale per rispondere alla domanda come lo si intende.

    
risposta data 28.07.2009 - 05:50
fonte
3

Direi che un linguaggio codifica il significato. Se il significato ha un senso in qualche contesto, allora tutte le lingue che potrebbero esprimere il significato potrebbero dirsi equivalenti limitate dal significato e dal contesto.

Se si limita quel contesto a una macchina Von Neumann standard, si potrebbe dire che i significati computazionali del cambiamento della memoria e del calcolo in una CPU sono l'origine - e probabilmente l'unico significato comune a tutte le lingue. Tutte le altre cose sono costruite su queste astrazioni.

    
risposta data 02.07.2012 - 12:06
fonte
2

I linguaggi di programmazione sono anche strumenti per pensare. Con un'altra prospettiva pensante, alcuni problemi scompaiono o vengono trasformati in un tipo diverso e più gestibile (ad esempio, molti modelli di progettazione in stile C ++ scompaiono quando si pensa in Lisp (si veda ad esempio questo presentazione di Peter Norvik ), e Erlang ti libera dal pensare ad una concorrenza di basso livello o distribuita costrutti di calcolo e consente di concentrarsi solo sulla logica dell'applicazione).

Si noti, tuttavia, che a volte i "nuovi" paradigmi possono essere parzialmente applicati ai linguaggi di programmazione "più vecchi", il che spiega perché, per esempio, abbiamo libri che insegnano programmazione funzionale per i programmatori Java . Ma il supporto e l'integrazione nativi di un paradigma più potente a livello linguistico consentono un'applicazione più naturale del paradigma (e di conseguenza rendono impossibile capire i programmi in un linguaggio che supporta paradigmi non familiari, come suggerito da altre risposte - @Ira Baxter che elenca i linguaggi non procedurali e @kwatford che fa riferimento a Paul Graham ).

    
risposta data 29.06.2012 - 09:52
fonte
2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

Al livello più basso, ogni linguaggio di programmazione è lo "stesso", ma ciò non significa che siano uguali al livello in cui effettivamente interagisci. Hanno problemi astratti per te; ciò non significa che essi astraggono gli stessi problemi o che astraggono ogni problema nello stesso modo.

    
risposta data 02.07.2012 - 13:55
fonte
1

Le lingue mature in genere hanno pochi obiettivi e fanno dei compromessi in cui sacrificano una cosa per un'altra. Un linguaggio generico può essere usato per qualsiasi cosa, ma nessuna lingua può mai eccellere in ogni area. Alcuni esempi:

C tenta di essere un linguaggio di programmazione dei sistemi ideale. A tal fine sacrifica la leggibilità e la sicurezza per il controllo e la velocità di basso livello.

Python mira ad essere un linguaggio di scripting ideale. A tal fine sacrifica velocità e verificabilità per produttività e portabilità.

Haskell tenta di essere un linguaggio sicuro, matematicamente puro. A tal fine sacrifica l'apprendimento e le convenzioni per verificabilità e affidabilità.

Questi sacrifici e benefici fanno una enorme differenza nella lingua. Sì, la maggior parte dei linguaggi di programmazione può essere utilizzata per tutto ciò che può essere fatto da un computer, ma nessuna di quelle stesse lingue dovrebbe essere usata per tutto. Tutte le lingue di cui sopra sono quelle che sceglierei per determinati compiti ma non per gli altri. Se stavo programmando un sistema operativo, sceglierei C. Se stavo scrivendo un backend per un sito web, userei Python. E se scrivessi un sistema finanziario, userei Haskell.

Alla fine, la scelta del programmatore è lo strumento giusto per il lavoro.

    
risposta data 13.08.2009 - 05:28
fonte

Leggi altre domande sui tag