Чому б не мати ОС на високому рівні? Чи ефективніші мови низького рівня?


44

Не будучи самовпевненим, я хотів би, щоб ви розглядали можливість цього. Більшість ОС сьогодні базується на досить низьких мовах (в основному на C / C ++). Навіть нові, такі як Android, використовує JNI, і основна реалізація знаходиться в C

Насправді, (це особисте спостереження) багато програм, написаних на C, запускаються набагато швидше, ніж їхні високоякісні аналоги (наприклад: Передача (bittorrent-клієнт на Ubuntu) набагато швидше, ніж Vuze (Java) або Deluge (Python) ). Навіть компілятори python написані на C, хоча PyPy - виняток.

Так чи є певна причина цього? Чому так, що всі наші так звані "мови високого рівня" із чудовими концепціями "OOP" не можуть бути використані для створення надійної ОС?

Тож у мене в основному є 2 питання.

  1. Чому програми, написані мовами низького рівня, ефективніші, ніж їхні партнери HLL? Чи працюють мови низького рівня з тієї простої причини, що вони низькі, і їх легше переводити в машинний код?
  2. Чому у нас немає повноцінної ОС, заснованої повністю на мові високого рівня?

36
Ви маєте на увазі, що лише "мови високого рівня" орієнтовані на об'єкти, що не відповідає дійсності.
Uooo

2
@rtindru "Досить низького рівня мови" (переважно C / C ++)? Яке ваше тоді визначення мови високого рівня? Вам потрібно чітко визначити своє визначення / тлумачення мови високого рівня. Python - це насправді сценарій мови, оскільки він виконується безпосередньо на своєму двигуні (IDLE або терміналі командного рядка), якщо ви цього ще не усвідомлювали. Є дуже вагома причина (філософська та практична), чому C / C ++ використовуються в якості мов реалізації для багатьох ОС, але я впевнений, що власні користувачі тут, мабуть, не втручаються в це питання.
hagubear

10
Android - не зовсім нова ОС. Це просто ще один аромат Linux.
День

3
@hagubear Є дуже вагома причина (філософська та практична), чому C / C ++ використовуються як мови реалізації для багатьох ОС . Що це за дуже вагома причина?
rtindru

2
Якщо я правильно розумію, ОС для машин LISP була написана в LISP. Хоча, можливо, можна стверджувати, що вживаний діалект був мовою низького рівня?
Роберт Фішер

Відповіді:


38

Microsoft зробила кілька дуже цікавих досліджень у цьому напрямку, якщо вивчити особливість:

http://research.microsoft.com/en-us/projects/singularity/

Також Mothy Roscoe та інші працювали над Barrelfish, який використовує мову програмування обмеження Eclipse як службу ОС для вирішення всіх видів управління ОС та розподілу ресурсів:

http://www.barrelfish.org/


Нічого не можу проголосувати, мені потрібно 15 повторень ... щойно приєдналися! Дуже дякую.
rtindru

9
@rtindru: навіть з 1 точкою повторення ви можете прийняти відповідь. Що означає, коли відповідь "прийнята"?
Мар'ян Венема

6
Прийняття відповіді, як правило, скорочує нові відповіді / обговорення. Особисто я б рекомендував не приймати (до цього конкретного питання) хоча б ще один день.
Брайан

1
Я б додавав Космос до групи: відкритий код, стороннє підприємство, не настільки цікаве, як сингулярність, але є кілька приємних ідей! cosmos.codeplex.com
Лоренцо Дематте

38

Багато залежить від того, куди ви поділите розділення між мовами низького та високого рівня. Наприклад, різні люди схильні ставити мову на зразок C ++ на різні сторони поділу.

Щодо ваших питань:

  1. Я не вірю, що існує така різниця між мовами низького рівня та високого рівня, але більше різниця між інтерпретованими мовами та мовами, які компілюються в рідні інструкції.

    Але також може бути різниця в культурі між програмістами, коли ті, хто використовує мову низького рівня, зосереджуються більше на аспектах продуктивності (дизайнерського) вибору, який вони роблять.

  2. Якщо ви вважаєте, що C ++ є високорівневим, то існує принаймні одна ОС, написана повністю мовою високого рівня (Symbian OS написана на C ++). Що вас заважає писати ОС на більшості мов високого рівня - це дві речі:

    • ОС потребує низького рівня доступу до пам'яті та обладнання та виконує брудні хитрощі. Цей тип доступу, як правило, вважається небезпечним для програм на рівні додатків, тому багато мов високого рівня цього не дозволяють.
    • ОС потрібно виконувати без наявності програмного забезпечення підтримки, наприклад, перекладачів. Це робить надзвичайно важко писати ОС мовою, яку неможливо легко скласти в рідні інструкції.

