Perché alcuni programmatori classificano C, Python, C ++ in modo diverso? - per quanto riguarda il livello

15

Sto seguendo un corso introduttivo su python e l'istruttore dice che Python è un linguaggio di alto livello e C e C ++ sono lingue di basso livello. È solo confuso. Pensavo che C, C ++, Python, Java, ecc. Fossero tutti linguaggi di alto livello.

Stavo leggendo le domande su StackOverflow su C, C ++, ecc. e sembrano tutti riferirsi a quelle lingue come ad alto livello. Mi sembra che alcuni programmatori usino questi termini in modo intercambiabile.

    
posta atheistlearner 04.05.2013 - 06:27
fonte

4 risposte

31

Alto livello e basso livello sono termini relativi, quindi l'utilizzo è cambiato nel tempo. Negli anni '70 UNIX fece ondate perché mostrò che un sistema operativo poteva essere scritto principalmente in un linguaggio di alto livello: C. Al tempo C era considerato di alto livello in contrasto con l'assemblatore.

Al giorno d'oggi C è considerato un linguaggio di basso livello perché né la lingua né le librerie standard forniscono una qualsiasi delle strutture di dati di pane e burro come i vettori, i dizionari, gli iteratori e così via. Puoi avere tutte quelle strutture in un programma in C, ma finirai per scriverle tu stesso. Python, Java, ecc. Sono di alto livello rispetto a C perché molte di queste strutture dati standard sono incorporate nella lingua o fanno parte delle librerie standard. Avere quelli immediatamente pronti rende più facile programmare a un livello più astratto.

C è di basso livello in un secondo senso: consente la manipolazione diretta dell'hardware del computer (almeno direttamente come consentirà il sistema operativo). Le implementazioni più comuni di Python, Java, ecc. Sono almeno una fase ulteriormente rimossa dall'hardware perché vengono eseguite in una VM. Se vuoi manipolare l'hardware da Python, dovrai scrivere un'estensione alla VM Python, di solito in C o C ++.

C ++ è un caso strano. Fornisce tonnellate di strutture dati piacevoli come parte della libreria standard, ma consente anche la manipolazione di basso livello dell'hardware.

    
risposta data 04.05.2013 - 06:57
fonte
8

Pensa a questo in termini di scala mobile, dai linguaggi di livello BASS fino alle lingue di alto livello. Quando una lingua sale di livello, da LOW a HIGH, la lingua fornisce sempre più astrazione dall'interfaccia specifica con il computer.

I linguaggi a LOW livello sono scritti per dirigere esplicitamente il computer - pensa codice macchina e codice assembly.

Linguaggi di alto livello tentano di astrarre i dettagli nitidi (in particolare allocazione di memoria e rilascio di memoria). L'idea è quella di fornire un'interfaccia più "naturale" alla programmazione e, auspicabilmente, consentire al programmatore di concentrarsi sulla progettazione e sulla produzione.

In questi giorni, C è considerato un linguaggio a livello LOW. Ha ancora alcune significative astrazioni dal codice macchina e dal codice assembly, quindi è tecnicamente "più alto" di questi. Tuttavia, fornisce ancora l'indirizzamento della memoria diretta e non fornisce la garbage collection. Quindi questi sono i dettagli che un programmatore deve progettare per.

Confronta questo con altri linguaggi come Python, Ruby o Haskell e hai un'interfaccia molto più oscura. Questi linguaggi hanno grandi librerie di codice che astraggono la maggior parte del comando del computer. Vi siete mai chiesti cosa succede a una variabile in Python quando si lascia l'ambito locale di una funzione, o si elimina? Probabilmente non hanno ragione? E questo perché in un linguaggio di alto livello non è necessario! Si occupano dell'assegnazione / rilascio della memoria per te.

I linguaggi di alto livello hanno il vantaggio della funzione. Ci permettono di progettare e sviluppare liberamente (e in sicurezza!).

Nella maggior parte dei casi, le lingue di livello inferiore hanno il vantaggio della velocità. C'è un costo per interpretare il codice di alto livello. Inoltre, è abbastanza divertente scrivere qualcosa in "computer speek".

Spero che questo aiuti

    
risposta data 04.05.2013 - 06:52
fonte
5

