Самостоятельный хостинг (компиляторы)
Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2010 г. ) |
В компьютерном программировании самохостинг — это использование программы как части набора инструментов или операционной системы , которая создает новые версии той же самой программы — например, компилятора , который может компилировать собственный исходный код . Самостоятельное размещение программного обеспечения является обычным явлением на персональных компьютерах и более крупных системах. Другие программы, которые обычно размещаются самостоятельно, включают ядра , ассемблеры , интерпретаторы командной строки и программное обеспечение для контроля версий .
Операционные системы
[ редактировать ]Операционная система является автономной, если набор инструментов для ее создания работает в этой же операционной системе. Например, Windows может быть построена на компьютере под управлением Windows.
Прежде чем система сможет стать самостоятельным хостингом, необходима другая система для ее развития, пока она не достигнет стадии, когда самостоятельный хостинг станет возможным. При разработке для нового компьютера или операционной системы необходима система для запуска программного обеспечения для разработки, но также необходимо программное обеспечение для разработки, используемое для написания и сборки операционной системы. Это называется проблемой начальной загрузки или, в более общем смысле, дилеммой курицы или яйца .
Решением этой проблемы является кросс-компилятор (или кросс-ассемблер при работе с языком ассемблера). Кросс-компилятор позволяет компилировать исходный код на одной платформе для другой машины или операционной системы, что позволяет создать операционную систему для машины, для которой еще не существует самостоятельный компилятор. После написания программное обеспечение может быть развернуто в целевой системе с использованием таких средств, как EPROM , дискета , флэш-память (например, флэш-накопитель USB) или JTAG устройство . Это похоже на метод, используемый для написания программного обеспечения для игровых консолей или портативных устройств, таких как сотовые телефоны или планшеты, которые не имеют собственных инструментов разработки.
Как только система становится достаточно зрелой для компиляции собственного кода, зависимость между разработками прекращается. На этом этапе операционная система называется автономной.
Составители
[ редактировать ]Разработка программного обеспечения с использованием компилятора или интерпретаторов также может осуществляться самостоятельно, если компилятор способен компилировать себя сам. [1]
Поскольку автономные компиляторы страдают от тех же проблем с загрузкой, что и операционные системы, компилятор для нового языка программирования необходимо писать на существующем языке. Таким образом, разработчик может использовать что-то вроде языка ассемблера C / C++ или даже языка сценариев, такого как Python или Lua , для создания первой версии компилятора. Как только язык станет достаточно зрелым, разработка компилятора может перейти на родной язык компилятора, что позволит компилятору построить себя самостоятельно.
История
[ редактировать ]Первый автономный компилятор (исключая ассемблеры) был написан для Лиспа Хартом и Левином из Массачусетского технологического института в 1962 году. Они написали компилятор Лиспа на Лиспе, протестировав его внутри существующего интерпретатора Лиспа . Как только они улучшили компилятор до такой степени, что он мог компилировать собственный исходный код, он стал самостоятельным. [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 .
Многие языки программирования имеют самостоятельные реализации: компиляторы, работающие как на одном языке, так и для него. Подход — это начальная загрузка , при которой базовая версия языка изначально реализуется с использованием другого языка высокого уровня, ассемблера или даже машинного языка ; полученный компилятор затем используется для создания последовательных расширенных версий самого себя.
Список языков, имеющих самостоятельные компиляторы
[ редактировать ]Следующие языки программирования имеют автономные компиляторы: [ нужна ссылка ]
- Есть
- АЛГОЛ ( Берроуз B5000 )
- БАЗОВЫЙ [5]
- БКПЛ
- С
- C++ ( Visual C++ , clang , gcc 4.8)
- C# ( Майкрософт Рослин , моно )
- ClojureScript [6]
- Кофескрипт
- Кристалл
- Карри
- Д
- Дарт
- Дельфи
- Дилан
- Эйфелева
- Эликсир
- Ф#
- ФАСМ [7]
- Фактор
- Форт
- Креветки
- Идти
- Хаскелл [8]
- Идрис
- Ява
- Котлин
- Лисп ( Общий Лисп )
- LiveScript
- Меркурий
- Немерль
- Nim
- Оберон
- Объектный Паскаль ( Свободный Паскаль )
- OCaml
- Паскаль ( Свободный Паскаль )
- Пирет [9]
- Питон ( PyPy )
- Раку ( Ракудо )
- Ржавчина
- Скала
- Схема
- Смолток
- Стандартный ML ( MLton )
- Ткл [10]
- ТМГ
- Машинопись
- Налить
- Вергилий [11]
- Visual Basic .NET ( Microsoft Roslyn , Mono )
- Зиг
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Хитон, Роберт. «Что такое самостоятельный компилятор?» . robertheaton.com/ .
- ^ Перейти обратно: а б Харт, Тим; Левин, Майк. «AI Memo 39-Новый компилятор» (PDF) . Архивировано из оригинала (PDF) 13 декабря 2020 г. Проверено 23 мая 2008 г.
- ^ Перейти обратно: а б Томпсон, Кен. «VCF East 2019 — Брайан Керниган берет интервью у Кена Томпсона» . Ютуб . Проверено 28 октября 2019 г.
- ^ Деннис М. Ричи. «Развитие языка Си» . 1993.
- ^ Пример начальной загрузки компилятора BASICO
- ^ ClojureScript Далее
- ^ «плоский ассемблер» . Проверено 7 января 2022 г.
Плоский ассемблер является автономным и включает в себя полный исходный код.
- ^ «Отчет о сообществах и деятельности Haskell» .
- ^ https://www.pyret.org. Архивировано 10 апреля 2018 г. на Wayback Machine.
- ^ «Реализовать TCL в TCL» . Архивировано из оригинала 4 июня 2017 г. Проверено 19 сентября 2017 г.
- ^ «Вергилий» .