35
Немає такого поняття, як інтерпретована мова чи мова, яка складається на рідні інструкції. Мова - це сукупність математичних правил, її не інтерпретують і не складають, вона просто є . Інтерп. і склад. - це риси перекладача чи упорядника, а не мова. Кожна мова може бути реалізована за допомогою компілятора чи інтерпретатора. Більшість мов сьогодні інтерпретують та компілюють реалізацію. Існують інтерпретатори для C і всі основні реалізації JavaScript, зібрані в початковий код. А що таке рідний код? Якщо я компілюю Java в байт-код JVM і запускаю
Jörg W Mittag

11
що на процесорі Java, і я компілюю C до машинного коду ARM і запускаю його на інтерпретаторі ARM, оскільки мій ПК не має процесора ARM, то що робить ARM рідним, а JVML - ні?
Йорг W Міттаг

5
@ JörgWMittag: Якщо у вас є процесор, який може безпосередньо виконувати байт-код Java (без використання додаткового JVM), то байт-код Java - це нативний код цього CPU. Крім того, я не виключаю можливості запису ОС на мові, яка зазвичай інтерпретується або виконується у віртуальній машині, але це робить їх менш очевидним вибором.
Барт ван Іґен Шенау

15
@ JörgWMittag - Я погоджуюся, що будь-яка мова може бути складена або інтерпретована (компілювати баш-скрипт; використовувати інтерпретований C ++ (CINT / Cling)), але багато рішень в мовному дизайні ґрунтуються на тому, чи буде це інтерпретовано, складено або обидва. Мова, яка змушує вас вручну оголошувати / ініціалізувати статичні типи змінних, вручну розподіляти / звільняти пам’ять, робити арифметику вказівника, не забудьте перевірити межі масиву в інтерпретаторі буде менш зручним (порівняно з мовою, яка сміття збирає пам'ять, підводить динамічний тип, перевіряє межі масиву). Чи чітко цей рядок на 100%? Ні, але різниця існує на практиці.
д-р Джимбоб

15

Для цього є ряд вагомих причин.

Сьогоднішня мова низького рівня була вчорашньою мовою високого рівня

Так, вірите чи ні, колись навіть С розглядався як мова високого рівня. Навіть ~ 20 років тому це було досить поширеним явищем, щоб описати його як "середній рівень" мови. Це був час, коли OO був таким же популярним, як і сьогодні, Java не існувала, C # не існувало, навіть C ++ ще не було належним чином стандартизовано.

Історична інерція

Операційні системи, які ви використовуєте сьогодні, мають глибоке коріння в історії. Windows повертається до початку / середини 80-х, Unix - до початку / середини 70-х. В операційних системах є багато старого, робочого коду, і ви, як правило, не хочете переписувати старий, робочий код.

У якийсь момент вам доведеться перейти до обладнання

Це відбувається в ядрі, в драйверах, в підсистемах управління пам'яттю, у файловій системі. Впевнені, що ви можете розшаровувати мову високого рівня поверх нього, але вам все одно потрібна можливість більш прямого доступу до обладнання, яке пропонує мова нижчого рівня.

Переносність

Я не маю на увазі переносимість на інше обладнання або іншу ОС, як це частіше розуміється сьогодні; це тонкіше. Є одна головна перевага надання інтерфейсу на основі С для чогось, і це той факт, що практично будь-яка інша мова, яка існує, може посилатися на C. Навіть API API все ще є API на базі C в наші дні з цієї причини.

Особисті переваги

Деякі люди просто вважають за краще програмувати таким чином, і це може бути головним фактором. Наприклад, Лінус Торвальдс має знамениту злобу проти C ++, що дає чітко зрозуміти, що, наскільки він стурбований, C завжди буде його інструментом вибору для такої роботи (зміст рента і чи ви згодні з ним для цієї дискусії не має значення; достатньо того факту, що існує тираж).

У сукупності вони повинні чітко встановити, чому в минулі часи операційна система була написана на чомусь на зразок C, і чому дуже значні фрагменти цього - навіть сьогодні.


13

Основна причина домінування C для операційних систем криється в історії - поточні основні операційні системи, такі як Windows і всі форми Unix (BSD, Solaris, HP-UX, MacOS X, ... а також клони, такі як Linux) повертаються назад довгий час, перш ніж ОО та інші конструкції "високого рівня" стали мейнстрімом.

Для ядра операційної системи, окрім продуктивності, необхідно дуже чітко ознайомитись з інструкціями щодо обладнання, і потрібно повний контроль над пам'яттю, які мови на зразок C дуже добре працюють.

Для вбудованих систем іноді існують операційні системи, що використовують мови більш високого рівня для більшої частини системи. Один із помітних прикладів - JavaOS від Sun.

Для широко розповсюджених операційних систем помітним прикладом, що не використовує C, є класичний MacOS перед MacOS X - це великими частинами написано на діалекті Паскаля, що дозволяло деяку форму орієнтації на об'єкт.


12

По-перше, є деякі проблеми завантаження. Більшість функцій, які полегшують мови високого рівня, базуються на абстракціях, які ядро ​​повинне надавати самому. Як ви пишете менеджер пам'яті мовою, яка потребує менеджера пам'яті? Як ви пишете драйвери вводу / виводу без використання приємних стандартних бібліотек вводу / виводу вашої мови? Як ви створюєте примітиви для потоку та синхронізації, не використовуючи бібліотеки мови?

По-друге, надзвичайно корисно і набагато легше читати при написанні операційних систем, щоб мати можливість призначити змінну певному місці пам'яті. Це легко в C, і кожен програміст на C знає, як це зробити. Якщо це можливо навіть на мовах вищого рівня, це так рідко, що тільки гуру знають, як це зробити.

Іншими словами, коли ви враховуєте всі обмеження та зміни, які вам доведеться прийняти, C і C ++ починають виглядати набагато простіше.


2
Ваш перший абзац не має сенсу. Драйвер вводу / виводу на C також не використовує stdio.h. Спеціальна реалізація mutex не використовує pthreads. Саме це означає реалізувати це самостійно! І це не залежить від мови, якою ви користуєтесь. Це не означає, що мови високого рівня - хороший вибір для завдань низького рівня (як правило, у мене немає досвіду).

Я це знаю. Я просто вказую, що багато того, що відрізняє високий рівень від мови низького рівня, є в тих частинах мови, які недоступні в розробці ядра. Якщо порівнювати основні мови з основними, C вже не виглядає так спартанською.
Карл Білефельдт

Не зовсім правда. У той час як ви будете потребувати в якій - то код , який не використовує X для реалізації X, всі інші код може залежати від цього коду і використання X.

Це хороший момент.
Карл Білефельдт

6

Перш за все, для завантаження даних потрібно хоча б невелику частину записати в Асамблеї або еквівалент.

По-друге, там була ОС, написана на безперечно HLL - Lisp Machine . (Справа в тому, що вона не вийшла з комерційних продажів, більше стосується того, щоб інше обладнання стало дешевше, а тріумф гіршого кращий, ніж з недоліками його філософії чи дизайну).

По-третє, C ++ є досить об'єктно-орієнтованим та високим рівнем, тому, як зазначали інші, Symbian OS - ще один приклад.

По-четверте, наразі мало необхідності в нових ОС. У нас вже є чимало ароматів Linux та bsd, які працюють майже на будь-якому апаратному забезпеченні, і створити абсолютно нову ОС з нуля досить дорого.


Ви пропустили мейнфрейми Burroughs B5000. Їх операційна система була написана в Burroughs Extended ALGOL.
Джон Р. Стром

1
there is little need for new OSes at this timeЯ досі не вирішив, чи це правда чи ні. Так, сучасні ОС (сучасні вікна (NT) / сучасний Unix) - це все, що нам потрібно, функціональність та продуктивність. Але ледве: вони народжуються в іншій області, де "мережа" була корпоративною / університетською, і користувачі довіряли, а multiproc - це 2/4 процесорів. Вони певною мірою «мучаться» надлишком довіри (руткіти, зловмисне програмне забезпечення, віруси ..). Я починаю думати, що є простір для сучасної, безпечної, ізольованої ОС… і з кращою підтримкою паралелізму (краще, ніж теми)
Лоренцо Дематте

Лісп є низьким рівнем, CARі CDRє IBM 704 асемблера макросів ! Навіть C відокремлює вбудований монтаж , а не трактує його як будь-яку іншу функцію. Враховуючи роботу Lisp CARта CDRроботу над x86, ARM та безліччю ISA, це певна портативна збірка. (Бічна примітка до всіх, кого я, можливо, плутав: Так, Lisp - мова високого рівня. CARА CDRмакрос асемблера був лише деталлю реалізації, а не ключовою особливістю.;))
8bittree

