Я думаю, что необходимо проводить различие, однако оно не обязательно должно быть «компилируемым» и «управляемым». Это не противоположности; язык может быть скомпилирован и не управляться, или интерпретироваться (не компилироваться) и управляться, либо и тем, и другим, или даже без него.
«Скомпилированный» язык - это просто язык, на котором есть шаг, который преобразует исходный код, написанный разработчиком, в какой-то более обычный «байт-код», который исполняется машиной. «Машина» может быть фактическим процессором или «виртуальной машиной», которая выполняет дополнительные операции над байтовыми кодами для перевода их в «собственные» машинные инструкции. Антоним для «скомпилированного» языка - это «интерпретируемый» язык, в котором исходный код преобразуется в инструкции байт-кода во время выполнения, построчно по мере их выполнения, без этапа компиляции. Гибридом между ними является «джитинг» от «JIT» (Just In Time), который обычно интерпретируется как одноразовый шаг исполняющей машиной;
«Управляемый» язык - это язык, предназначенный для создания программ, которые используются в определенной среде выполнения, которая почти всегда включает интерпретатор байт-кода; «Виртуальная машина», которая принимает код программы и выполняет дополнительное преобразование для конкретной машины или среды. Среда может также включать управление памятью, такое как «сборщик мусора» и другие функции «безопасности», предназначенные для поддержания работы программы в «песочнице» пространства и инструментов, однако такие функции не являются единственной областью «управляемых» сред выполнения , Практически все интерпретируемые языки можно считать управляемыми, потому что они требуют, чтобы интерпретатор работал под строками исполняемого «пользовательского» кода. Кроме того, языки JVM и .NET (Java, Scala, C #, VB, F #, IronWhothing) компилируются в промежуточный язык или IL, которые внешне похожи по форме и функциям на бинарный язык ассемблера, но не придерживаются 100% любого «нативного» набора команд. Эти инструкции выполняются JVM или CLR .NET, что эффективно переводит их в собственные двоичные инструкции, специфичные для архитектуры ЦП и / или ОС компьютера.
Таким образом, языки обычно можно описать как «скомпилированные» или «интерпретированные», а также как «неуправляемые» (или «нативные») и «управляемые». Существуют языки, которые можно описать как любую их комбинацию, кроме возможных «интерпретируемых нативных» (которые будут справедливы только для рукописных шестнадцатеричных кодов операций, где то, что написано разработчиком, является тем, что выполняется); если вы рассматриваете слой интерпретации как «среду выполнения» (с которой легко спорить и с которой трудно спорить), то все интерпретируемые языки «управляемы».
Если вы хотите получить техническую поддержку, почти все программы, ориентированные на многозадачность ОС, в настоящее время являются «управляемыми»; ОС создаст «виртуальную машину» для каждой работающей программы, в которой программа думает (или, по крайней мере, не должна знать иначе), что это единственная работающая программа. Код может выполнять вызовы внутри себя и других библиотек, на которые ссылаются, как если бы эта программа была единственной вещью, загруженной в память; аналогично, запросы на выделение ОЗУ и другой более высокой памяти для хранения и управления данными и управляющими устройствами кодируются так, как если бы была доступна вся архитектура памяти. Затем виртуальная машина (и операционная система за ней) преобразует различные указатели памяти в фактическое местоположение программы, ее данные и привязки к драйверам устройств и т. Д. Это чаще всего делается путем применения смещения памяти (каждая виртуальная машина получает блок по 2 ГБ). или что угодно из памяти, начиная с адреса X, который программа может обрабатывать так, как если бы этот X был адресом 0), и поэтому делать это очень дешево, но есть и другие вещи, за которые отвечает ядро ОС, такие как планирование процессов и взаимодействие между процессами, которые сложнее управлять. Однако этот базовый шаблон, как правило, не считается «управляемым», поскольку программе не нужно знать, что она запускается виртуальной машиной, и часто по-прежнему отвечает за поддержание своей выделенной памяти «чистой». Программа, которая была разработана для запуска в командной строке MS-DOS, может быть запущена на более новых ОС Windows, в которых даже нет среды MS-DOS; вместо этого программе предоставляется среда «виртуальной консоли», и при условии, что она не пытается покинуть эту «песочницу»