Alto e 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ù asporta l'hardware.
Il livello più basso, ovviamente, è il codice binario della macchina: è l'esatta rappresentazione che il sistema operativo carica e invia alla CPU. L'assemblaggio è il primo livello di astrazione costruito su di esso: al posto del codice binario, si scrivono mnemoici, codici simbolici leggibili dall'uomo che rappresentano le istruzioni binarie della macchina. Questo è ciò che le persone usavano per la programmazione dei sistemi prima di UNIX.
C è il passo successivo nella catena dell'astrazione, raggruppando schemi comuni in costrutti di controllo del flusso e astraggendo istruzioni specifiche della macchina nella sintassi agnostica della piattaforma, e quest'ultima astrazione è stata uno dei principali fattori che hanno reso UNIX rivoluzionario e di grande successo, perché significava che lo stesso codice poteva essere compilato per qualsiasi piattaforma senza grandi cambiamenti.
Il C ++ aggiunge un altro livello di astrazioni: aggiunge classi (astrazione di vtables e contesto che passa in una sintassi OOP) new
e delete
(raggruppamento dell'allocazione di memoria e inizializzazione variabile in un singolo costrutto), verifica del tipo di tempo di compilazione, modelli (compilazione-tempo di tipo sicuro metaprogrammazione) e un sacco di comodità di sintassi in fase di compilazione come spazi dei nomi, sovraccarico di funzioni e operatori, ecc.
Python fa un altro grande passo dall'hardware. C ++ fornisce ancora al programmatore il pieno controllo sull'allocazione della memoria e consente la manipolazione diretta della RAM; Python si occupa della gestione della memoria per te. Inoltre, invece di compilare il codice in istruzioni di tutte le macchine native, lo esegue su una macchina virtuale; questo comporta una penalità per le prestazioni (che a volte può essere pesante, ma di solito non è qualcosa di cui preoccuparsi), ma consente anche cose ordinate che sarebbero complicate in C ++ e terribilmente difficili in C, come manipolare funzioni e classi in esecuzione tempo, ottenere i nomi di oggetti arbitrari in fase di esecuzione, istanziare le classi per nome in fase di esecuzione, patch di 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 di demarcazione era tra assemblaggio e C (il fattore decisivo era l'astrazione delle istruzioni macchina specifiche della piattaforma); 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 menzionate è C <C ++ <Python.