Чому деякі програмісти по-різному класифікують C, Python, C ++? - щодо рівня


16

Я беру вступний курс з python, і викладач каже, що python - це мова високого рівня, а C і C ++ - це мови низького рівня. Це просто заплутано. Я думав, що C, C ++, Python, Java тощо - це мови високого рівня.

Я читав питання в stackoverflow на C, C ++ тощо, і всі вони, схоже, посилаються на ці мови як на високий рівень. Мені здається, що деякі програмісти використовують ці терміни взаємозамінно.


1
Як і багато речей, високий та низький рівень є спрощенням - корисним для розуміння, але потенційно оманливим, якщо ви забудете, що це спрощення. Який рівень, безумовно, відносний, як говорили інші. Але це не обов'язково лінія - є різні напрямки, в яких можна абстрагуватися (наприклад, різні парадигми). Тільки тому, що ви рухаєтесь далі від машинної абстракції, це не означає, що ви рухаєтесь до відповідної абстракції для вашої програми.
Steve314

Навіть початкова точка може відрізнятися. Наприклад, IMO обчислення лямбда - це дуже низький рівень абстракції - достатньо абстрагується в машині, але це дуже проста абстракція, яка служить відправною точкою для функціональних мов для початку побудови абстракцій поверх. У будь-якому випадку, лямбда-числення, ймовірно, не ближче до ідеальної абстракції для будь-якого конкретного застосування, ніж машинний код.
Steve314

Відповіді:


31

Високий і низький рівень є відносними термінами, тому використання використовувалося з часом. У 70-х роках UNIX робив хвилі, тому що він показав, що операційна система може бути написана в основному мовою високого рівня: C. У той час C вважався високим рівнем, як на відміну від асемблера.

Сьогодні C вважається мовою низького рівня, оскільки ні мова, ні стандартні бібліотеки не надають жодної структури даних про хліб та масло, як вектори, словники, ітератори тощо. Ви можете мати всі ці структури в програмі на C, але ви в кінцевому підсумку пишете їх самі. Python, Java тощо мають високий рівень відносно C, оскільки багато з цих стандартних структур даних вбудовані в мову або входять до стандартних бібліотек. Наявність цих праворуч з поля полегшує програмування на більш абстрактному рівні.

C - низький рівень у другому сенсі: він дозволяє безпосередньо маніпулювати апаратними засобами комп'ютера (принаймні настільки ж прямо, наскільки це дозволить ОС). Найпоширеніші реалізації Python, Java та ін. Принаймні на один крок далі вилучаються з апаратного забезпечення, оскільки вони працюють в VM. Якщо ви хочете маніпулювати апаратним забезпеченням від Python, вам потрібно буде написати розширення до VM Python, як правило, на C або C ++.

C ++ - це незвичайний випадок. Він забезпечує багато приємних структур даних як частину стандартної бібліотеки, але також дозволяє керувати обладнанням низького рівня.


3
C ++ насправді не такий дивний випадок, IMO - це просто змішаний рівень мови. Рівень абстракції, який ви отримуєте, залежить від того, які функції ви використовуєте.
Steve314

1
@ Steve314: Так і ні: зазвичай абстракція приховується з інформацією, тобто мова чи бібліотека схожа на чорну скриньку, яка забезпечує інтерфейс, і ніхто не хоче знати, що знаходиться всередині чорного поля. C ++ дещо дивно в цьому, оскільки він пропонує конструкції вищого рівня, але не заважає програмісту отримати доступ до їх представлення та порушити їх. C ++ є єдиною мовою, яку я знаю, яка не виокремлює різні шари абстракції (але, можливо, є й інші мови, яких я не знаю).
Джорджіо

1
@Giorgio - C ++ дозволяє приховати будь-які деталі реалізації - наприклад, зробити її частиною приватного інтернету класу, тому єдиний офіційний спосіб його використання - через публічний інтерфейс цього класу. Звичайно, ви можете порушити правила і скремтувати пам'ять все, що завгодно, але на практиці ви можете це робити будь-якою мовою, яка підтримує розробку реальних програм.
Steve314

@Giorgio - Візьмемо для прикладу Haskell. "Небезпечний" у цьому випадку має тенденцію означати нереференційно-прозорий (як у unsafePerformIO). Існують IORefтипи, але немає жодного еквіваленту, який reinterpret_castя знаю, і немає еквівалента арифметики вказівника. Але це не означає, що це безпечно від людей, які втручаються в пам'ять. Щоб бути практичною мовою, Haskell повинен взаємодіяти з реальними операційними системами та бібліотеками. Він має "інтерфейс іноземної функції". Якщо я дійсно хочу його підривати, все, що мені потрібно зробити, - це використовувати FFI для написання примітивних функцій підриву.
Steve314

@Giorgio - Звичайно, мені може бути важко знайти значення, які я хочу зіпсувати в пам'яті, але те саме можна застосувати і в C ++, залежно від того, наскільки добре я їх приховав. Наприклад, я можу використовувати PIMPL . Якщо я тоді надаю лише об'єктний код та заголовок для бібліотеки, яка розуміє, на що це вказує, потенційний підривник повинен реверсувати інженерний код цього об'єкта, щоб зрозуміти, що потрібно субвертувати та як.
Steve314

8

Подумайте про це з точки зору ковзаючої шкали, починаючи з мов на рівні низьких рівнів аж до мов високого рівня. Коли мова рухається вгору за шкалою, від НИЗКОГО до ВИСОКОГО, мова забезпечує все більшу абстракцію від конкретного інтерфейсу з комп'ютером.

Мови на низькому рівні написані для явного керування комп'ютером - продумайте машинний код та код складання.

