Высокий уровень против низкого уровня - это не черно-белая вещь, а непрерывная шкала. Термины используются для описания того, насколько близко язык программирования к аппаратному обеспечению; чем выше уровень, тем больше он отвлекает оборудование.
Самым низким уровнем, очевидно, является двоичный машинный код - это точное представление загрузки ОС и ее загрузки в ЦП. Сборка - это первый уровень абстракции, построенный на ее основе: вместо двоичного кода пишут мнемосхемы, читаемые человеком символические коды, которые представляют двоичные машинные инструкции. Это то, что люди использовали для системного программирования до UNIX.
C - следующий шаг в цепочке абстракций, объединение общих шаблонов в конструкции управления потоком и абстрагирование машинно-специфических инструкций в синтаксис, независимый от платформы, и эта последняя абстракция была одним из основных факторов, которые сделали UNIX и революционным, и очень успешным, потому что это означало, что один и тот же код мог быть скомпилирован для любой платформы без каких-либо серьезных изменений.
C ++ добавляет еще один уровень абстракций: он добавляет классы (абстрагирование vtables и контекста, передаваемых в синтаксис OOP), new
и delete
(объединение выделения памяти и инициализации переменных в одну конструкцию), проверка типов во время компиляции, шаблоны (безопасные во время компиляции) метапрограммирование), а также набор синтаксических удобных функций во время компиляции, таких как пространства имен, перегрузка функций и операторов и т. д.
Python делает еще один большой шаг от оборудования. C ++ по-прежнему дает программисту полный контроль над распределением памяти и позволяет напрямую манипулировать оперативной памятью; Python позаботится об управлении памятью для вас. Кроме того, вместо компиляции вашего кода для всех машинных инструкций он запускается на виртуальной машине; это влечет за собой снижение производительности (что иногда может быть очень сложно, но обычно не о чем беспокоиться), но также допускает изящные вещи, которые были бы сложными в C ++ и мучительно сложными в C, такие как манипулирование функциями и классами при запуске время, получение имен произвольных объектов во время выполнения, создание экземпляров классов по имени во время выполнения, исправление обезьян и т. д. и т. д.
Поэтому, когда люди делят языки на языки «высокого уровня» и «низкого уровня», они где-то проводят произвольную линию, и эта линия не всегда одинакова. В 1970 году была проведена грань между сборкой и C (решающим фактором было абстрагирование машинных инструкций для конкретной платформы); в 1987 году он мог находиться где-то между C и C ++; сегодня это может быть между C ++ и Java (решающим фактором является автоматическое управление памятью).
Короче говоря: высокоуровневый уровень - это скользящая шкала, и для трех упомянутых вами языков это C <C ++ <Python.