osdev.orgРазработка операционных систем
ИСПОЛЬЗОВАНИЕ ЯЗЫКОВ ОТЛИЧНЫХ ОТ СИ (13 августа 2012 года)

Оглавление | Оригинал 


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

Содержание
1. История
2. Предупреждение
3. Могу ли я использовать язык XYZ?
4. Могу ли я написать компилятор для XYZ?
5. Однако, я слышал о ОС написанной на языке XYZ, который является компилятором?

История
 Ранние операционные системы писались на исключительно на различных диалектах языка Ассемблер и исключительно для собственных процессоров. В современных ОС, всё ещё остаётся часть которая может быть реализована только на Ассемблере. В прошлом, для разработки ОС использовались многие языки высокого уровня, включая C, Lisp, FORTH, C#, C++, Modula-2, Ada, Bliss, и PL/1. Во множестве языков отличных от C довольно много от ассемблера, а разработка на C требует предоставление надлежащих условий среды исполнения поддерживающей абстракции языка.

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

 Использования языка отличного от C влечёт за собой немало дополнительных усилий. Однако есть разработчики готовые с этим мириться.

 С другой стороны, попытка написать ОС на одном из интерпретируемых языков, таких как Perl или Java врядли завершиться успехом. Конечно, на эту тему есть ряд научно-исследовательских проектов, но ничего такого, что бы изменило взгляд на принципы написания ядра. Соответственно, попытка писать ОС на HTML, PHP и JavaScript, станет доказательством того, что вам есть ещё чему учиться...

Могу ли использовать язык XYZ?
 Если вы считаете, что ваш любимый язык подходит для разработки ОС, просто ответьте на следующие вопросы:

 Если ответом на любой из этих вопросов будет "Ой, нет, я не могу сделать это с помощью языка XYZ", то есть вероятность, что XYZ не подойдёт для разработки ОС - или должен будет смешиваться с другими языками и заглушками для нормального функционирования.

Могу ли я написать компилятор для XYZ?
 Единственная задача, более сложная чем написание компилятора  - написание операционной системы. Поскольку вы планируете сделать последнее, это выглядит так, как будто вы хотите найти лучший способ обработки металлов для создания лучшей машины. Канонической отправной точкой является "книга дракона" ("Компиляторы - Принципы, способы и инструменты", которая находится на странице Книги).

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

 Вы можете, время от времени, слышать о ОС, написанных на языках которые считаются интерпретируемыми, или которые используют интерпретатор: JavaOS, Genere (Symbolics Lisp Machine OS), Smalltalk-80, UCSD Pascal, различные системы FORTH и пр. Большинство из них относятся к трём категориям:

 Операционная система работает на низкоуровневом интерпретаторе, написанном на Ассемблере или другом системном языке подобном Си, который на самом деле взаимодействует с оборудованием.  По сути, "операционная система" является всего лишь приложением, запущенным на другой низкоуровневой операционной системе. Подобно работают Smalltalk-80, UCSD Pascal, и JavaOS, хотя они имеют некоторые модули компилируемые в машинный код. (смотрите ниже).

Например:
 Архитектура машины MIT CADR Lisp имела общирный набор инструкций с аппаратной поддержкой высокоуровневых операций, таких как проверка типов тэгов и GC. Она использовала теговую архитектуру, означающую, что часть 36-разрядного слова адресации предназначалась для информации о типе. Как правило, эти машины имели различные компиляторы, в том числе и для системного языка Lisp, который имел возможность использовать дополнительный набор команд.
 Rekursiv Single-Board Computer имел аппаратную поддержку записи набора команд (т.е. возможность динамического добавления микрокода инструкций) и ассоциативные таблицы управления памятью для поддержки объектно-ориентированного программирования.