Il linguaggio di programmazione C era considerato un linguaggio di basso livello quando è uscito?

148

Attualmente C è considerato un linguaggio di basso livello , ma negli anni '70 era considerato di basso livello? Il termine era anche in uso allora?

Molte lingue popolari di alto livello non esistevano fino alla metà degli anni '80 e oltre, quindi sono curioso di sapere se e come la natura del basso livello sia cambiata nel corso degli anni.

    
posta joeyfb 30.06.2018 - 17:45
fonte

7 risposte

156

Dipende dalla tua definizione di linguaggio di alto livello e di basso livello. Quando è stato sviluppato C, tutto ciò che era di livello superiore rispetto all'assemblaggio era considerato un linguaggio di alto livello. Questa è una barra bassa da cancellare. In seguito, questa terminologia è passata al punto che oggi alcuni considerano anche Java un linguaggio di basso livello.

Anche all'interno del panorama linguistico di alto livello degli anni '70, vale la pena sottolineare che C è un livello piuttosto basso. Il linguaggio C è fondamentalmente B più un semplice sistema di tipi, e B non è molto più di un comodo strato di sintassi procedurale / strutturato per l'assemblaggio. Poiché il sistema dei tipi è un adattamento retro in cima al linguaggio B non tipizzato, puoi ancora lasciare delle annotazioni sui tipi in alcuni punti e si assumerà int .

