Для начала желательно изучить уже существующие языки программирования. Если будете знать их слабые и сильные стороны, то это поможет избежать ошибок проектирования и взять из них только всё самое лучшее.
Далее придумывается синтаксис, набор конструкций. То как выглядят циклы, функции, условие, комментарии, структуры данных и прочее. Попробуйте написать на вашем языке короткую программу и посмотреть как она выглядит, как читается. Много ли приходится набирать символов, как лучше форматировать текст, с отступами или без. Попробуйте разные варианты и сравните. Покажите другу. Важным фактором является масштабируемость. То как можно будет в дальнейшем добавлять новые фичи в синтаксис.
Когда синтаксис разработан, то можно приступать к написанию парсера. Можно взять готовые парсеры, которые генерируют текст c++ программы, исходя из правил разбора. Но я бы рекомендовал делать парсер самостоятельно, чтобы не тратить время на изучение сторонних программ и их правил. Обычно парсер формирует промежуточные данные, содержащие AST деревья, учитывающие приоритеты операций. Чтобы, например, умножение вычислялось перед сложением в выражении (a+b*c). Но этот этап можно пропустить для языка, не поддерживающего сложные выражения (или в случае транслятора в язык с идентичным приоритетом операторов). На основании промежуточных данных формируется список инструкций. Или массив списка инструкций, для ветвления через инструкцию "обратиться к элементу массива под номером n", и ленивых вычислений. В случае интерпретатора мы просто выполняем по порядку все инструкции из полученного списка (инструкции могут работать со стеком - это такой массив данных, хранящий временные значения, полученные от предыдущих инструкций). А в случае транслятора (или компилятора) экспортируем список в итоговый файл или файлы.
Важным нюансом является обработка ошибок и выдача отчёта в какой строчке скрипта что не так. Одни ошибки ловятся на этапе работы парсера (напр. пропущена запятая). Другие - на этапе проверки промежуточных данных (напр. вызов функции, которая не была определена). Бывают и run-time ошибки. Разработчик языка определяет какие ошибки являются критическими и должны приводить к остановке работы программы, а какие игнорируются и программа продолжается.
p.s. Я разрабатываю новый язык программирования
ksi (уже есть рабочий прототип интерпретатора).