Alto livello vs basso livello non è una cosa in bianco e nero, ma una scala continua. I termini sono usati per descrivere quanto vicino un linguaggio di programmazione è all'hardware; più alto è il livello, più astrae l'hardware.

Il livello più basso, ovviamente, è il codice macchina binario - è la rappresentazione esatta che il sistema operativo carica e alimenta alla CPU. Assembly è il primo livello di astrazione costruito su di esso: al posto del codice binario, uno scrive mnemoici, codici simbolici leggibili dall'uomo che rappresentano istruzioni di macchine binarie. Questo è ciò che le persone usavano per programmare i sistemi prima di UNIX.

C è il passo successivo nella catena di astrazione, raggruppando schemi comuni in costrutti di controllo del flusso e astrazione di istruzioni specifiche della macchina in sintassi indipendente dalla piattaforma, e quest'ultima astrazione è stato uno dei maggiori fattori che ha reso UNIX sia rivoluzionario che altamente successo, perché significava che lo stesso codice poteva essere compilato per qualsiasi piattaforma senza modifiche importanti.

C ++ aggiunge un altro livello di astrazione: aggiunge classi (estraendo vtables e contesto che passa in una sintassi OOP), new e delete (raggruppamento dell'allocazione di memoria e inizializzazione di variabili in un singolo costrutto), controllo del tipo in fase di compilazione , modelli (metaprogrammazione in fase di compilazione sicura in fase di scrittura) e una serie di comodità di sintassi in fase di compilazione come spazi dei nomi, sovraccarico di funzioni e operatori, ecc.

Python fa un altro grande passo avanti dall'hardware. C ++ fornisce ancora al programmatore il pieno controllo sull'allocazione della memoria e consente la manipolazione diretta della RAM; Python si prende cura della gestione della memoria per te. Inoltre, invece di compilare il codice con istruzioni di macchina native, lo esegue su una macchina virtuale; questo comporta una penalizzazione delle prestazioni (che a volte può essere pesante, ma di solito non è qualcosa di cui preoccuparsi), ma consente anche cose chiare che sarebbero complicate in C ++ e terribilmente difficili in C, come la manipolazione di funzioni e classi in esecuzione tempo, ottenendo i nomi di oggetti arbitrari in fase di esecuzione, creando istanze di classi per nome in fase di esecuzione, patch per scimmie, ecc. ecc.

Quindi quando le persone dividono le lingue in "alto livello" e "basso livello", tracciano una linea arbitraria da qualche parte, e quella linea non è sempre la stessa. Nel 1970, la linea era tra assemblea e C (l'astrazione delle istruzioni macchina specifiche della piattaforma era il fattore decisivo); nel 1987, potrebbe essere stato da qualche parte tra C e C ++; oggi, potrebbe essere tra C ++ e Java (con la gestione automatica della memoria come fattore decisivo).

Per farla breve: l'alto livello è una scala mobile, e per le tre lingue che hai citato è C < C ++ < Python.

    
risposta data 04.05.2013 - 09:37
fonte
3

La linea tra le lingue "di basso livello" e "di alto livello" cambia di volta in volta.
Ad esempio:
Ai tempi di UNIX, C era un linguaggio di alto livello.
Oggi C non ha le strutture come i tipi di mappatura (dizionari), iteratori ecc. Che i linguaggi di alto livello di oggi come Python hanno. Quindi la linea si è spostata e C è ora caduto nel gruppo di basso livello.

Lingue di basso livello: Queste lingue sono "vicine" a ciò che la macchina può eseguire (il livello più basso è: Codice di assemblaggio!).
Quando si lavora con questi linguaggi, il programmatore deve pensare alle cose di livello più basso come la gestione della memoria. Sei vicino in questo senso all'hardware, che devi lavorare direttamente con esso.

Lingue di alto livello: Queste lingue ti portano via dall'hardware, poiché gestiscono cose come la memoria stessa. Quando lavori con questi linguaggi, la memoria è un fattore (ovviamente), ma non lavori direttamente con l'hardware. Invece la lingua la gestisce, tenendoti lontano (forse più in alto) dall'interfaccia hardware inferiore.

    
risposta data 04.05.2013 - 20:01
fonte

Leggi altre domande sui tag