Різниця керованих мов проти компільованої мови?


18

Я плутаюся, коли люди намагаються розрізняти складені мови та керовані мови. З досвіду я розумію, що більшість вважають складені мови C, C ++, а керованими мовами є Java, C # (очевидно, що більше, але це лише кілька прикладів). Але в чому саме полягає різниця між двома типами мов?

Я розумію, що будь-яка програма, незалежно від того, якою мовою ви користуєтесь, по суті "компілюється" у машинний код низького рівня, який потім інтерпретується, так що це робить керованими мовами підмножину компільованих мов (тобто всі керовані мови є складені мови, але не навпаки)?


2
цей термін придуманий Microsoft, у вузькому розумінні також управляється Java. Майже у всіх випадках ми можемо думати , керованих мов , таких як підмножини того, який compiles.Also, це, я вважаю , пов'язаний - programmers.stackexchange.com/questions/72446 / ...
shabunc

Зауважте, що існує велика різниця між мовою, яка компілює (статично) код до чогось більш машинного, керованого до виконання (наприклад, Java), і тієї, яка робить це під час виконання (наприклад, Python). Однією з головних відмінностей є те, що статичне компіляція його до часу виконання дає можливість кодеру зробити деякі оптимізації, які можуть призвести до значних поліпшень швидкості (наприклад, JIT Java, перестановка коду для прогнозування гілок тощо).
Shivan Dragon

6
@ShivanDragon, "мова" нічого не збирає. Її реалізація робить. І ви можете компілювати Python статично (див. Наприклад, PyPy або IronPython). ОТО, справді важко зробити це ефективно за допомогою динамічно набраної мови (шукати "простеження JIT", "абстрактне тлумачення" тощо)
SK-логіка

@ SK-логіка: погодився, я вже сказав бадді. Я хотів звернутися до платформи, а не до мови.
Shivan Dragon

@shabunc Насправді я б сказав, що "Компільований" - це підмножина керованого. Керована мова може робити все, що може зробити компільована мова (практично з однаковою швидкістю), і більше того, оскільки може бути скомпільована керована мова. Для того, щоб надати C особливостям керованої мови, вам потрібно побудувати "VM" і фактично зробити його керованою мовою.
Білл К

Відповіді:


47

Різниця не в "складеному" проти "керованому", це дві ортогональні осі. Під "керованим" вони зазвичай означають наявність управління пам'яттю зібраним сміттям та / або наявність інфраструктури віртуальної машини. Обидва не мають абсолютно нічого спільного з компіляцією, і все, що люди вважають протилежним їй.

Всі ці "відмінності" є досить розмитими, штучними та неактуальними, оскільки завжди можна змішати керовану та некеровану пам'ять за один час виконання, і різниця між компіляцією та інтерпретацією теж дуже невиразна.


2
Це те, що я в основному мав на увазі, але я натрапив на багато людей, які продовжують робити це. Дякую за чітку відповідь.
l46кок

Керований код означає наявність проміжної мови, про яку слід піклуватися про те, яке середовище виконання, яке ви виконуєте під час виконання, так? Отже, проміжну мову (скажімо, байт-код) повинен виробляти компілятор. ІМО, що пари трохи "керували" кодом та концепцією "компіляції". Однак, якщо мова "компільована", це не показує, що вона дає керований код (тобто. C ++ проти Java)
zgulser

@zgulser, ні, проміжні мови є ортогональними. Керований означає мати інтеграцію GC з мовою виконання. Наприклад, час виконання OCaml "керується", хоча він збирається безпосередньо на рідному.
SK-логіка

8

Для цитування Вікіпедії:

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

Керований код потребує виконання (наприклад, .NET CLT) для виконання.


5
Керований код не має нічого спільного з рамкою. Потрібен час виконання, який керує пам'яттю.
Одід

Можливо, моє формулювання трохи не вдається, але чи не .NET Framework насправді є "загальною мовою виконання"?
janvdl

3
Ні. Включає CLR, але він також включає бібліотеки базового класу, специфікацію IL та інше.
Одід

4

Я думаю, що слід розрізняти, однак це не обов'язково між "Складеним" та "Керованим". Це не протилежності; мова може бути складена і не керована, або інтерпретована (не компільована) та керована, або обидва, або навіть жодна.

"Скомпільована" мова - це просто така, в якій є крок, який перетворює вихідний код, написаний розробником, у якийсь більш регулярний "байт-код", який виконується машиною. "Машина" може бути фактичним процесором, або "віртуальною машиною", яка виконує додаткові операції над байткодами, щоб перевести їх на "рідні" інструкції машини. Антонім для "складеної" мови - це "інтерпретована" мова, в якій вихідний код перетворюється на інструкції байт-коду під час виконання, рядок за рядком під час їх виконання, без кроку компіляції. Гібрид між ними - це "джитінг", від "JIT" (Just In Time), що зазвичай є інтерпретацією як одноразовий крок виконавчою машиною;

