Нет, я бы не сказал, что GC и IL тесно связаны. На самом деле одно может существовать без другого - и иногда это так.
Основная цель IL - сделать его независимым от платформы и позволить JIT проводить очень специфические оптимизации, которые зависят от платформы. Например, x86, x64, ARM и т. Д. Цель JIT - превратить этот IL-код в собственный машинный код для архитектуры и правильно его оптимизировать.
Вы не могли оптимизировать для x86 и ARM, потому что платформы слишком разные. Вот почему есть JIT для каждой конкретной платформы. JIT может позволить себе роскошь знать, с какой платформой он будет работать. Как автор кода, вы можете не знать.
С другой стороны, GC относится к управлению памятью. Существует множество библиотек Garbage Collector для программного обеспечения, которое не компилируется на промежуточный язык. Возьмите, например, этот , который небольшой, но выполняет свою работу. На эту тему также было много статей .
Возможно, что один может существовать без другого, просто это не так, как мы видим это очень часто.
Так, что делает "управляемый" язык? Для меня это означает, что задействована виртуальная машина определенного типа. В случае .NET, CLR. Он предоставляет различные услуги, такие как GC, Jit, Code Access Security (CAS) и т. Д.