Можно ли написать компилятор в машиный код на языке очень высокого уровня?
1. Поверьте человеку, который пишет на Си с 1985 года (30 лет, вроде бы?) - НИКОГДА не пишите на Си ничего, если только к вашему виску не приставили пистолет. Исключение одно - ядро ОС. Да и то...
2. Что угодно можно написать на чём угодно. Вопрос удобства.
3. Писать компилятор надо на языке с развитыми средствами поддержки жизни проекта. Таких два - Java и C#. Можно (а если Вам это комфортно, то и нужно) использовать функциональные расширения соответствующих платформ. Scala/F#.
4. На говноязыках серьёзные вещи писать не нужно. Ключевое свойство говноязыка - обсуждение вокруг него о том, как бедные программеры перетрудились явно прописывать руками типы всех переменных. На таких ЯП можно писать затычки и примочки.
5. Не применяйте генераторы лексических и грамматических анализаторов, пока не научитесь писать компилятор руками. Ключевое слово - парсинг рекурсивным спуском. Это реально просто, если грамматика языка - LR1. Для начала надо взять простой язык. Очень простой.
6. Базовый компилятор с кодогенерацией для стековой машины нужно уметь писать за два дня. Если вы хотите это уметь.
7. Бекэнды (реальную кодогенерацию) писать НЕ НУЖНО. Вообще. Вы её хорошо не напишете ни-ко-гда. Проще генерировать на выходе Си и докомпилировать приличным си-компилятором.
Главное в компиляторе - разбор кода, который на входе. А разбору строк, ИМХО, уж всяко легче учиться на ЯВУ. А тема это (если изучать на уровне компилятора) очень и очень большая.
Ну и технически, конечно, тоже можно почти на чем угодно, всего-то прочитать текстовый файл, разобрать его (вот тут проблемка - регулярки нужны) и записать бинарный файл.