C lascia consapevolmente costose o difficili da implementare funzionalità che erano già ben consolidate al momento, come

  • gestione automatica della memoria
  • funzioni annidate o chiusure
  • OOP di base o coroutine
  • più sistemi di tipo espressivo (ad esempio tipi con limiti di intervallo, tipi definiti dall'utente come tipi di record, tipizzazione strong, ...)

C ha alcune caratteristiche interessanti:

  • supporto per la ricorsione (come conseguenza delle sue variabili automatiche basate su stack, rispetto alle lingue in cui tutte le variabili hanno una durata globale)
  • puntatori di funzioni
  • I tipi di dati definiti dall'utente (structs e unions) sono stati implementati poco dopo il rilascio iniziale di C.
  • La rappresentazione di stringa di C (pointer-to-chars) è in realtà un enorme miglioramento rispetto a B che codifica più lettere in una sola parola macchina.
  • I file header di
  • C sono stati un hack di efficienza per mantenere le unità di compilazione piccole, ma anche per fornire un semplice sistema di moduli.
  • Puntatori non vincolati in stile assembly e aritmetica del puntatore, rispetto ai riferimenti più sicuri. I puntatori sono una caratteristica intrinsecamente non sicura, ma anche molto utile per la programmazione di basso livello.

Nel periodo in cui C fu sviluppato, altri linguaggi innovativi come COBOL, Lisp, ALGOL (in vari dialetti), PL / I, SNOBOL, Simula e Pascal erano già stati pubblicati e / o erano ampiamente utilizzati per specifici domini problematici. Ma la maggior parte di quelle esistenti erano destinate alla programmazione su mainframe o erano progetti di ricerca accademica. Per esempio. quando ALGOL-60 fu inizialmente progettato come un linguaggio di programmazione universale, la tecnologia e l'informatica necessarie per implementarlo non esistevano ancora. Alcuni di questi (alcuni dialetti ALGOL, PL / I, Pascal) erano anche destinati alla programmazione di basso livello, ma tendevano ad avere compilatori più complessi o erano troppo sicuri (ad esempio senza puntatori senza restrizioni). In particolare Pascal manca di un buon supporto per gli array a lunghezza variabile.

Rispetto a quelle lingue, C rifiuta "eleganti" e costose funzionalità per essere più pratico per lo sviluppo di basso livello. C non è mai stato principalmente un progetto di ricerca sul design linguistico. Invece, è stata una propaggine dello sviluppo del kernel Unix sul minicomputer PDP-11 che era relativamente limitato alle risorse. Per la sua nicchia (un linguaggio minimalista di basso livello per scrivere Unix con un compilatore single-pass che è facile da portare) C è assolutamente eccellente - e oltre 45 anni dopo è ancora la lingua franca della programmazione di sistemi.

    
risposta data 30.06.2018 - 18:18
fonte
142

Per rispondere agli aspetti storici della domanda:

La filosofia del design è spiegata in The C Programming Language scritto da Brian Kernighan e dal designer C Dennis Ritchie, il "K & R" di cui potresti aver sentito parlare. La prefazione alla prima edizione dice

C is not a "very high level" language, nor a "big" one...

e l'introduzione dice

C is a relatively "low level" language... C provides no operations to deal directly with composite objects such as character strings, sets, lists, or arrays. There are no operations that manipulate an entire array or string...

L'elenco continua per un po 'prima che il testo continui:

Although the absence of some of these features may seem like a grave deficiency,... keeping the language down to modest size has real benefits.

(Ho solo la seconda edizione del 1988, ma il commento qui sotto indica che il testo citato è lo stesso nella prima edizione del 1978.)

Quindi, sì, i termini "alto livello" e "basso livello" erano in uso allora, ma C era progettato per cadere da qualche parte sullo spettro intermedio. Era possibile scrivere codice in C che fosse portatile su piattaforme hardware, e quello era il criterio principale per stabilire se una lingua fosse considerata di alto livello al momento. Tuttavia, C mancava di alcune caratteristiche che erano caratteristiche dei linguaggi di alto livello, e questa era una decisione di progettazione in favore della semplicità.

    
risposta data 30.06.2018 - 22:38
fonte
36

All'inizio degli anni '70, C era una folgorante boccata d'aria fresca usando i costrutti moderni in modo così efficace che l'intero sistema UNIX poteva essere riscritto dal linguaggio assembly in C con spazio trascurabile o penalità di prestazioni. All'epoca molti contemporanei si riferivano ad esso come un linguaggio di alto livello.

Gli autori di C, principalmente Dennis Ritchie, erano più cauti e nel L'articolo di Bell System Technical Journal ha detto che "C non è un linguaggio di alto livello". Con un sorriso ironico e con l'intenzione di essere provocatorio, Dennis Ritchie direbbe che si tratta di un linguaggio di basso livello. Primo tra i suoi obiettivi di design per C era quello di mantenere la lingua vicino alla macchina, pur fornendo la portabilità, cioè l'indipendenza della macchina.

Per maggiori informazioni consulta l' articolo BSTJ originale:

Grazie, Dennis. Che tu possa riposare in pace.

    
risposta data 30.06.2018 - 21:56
fonte
21

Come ho scritto altrove su questo sito quando qualcuno faceva riferimento al modello di gestione della memoria malloc / free come "programmazione a basso livello"

Funny how the definition of "low-level" changes over time. When I was first learning to program, any language that provided a standardized heap model that makes a simple allocate/free pattern possible was considered high-level indeed. In low-level programming, you'd have to keep track of the memory yourself, (not the allocations, but the memory locations themselves!), or write your own heap allocator if you were feeling really fancy.

Per contesto, questo era nei primi anni '90, ben dopo che C uscì.

    
risposta data 30.06.2018 - 17:49
fonte
15

Molte risposte hanno già fatto riferimento a vecchi articoli che dicevano cose come "C non è un linguaggio di alto livello".

Non riesco a resistere all'impilamento, tuttavia: molti, se non la maggior parte o tutti gli HLL al momento - Algol, Algol-60, PL / 1, Pascal - hanno fornito il controllo dei limiti dell'array e il rilevamento numerico degli overflow.

L'ultima volta che ho controllato il buffer e gli overflow integer erano la causa principale di molte vulnerabilità della sicurezza. ... Sì, ancora il caso ...

La situazione per la gestione dinamica della memoria era più complicata, ma ancora, lo stile C malloc / free era un grande passo indietro in termini di sicurezza.

Quindi, se la tua definizione di HLL include "impedisce automaticamente molti bug di basso livello", beh, lo stato pietoso della sicurezza informatica sarebbe molto diverso, probabilmente meglio, se C e UNIX non fossero accaduti.

    
risposta data 01.07.2018 - 17:01
fonte
8

Considera le lingue più vecchie e molto più avanzate precedenti a C (1972):

Fortran - 1957 (non molto più alto di C)

Lisp - 1958

Cobol - 1959

Fortran IV - 1961 (non molto più alto di C)

PL / 1 - 1964

APL - 1966

Oltre a un linguaggio di livello medio come RPG (1959), principalmente un linguaggio di programmazione per sostituire i sistemi di registrazione di unità basati su plug-in.

Da questa prospettiva, C sembrava un linguaggio di livello molto basso, solo un po 'al di sopra degli assemblatori di macro usati sui mainframe in quel momento. Nel caso dei mainframe IBM, sono state utilizzate macro assembler per l'accesso al database come BDAM (metodo di accesso al disco di base), poiché le interfacce del database non erano state trasferite su Cobol (in quel momento) risultando in un retaggio di un mix di assembly e Programmi Cobol ancora in uso oggi su mainframe IBM.

    
risposta data 02.07.2018 - 18:53
fonte
6

La risposta alla tua domanda dipende da quale linguaggio C sta chiedendo.

La lingua descritta nel Manuale di riferimento del 1974 C di Dennis Ritchie era un linguaggio di basso livello che offriva alcune delle comodità di programmazione dei linguaggi di livello superiore. Anche i dialetti derivati da quella lingua tendevano a essere linguaggi di programmazione di basso livello.

Quando fu pubblicato lo standard C 1989/1990, tuttavia, non descriveva il linguaggio di basso livello che era diventato popolare per la programmazione di macchine reali, ma descriveva invece un linguaggio di livello superiore che poteva essere - ma non era richiesto essere - implementato in termini di livello inferiore.

Come gli autori della nota C standard, una delle cose che ha reso il linguaggio utile è che molte implementazioni potrebbero essere trattate come assemblatori di alto livello. Poiché C era anche usato come alternativa ad altri linguaggi di alto livello e poiché molte applicazioni non richiedevano la capacità di fare cose che i linguaggi di alto livello non potevano fare, gli autori dello standard consentivano alle implementazioni di comportarsi in modo arbitrario se i programmi hanno provato a usare costrutti di basso livello. Di conseguenza, il linguaggio descritto dallo standard C non è mai stato un linguaggio di programmazione di basso livello.

Per capire questa distinzione, considera come Ritchie's Language e C89 vedrebbero il frammento di codice:

struct foo { int x,y; float z; } *p;
...
p[3].y+=1;

su una piattaforma dove "char" è 8 bit, "int" è big-endian 16 bit, "float" è a 32 bit e le strutture non hanno padding o allineamento speciali requisiti quindi la dimensione di "struct foo" è di 8 byte.

Su Ritchie's Language, il comportamento dell'ultima affermazione sarebbe necessario l'indirizzo memorizzato in "p", aggiungere 3 * 8 + 2 [vale a dire 26] byte, e recuperare un valore a 16 bit dai byte a quell'indirizzo e il successivo, aggiungere uno a quel valore e quindi riscrivere quel valore a 16 bit sugli stessi due byte. Il comportamento sarebbe definito come agire il 26 e il 27 byte che seguono quello all'indirizzo p senza riguardo per quale tipo di l'oggetto è stato memorizzato lì.

Nella lingua definita dallo standard C, nel caso in cui * p si identifichi un elemento di una "struct foo []" che è seguito da almeno altri tre completare gli elementi di quel tipo, l'ultima istruzione aggiungerebbe uno al membro y del terzo elemento dopo * p. Il comportamento non sarebbe definito dal Standard in qualsiasi altra circostanza.

Il linguaggio di Ritchie era un linguaggio di programmazione di basso livello perché, mentre era permesso a un programmatore di usare astrazioni come matrici e strutture quando conveniente, ha definito il comportamento in termini di layout di base di oggetti in memoria. Al contrario, la lingua descritta dalla C89 e successive gli standard definiscono le cose in termini di un'astrazione di livello superiore e solo definisce il comportamento del codice che è coerente con quello. Le implementazioni di qualità adatte per la programmazione di basso livello si comportano in modo utile in più casi rispetto a quanto previsto dallo Standard, ma non esiste un documento "ufficiale" che specifichi cosa deve fare un'implementazione per essere adatto a tali scopi.

Il linguaggio C inventato da Dennis Ritchie è quindi un linguaggio di basso livello ed è stato riconosciuto come tale. La lingua inventata dal Comitato degli standard C, tuttavia, non è mai stata un linguaggio di basso livello in assenza di garanzie fornite dall'implementazione che vanno oltre i mandati dello Standard.

    
risposta data 02.07.2018 - 01:31
fonte

Leggi altre domande sui tag