Ядро Linux (или другой низкоуровневый материал) “хороший” пример того, как записать [закрытый] C

std::istream не является подвижным , так что практической пользы для этого нет.

Это уже сигнализирует о том, что вещь может быть «модифицирована», не путаясь с предположением, что вы передаете право собственности на объект std::istream (что вы не делаете и не можете сделать).

Я могу отчасти увидеть обоснование использования этого, чтобы сказать, что поток логически перемещается, но я думаю, что вы должны провести различие между «владением этой вещью передается», и «Я сохраняю право собственности на эту вещь, но я позволю вам использовать все ее услуги». Передача прав собственности довольно хорошо понимается как соглашение в C ++, и это не совсем так. Что подумают пользователи вашего кода, когда им придется написать parse(std::move(std::cin))?

Хотя ваш путь не «опасен»; вы не сможете ничего сделать с этой ссылкой на rvalue, что вы не сможете сделать с ссылкой на lvalue.

Было бы гораздо более самодокументированным и обычным делом просто взять ссылку на lvalue.

5
задан Norman Ramsey 14 January 2009 в 04:00
поделиться

9 ответов

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

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

Более широко ядра ОС являются узкоспециализированными вещами---нет ничего господствующей тенденции о ядре. Если Вы хотите примеры хорошей практики C, Вы могли бы судить Kernighan и книгу Щуки по Практике Программирования. Или если Вы хотите изучить реальную систему, реализация Lua является достаточно маленькой, что можно считать все это, чрезвычайно хорошо спроектированный, и невероятно портативный---работает на любой платформе с компилятором C ANSI.

Извинения за субъективный и спорный ответ :(

18
ответ дан 18 December 2019 в 05:14
поделиться

Что Вы подразумеваете под хорошим примером? Я полагаю, что ядро Linux является очень хорошо записанным ядром в C с некоторыми проблемами, многие из которых очищаются. Однако до использования его как пример того, как написать код генерала C, я не думаю, что он вполне соответствует. Чтение и понимание ядра будут учить Вас много C. Но то, что Вы не найдете в ядре, является любыми библиотеками для разговора о. Стандартные библиотеки недоступны. Так, например, Вы будете видеть "printk" вместо "printf" и т.д. Существует также некоторое темное волшебство. Ядро является совершенно особым случаем. Я не использовал бы его для нахождения лучших практик, скажем, если бы Вы писали некоторое общее применение как файловый менеджер или база данных.

16
ответ дан 18 December 2019 в 05:14
поделиться

Да, это.

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

Другое хорошее место для чтения исходного кода C находится в C очень собственная Стандартная Библиотека.

Наконец, еще один недавний проект C, о котором я слышу хорошие вещи, является Мерзавцем.

9
ответ дан 18 December 2019 в 05:14
поделиться

Для основных программ? Нет. *отклоните код ядра, обычно находится не в пространстве пользователя, и как таковой имеет различные конвенции и требования, чем самое "основное" программирование. Это - однако, часть лучшего и кода C высшего качества, который можно изучить для приобретения знаний из. Это имеет свои слабые места, и это не совсем правильно написано, но по большей части это - очень эффективный, чистый код.

2
ответ дан 18 December 2019 в 05:14
поделиться

Я предложил бы смотреть на утилиты гну (например, исходный код для стандартных утилит Unix, таких как 'ls' и 'awk'), поскольку они собираются быть легче понять, и более вероятная попытка быть записанным более чистым способом (ядро имеет различные потребности производительности и проблемы совместимости, чем другие типы программного обеспечения).

3
ответ дан 18 December 2019 в 05:14
поделиться

Если Вы спрашиваете с точки зрения изучения C, то это могло бы быть слишком подавляющим для запуска. Что касается использования C, это подходит лучше всего для приложений, требующих мобильности и производительность. Это является наиболее часто используемым для системного программирования уровня. Но, это делает так за счет абстракции. Поэтому необходимо сделать объем кодирования себя в отличие от языка как Java или даже C++. Идеально, Ваш тип приложения должен решить, что выбором языка, и с операционными системами C является способ пойти.

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

1
ответ дан 18 December 2019 в 05:14
поделиться

Является ли это "лучшей практикой", зависит от того, кого Вы спрашиваете. Существует много низкоуровневых C программ, записанных на платформе Windows также, но если Вы будете смотреть на них (например, примеры драйвера устройства от WINDDK), то Вы поймете, что Microsoft успешно изобрела другой язык, что они называют C :-) Но тем не менее, их нужно, вероятно, рассмотреть как "лучшую практику", если Вы когда-нибудь хотите разработать драйверы устройств в Windows.

1
ответ дан 18 December 2019 в 05:14
поделиться

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

0
ответ дан 18 December 2019 в 05:14
поделиться

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

0
ответ дан 18 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: