Похоже, вы запутались между необходимостью поддержки языковых функций во время выполнения и разницей между языком, компилируемым и встроенным в VM (или интерпретируемым).
Большинству языков высокого уровня требуется некоторая поддержка во время выполнения. Даже C имеет библиотеку времени выполнения, хотя на многих платформах вы можете не использовать ее полностью или частично. Современные операционные системы обеспечивают еще большую поддержку во время выполнения, а многие языки предоставляют специфичные для ОС расширения, которые их интегрируют - учитывая динамическую загрузку библиотек ...
Кроме того, ничто не мешает вам построить систему передачи сообщений поверх языка, который не поддерживает ее по сути. Поскольку это чрезвычайно распространено (особенно для программ, написанных для платформ, управляемых событиями), его интеграция в язык может рассматриваться как простой вывод некоторой подверженной ошибкам занятой работы из высокоуровневого кода, а также в язык и среду выполнения.
Наконец, и Java, и большинство языков .NET фактически скомпилированы - они просто компилируются в байт-код, который ни одна машина не реализует изначально, что требует использования Виртуальной машины для их фактического выполнения. Самые производительные виртуальные машины компилируют код снова перед его выполнением - это может быть настолько эффективным методом, что он использовался для построения быстрых и эффективных цепочек инструментов компилятора !
Visual Basic здесь - красная сельдь - некоторые версии интерпретируются, другие компилируются , а VB.NET - как и другие языки .NET - компилируется в байт-код, а затем снова JIT-компилируется во время выполнения ( хотя внешне схоже, это имеет тенденцию быть реализованным очень по-другому от более ранних виртуальных машин VB). Если ничего другого, это должно сказать вам, что язык и средства, с помощью которых программы, написанные на нем, выполняются, не так тесно связаны, как это принято считать ...
В ответ на ваш последний вопрос : Objective-C никогда не был не переносимым, по крайней мере в том смысле, что C переносим (то есть переносимость исходного кода) ). Apple использует компилятор GCC , который был перенесен на головокружительный массив платформ ... Однако, как только вы начнете использовать API-интерфейсы для платформ (вероятно, это одна из лучших причин для использования Obj-C на Платформы Apple для начала ...) вы ограничены платформами, которые реализуют эти API . Двоичная переносимость теоретически возможна, но я не знаю ни одной реализации.