Domanda

So che questo è molto astratto, ma credo che sia molto concentrato.

Ci sono un sacco di linguaggi di alto livello oggi: C # , Java , VB , Python , ecc ., tutti creati ad astrarre basso livello di complessità e di fornire una più esperienza di programmazione user-friendly. linguaggi di alto livello in grado di ridurre, e la maggior parte del tempo completamente rimuovere, la necessità di eseguire basso livello, le operazioni di processo specifiche (come la manipolazione puntatore e gestione della memoria). Molti dettagli piattaforma anche rimuovere (come la manipolazione di file, la generazione di interfaccia utente, ecc.)

Le mie due domande sono:

  1. Che altro può / deve essere estratta? Ci sono più la semantica di basso livello presente in linguaggi di alto livello di oggi che saranno / dovrebbe essere astratte via ulteriormente?
  2. A che punto fa un general-purpose, linguaggio di alto livello diventare molto alto -level , alias obiettivo orientato
È stato utile?

Soluzione

Uno dei problemi con inclusi astrazioni di altissimo livello in una lingua è che a volte non sono sufficienti per tutto ciò che si desidera ottenere fatto, così si finisce per dover astrazioni di livello inferiore, anche. Il problema di avere astrazioni alto e basso livello nella stessa lingua è che le astrazioni di alto livello possono diventare perde molto facilmente se si riesce a sondare attraverso astrazioni di basso livello.

Java, per esempio, non è nemmeno che di alto livello di una lingua, ma è progettato per essere sicuro (nel senso che le astrazioni non perdano) prima di tutto. Pertanto, alcune cose sono semplicemente impossibile da fare in Java. Ad esempio, non è possibile scrivere garbage collector di Java all'interno di Java, o rotolare il proprio sistema oggetto utilizzando puntatore fusione polimorfismo, o scrivere un sistema operativo (almeno non uno tradizionale).

Al contrario, D offre sia di alto livello e servizi di basso livello. D's garbage collector, ad esempio, è scritto in D. questo suona bene e per la maggior parte si tratta. Tuttavia, quando si inizia a mescolare livelli di astrazione in una sola base di codice le astrazioni possono perdere, soprattutto se si utilizza calchi o unioni di sconfiggere il sistema di tipi. Pertanto, per con successo il programma in D potrebbe essere di tanto in tanto bisogno di essere a conoscenza di alcuni dettagli di basso livello per affrontare astrazioni che perde, anche se non ne hanno bisogno per il compito a portata di mano.

Altri suggerimenti

  1. Che altro può / deve essere astratta?  Dipende sempre il vostro obiettivo. Non c'è una linea chiara qui, ma penso che si tratta di quanto controllo avete bisogno? Di solito c'è un abbastanza pesante trade-off tra astrazione e possibilità.
  2. obiettivo Quando si fa un general-purpose, linguaggio di alto livello orientarsi?  Non appena si può dire al / ambiente di programmazione lingua ciò che si vuole, invece di quello che dovrebbe fare.

In realtà, però ... la linea è del tutto arbitrario, naturalmente.

Tcl ha una proposta ufficiale ( Tcl Improvement Proposal (TIP) 131 che praticamente risolve il problema per bene. Tutto ciò che serve è un volontario per fare il lavoro. C'è anche un'implementazione scheletrica con solo alcuni dei dettagli lasciato fuori.

Alcuni dominio specifico Lingue possono essere estremamente "alto livello". Un buon esempio di questo è Informare (utilizzato per avventure testuali scrittura) in cui il linguaggio di programmazione non è molto diverso da un inglese. Ecco un estratto da un progetto di esempio :

The fireplace is scenery in the Entrance Hall. The description is "Unlit, vacant
[if Search is happening]. It is almost as though you are not expected[end if]."
The sound of the fireplace is "whistling wind". Understand "fire" or "whistling" 
or "wind" as the fireplace. Instead of burning the fireplace: say "There is no 
fuel prepared for a fire."

Si tratta di codice sorgente. :)

Credo che un linguaggio ipotetico futuro vi permetterà di scrivere un verificatore, invece di un'implementazione. Il compilatore analizza che verificatore e (tentativi di) scrivere un'implementazione corrispondenti alla spec. (Ovviamente il compilatore deve fallire o cadere di nuovo a forza bruta a volte, perché non è un risolutore di arresto.)

In sostanza, un linguaggio logico con le ottimizzazioni ridicole rispetto alla bruta costringendo la risposta.

Anche se il codice di verifica può essere più lungo di codice di implementazione, agisce come molta documentazione meglio ed è più vicino a ciò che un aspetto spec come. È il commercio più tempo in codice tipizzazione per meno desyncing documentazione / spec / code.

Ad esempio:

int32 Remainder(int32 numerator, int32 denominator) {
    requires denominator != 0
    ensures Math.Abs(result) < Math.Abs(denominator)
    ensures exists n suchthat n*denominator + result == numerator
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
    requires denominator != 0
    ensures result >= 0
    ensures result < Math.Abs(denominator)
    ensures exists n suchthat n*denominator + result == numerator
}

Risultati in:

//warning: suggested precondition: denominator != int32.MinValue due to Math.Abs
int32 Remainder(int32 numerator, int32 denominator) {
    return numerator % denominator;
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
    return ((numerator % denominator) + denominator) % denominator;
}

Hrm, penso che alcune lingue stanno tentando di guidare alcune astrazioni supplementari:. Clojure con la sua STM e Erlang con il modello attore

  1. L'unica cosa che posso vedere che non riesco a vedere come sarebbe stato fatto è una lingua con assegni di concorrenza simile a verificare staticamente tipizzato. Dico questo perché il problema della terminazione esiste.
  2. Quando si taglia il mio prato, mi fa il caffè la mattina, controlli la mia email e mi dice quello che è successo nelle notizie.

Credo che i quadri sono il passo successivo.

  • Attualmente alcuni "linguaggi" sono per SVS (che è vicino a quello che si potrebbe chiamare un gol e con un obiettivo richiede test , perché è l'unico modo in cui poteva essere spiegato, ad esempio Fit per la parte di prova); questi potrebbero essere fusi con i linguaggi di programmazione.
  • Praticamente ogni lingua è sempre l'accesso a sempre più interfacce di alto livello (vale a dire, astrazione ) che richiede sempre meno il codice da voi e astratto dal sistema operativo (vedi quanto facile è di fare applicazione GUI ora in C #, rispetto al C ++ MFC, rispetto al C ++ API Win32).
  • Per quanto riguarda i linguaggi di programmazione si potrebbe ottenere più delle migliori caratteristiche di altri metodi di sviluppo: sto pensando di Aspect programmazione orientata , che potrebbe contribuire a risolvere molti questione OO ed è già in parte attuata in una qualche forma di C # e Java (come questioni riguardanti registrazione, transazioni ...).
  • UML obiettivo finale ( è stato ?) Per consentire il viesw UML con i dettagli dei diagrammi essere sufficiente per il codice del sistema; UML è anche un linguaggio (nel senso più ampio).
  • IDE dovrebbe essere inclusa: Ora è possibile impostare come una finestra dovrebbe ridimensionare l'IDE, mentre spesso si doveva codice prima. In seguito si può essere in grado di style tutta la vostra applicazione o sito web da un menu di temi come qualsiasi applicazione cutanea-grado. E molto di più potrebbe venire.

Immaginate l'unione di coloro che in un ambiente unificato, perché l'ambiente di sviluppo è una parte importante dello sviluppo così come le librerie si ha l'accesso e il suo livello di accesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top