Можно не спешить с доказательствами, а обратиться к истории компьютеров. Посмотреть на перфокарты, магнитные ленты, машинные коды. Собрать информацию об устройстве процессора и о том, как он выполняет команды из машинного кода. Если коротко: когда не было сред вроде C++, люди пользовались перфокартами и перфолентами и писали на них машинные коды. Потом на этих кодах начали писать самые простые языки (ассемблер). На простых языках — другие, более сложные языки. А на других — третьи. А теперь чуть подробнее. Машинные коды процессор понимает идеально — на уровне физических законов. Но людям было неудобно писать этими кодами. Это надо держать перед собой сотни команд и знать, какой бит за что отвечает. Тогда люди придумали более человечный язык — язык ассемблера. Его команды чуть больше похожи на человеческие слова (mov, add, xor, int и прочие), но он по-прежнему работает на уровне машинных команд. Ты пишешь программу на языке ассемблера. Затем сборщик — какой-нибудь человек или программа на чистом машинном коде — переводит эти команды в машинные коды и загружает в компьютер. И программа работает. Но людям и этого мало. Их заколебало тысячи раз писать одни и те же алгоритмы. Да и язык можно сделать получше. Тогда они придумали еще более человечные языки — Си, Паскаль, Бейсик… Это далеко не полный список. И в эти языки они добавили макрокоманды — возможность одной строчкой делать то, что раньше они подробно расписывали в ассемблере. Если ты видел какую-нибудь старую среду программирования для DOS (например, Turbo Pascal), то мог заметить, что к среде прилагается что-нибудь вроде TASM. Да, это сборщик ассемблерного кода! То есть код на Паскале переводился на язык ассемблера, а из него — в машинные коды, понятные процессору. Так работают языки с компилятором. Еще есть интерпретаторы — программы, которые тупо читают код, разбирают его на части и исполняют без компиляции. Это касается таких языков, как Python или Javascript. У интерпретатора уже есть наготове все необходимые команды процессору, и компиляция не происходит.