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.