Esistono lingue con servizi sia di livello alto che di livello basso? [chiuso]

1

Esistono lingue con servizi sia di livello alto che di livello basso? In caso contrario, è possibile crearne uno? Perché o perché no?

In teoria, sarebbe molto utile avere un linguaggio di programmazione che abbia funzioni di linguaggio di shell e di programmazione regolare, come Forth , ad esempio, può essere facilmente realizzato e avere anche strutture di alto livello; Forth non sembra (e probabilmente ci vorrebbe un bel po 'di lavoro per farlo) come un adattamento naturale per cose di alto livello.

Naturalmente, linguaggi come C o C ++ possono essere fatti per simulare le caratteristiche di linguaggi di alto livello, ma a costo di una sintassi brutta o difficile, e l'aggiunta di una complessità considerevolmente maggiore, o al costo di molto lavoro , che non sarebbe necessario dal momento che sarebbe spesso più semplice utilizzare un linguaggio di programmazione di alto livello più standard.

Chiarimento : significato di basso livello, ad esempio gestione manuale della memoria, strutture dati limitate, un solo valore di ritorno e simili. Esempi: linguaggio Assembly , C, C ++ in una certa misura e Forth.

Esempi di linguaggio di alto livello potrebbero essere: Python, Perl , JavaScript, Java e C # in larga misura, < a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"> Lisp .

    
posta Abbafei 19.12.2011 - 04:27
fonte

2 risposte

16

C ++ è l'esempio canonico di una lingua che combina le funzioni di basso livello e di alto livello 1 . Non simula nulla, fornisce supporto nativo per quasi tutti i costrutti di alto livello che solitamente trovi in un linguaggio comune di alto livello e quasi tutti i costrutti di basso livello che trovi in C.

Ma ovviamente i termini sono molto relativi, c'era un punto nel tempo (non molto tempo fa 2 ) in cui C era considerato un linguaggio di altissimo livello. E ci sono molti altri linguaggi che offrono considerevoli funzionalità di basso livello mentre sono ancora comunemente considerati di alto livello, e viceversa, le linee sono un po 'sfocate.

Per quanto riguarda la sintassi, è qualcosa che è naturalmente influenzato dal livello di astrazione della lingua. Basso livello significa in generale :

In computer science, a low-level programming language is a programming language that provides little or no abstraction from a computer's instruction set architecture. Generally this refers to either machine code or assembly language. The word "low" refers to the small or nonexistent amount of abstraction between the language and machine language; because of this, low-level languages are sometimes described as being "close to the hardware."

Quindi, naturalmente, un linguaggio di basso livello adotta una sintassi più vicina al codice macchina, che è intrinsecamente non amichevole. Parecchi linguaggi, come C ++, hanno adottato un'ampia varietà di zucchero sintattico , come un meccanismo per rendere le cose più facili da leggere o per esprimere. Ma lo zucchero sintattico è qualcosa che ha optato per quasi tutti i linguaggi di alto livello, lo zucchero del C ++ da solo non lo rende un linguaggio di basso livello.

Per quanto riguarda la complessità di un basso e amp; linguaggio di alto livello, è anche naturale: è uno strumento con più obiettivi, ogni singolo obiettivo si aggiunge alla sua complessità. Questo è inevitabile indipendentemente dall'obiettivo. Le lingue di alto livello non sono "migliori" di quelle di basso livello, sono solo più concentrate su un unico obiettivo. Le lingue progettate con facilità di utilizzo come obiettivo principale tendono ad essere di alto livello, ma ciò è importante solo se i necessari compromessi per raggiungere l'obiettivo non influiscono sulle applicazioni.

Il livello basso o alto non ha molta importanza, le lingue sono principalmente strumenti. Dovresti scegliere quello che meglio si adatta a qualsiasi cosa tu stia costruendo in combinazione con quali abilità hai. Le lingue più diffuse sono multiuso e Turing completo , in teoria sono valide scelte per costruire quasi tutto. Non ci sono assoluti, ovviamente, puoi vincere in alcune aree se opti per un linguaggio di alto livello e in altri se opti per uno di livello inferiore, anche all'interno della stessa applicazione.

La maggior parte delle applicazioni su larga scala si mescolano e si abbinano, seguendo la mentalità del "giusto strumento per il lavoro", e questo è un approccio più efficiente, imho, che cercare di avere la tua torta e mangiarla anche tu.

1 Tuttavia, tieni presente che non esiste una risposta definitiva su ciò che è considerato una funzione di livello strettamente alto e su quella di basso livello.

2 Negli anni umani, negli anni del software era molto tempo fa ...

    
risposta data 19.12.2011 - 04:56
fonte
6

C ++ si adatta in qualche misura al disegno di legge se usi i trucchi metaprogrammatici del modello giusto. D porta questo al livello successivo. D ha ogni funzione di basso livello che ha C tranne il preprocessore macro (che è reso obsoleto da una combinazione di un sistema di moduli reale e string mixins ) e bitfield (che invece sono implementati nella libreria standard).

Sul lato di alto livello, D è garbage collection, ma il garbage collector è scritto in D e la gestione della memoria manuale può essere eseguita usando malloc di C e gratuitamente . Il sistema di metaprogrammazione dei modelli è stato progettato con l'aiuto di Andrei Alexandrescu, l'autore di Modern C ++ Design ed è in realtà progettato per la metaprogrammazione leggibile oltre i semplici generici. È abbastanza avanzato da consentire moduli di libreria standard di alto livello come std.range , std.algorithm e std.parallelism .

Spingendo ulteriormente i confini, ho fatto da mentore a un progetto di Google Summer of Code la scorsa estate per creare una libreria di matrici in D. Non è ancora pronta per la produzione, ma consente di scrivere espressioni di matrice in un formato di alto livello come il seguente , con la lingua che deduce tutti i tipi e nessuna matrice / vettori temporanei non necessari allocati:

auto m = matrix(
    [[1.0, 2, 3],
     [4.0, 5, 6],
     [7.0, 8, 9]]
);

auto v1 = vector([8.0, 6, 7]);
auto v2 = vector([3.0, 1, 4]);
auto v3 = vector([2.0, 7, 1]);

// .t is the transpose operator.
auto result = eval( inv(m * v1 * v2.t) * v3 );
writeln(result.pretty);

Dubito che persino il codice Matlab sarebbe molto più corto o più pulito di quello, e le matrici sono il terreno di casa di Matlab.

    
risposta data 19.12.2011 - 04:48
fonte