4

Для кращої фази, що я писав раніше.

Машини Burroughs 5xxx - 6xxx не мали мови складання. Найнижчою мовою було розширення до Algol. Algol був реалізований апаратно. ОС і всі мови були написані в Algol. Це перевершило всі машини тогочасного конкурента. Це також вимагало значно менше коду, що полегшило його обслуговування. Це обладнання для стека, яке підтримувало рекурсивну мову, такий як Algol.

Операційна система Burroughs перетворилася на версію під назвою MCP. MCP в даний час працює в системах Unisys.


3

Більшість мов вищого рівня, які ви згадуєте, мають функцію, яка не добре поєднується з операційними системами: автоматичне управління пам’яттю. Ви не можете розраховувати на сміттєзбірник під час написання системи в режимі реального часу - або м'якої (що таке операційна система), або навіть найгіршої. Щоб цитувати Таненбаум [i]:

Деякі речі, яких немає на C, включають вбудовані рядки, нитки, пакунки, класи, об’єкти, безпеку типу та збирання сміття. Останній - шоу-пробка для операційних систем. Всі сховища в C або статичні, або явно розподіляються і вивільняються програмістом, як правило, з функцією бібліотеки malloc і free . Саме остання властивість - повний контроль програміста над пам'яттю - разом із явними покажчиками робить C привабливим для запису операційних систем. Операційні системи - це, в основному, системи в режимі реального часу, певною мірою, навіть загальні. Коли відбувається переривання, операційна система може мати лише кілька мікросекунд, щоб виконати якусь дію або втратити критичну інформацію. Втратити сміття в довільний момент - нестерпно.

