Вы в основном правы. Если говорят, что Ruby написан на C, это означает, что интерпретатор языка и части базовой библиотеки написаны на C.
Таким образом, интерпретатор Ruby - это программа на C, которая принимает текстовый файл в качестве входных данных, обрабатывает его и затем вызывает функции, которые находятся либо в другом текстовом файле (если написаны на Ruby), либо являются скомпилированным кодом C, что является основной функциональностью, которая требуется прямой доступ к системным ресурсам, таким как память, файловая система и многое другое. И некоторые функции, которые требуют очень высокой производительности.
Таким образом, у вас есть разные части языка, которые можно или нужно писать на других языках. Ничто не помешает вам написать интерпретатор на C и библиотеки на C ++ (хотя, может быть, несколько сложнее). Вы могли бы даже сделать несколько шагов и использовать язык, который очень хорош в обработке текста, чтобы генерировать некоторые промежуточные данные, которые затем обрабатываются некоторым C-кодом.
Факторы для решения могут быть такими же, как и для других сложных приложений. Производительность одна. Возможность написания кода, который может напрямую обращаться к системным ресурсам другого. Так что в большинстве случаев это должен быть скомпилированный язык (хотя теоретически вы можете написать интерпретатор Ruby на Python). Доступность в разных системах важна, если вы хотите, чтобы ваш язык работал в Linux, Win, OS X и других.