Для ядра/ОС C - все еще это? [закрытый]

Вы можете попробовать код ниже. Если вы хотите пропустить дубликаты, вы можете использовать Set,

 String[] strings = {"1", "2", "10"};
String foo = "1 2 3 4 5 6 7 8 9 10".replaceAll("\\s","");

StringBuilder newString = new StringBuilder();

List<String> stringsList = Arrays.asList(strings);

//Set can be used to avoid duplicates like "1 1 2 2 4 4"
Set<String> resSet=new HashSet<String>();
// Loop through each entry of foos and compare to each element in stringsList
for (int i = 0; i < foo.length(); i++) {
    //if current char and next is 10 add it and continue
    if((String.valueOf(foo.charAt(i))+String.valueOf(foo.charAt(i+1))).equals("10") && stringsList.contains("10"))
    {
        resSet.add("10");

        //Extra operation in case you want to avoid duplication
        newString.append(10);
        i++;
        continue;
    }
    //if match found add it
    if (stringsList.contains(String.valueOf(foo.charAt(i)))) {
        newString.append(String.valueOf(foo.charAt(i)));

      //Extra operation in case you want to avoid duplication
        resSet.add(String.valueOf(foo.charAt(i)));
    }
}

System.out.println(newString);
System.out.println(resSet);
18
задан Zach Johnson 13 March 2010 в 04:55
поделиться

14 ответов

I think it's safe to say that low-level parts of operating systems (e.g. the kernel) will continue to be written in C because of its speed. Like mentioned elsewhere, you will need to know assembler for certain parts of the kernel (something needs to load the kernel into memory). But you can work on the kernel with little or no assembly knowledge. A good example would be if you're implementing a file system.

Don't worry about what language the operating system is implemented in. What's important is how an operating systems are used, and what can be done to improve them. A good example is when Unix first came out. The file system had the inodes at the front of the disk, and data in the remaining space. This didn't perform very well as you were seeking to different parts of the disk for all files. Then the Berkeley Fast File System was created to make a disk aware file system. This means having inodes near their corresponding data. I'm leaving out a lot of details, but I hope this illustrates that it's more important to think about how an operating system can be improved rather than what language it will be programmed in.