"Керована" мова - це мова, призначена для створення програм, які споживаються в певному середовищі виконання, яка майже завжди включає інтерпретатор байт-коду; "віртуальна машина", яка приймає код програми і виконує деяку додаткову машинну чи середовищну трансформацію. Навколишнє середовище може також включати управління пам’яттю, наприклад «збирач сміття» та інші функції «безпеки», призначені для збереження програми, яка працює в її «пісочниці» простору та інструментів, однак такі функції не є єдиним доменом «керованих» режимів виконання . Практично всі інтерпретовані мови можна вважати керованими, оскільки вони вимагають, щоб інтерпретатор працював під рядками виконуваного коду "користувача". Крім того, мови JVM та .NET (Java, Scala, C #, VB, F #, IronWever) складаються на проміжну мову або IL, яка поверхнево схожа за формою та функцією з бінарною мовою асемблери, але не дотримується на 100% жодного "рідного" набору інструкцій. Ці вказівки виконуються JVM, або CLR .NET, що ефективно переводить їх у власні бінарні інструкції, характерні для архітектури процесора та / або ОС машини.

Отже, мови в цілому можна описати як "складені" або "інтерпретовані", і як "некеровані" (або "рідні") та "керовані". Є мови, які можна описати як будь-яку їх комбінацію, за винятком можливих "інтерпретованих" рідних (що було б справедливо лише для рукописних шістнадцяткових опкодів, де написано розробником - те, що виконується); якщо ви розглядаєте шар інтерпретації як "час виконання" (що легко аргументувати і важко сперечатися), то всі інтерпретовані мови "керуються".

Якщо ви хочете отримати технічну інформацію, майже всі програми, орієнтовані на багатозадачну ОС, в даний час "управляються"; ОС створить "віртуальну машину" для кожної запущеної програми, в якій програма думає (або, принаймні, не повинен знати інакше), що це єдине, що працює. Код може здійснювати дзвінки всередині себе та в інші бібліотеки, на які посилається, ніби ця програма є єдиним завантаженим у пам'яті; аналогічно, виклики виділення оперативної пам’яті та іншої вищої пам’яті для зберігання та управління маніпуляціями з даними та пристроями управління кодуються так, ніби вся архітектура пам’яті була доступна. Потім VM (і ОС за нею) потім переводить різні вказівники пам'яті на фактичне розташування програми, її дані та гачки на драйвери пристроїв тощо. Найчастіше це робиться шляхом застосування зміщення пам'яті (кожен VM отримує блок в 2 Гб або що б там не було пам'яті, починаючи з адреси X, яку програма може вважати так, ніби це X адресою 0), і як таке це зробити дуже дешево, але є й інші речі, за які відповідає ядро ​​ОС, такі як планування процесів та міжпроцесовий зв'язок, які є хитріше керувати. Однак, ця основна схема, як правило, не вважається "керованою", оскільки програма не повинна знати, що її управляє віртуальна машина, і часто все ще відповідає за збереження виділеної пам'яті "чистою". Програму, розроблену для запуску в командному рядку MS-DOS, можна запускати на нових ОС Windows, у яких навіть немає середовища MS-DOS під ними; програмі натомість надається середовище "віртуальної консолі", і за умови, що вона не намагається залишити цю "пісочницю"


"мови в цілому можна описати як" складені "або" інтерпретовані "" - Ні, вони не можуть. Компіляція та інтерпретація - це риси укладачів та перекладачів, а не мови. Термін "складена мова" навіть не має сенсу. Якби англійська мова була набраною мовою, це була б помилка типу.
Йорг W Міттаг

2
Укладачі та перекладачі, як правило, зустрічають компіляцію та інтерпретацію дуже специфічних діалектних мов, які призначені для компіляції чи інтерпретації. Ніхто не компілює вихідний код JavaScript, який я знаю, і ніхто не інтерпретує C #. Мови розроблені для того, щоб споживати так чи інакше. Як таке, зазвичай прийнятним називати саму мову як "складену" або "інтерпретовану", оскільки повне середовище, в якому мова використовується, включає один із цих двох етапів.
KeithS


en.wikipedia.org/wiki/Interpreted_language - "Теоретично будь-яка мова може бути складена або інтерпретована, тому це позначення застосовується виключно через загальну практику впровадження, а не якусь істотну властивість мови".
KeithS

@KeithS, Вікіпедія не є майже ідеальною. Той факт, що стаття існує протягом певного недійсного терміну, не робить цей термін більше чинним. Так, мови завжди розроблені з урахуванням певного способу виконання, але все-таки контрпродуктивно називати їх "складеними" або "інтерпретованими" виключно на основі намірів дизайнерів. А що стосується тлумачення, то насправді важко знайти відповідного "перекладача" будь-яким способом. Tcl, мабуть, останній у своєму роді. Усі інші так звані "перекладачі" насправді є упорядниками.
SK-логіка

2

Керована мова простою мовою - це мова високого рівня, що залежить від служб, які надає середовище виконання часу, наприклад служби збору сміття, тому вона називається керованою, але це не єдина послуга, яку вона використовує , а деякі з цих сервісів є security services, exception handling, standard types, вони використовуються Common Language Run-time CLRдля виконання, як-от у мовах .Net або у віртуальному середовищі на зразок Java, в якому використовується `Java Virtual Machine JVM.

Некерована мова - це мова низького рівня, що виконується безпосередньо операційною системою без необхідності віртуальних служб виконання або проміжних мов, такі мови, як C, C++некерований код, створений такими мовами, використовує бібліотечні процедури, які динамічно пов'язані з ОС, щоб отримати код для запуску з назвою DLL (динамічні бібліотеки посилань), некерований код отримує доступ до пам’яті безпосередньо, тому це швидше, ніж керований код, але якщо ви не створюєте драйвер обладнання або складну відеоігру, ви не хочете використовувати некеровані мови як працювати може особливо небезпечно, особливо з недосвідченими розробниками, такими як роль ролейwith great power comes great responsibility, і саме тому існують керовані мови, щоб допомогти розробникам виробляти розширюваний код, не занурюючись в нижню частину системи, але все ж ви можете створити змішаний код, якщо вам потрібно, ці статті пояснюють це все:

Огляд сумісності керованого / некерованого коду

Зразок: змішування некерованого C ++, C ++ / CLI та C # коду

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