Можно ли написать целую операционную систему, не используя даже одной строки кода C/C++?

Можно ли написать целую операционную систему, не используя даже одной строки кода C/C++?

РЕДАКТИРОВАТЬ: еще один, чтобы добавить в список - сборка


person fARcRY    schedule 09.03.2009    source источник
comment
Вспомнился старый анекдот про /vmunix.el   -  person Paul Tomblin    schedule 09.03.2009
comment
@Rich B - хорошая работа по редактированию вопроса, чтобы все ответы выглядели так, как будто их авторы не читали вопрос.   -  person Ori Pessach    schedule 09.03.2009
comment
Разве не существовало машины с ОС, написанной на Modula 3, Ada или каком-то другом языке Bondage and Discipline?   -  person Paul Tomblin    schedule 09.03.2009


Ответы (11)


И да и нет.

Прежде всего, важно помнить, что какой бы язык вы ни выбрали, в конечном итоге скомпилированный продукт будет написан на языке ассемблера (или, точнее, на машинном коде). Даже интерпретаторы (например, интерпретатор cpython) в конечном итоге переводят ваши скрипты в машинный код.

Но это, вероятно, слишком техническое и упускает из виду суть вашего вопроса:

«Могу ли я написать операционную систему на языке более высокого уровня?»

Ответы на это как личные, так и технические.

Во-первых, личная сторона: если вы еще не знаете, как написать операционную систему на смеси языка ассемблера и C, то вам абсолютно нечего пробовать свои силы в разработке ОС.

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

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

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

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

Просто имейте в виду, что объем необходимых знаний (не только о компьютерных операциях, но и о социальных конструкциях, таких как API) огромен. Это долгий путь и благодарный. Если вы действительно любите это ремесло, как я, вы будете рады, что нашли время, даже если вы никогда не писали ОС.

Теперь технический ответ. Вам понадобится загрузчик, и он должен быть написан на ассемблере. В конце концов, ваш процессор не знает C#. После фазы загрузчика вы можете написать код своей ОС на любом языке, который вы хотите, и он будет работать, при условии, что ваш язык может компилироваться в двоичные файлы машинного кода (а не в байт-код!)

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

Скорее всего, вам нужно будет написать свой собственный компилятор/интерпретатор данного языка в качестве основного компонента вашей ОС. Этот базовый компилятор, вероятно, разрешит только ограниченное подмножество языка (и вы загрузитесь, написав более надежный компилятор на ограниченном подъязыке). В противном случае производительность будет ужасной.

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

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

person Jason L    schedule 09.03.2009
comment
Технически ответа там немного, но для меня он все же лучший. - person Joachim Sauer; 09.03.2009
comment
Это справедливое замечание, но иногда вопрос человека показывает, что нужная ему информация — это не та информация, которую он запрашивал. ;) - person Jason L; 11.03.2009
comment
Не хочу, чтобы вы завидовали, но мне было всего 14 лет, когда я написал свою первую ОС. Он был написан только на ассемблере, так как мне было практически невозможно заставить мой компилятор (какая-то очень старая версия Visual Studio) выводить исполняемые файлы, не зараженные какой-либо ерундой, связанной с Windows. ОС была названа GOSth (графическая ОС, обратите внимание на неправильное написание Ghost; D, английский не мой родной язык). Он состоял из графической оболочки (256-цветный графический интерфейс, Wohoo!), поддержки мыши, реализованных частей DOS-API. К сожалению, в моем ноутбуке нет дисковода. И исходники на дискете... - person Frank; 11.09.2009
comment
Интерпретаторы не переводят сценарий в машинный код. Если бы они это сделали, их бы назвали компиляторами. (JIT-компиляторы часто выполняют перевод языков сценариев, предназначенных для интерпретации.) Интерпретаторы работают, перескакивая между уже существующими блоками машинного кода, которые реализуют примитивы, доступные в языке сценариев, — они не создают новых компоновок машинного кода. - person Ben Voigt; 18.09.2014
comment
С появлением таких процессоров, как JOP, разве нельзя написать операционную систему, скажем, на JAVA, скомпилировать ее в инструкции JVM на какой-либо другой платформе и использовать эти инструкции JVM в качестве сборки? - person cipher; 19.09.2015

да. Используйте ассемблер. Я бы использовал Форт. Genera была ОС, созданной символикой**, закодированной на Лиспе. C в основном используется, потому что ему доверяют, мы знаем, как он работает. И существуют компиляторы c для каждого процессора во вселенной. Компиляторы для c просты в сборке.

** Symbolics зарегистрировала первый домен в Интернете. (интересный факт)