Some recent trends in operating systems are virtualization and distributed computing (see Google's paper on MapReduce). File systems, security, scheduling (especially with multi-core processors), etc are continually areas of interest even though these problems are not new.

Here are some resources if you want to learn more about kernel development:

  • Linux Kernel Newbies - Resource for those who want to get started on modifying the Linux kernel.
  • xv6 source - x86 port of Unix version 6. Used by MIT to teach an operating systems class. Simple, and easy to extend (more info).
  • Linux Kernel Map - Call chain of system calls in Linux. Useful in visualizing what a system call does.

Bottom line: Start getting familiar with the kernel and read papers on what researchers are writing about (USENIX is useful for this). This knowledge is much more valuable than learning a new language, as most concepts from one language can easily be transferred to another if there does happen to be a shift in what operating systems are written. Hope this helps!

11
ответ дан 30 November 2019 в 05:59
поделиться

Определенно! Вам также следует изучить хотя бы один язык ассемблера / аппаратную архитектуру.

0
ответ дан 30 November 2019 в 05:59
поделиться

If it is kernel you are talking about, then you need to learn a language that will enable easy access to the underlying hardware, faster. I can only think of

  • C language and
  • Assembly

AFAIK, some parts of the boot-loader will be written in assembly, and from then on, C. There are many open-source easy-to-understand operating systems available, like for example the latest TOPPERS. Try to look into it.

I guess, as a OS-kernel developer, you will worry more about the ways to efficiently access underlying hardware (like processor and memory) rather than the choice of the language. I bet, most of the times, we will be tempted to use assembly

0
ответ дан 30 November 2019 в 05:59
поделиться

Возможно, вы захотите взглянуть на проект Singularity от Microsoft (также на Wikipedia ):

Singularity - экспериментальная операционная система разрабатывается Microsoft Research с 2003 года. Она задумывалась как высоконадежная ОС, в которой ядро, драйверы устройств и приложения написаны в управляемом коде.

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

1
ответ дан 30 November 2019 в 05:59
поделиться

Microsoft находится в процессе переписывания части Windows в .NET, однако я сомневаюсь, что большая часть ядра будет затронута.

Однако есть такие проекты, как Cosmos ( http://www.gocosmos.org/index.en.aspx ), которые вселяют в нас надежду.

1
ответ дан 30 November 2019 в 05:59
поделиться

Actualy, there is quite a bit of room in the core of a modern OS for C++ code. I just looked and the Win7 core kernel tree has quite a bit of C++ code. Note that many sub-systems remain in simple C. There are a few reasons for this

  1. C is the original language of the NT based OS
  2. C is very, very well understood by key people
  3. Well written C can be the most straight forward code to debug - especialy in kernel mode.

That being said, many teams and people have found well written C++ to be an effective tool for core OS work.

There is nothing about C++ that prevents it from being used to write core resource management code like a scheduler, memory manger, I/O subsystem, graphics sub-system, etc. etc.

As others have pointed out - any kernel work will always require some bit of assembly language.

3
ответ дан 30 November 2019 в 05:59
поделиться

Нет, это не «оно». Ядра обычно пишутся на C с добавлением небольшого количества ассемблера. Но ОС написана на всех языках. Но даже там C ++ можно использовать без особых проблем. То же самое можно сказать и на многих других языках. Linux написан фанатиками Си, которые боятся и ненавидят все остальное, что является их проблемой. Windows написана на большом сочетании языков C и C ++ и, вероятно, с некоторыми фрагментами старого кода Pascal. В наши дни также появляются части .NET. OS X использует Objective-C для большей части кода ОС.

Тот же совет применим, что и во всех других областях программирования:

  • Знай свое дело
  • Не ограничивайся одним истинным языком.

] Ядро - единственная область, где применяются несколько "особые" правила. Но ядро ​​ крошечное .

1
ответ дан 30 November 2019 в 05:59
поделиться

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

Конечно, Cody тоже не хотел об этом упоминать:

5
ответ дан 30 November 2019 в 05:59
поделиться

C в значительной степени это, с изрядным количеством ассемблера. Важные темы для работы ядра ОС включают:

  • Принципы кэширования и управления кешем
  • Виртуальная память, управление TLB
  • ЦП и архитектура системы
  • Иерархии хранилищ
  • Методы параллельного программирования (взаимное исключение, блокировка,. ..)
  • Алгоритмы и структуры данных
3
ответ дан 30 November 2019 в 05:59
поделиться

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

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

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

  • Singularity использует технологию компилятора, а не технологию OS / MMU. , чтобы изолировать один «процесс» от другого. Внезапно создание нового «процесса» (на самом деле новый вид домена защиты ) обойдется очень дешево, и эта дешевизна позволяет создавать новые разработки.

Singularity - лишь последний из длинного списка проектов, которые использовали язык и технология компилятора для решения проблем ОС. Одним из моих любимых было ядро ​​SPIN Вашингтонского университета , которое позволяло приложениям безопасно расширять ядро ​​и было написано на Modula-3.

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

  • В сегодняшних производственных системах C по-прежнему "он".

  • Для операционных систем будущего C почти наверняка не " это »- мы знаем, что можно добиться большего, - но точная природа нового« это »все еще остается открытым вопросом.

36
ответ дан 30 November 2019 в 05:59
поделиться

Вы определенно должны свободно владеть C.

Как отмечали другие, нет причин, по которым операционная система должна быть написана на C, и есть много преимуществ, если использовать более сложные языков. Но если вы собираетесь работать над операционными системами в реальном мире (то есть не в академических кругах или исследовательских лабораториях), вам придется смириться с двумя реальностями:

  1. Существующие операционные системы огромны, часто их много. миллионы строк кода и написаны на C или C-производных, например Objective-C или C ++.
  2. Новым операционным системам требуются сотни инженерных лет (и много календарных лет), чтобы достичь и соответствовать функциональности и надежности существующих операционных систем.

В результате мне трудно понять, как и когда мир будет отойти от ядер операционных систем на основе C. Да, технически возможно. Но стоимость может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС - Windows, Linux и BSD - все на основе C.

Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (например, Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

  • Новым операционным системам требуются сотни инженерных лет (и много календарных лет), чтобы достичь и соответствовать функциональности и надежности существующих операционных систем.
  • В результате мне трудно понять, как и когда мир будет отойти от ядер операционных систем на основе C. Да, технически возможно. Но стоимость может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС - Windows, Linux и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (например, Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

  • Новым операционным системам требуются сотни инженерных лет (и много календарных лет), чтобы достичь и соответствовать функциональности и надежности существующих операционных систем.
  • В результате мне трудно понять, как и когда мир будет отойти от ядер операционных систем на основе C. Да, технически возможно. Но стоимость может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС - Windows, Linux и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (например, Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

    Мне сложно представить, как и когда мир уйдет от ядер операционных систем на основе C. Да, технически возможно. Но стоимость может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС - Windows, Linux и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (например, Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

    Мне сложно представить, как и когда мир уйдет от ядер операционных систем на основе C. Да, технически возможно. Но стоимость может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС - Windows, Linux и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (например, Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

    и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (такой как Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

    и BSD - все на основе C.

    Было бы интересно узнать, какие исследования были проведены, или какие инструменты и методы могут быть доступны для развития существующей кодовой базы (такой как Linux) до лучшего языка. Я думаю, что это был бы гораздо более жизнеспособный подход, чем заставить мир принять совершенно новую ОС.

    0
    ответ дан 30 November 2019 в 05:59
    поделиться

    Думаю, можно с уверенностью сказать, что серьезная (не экспериментальная) разработка ОС в обозримом будущем останется на C (и сборке).

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

    Итак, если люди искали технически более совершенный язык по сравнению с C, вы бы повсюду видели операционные системы, написанные на Ada, верно? На самом деле я вижу одну серьезную ОС, реализованную на Аде. Он больше не поддерживается в пользу повторной реализации на C.

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

    1
    ответ дан 30 November 2019 в 05:59
    поделиться

    Я провел обширное программирование как для Windows NT, так и для ядра Linux. И я могу заверить вас, что до тех пор, пока эти 2 ОС находятся на уровне C, будут использоваться в ядре. Думаю, причин множество, но самый простой ответ - время. Как упоминалось в предыдущих плакатах, количество времени, которое потребуется, чтобы переписать ядро ​​на другом языке, того не стоит. И это не просто перенос кода. Ядро потребует серьезных изменений конструкции. Лично я считаю, что C - наиболее подходящий язык для ядра. Возможность управлять открытой памятью, а также динамически выделять и освобождать собственную память имеет решающее значение, когда вы работаете в ядре. Особенно, если вы работаете с выгружаемой памятью. Размер стека, который вы выделяете в режиме ядра, также обычно меньше, чем в пользовательском режиме, поэтому снова эффективность памяти имеет решающее значение. C также позволяет программистам создавать красивые структуры данных, которые не содержат всех чрезмерных накладных расходов, которые есть у управляемых языков. На мой взгляд, структуру также можно использовать так же эффективно, как и объект, но опять же без излишних накладных расходов. Управляемые языки также нуждаются в «управлении». В ядре у вас нет ничего, что убирает ваш беспорядок. Не поймите меня неправильно, я люблю C # и думаю, что.NET Framework прекрасна, но если вы работаете в ядре, C есть и будет им.

    0
    ответ дан 30 November 2019 в 05:59
    поделиться

    C++ поддерживается для разработки в режиме ядра в Windows, но вы не можете легко использовать исключения и RTTI. Я считаю, что сегодня нет причин писать код на C, поскольку накладные расходы C++ ничтожны (любая инфраструктура трассировки/отладки будет стоить гораздо дороже, чем дополнительное разыменование для вызова виртуальной функции). На самом деле большинство DDK для Windows реализуют объектно-ориентированные паттерны с помощью C, что просто неудобно по сравнению с C++.

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

    0
    ответ дан 30 November 2019 в 05:59
    поделиться