На каком языке программирования пишут операционные системы

Существует множество языков программирования, некоторые из которых больше подходят для разработки ОС и написания ядра. Чем другие. На этой странице мы подробно обсудим этот вопрос.

История

Ранние операционные системы были написаны полностью на диалекте ассемблера соответствующего процессора. И это остается вариантом для нынешних разработчиков. Желающих потратить время и усилия на его использование. Даже если ОС написана в основном на высокоуровневом языке, все равно есть части. Которые можно выполнить только на ассемблере. Значительная часть разработчиков ОС предпочитает работать исключительно на ассемблере и. По крайней мере. Некоторые работают непосредственно на машинном языке (хотя сегодня это редкость).

В прошлом для разработки ОС использовались многие высокоуровневые языки, включая C, Forth, Lisp, C#, C++, Modula-2, Ada, Bliss. Smalltalk и PL/1. Однако не все языки подходят для разработки ОС, и во многих языках. Кроме C. Требуется достаточное количество сборки для обеспечения соответствующей среды выполнения. Поддерживающей абстракции языка. Языки. Такие как C, Modula-2, Ada, Bliss, PL/M и XPL. Были разработаны специально для программирования низкоуровневых систем. Как в OS dev. Так и во встроенных системах. В то время как языки. Такие как Forth. Включают необходимые низкоуровневые функции. Даже если они не были предназначены специально для этой цели.

Предупреждение

Не все языки подходят для низкоуровневого системного программирования.], не имеют подходящих низкоуровневых инструментов разработки или требуют специальной поддержки во время выполнения. Проблема C не страдает. Кроме того, подавляющее большинство ресурсов, связанных с ОС (например. Учебные пособия и практические примеры. Включая эту вики-страницу). Предполагают. Что C является основным языком разработки. Поэтому разработчик ОС должен. По крайней мере. Уметь читать код C.

Использование языка, отличного от С, требует больших дополнительных усилий. Но есть некоторые разработчики, которые готовы приложить усилия. Чтобы приспособить разработку своих ОС к их способам мышления (например, парадигмы программирования).

С другой стороны, попытка написать ОС на интерпретируемых или байт-кодовых языках. Таких как Perl или Java. Является непомерно сложной задачей и. Следовательно. С меньшей вероятностью приведет к успеху. Конечно, есть исследовательские проекты по этому поводу, но ничего. Что полностью изменило бы то. Как мы пишем ядра до сих пор.

И попытка написать его в HTML будет просто доказательством того. Что вам еще многому предстоит научиться.

Итак, вы предупреждены. И теперь вы должны сделать выбор, надеюсь, осознанный выбор.

Могу ли я использовать язык XYZ?

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

Также перед началом работы стоит ответить на следующие вопросы:

  • Можете ли вы справиться со структурами данных. Имеющими определенное расположение битов и байтов (обязательное, например. Для структур MMU и тому подобных вещей)?

    Или у вас есть соответствующие инструменты?

  • Можете ли вы взять под контроль выделение/освобождение памяти? Или вы можете, по крайней мере, разделить большой кусок памяти на более мелкие куски. Которые другие функции могут использовать прозрачно (необходимо для любого вида управления памятью)? И здесь важное следствие — есть ли у вас какая-то поддержка вашего персонального менеджера памяти на вашем языке?
  • Можете ли вы создать самодостаточную библиотеку времени выполнения для поддержки языковых функций. Которые вам понадобятся?

  • Можете ли вы легко взаимодействовать с XYZ с некоторым ассемблерным кодом (да, он у вас будет , по крайней мере. В библиотеке времени выполнения. Которую вам придется написать)?
  • Если XYZ соответствует другим точкам и является интерпретируемым языком. Можете ли вы вызвать код. Исходящий из необработанных байтов данных с помощью XYZ. То есть перейти по определенному адресу и продолжить выполнение там (это будет обязательно для загрузки и запуска программ)?

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

Разве я не могу написать компилятор для XYZ?

