Начальная загрузка все еще требует внешней поддержки

Попробуйте следующее:

function ready(callback){
    if(typeof callback === "function"){
        document.addEventListener("DOMContentLoaded", callback);
        window.addEventListener("load", callback);
    }else{
        throw new Error("Sorry, I can not run this!");
    }
}
ready(function(){
    console.log("It worked!");
});
93
задан nbro 1 August 2017 в 17:59
поделиться

8 ответов

там способ на самом деле записать компилятор на его собственном языке?

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

, Если бы Вы были попытка загрузить компилятор для Yazzleof, Вы обычно не писали бы компилятор для полного языка первоначально. Вместо этого Вы записали бы компилятор для Yazzle-облегченного, самого маленького подмножества Yazzleof (хорошо, довольно маленький подмножество, по крайней мере). Тогда в Yazzle-облегченном, Вы записали бы компилятор для полного языка. (Очевидно, это может произойти многократно вместо в одном переходе.), Поскольку Yazzle-облегченный собственное подмножество Yazzleof, у Вас теперь есть компилятор, который может скомпилировать себя.

существует действительно хорошая рецензия о начальной загрузке компилятора от самого низкого уровня (который на современной машине является в основном Hex-редактором), названный Начальная загрузка простого компилятора ни от чего . Это может быть найдено в https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html .

104
ответ дан MD XF 24 November 2019 в 06:18
поделиться

Объяснение, которое Вы считали, корректно. Существует обсуждение этого в Компиляторы: Принципы, Методы и Инструменты (Книга Дракона):

  • Запись компилятор C1 для языка X в Использовании языка Y
  • компилятор C1, чтобы записать компилятору C2 для языка X на языке X
  • Теперь C2 полностью сам хостинг среды.
19
ответ дан Peter Mortensen 24 November 2019 в 06:18
поделиться

Супер интересное обсуждение этого находится в co-создателе Unix Ken Thompson Премия Turing лекция.

Он начинается с:

то, Что я собираюсь описать, является одним из многих "курица и яйцо" проблемы, которые возникают, когда компиляторы записаны на их собственном языке. В этой простоте я буду использовать определенный пример от компилятора C.

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

второй шаблон нацелен на компилятор C. Заменяющим кодом является Этап I самовоспроизводящаяся программа, которая вставляет обоих Троянских коней в компилятор. Это требует фазы изучения как в примере Этапа II. Сначала мы компилируем измененный источник с нормальным компилятором C для создания двоичного файла с ошибками. Мы устанавливаем этот двоичный файл как чиновник C. Мы можем теперь удалить ошибки из источника компилятора, и новый двоичный файл повторно вставит ошибки каждый раз, когда это компилируется. Конечно, команда входа в систему останется с ошибками без трассировки в источнике где угодно.

7
ответ дан Peter Mortensen 24 November 2019 в 06:18
поделиться

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

Это - определение начальная загрузка:

процесс простой системы, активирующей более сложную систему, которая служит той же цели.

РЕДАКТИРОВАНИЕ: статья Wikipedia о компиляторе, загружающемся покрытия понятие лучше, чем я.

5
ответ дан Eric Haskins 24 November 2019 в 06:18
поделиться

Другая альтернатива должна создать машину байт-кода для Вашего языка (или использовать существующий, если это - функции, не очень необычны), и запишите компилятор в байт-код, или в байт-коде, или на Вашем желаемом языке с помощью другого промежуточного звена - такого как инструментарий синтаксического анализатора, который производит AST как XML, затем скомпилируйте XML в байт-код с помощью XSLT (или другой язык сопоставления с образцом и основанное на дереве представление). Это не удаляет зависимость от другого языка, но могло означать, что больше загружающейся работы заканчивается в заключительной системе.

2
ответ дан Pete Kirkham 24 November 2019 в 06:18
поделиться

Это - версия информатики парадокса курицы-и-яйца. Я не могу думать о способе не записать первоначальный компилятор в ассемблере или некотором другом языке. Если это, возможно, было сделано, я должен, Lisp, возможно, сделал его.

На самом деле, я думаю, что Lisp почти квалифицирует. Выезд его статья в Википедии . В соответствии со статьей, функция оценки Lisp могла быть реализована на IBM 704 в машинном коде с полным компилятором (записанный в самом Lisp) возникающий в 1962 в MIT.

2
ответ дан Peter Mortensen 24 November 2019 в 06:18
поделиться

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

, Как еще это работало бы? Я не думаю, что даже концептуально возможно сделать иначе.

2
ответ дан Peter Mortensen 24 November 2019 в 06:18
поделиться

Посмотрите подкаст Эпизод 61 Software Engineering Radio (2007-07-06), в котором обсуждаются внутренние компоненты компилятора GCC, а также процесс начальной загрузки GCC.

4
ответ дан 24 November 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: