Скажем, я покупаю новый процессор без него.Во время первой операции я хочу установить ОС, на которой работает C. Что запускает компилятор C?Есть ли в BIOS миниатюрный компилятор C?
Я понимаю, о чем вы спрашиваете ... что произойдет, если у нас не будет компилятора C и мы начнем все с нуля?
Ответ: вам нужно начатьот сборки или оборудования.То есть вы можете создать компилятор как программно, так и аппаратно.Если бы во всем мире не было компиляторов, в эти дни вы, вероятно, могли бы делать это быстрее при сборке;тем не менее, в те времена, я полагаю, компиляторы на самом деле были выделенными аппаратными средствами.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Вопрос: "Что происходит сегодня?Ну, эти авторы компиляторов годами занимались написанием переносимого C, поэтому компилятор должен иметь возможность компилировать себя.Стоит обсудить на очень высоком уровне, что такое компиляция.По сути, вы берете набор утверждений и производите из них сборку.Вот и все.Ну, на самом деле все сложнее - вы можете делать все что угодно с помощью лексеров и парсеров, и я понимаю только небольшое его подмножество, но, по сути, вы хотите сопоставить C со сборкой.
ПодПри нормальной работе компилятор создает ассемблерный код, соответствующий вашей платформе, но это не обязательно.Он может создавать ассемблерный код для любой платформы, которая вам нравится, при условии, что она знает, как это сделать.Итак, первый шаг к тому, чтобы заставить C работать на вашей платформе, - создать цель в существующем компиляторе, начать добавлять инструкции и заставить работать базовый код.
Как только это будет сделано, теоретически, теперь вы можете кросс-компилировать с одной платформы на другую.Следующие этапы: сборка ядра, загрузчика и некоторых базовых утилит пользователя для этой платформы.
Затем вы можете приступить к компиляции компилятора для этой платформы (как только вы получите работающий пользовательский мир и все остальное).вам нужно запустить процесс сборки).Если это удастся, у вас есть базовые утилиты, работающее ядро, пользовательское пространство и система компиляторов.Теперь вы уже в пути.
Обратите внимание, что в процессе переноса компилятора вам, вероятно, нужно было написать ассемблер и компоновщик для этой платформы.Чтобы описание было простым, я их опускал.
Если это интересно, Linux с нуля - интересное чтение.Он не говорит вам, как создать новую цель с нуля (что существенно не тривиально) - он предполагает, что вы собираетесь построить для существующей известной цели, но он показывает, как вы перекрестно компилируете основы и начинаете строитьдо системы.
Python фактически не собирается для сборки.Для начала, работающая программа на Python отслеживает количество ссылок на объекты, что процессор не сделает для вас.Тем не менее, концепция кода на основе инструкций также лежит в основе Python.Поиграйте с этим:
>>> def hello(x, y, z, q):
... print "Hello, world"
... q()
... return x+y+z
...
>>> import dis
dis.dis(hello)
2 0 LOAD_CONST 1 ('Hello, world')
3 PRINT_ITEM
4 PRINT_NEWLINE
3 5 LOAD_FAST 3 (q)
8 CALL_FUNCTION 0
11 POP_TOP
4 12 LOAD_FAST 0 (x)
15 LOAD_FAST 1 (y)
18 BINARY_ADD
19 LOAD_FAST 2 (z)
22 BINARY_ADD
23 RETURN_VALUE
Там вы можете увидеть, как Python думает о коде, который вы ввели.Это байт-код python, т.е. язык ассемблера python.Он эффективно имеет свой собственный «набор инструкций», если вам нравится реализация языка.Это концепция виртуальной машины.
Java имеет точно такую же идею.Я взял функцию класса и набрал javap -c class
, чтобы получить это:
invalid.site.ningefingers.main:();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_1
4: iload_1
5: aload_0
6: arraylength
7: if_icmpge 57
10: getstatic #2;
13: new #3;
16: dup
17: invokespecial #4;
20: ldc #5;
22: invokevirtual #6;
25: iload_1
26: invokevirtual #7;
//.......
}
Я так понимаю, вы поняли идею.Это языки ассемблера миров python и java, то есть то, что думают интерпретатор python и компилятор java соответственно.
Еще кое-что, о чем стоило бы прочитать, это JonesForth .Это как работающий переводчик, так и учебник, и я не могу рекомендовать его достаточно для размышлений о том, «как все выполняется» и как вы пишете простой и легкий язык.