Сами по себе языки программирования не являются программами. Так что вопрос, того на каком языке создаются языки программирования - не до конца корректный.
Почему не до конца, хоть ЯП не является программой и не создаётся на каком-то конкретном языке программирования, для его работы нужна совокупность программ. И вот эти программы, в свою очередь, требуют написания. Но писать их можно на любом угодном вам языке.
Программы, которые нужны для работы Вашего ЯП, это – лексический анализатор, синтаксический анализатор и интерпретатор/компилятор.
Поэтому, на текущий момент, задача написания своего языка программирования сводится к следующим этапам:
- Описание грамматики/синтаксиса языка(например используя форму Бэкуса — Наура, сокрашено БНФ)
- Написание лексического анализатор, который будет анализировать код, написанный на вашем ЯП, и формировать из него список токенов
- Написание синтаксического анализатора, который будет формировать из списка токенов абстрактное синтаксическое дерево(AST)
- Переход от AST к абстрактному семантическому графу(ASG). По своей сути, ASG это AST с контекстом. Он содержит информацию о типах переменных, сигнатурах функций, местах использования и объявления переменных, и т.п.
- Последним этапом является запуск. Для этого необходим написать интерпретатор, либо компилятор языка, в зависимости от того, какого типа ЯП вы решили писать, интерпретируемый или компилируемый соответственно. Писать их можно на любом угодном Вам языке.
Однако, писать свой компилятор/интерпретатор может быть задачей очень затратной и, в некоторых ситуациях, бессмысленной. Поэтому, можно пойти по пути транспайлинга.
По своей сути, транспайлинг кода, это процесс перевода кода на одном ЯП в код на другом ЯП. То есть, перед Вами будет стоять задача компиляции программы написанной на Вашем ЯП в программу написанную, например, на C++, а затем пропуск результата через компилятор того самого C++