Wysoki poziom kontra niski poziom nie jest rzeczą czarno-białą, ale ciągłą skalą. Terminy są używane do opisania, jak blisko język programowania jest do sprzętu; im wyższy poziom, tym bardziej oddziela sprzęt.
Najniższym poziomem jest oczywiście binarny kod maszynowy - jest to dokładna reprezentacja, którą system operacyjny ładuje i podaje do procesora. Montaż to pierwszy poziom abstrakcji zbudowany na nim: zamiast kodu binarnego pisze się mnemoiki, czytelne dla człowieka kody symboliczne, które reprezentują instrukcje maszyny binarnej. Tego używali ludzie do programowania systemów przed UNIX.
C jest kolejnym krokiem w łańcuchu abstrakcji, łącząc wspólne wzorce w konstrukty kontroli przepływu i wyodrębniając instrukcje specyficzne dla maszyny w składni agnostycznej platformy, a te ostatnie abstrakcje były jednym z głównych czynników, które uczyniły UNIX zarówno rewolucyjnym, jak i bardzo udanym, ponieważ oznaczało to, że ten sam kod można skompilować dla dowolnej platformy bez większych zmian.
C ++ dodaje kolejną warstwę abstrakcji: dodaje klasy (abstrakcyjne tabele i kontekst przechodzące do składni OOP) new
orazdelete
(łączenie alokacji pamięci i inicjalizacji zmiennych w jedną konstrukcję), sprawdzanie typu kompilacji, szablony (czas kompilacji bezpieczny dla typu metaprogramowanie) oraz szereg udogodnień w czasie kompilacji, takich jak przestrzenie nazw, przeciążenie funkcji i operatora itp.
Python robi kolejny duży krok od sprzętu. C ++ nadal zapewnia programistom pełną kontrolę nad przydzielaniem pamięci i pozwala na bezpośrednią manipulację pamięcią RAM; Python dba o zarządzanie pamięcią. Ponadto zamiast kompilować kod do instrukcji natywnej maszyny, uruchamia go na maszynie wirtualnej; niesie to ze sobą ujemny wpływ na wydajność (co czasem może być ciężkie, ale zwykle nie jest to powód do zmartwień), ale pozwala także na porządne rzeczy, które byłyby trudne w C ++ i niezwykle trudne w C, takie jak manipulowanie funkcjami i klasami w trakcie uruchamiania czas, pobieranie nazw dowolnych obiektów w czasie wykonywania, tworzenie instancji klas według nazw w czasie wykonywania, łatanie małp itp. itp.
Kiedy więc ludzie dzielą języki na „wysoki” i „niski poziom”, narysują gdzieś dowolną linię i ta linia nie zawsze jest taka sama. W 1970 r. Linia znajdowała się między montażem a C (czynnikiem decydującym było wyodrębnienie instrukcji maszynowych specyficznych dla platformy); w 1987 roku mogło być gdzieś pomiędzy C i C ++; dziś może być pomiędzy C ++ a Javą (z decydującym czynnikiem jest automatyczne zarządzanie pamięcią).
Krótko mówiąc: wysoki poziom to przesuwana skala, a dla trzech języków, o których wspominasz, to C <C ++ <Python.