Я часто фантазировал о попытке построить (еще один) компьютер высокого уровня. Целью было бы попытаться надавить на конверт быстроты развития и на результат результата. Я бы попытался создать библиотеки как минимум минимальных, довольно высоко оптимизированных операций, а затем попытаться разработать языковые правила таким образом, чтобы любое выражение или выражение, выражаемое на языке, приводило к оптимальному коду .., если бы не было выражено просто изначально субоптимальный.
Он будет компилироваться в байтовый код, который будет распространен, а затем в машинный код при установке или при изменении среды процессора. Поэтому, когда исполняемый файл загружен, будет существовать кусок загрузчика, который будет проверять процессор и несколько байтов данных управления в объекте, а если они совпадают, то исполняемая часть объекта может быть загружена сразу, но если нет, , тогда байт-код для этого объекта должен быть перекомпилирован, а исполняемая часть обновлена. (Так что это не Just In Time компиляция - это On Program Install или в CPU Измененная компиляция.) Часть загрузчика была бы очень короткой и сладкой, она была бы в коде 386, поэтому ее не нужно было компилировать. Он загрузил бы только компилятор байтового кода, если бы это было необходимо, и если да, то он загрузил бы объект компилятора, который был бы небольшим и плотным, и оптимизирован для обнаруженной архитектуры. В идеале, загрузчик и компилятор останутся постоянными, после загрузки, и будет только один экземпляр обоих.
В любом случае, я хотел ответить на мысль, что у вас должно быть как минимум два прохода - я не думаю, что вполне согласен. Да, я бы использовал второй проход через скомпилированный код, но не через исходный код.
Что вы делаете, когда вы сталкиваетесь с символом, проверьте свою хэш-таблицу символов, и если там нет записи, создайте ее и сохраните маркер «прямой ссылки» в скомпилированном коде с указателем на таблицу запись. Когда вы сталкиваетесь с определениями меток и символов, обновите (или поместите новые данные) в свою таблицу символов.
Индивидуальные скомпилированные объекты никогда не должны быть настолько большими, чтобы они занимали очень много памяти, поэтому определенно весь скомпилированный код должен храниться в памяти до тех пор, пока все не будет готово к записи. То, как вы сохраняете свой малый размер памяти, - это просто иметь дело только с одним объектом за раз, и никогда не оставлять в памяти не более одного небольшого буфера, заполненного исходным кодом. Может быть, 64k или 128k или что-то еще. (Что-то достаточно большое, чтобы накладные расходы, связанные с выполнением вызова для загрузки буфера с диска, были небольшими по сравнению с временем, затрачиваемым на чтение данных с диска, так что оптимизация потоковой передачи была оптимизирована.)
Итак, один проход через исходный поток для объекта, тогда вы объединяете свои фрагменты, собирая необходимую информацию о перенаправлении из хеш-таблицы по ходу дела, а если данных нет - это ошибка компиляции. Это процесс, который мне хотелось бы попробовать.
Это напоминает мне о тесте программист с 1980-х годов, учитывая дискету с только command.com и debug.com на него, какой тип среды разработки будет создавать для себя. Я знаю, как ответили ребята из Форта. – zumalifeguard