Компилятор-это одна из немногих вещей в программном обеспечении, которые имеют ту же сложность. Что и операционные системы. Поскольку вы уже планируете написать ОС. Решение сделать компилятор также похоже на поиск новых способов ковать металлы. Чтобы построить лучший автомобиль. Тем не менее, есть некоторые ОСДеверы, которые считают себя способными принять вызов. Канонической отправной точкой является Компиляторы — Принципы, Методы и инструменты, расположенные на странице Книги).

Однако это не означает. Что вы можете позволить себе игнорировать язык Си и Ассемблер; действительно. Ассемблер может быть гораздо более важным для этапа генерации кода компиляции. Чем для разработки ОС (если только вы полностью не избегаете языков высокого уровня). И для разработчиков компиляторов твердое понимание целевого языка является обязательным.

Кроме того, как уже было сказано. Большая часть информации о OS dev ориентирована на разработчиков языка Си. И твердая способность хотя бы читать язык Си необходима. Если только вы не собираетесь работать полностью в одиночку.

Кроме того, подумайте вот о чем: на каком языке вы будете писать свой компилятор?

Сборка неуклюжая, поэтому ваш выбор-C или ваш любимый язык XYZ. Если вы используете последнее, как вы будете самозагружаться? Если вы используете первый. Вам нужно будет портировать libc и GCC-вы действительно хотите быть самостоятельным хостингом… верно?

Но я слышал об ОС, написанной на языке XYZ, разве она не интерпретируется?

Это отвлекающий маневр. Не существует такого понятия. Как Любой язык может быть реализован с помощью интерпретатора или компилятора; и даже в проекте ОС существуют формы

Вы можете время от времени слышать из операционных систем, написанных на языках. Которые обычно интерпретируются. Или использовать переводчик какой-то: JavaOS,

родов (символика Лисп машина ОС). Летчик-ОС (системы для ксерокс Альто и звезды рабочих станций. Написанные в основном в Smalltalk-80). Сан-Диего Паскаль. Различных вперед систем и т. д. Большинство из них относятся к одной из трех категорий :

  • Операционная система работает в низкоуровневом интерпретаторе. Написанном на ассемблере или некотором системном языке. Таком как C. Который фактически взаимодействует с аппаратным обеспечением. По сути, Pilot-OS, UCSD Pascal и некоторые Java-операционки работают так же. Хотя у них также есть некоторые модули. Которые также компилируются в машинный код (см.

  • Весь или часть кода была скомпилирована в машинный код. Это может включать в себя использование подмножества языка с уменьшенными требованиями к времени выполнения (например, Pre-Schemeили Slang-хотя они до сих пор не использовались для разработки ОС . Они демонстрируют такой низкоуровневый язык реализации. Который можно использовать таким образом).
    • Операционные системы на базе Forth являются частным случаем этого. В то время как Forth обычно описывается как интерпретируемый язык, интерпретаторы

      потокового кода многие системы FORTH используют работу. Отличную от большинства других интерпретаторов; по сути. Интерпретатор проходит через различные Кроме того. Системы Forth включают специальный ассемблер. Который создает код. Специально предназначенный для использования интерпретатором; кроме того. Обычно используемые Наконец. Многие встроенные системы Forth используют специальное аппаратное обеспечение (см.

    • Большинство систем Lisp свободно смешивают интерпретируемый и компилируемый код, и почти во всех
  • Система работала на специализированном оборудовании и микрокоде. Который выполнял роль встроенного

    К этому типу систем относятся SOAR (Smalltalk On A RISC), Recursiv System. Lillith Modula-2 System и Burroughs 6500 (мэйнфрейм. Предназначенный для запуска Algol-60 в 1960-х годах). Методы системного программирования для них не могут работать на стандартном оборудовании. Например:

    • Архитектура Лисп-машины MIT CADR имела обширный набор команд с аппаратной поддержкой определенных высокоуровневых операций. Таких как проверка тегов типов и GC. Он имел маркированную архитектуру, означавшую. Что часть 36-битного адресного слова предназначалась для информации о типе.

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

    • Одноплатный компьютер Rekursiv имел аппаратную поддержку записываемого набора команд (то есть можно было динамически добавлять инструкции микрокода) и ассоциативные таблицы диспетчеризации памяти для поддержки объектно-ориентированного программирования.