Есть единственный язык, который может понимать процессор - это машинный язык. Команды в нём - всего-навсего представляют собой числовой код. Когда-то так и программировали, исключительно кодами. Затем стали применять мнемонические языки, более пригодные для человеческого восприятия, при этом это были языки 1:1, т.е. одна мнемоническая команда определяла один код, одну машинную команду. С некоторым расширением от соотношения 1:1 существует язык Ассемблер. Он, в принципе так и остался до сего дня языком программирования на машинном уровне.
Затем стали появляться языки более высокого уровня, где уже одна команда на этих языках могла соответствовать нескольким машинным командам. Этот процесс шёл и шёл. Языки программирования становились всё формализованнее и формализованнее. Можно уже было описывать несколькими командами на этих языках целые функциональные блоки из машинных команд. Появились библиотеки таких готовых блоков.
Оставалось совсем чуть-чуть до идеи создания такой программы, которая могла бы по желанию программиста собирать из этих заранее готовых блоков массив машинных кодов, почти готовый к использованию. Таким образом получалась программа, способная 'писать' другие программы. На самом деле это было не совсем так. Ничего эта программа не сочиняла. Она просто 'вытаскивала' из библиотеки готовых блоков нужный в данный момент программисту блок и 'притирала' по возможности этот блок к остальному тексту. Если эта 'притирка' не получалась, или нужного блока не находилось (а потребности всегда превосходят наличие), программисту приходилось самому вручную писать 'прокладки' между этими блоками на языке более низкого уровня, чем этот язык блочного программирования.
Сама эта программа блочного программирования могла быть написана в принципе на любом языке, даже на том, на котором написаны блоки. Тут нет ничего удивительного, ибо её-то писали просто вручную.
А вот то, чему стоит подивиться и чего я так и не мог понять, это то заявление Ричи, что транслятор с языка "С" сам написан на языке "С". Вот это непонятно вообще. Разве что, для трансляции этого транслятора использовался какой-то начальный, примитивный транслятор, без наворотов, чистый функционал.