person FlinkmanSV    schedule 09.03.2009
comment
Я знаю, что вопрос переключился на вас после вашего ответа. Так что ваш ответ не сбивает с толку людей, читающих это вскрытие: изначально ОП спрашивал, могу ли я написать операционную систему без использования C/C++? Позже он был изменен на Могу ли я написать операционную систему, не используя язык низкого уровня? - person Jason L; 11.03.2009
comment
И, чтобы конкретно ответить на ваш комментарий, у меня всегда была слабость к Форту. Если бы у меня когда-нибудь было свободное время, чтобы заняться сборкой ОС, я бы тоже выбрал Forth. :) - person Jason L; 11.03.2009
comment
Yepp, Если бы я был единственным, кто использовал бы мою ОС, то Форт был бы идеальным инструментом. - person FlinkmanSV; 12.03.2009

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

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

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

Изменить: как только вы удалите сборку из уравнения, она станет намного сложнее. Настройка приличной операционной системы требует выполнения нескольких инструкций машинного кода, которые просто не представлены в языках высокого уровня (поскольку они очень, очень специфичны для машины). Теоретически вы можете создать чистый машинный код в двоичном двоичном объекте и перейти в это место из языка высокого уровня, но я считаю это мошенничеством, поскольку вам придется придумать этот двоичный объект в первую очередь.

person Joachim Sauer    schedule 09.03.2009
comment
Черт, ты выиграл. Хорошо, когда представитель находится в первом ряду. - person FlinkmanSV; 09.03.2009

Да, MenuetOS — это пример операционной системы, написанной только на ассемблере.

Поскольку вы, похоже, не интересуетесь ассемблером, см. также JNode, операционную систему, написанную на Java, и Singularity, операционная система, написанная на C#.

person Daniel Watkins    schedule 09.03.2009
comment
Спасибо, Олафур. Я не понял синтаксис ссылки с самого начала. - person Daniel Watkins; 09.03.2009
comment
Относительно Singularity: Код в Singularity либо проверен, либо доверен. Тип проверенного кода и сохранность памяти проверяется компилятором. Система должна доверять непроверяемому коду, и он ограничен уровнем аппаратной абстракции (HAL), ядром и частями системы времени выполнения. Большая часть ядра надежно проверяема, но некоторые части написаны на ассемблере, C++ и небезопасном C#. - person Ben Voigt; 18.09.2014

Есть многочисленные попытки создать аппаратную реализацию JVM. Разумеется, ОС для такого оборудования будет написана на Java. См., например: http://www.jopdesign.com/

Кроме того, похоже, что S40 от Nokia разработан в основном на Java.

person vartec    schedule 09.03.2009

Конечно. Код C/C++ компилируется в код ASM, но есть много других языков, которые можно использовать таким же образом.

Возможно, вы не сможете использовать Java или C#, поскольку они полагаются на виртуальную машину и могут быть написаны на C.

На самом деле я считаю, что был проект по созданию ОС на основе LISP, но он провалился.

person Bogdan Gavril MSFT    schedule 09.03.2009
comment
большинство компиляторов генерируют машинный код, а не ассемблер; кроме того, похоже, вы никогда не слышали о машинах LISP: en.wikipedia.org/wiki/Lisp_machine - person Christoph; 09.03.2009

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

person Christoph    schedule 09.03.2009

Посетите http://common-lisp.net/project/movitz/. Это ОС, полностью написанная на Lisp. Я думаю, что у него есть свой Ассмеблер, например. Lisp для транслятора машинного кода.

Мне нравится идея ОС без C/C++ и особенно на основе Lisp.

person siddhadev    schedule 09.03.2009
comment
Вы когда-нибудь слышали о Symbolic Lisp Machine? - person Paul Tomblin; 09.03.2009
comment
Звучит странно, что вы упоминаете Movitz и, по общему признанию, никогда не слышали о машинах Lisp. Машины Lisp считаются основным источником вдохновения для Movitz. Машины на Лиспе потерпели коммерческий провал, потому что они не могли идти в ногу с конкурентами, не относящимися к Лиспу, но с огромной сырой аппаратной мощью, которую мы имеем сегодня, почему бы не попробовать еще раз с проектом с открытым исходным кодом? - person Halberdier; 26.07.2011

да. Очевидно, что все возможно в сборке, но часто нецелесообразно. Было несколько попыток создания операционных систем в управляемом коде (.NET, Java) с разной степенью успеха.

person Dinah    schedule 09.03.2009

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

person Fletcher Cutting    schedule 07.01.2014

вы могли бы написать это в машинном коде? но это просто двоичный код. вы могли бы написать это на ассемблере, но это имеет сложную структуру. вам, вероятно, следует написать его на C, потому что он транслируется непосредственно в машинный код при компиляции, поэтому он быстрее, чем C#/C++, и проще, чем ассемблер.

person Community    schedule 25.07.2009