Я думаю, що слід розрізняти, однак це не обов'язково між "Складеним" та "Керованим". Це не протилежності; мова може бути складена і не керована, або інтерпретована (не компільована) та керована, або обидва, або навіть жодна.
"Скомпільована" мова - це просто така, в якій є крок, який перетворює вихідний код, написаний розробником, у якийсь більш регулярний "байт-код", який виконується машиною. "Машина" може бути фактичним процесором, або "віртуальною машиною", яка виконує додаткові операції над байткодами, щоб перевести їх на "рідні" інструкції машини. Антонім для "складеної" мови - це "інтерпретована" мова, в якій вихідний код перетворюється на інструкції байт-коду під час виконання, рядок за рядком під час їх виконання, без кроку компіляції. Гібрид між ними - це "джитінг", від "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 під ними; програмі натомість надається середовище "віртуальної консолі", і за умови, що вона не намагається залишити цю "пісочницю"