Ну это утрировано. В конечном случае с железяками дейстительно только 1 и 0 (есть заряд - нет заряда) потому что машина по другому не умеет, но сам процессор оперирует с командами. Если вы хоть раз видели код на ассемблере, то вот примерно такие инструкции выполняет процессор, работая со стеком, регистрами и прочим. У меня была в институте дисциплина по низкоуровневому программированию. Так вот там что бы умножить два числа, приходилось очень сильно извернуться кодом строк на 10. Потому что как таковых переменных там не было. Был рабочий регистр, был небольшой банк памяти, была возможность складывать. Умножение делалось циклом, организация которого ввиду отсутствия переменных и условий тоже была очень занятной штукой... Все было основано на волшебной команде "если в регистре сейчас 0, то пропускаем следующую команду".. Эта кстати дисциплина существенно помогла мне продвинуться в разработке КМ. Поэтому сказать что "сейчас в России ничему не учат" я не умогу.
Вообщем поэтому традиционно считается что по ассемблерному коду невозможно достаточно точно восстановить исходный код. Слишком большой уровень запутанности. При том что ассемблерный код можно получить всегда и он остается рабочим. Именно умельцам читать этот код мы обязаны всем существующим крякам к программам.
Что до кликера, то он возводит уровень абстракции еще выше. То есть, если команда "записать строчку в файл" на асме (на командах процессору) содержала бы 100 строк, на С++ это было бы строк примерно 3-4, в CM это вообще одна строка.