Как компилятор компилирует компилятор?

Имея опыт программирования высокого уровня, я заинтересован в изучении низкоуровневого программирования. Я хочу знать, как компилируется компилятор?

После просмотра некоторых статей в вики, числовой машинный код считается языком самого низкого уровня, но должен быть компилятором для компиляции этого машинного кода. На каком языке написан этот компилятор?


person wtsang02    schedule 11.07.2013    source источник
comment
Машинный код не требует компиляции. Он напрямую выполняется процессором. Вы можете ввести его с помощью hex-редактора.   -  person Blorgbeard    schedule 12.07.2013
comment
Numerical machine code (i.e. not assembly code) may be regarded as the lowest-level representation of a compiled and/or assembled computer program , из статьи, 2-й абзац   -  person wtsang02    schedule 12.07.2013
comment
Да, самый низкий уровень — нижнего уровня нет. Это то, во что другие языки компилируются в!   -  person Blorgbeard    schedule 12.07.2013
comment
Ваша цитата говорит о том, что числовой машинный код является результатом компиляции программы. Не существует компилятора, принимающего на вход машинный код.   -  person Blorgbeard    schedule 12.07.2013
comment
Да, конечно есть компилятор, который компилирует машинный код: декодер инструкций. В современном ЦП (особенно линейки x86) декодер может быть очень сложным, он разбивает инструкции на последовательности микроинструкций, которые затем анализируются (для получения зависимостей и потенциальных опасностей) и выдаются в разные исполнительные блоки.   -  person SK-logic    schedule 12.07.2013


Ответы (4)


Обычно авторы компиляторов идут одним из двух путей:

  • Напишите весь компилятор на каком-то другом существующем языке. Это вообще самый простой вариант.

  • Напишите достаточно кода на каком-нибудь другом языке, чтобы иметь минимально пригодный для использования транслятор, и используйте эти «леса» в качестве основы для написания компилятора на языке, который он предназначен для компиляции. Это сложнее и обычно занимает больше времени, но по своей сути дает возможность устранить языковые ошибки и недостатки, протестировав язык в реальном проекте.

Первая программа для преобразования кода была написана, по крайней мере частично, в машинном коде — фактических числах, которые говорят процессору, что делать. Это самый низкий уровень, потому что на самом деле нет "компилятора" для машинного кода*; это просто числа, расположенные определенным образом, и в ЦП есть схема, позволяющая обрабатывать их без посторонней помощи.

* Существуют программы, помогающие спроектировать аппаратное обеспечение, которое интерпретирует и выполняет инструкции, но, возможно, это выходит за рамки определения компилятора. Такие программы генерируют описания аппаратных средств — принципиальные схемы и т. п. — в отличие от непосредственно исполняемых файлов, которые выдает компилятор.

person cHao    schedule 11.07.2013

Вы всегда можете использовать свой любимый компилятор A для написания другого компилятора, скажем, B. В этот B вы добавили некоторые дополнительные функции, поэтому он легко может стать вашим любимым, и вы будете использовать его для написания компилятора C,...

Как тогда начать? В старые времена люди просто заполняли память необработанными числами для прямой интерпретации процессором. Вот почему источник часто называют кодом. Как только минимальный компилятор был запрограммирован таким образом, его можно выполнить для создания другого компилятора, написанного на языке, который он компилирует. Это снова может быть использовано для создания более высокого уровня и так далее.

На самом деле заполнение необработанных кодов инструкций в памяти само по себе можно рассматривать как процесс компиляции нулевого уровня, где человек является компилятором.

Вполне обычно, что компилятор для данного языка написан на том же самом языке. Так обстоит дело, например, с языком программирования Си. Это несколько больше, чем совпадение, потому что тот, кто знает язык достаточно хорошо, чтобы осмелиться написать для него компилятор, вероятно, имеет этот язык в числе своих любимых языков для программирования. Однако это просто типичный случай, в котором нет необходимости, так как существует множество языков на выбор, включая те, которые особенно хороши для создания компиляторов.

person jmihalicza    schedule 11.07.2013

Числовой машинный код является двоичным. 1с и 0с. Компиляция подразумевает преобразование его в еще более низкую форму, поэтому на самом деле он не компилируется.

Например, из процитированной вами вики-статьи: For example, on the Zilog Z80 processor, the machine code 00000101, which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B.

Таким образом, у вас будет компилятор, когда вы будете писать язык ассемблера Z80, и инструкция DEC B будет скомпилирована в «00000101», а не наоборот.

person Cortright    schedule 11.07.2013

Цифровой машинный код представляет серию выключенных и включенных состояний цепей и является тем, чем являются все электронные данные на самом низком уровне. Для этого языка низкого уровня не существует «компилятора», скажем так, схемы в компьютере объединены и структурированы таким образом, чтобы «интерпретировать» их, считывая включения и выключения в коде, реализуемом высокими или низкими электрическими состояниями. В любом случае эти состояния высокого или низкого уровня вызывают открытие или закрытие различных ворот/цепей, в целом ведут себя по-разному. Узнайте больше на электронных воротах.

person Legion    schedule 11.07.2013