Мови ВИСОКОГО рівня намагаються абстрагувати деталі з дрібкою (особливо розподіл пам'яті та звільнення пам'яті). Ідея полягає у наданні більш "природного" інтерфейсу для програмування та сподіваємось дозволити програмісту зосередитись на дизайні та виробництві.

У ці дні C розглядають як мову на рівні НИЗЬКОГО. Він все ще має деякі значні абстракції від машинного коду та коду складання, тому технічно «вище», ніж ці. Однак він все ще забезпечує пряму адресацію пам'яті та не забезпечує збирання сміття. Отже, це деталі, які повинен розробити програміст.

Порівняйте це з іншими мовами, такими як Python, Ruby або Haskell, і у вас є набагато більш незрозумілий інтерфейс. Ці мови мають великі бібліотеки коду, які абстрагують більшість команд комп'ютера. Ви коли-небудь замислювалися, що відбувається зі змінною в Python, коли ви виходите з локальної області функції або видаляєте її? Напевно, не так? І це тому, що мовами ВИСОКОГО рівня не потрібно! Вони доглядають за розподілом / випуском пам'яті.

Переваги функції мають мови високого рівня. Вони дозволяють нам вільно (і безпечно!) Проектувати і розвиватися.

Мови на низькому рівні мають перевагу швидкості в більшості випадків. Інтерпретація коду високого рівня є витратою. Плюс, якось круто написати щось у «комп’ютерній промові».

Сподіваюсь, це допомагає


5

Високий рівень проти низького - це не чорно-біла річ, а суцільна шкала. Терміни використовуються для опису наближеності мови програмування до апаратного забезпечення; чим вище рівень, тим сильніше відбирає обладнання.

Очевидно, що найнижчий рівень - це двійковий машинний код - це точне подання завантаження ОС та подання до центрального процесора. Збірка - це перший рівень абстракції, побудований на ній: замість двійкового коду пишеться мнемоїка, читаються людиною символічні коди, що представляють собою бінарні машинні інструкції. Це те, що люди використовували для програмування систем до UNIX.

C - наступний крок в ланцюзі абстрагування, об'єднання загальних зразків у конструкції управління потоком та абстрагування конкретних машин інструкцій у платформо-агностичний синтаксис, і ця остання абстракція була одним з головних факторів, які зробили UNIX революційним та дуже успішним, оскільки це означало, що той самий код може бути скомпільований для будь-якої платформи без великих змін.

C ++ додає ще один шар абстракцій: додає класи (абстрагування vtables та контексту, що переходять у синтаксис OOP), newіdelete (поєднання розподілу пам'яті та ініціалізація змінних в єдину конструкцію), перевірка типу компіляції в часі, шаблони (безпечний для компіляції час-час метапрограмування) та купа зручних синтаксисів часу компіляції, таких як простори імен, перевантаження функцій та операторів тощо.

Python робить ще один великий крок від обладнання. C ++ як і раніше надає програмісту повний контроль над розподілом пам’яті та дозволяє безпосередньо маніпулювати оперативною пам’яттю; Python піклується про управління пам'яттю для вас. Крім того, замість того, щоб компілювати ваш код до загальнонаціональних інструкцій машини, він запускає його проти віртуальної машини; це несе покарання за продуктивність (що іноді може бути здоровим, але зазвичай це не про що турбує), але воно також дозволяє робити акуратні речі, які будуть складними в C ++ і важко важко в C, наприклад, маніпулювання функціями та класами під час бігу час, отримання назв довільних об'єктів під час виконання, інстанціювання класів за іменем під час виконання, виправлення мавп тощо та ін.

Отже, коли люди ділять мови на "високий" та "низький рівень", вони десь малюють довільну лінію, і ця лінія не завжди однакова. У 1970 р. Лінія проходила між складанням і С (вирішальним фактором є відмова від машинних інструкцій щодо платформи); у 1987 році він, можливо, був десь між C і C ++; сьогодні це може бути між C ++ і Java (визначальним фактором є автоматичне управління пам'яттю).

Короткий короткий огляд: високий рівень-ності - це ковзаюча шкала, а для трьох мов ви згадуєте це C <C ++ <Python.


Я б сказав, що високий рівень проти низького рівня - це не одна шкала, а натомість дві окремі шкали. Низькорівнева стосується того, наскільки добре мова стосується поведінки машини, тоді як високий рівень - це здатність забезпечувати абстракцію. C # є більш мовою високого рівня, ніж C99, але також є нижчим рівнем, ніж мова, визначена стандартом C, оскільки поведінка, наприклад, використання вказівника "int" для обробки "коротких" значень у масиві два в a час визначено в C #, але не в C99.
supercat

3

Рядок між мовами "низького рівня" та "високого рівня" час від часу зміщується.
Наприклад:
Ще в часи UNIX C була мовою високого рівня.
Сьогодні C не має таких структур, як типи відображення (словники), ітераторів тощо, якими є сучасні мови високого рівня, такі як Python. Тож лінія змістилася, і C тепер потрапив у групу низького рівня.

Мови низького рівня:
Ці мови "близькі" до того, що машина може виконувати (найнижчий рівень: Кодекс складання!).
Працюючи з цими мовами, програмісту доводиться думати про речі нижчого рівня, такі як управління пам'яттю. Ви близькі в цьому сенсі до апаратних засобів, що вам доведеться безпосередньо з ним працювати.

Мови високого рівня:
Ці мови віддаляють вас від обладнання, оскільки вони керують такими, як пам'ять. Коли ви працюєте з цими мовами, пам'ять є фактором (очевидно), але ви не працюєте безпосередньо з обладнанням. Натомість мова управляє цим, тримаючи подалі (можливо, вище) від нижнього, апаратного інтерфейсу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.