Тепер ви можете стверджувати, що C ++ також є хорошим кандидатом, оскільки пропонує ручне управління пам'яттю. C ++ вже застосовувався в деяких операційних системах, таких як Symbian (згадується Bart ) і BeOS. Але IMHO C як і раніше є найшвидшим мовою, який можна перенести в багато архітектур без великих зусиль (на відміну від складання певної архітектури).

[i]: Сучасні операційні системи, 3-е видання, стор. 73


3
Машини символіки мали автоматичне управління пам'яттю. Smalltalk зробив на Альто. Це було у 80-х. Система лінійного типу повністю усуває необхідність у GC. Це вирішені проблеми, якби тільки ми могли це пам’ятати!
Френк Ширар

Можливо, мова може включати автоматичне управління пам’яттю, але включати спеціальний вид «глибоко закріпленої» посилання та дозволяти методам чітко заявляти, що вони не матимуть доступу до жодної незакріпленої посилання та не застосовуватимуть будь-які методи, які можуть це зробити. Не було б потреби в зупинці збору сміття, щоб перешкоджати виконанню коду методом, який не збирався отримати доступ до будь-яких об'єктів, які можуть бути змінені GC.
supercat

2

Як зазначають інші, кілька операційних систем написані мовами високого рівня. Можливо, ви маєте на увазі те, що всі успішні, масові ринки, загального призначення ОС були написані в якійсь комбінації збірки, C і C ++?

Більшість мов високого рівня мають безліч корисних функцій, які несуть пов'язані з цим витрати на продуктивність. Автоматизоване управління пам'яттю - очевидний приклад, інша перевірка масивів - інший. Якщо ви пишете ОС загального призначення, ви, швидше за все, зіткнетесь із ситуаціями, коли штраф за ефективність цих корисних функцій більший, ніж ви готові заплатити. У цей момент ви хочете мати можливість вимкнути їх. Такі мови, як Python, C # та Java, залежать від функцій, які можна вимкнути, але жодна з них не є настільки універсальною, як C або C ++ у цьому плані.

У цьому аспекті C і C ++ є настільки ж універсальними, як і чиста збірка. Якщо ви вирішите, що вам потрібно десять різних менеджерів пам’яті, що охоплюють десять різних сценаріїв розподілу пам’яті, ви можете реалізувати їх усі в C та C ++, а також завантажувати та вивантажувати їх, як вважаєте за потрібне. Чорт забирає, вам навіть не потрібно посилатися на стандартні бібліотеки виконання C або стартовий код, якщо цього не потрібно.


0

Справжня відповідь - Гроші . Недостатньо сприйнятої переваги мовної ОС на високому рівні, щоб виправдати витрачання ресурсів на її створення, а потім наштовхнути її в основний потік. Наприклад, для створення нового драйвера для кожної апаратури, яку вона потребує, є великі витрати.

Існують різні ОС, написані мовами високого рівня, з основною метою дослідження, такими як Oberon та Singularity .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.