В компьютерном программировании самохостинг — это использование программы как части инструментальной цепочки или операционной системы , которая производит новые версии той же программы, например, компилятор , который может компилировать свой собственный исходный код . Самохостинг программного обеспечения является обычным явлением на персональных компьютерах и более крупных системах. Другие программы, которые обычно являются самохостинговыми, включают ядра , ассемблеры , интерпретаторы командной строки и программное обеспечение для контроля версий .
Операционная система является самохостируемой, когда набор инструментов для сборки операционной системы работает в той же операционной системе. Например, Windows может быть собрана на компьютере под управлением Windows.
Прежде чем система сможет стать самохостируемой, нужна другая система для ее разработки, пока она не достигнет стадии, на которой самохостинг станет возможным. При разработке для нового компьютера или операционной системы необходима система для запуска программного обеспечения разработки, но также необходимо программное обеспечение разработки, используемое для написания и сборки операционной системы. Это называется проблемой самозагрузки или, в более общем смысле, дилеммой курицы или яйца .
Решением этой проблемы является кросс-компилятор (или кросс-ассемблер при работе с языком ассемблера). Кросс-компилятор позволяет компилировать исходный код на одной платформе для другой машины или операционной системы, что позволяет создать операционную систему для машины, для которой еще не существует самостоятельный компилятор. После написания программное обеспечение может быть развернуто на целевой системе с помощью таких средств, как EPROM , дискета , флэш-память (например, USB-накопитель) или устройство JTAG . Это похоже на метод, используемый для написания программного обеспечения для игровых консолей или для карманных устройств, таких как сотовые телефоны или планшеты, которые не содержат собственных инструментов разработки.
Как только система становится достаточно зрелой, чтобы компилировать свой собственный код, зависимость от кросс-разработки заканчивается. В этот момент операционная система считается самохостируемой.
Разработка программного обеспечения с использованием компилятора или интерпретаторов также может быть самостоятельным проектом, если компилятор способен компилировать сам себя. [1]
Поскольку самостоятельные компиляторы страдают от тех же проблем с самозагрузкой, что и операционные системы, компилятор для нового языка программирования должен быть написан на существующем языке. Поэтому разработчик может использовать что-то вроде языка ассемблера, C / C++ или даже скриптовый язык, такой как Python или Lua, для сборки первой версии компилятора. Как только язык станет достаточно зрелым, разработка компилятора может перейти на родной язык компилятора, что позволит компилятору собрать себя.
Первый самохостинговый компилятор (исключая ассемблеры) был написан для Lisp Хартом и Левиным в Массачусетском технологическом институте в 1962 году. Они написали компилятор Lisp на Lisp, протестировав его внутри существующего интерпретатора Lisp . Как только они улучшили компилятор до такой степени, что он мог компилировать свой собственный исходный код, он стал самохостинговым. [2]
Компилятор, существующий на стандартной ленте компилятора, представляет собой программу на машинном языке, которая была получена путем обработки определения S-выражения компилятора над собой через интерпретатор.
— Памятка ИИ 39 [2]
Этот метод обычно применим только тогда, когда интерпретатор уже существует для того же самого языка, который должен быть скомпилирован; хотя это и возможно, крайне редко бывает, чтобы человек скомпилировал компилятор с самим собой. [3] Концепция напрямую заимствована и является примером более широкого понятия запуска программы на самой себе в качестве входных данных, используемого также в различных доказательствах в теоретической информатике , таких как доказательство того, что проблема остановки неразрешима.
Кен Томпсон начал разработку Unix в 1968 году, написав и скомпилировав программы на GE-635 и перенеся их на PDP-7 для тестирования. После того, как были завершены первоначальное ядро Unix, интерпретатор команд , редактор, ассемблер и несколько утилит, операционная система Unix стала самохостинговой — программы можно было писать и тестировать на самом PDP-7. [4]
Дуглас Макилрой написал TMG ( компилятор-компилятор ) на TMG на листке бумаги и «решил отдать свой листок своему листку бумаги», выполнив вычисления самостоятельно, таким образом скомпилировав компилятор TMG в ассемблер , который он набрал и собрал на PDP-7 Кена Томпсона. [3]
Разработка системы GNU в значительной степени опирается на GCC (коллекция компиляторов GNU) и GNU Emacs (популярный редактор), что делает возможной самостоятельную, поддерживаемую и устойчивую разработку свободного программного обеспечения для проекта GNU .
Многие языки программирования имеют самостоятельные реализации: компиляторы, которые находятся как на одном языке, так и для него. Подходом является самонастройка , когда базовая версия языка изначально реализуется с использованием другого языка высокого уровня, ассемблера или даже машинного языка ; затем полученный компилятор используется для начала построения последовательных расширенных версий самого себя.
Следующие языки программирования имеют самостоятельные компиляторы: [ необходима ссылка ]
Flat assembler является самостоятельным и включает в себя полный исходный код.