Подтвердить что ты не робот

Какие типы программ лучше всего написаны на C

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

Изменить: Я ищу, что C хорошо. Это, вероятно, не совпадает с лучшим способом обучения C.

4b9b3361

Ответ 1

Код, в котором вам необходим абсолютный контроль над управлением памятью. Код, где вам нужно полностью контролировать компромисс между скоростью и памятью. Очень малоуровневая обработка файлов (например, доступ к необработанным устройствам).

Примеры включают ядро ​​ОС и встроенные приложения.

В конце 1980-х годов я возглавлял группу поддержки по системе C, которая составляла более миллиона строк кода. Он имел доступ к базе данных (Oracle), графику X Windows, межпроцессные коммуникации, всевозможные хорошие вещи. Он работал на VMS и нескольких разновидностях Unix. Но если бы я сегодня воссоздал эту систему, я бы не использовал C, я бы использовал Java. Другие, вероятно, будут использовать С#.

Ответ 2

Низкоуровневые функции, такие как ядро ​​ОС и драйверы. Для них C непревзойден.

Ответ 3

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

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

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

Изучите это, а затем перейдите.

Ответ 4

Те 100 строк кода python, на которые приходится 80% времени выполнения.

Ответ 5

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

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

Ответ 6

  • Хруст числа (например, библиотеки, которые будут использоваться на более высоком уровне с другого языка, такого как Python).
  • Программирование встроенных систем.

Ответ 7

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

Я имею в виду приложения, такие как системы управления базами данных (mySQL, Oracle, SQL Server), веб-серверы (apache, IIS) или даже браузеры (посмотрите, как был написан хром).

Вы можете сделать так много оптимизаций в C, которые просто невозможны в языках, которые запускаются на виртуальных машинах, таких как Java или .NET. Например, базы данных и серверы поддерживают много одновременных пользователей и очень хорошо масштабируются. Для базы данных может потребоваться совместное использование структур данных между несколькими пользователями (потоки/процессы), но сделать это таким образом, чтобы эффективно использовать кэши CPU. В C вы можете использовать вызов операционной системы для определения размера кеша, а затем соответствующим образом выровнять структуру данных в строке кэша, чтобы линия не "пингонг-понг" между кешами, когда несколько потоков обращались к соседним, но несвязанные данные (так называемое "ложное разделение" ). Это один из примеров. Есть много других.

Ответ 8

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

Ответ 9

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

Ответ 10

  • Где вы чувствуете необходимость 100% -ного контроля над своей программой. Это часто бывает в случае с ОС нижнего уровня, например драйверами устройств, или настоящие встроенные устройства на базе MCU: s и т.д. (все это и другое уже упоминалось выше)

  • Но учтите, что C - зрелый язык, который существует уже много лет и будет вокруг еще много лет, он имеет много действительно хороших инструментов отладки и все еще огромное количество разработчиков, которые его используют. (Вероятно, он много потерял для более модных языков, но он по-прежнему огромен) Все его сильные и слабые стороны хорошо знают, язык, вероятно, больше не изменится. Поэтому сюрпризов не так много...

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

/Johan

Ответ 12

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

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

Ответ 13

Встраиваемые материалы, в которых важны использование памяти и скорость процессора.
Часть обработчика прерываний ОС (и, возможно, две или три функции в нем).

Даже если некоторые из вас теперь начнут bash сильно на меня теперь:
Я не думаю, что любое приличное приложение должно быть написано на C - это слишком склонно к ошибкам. (и да, я знаю, о чем говорю, написав очень много кода в C сам (ОС, компиляторы, виртуальные машины, сетевые протоколы, элементы управления RT и т.д.).

Использование языка высокого уровня делает вас намного более продуктивным. Скорость обычно достигается за счет соблюдения правила 10-90: 90% времени процессора расходуется на 10% вашего кода (который вы должны сначала оптимизировать). Кроме того, использование правильного алгоритма может дать больше производительности, чем оптимизировать биты в C. И делать что-то прямо на C гораздо труднее.

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

Ответ 14

Сборщики мусора!

Кроме того, просто программы, основной задачей которых является выполнение вызовов операционной системы. Например, мне нужно написать короткую C-программу под названием timeout, которая

  • Принимает командную строку в качестве аргумента с количеством секунд для запуска этой команды
  • Создает два дочерних процесса, один для запуска команды и один для сна в течение N секунд
  • Когда первый из дочерних процессов завершает работу, он убивает другого, а затем выходит из

Эффект будет состоять в том, чтобы запустить команду с ограничением времени настенного времени.

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

Ответ 15

В вашем вопросе подразумевается предположение, что язык высокого уровня, такой как Python или Perl (или Java или...) достаточно быстр, достаточно мал, достаточно для большинства приложений. Это, конечно, верно для большинства приложений и некоторых вариантов языка X. Учитывая, что ваш язык выбора почти наверняка имеет интерфейс внешней функции (FFI). Поскольку вы хотите изучить C, создайте модуль в FFI, встроенном в C.

Например, допустим, что вашим инструментом выбора является Python. Переопределите подмножество Numpy в C. Поскольку C - довольно быстрый язык и на C99 имеет понятный интерфейс с числовой библиотекой, вы получите возможность испытать силу C в соответствующей настройке.

Ответ 16

Несколько видов, о которых я могу думать:

  • Системное программирование, непосредственно использующее системные вызовы Unix/Linux или Win32
  • Критически важный для производительности код, который не имеет большого количества манипуляций с строками в нем (например, хруст числа)
  • Встроенное программирование или другие приложения, сильно ограниченные ресурсами

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

Ответ 17

примеры: встроенные приложения, код ядра, драйверы, сырые сокеты.

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

Ответ 18

c компилятор

Ответ 19

Исследования по математике и физике. Есть, вероятно, две альтернативы: C и С++, но такие функции последнего, как инкапсуляция и наследование, здесь не очень полезны. Можно предпочесть использовать С++ "как лучший C" или просто остаться с C.

Ответ 20

Ну, большинство людей предлагают системное программирование, связанное с такими вещами, как ядра ОС, драйверы устройств и т.д. Это сложно и требует много времени. Возможно, самое интересное для C - это консольное программирование. Вы слышали о SDK HAM? Это полный комплект для разработки программного обеспечения для Nintendo GBA, и создание игр для него - это весело. Существует также компилятор CC65, который поддерживает программирование NES (хотя и не полностью). Вы также можете создавать хорошие эмуляторы. Доверяйте мне, C очень полезно. Я изначально был поклонником Python и ненавидел C, потому что он был сложным. Но после использования yuoget вы можете сделать что-нибудь с C. Теперь я использую CPython для встраивания Python в мои C-программы (если необходимо) и код в основном на C. C также отлично подходит для переносимости. Существует C-компилятор для всех ОС и почти каждой консоли и мобильного устройства. Ive даже видел тот, который поддерживает некоторые калькуляторы!

Ответ 21

Не рассматривайте C как усиленный ассемблер. Я сделал в нем какое-то серьезное приложение, когда это был естественный язык (например, целевая машина была ящиком Solaris с X11).

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

Ответ 22

Фильтры ISAPI для Internet Information Server.

Ответ 23

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

Не какой-либо проект с открытым исходным кодом - лучший код для просмотра. Я предполагаю, что после того, как вы выберете тему, есть место для другого вопроса, попросите лучший проект с открытым исходным кодом в поле.
Играйте с ним, понимайте, как он работает, изменяя некоторые функции...
Лучший способ учиться - учиться у кого-то хорошего.

Ответ 24

Фильтры плагинов Photoshop. Множество интересных графических манипуляций вы можете сделать с ними, и вам понадобится чистый C, чтобы сделать это.

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

Ответ 25

Интересно, почему никто не сказал очевидного:

Веб-приложения.

Ответ 26

Любое место, где базовые библиотеки полностью находятся на C, является хорошим кандидатом для пребывания в C - openGL, расширениях Lua, расширениях PHP, old-school windows.h и т.д.

Ответ 27

Я предпочитаю C для чего-либо вроде синтаксического анализа, генерации кода - всего, что не нуждается в большой структуре данных (чтение ООП). Это пространство библиотеки очень легкое, потому что библиотеки классов не существуют. Я понимаю, что я необычен в этом, но так же, как многие вещи "считаются вредными", я стараюсь использовать/использовать как можно меньше структуры данных.

Ответ 28

Хорошо, если вы хотите научиться C и немного повеселиться, могу ли я предложить получить NXC и Lego Mindstorms? NXC является компилятором C для Leging Mindstorms.

Другим преимуществом такого подхода является то, что вы можете сравнить усилия по программированию "кирпича" Mindstorms с C, а затем попробовать LEJOS и посмотреть, как это происходит с Java.

Все самое интересное.

Ответ 29

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

И (mutatis mutandis) виртуальная машина, которая запускает остальную часть вашего программного обеспечения.

Ответ 30

Я бы сказал, что с минимальной средой выполнения и ее автономной природой вы можете начать с создания некоторых утилит CLI, таких как grep или tail (или половина команд в Unix). Хороший кандидат - все, что использует только STDOUT, STDIN и манипулирование файлами.

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

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

Чтобы ответить на ваш реальный вопрос, самое лучшее использование C - это тот, для которого он был создан, - портирование себя (и UNIX) на другие архитектуры процессора. Это объясняет отсутствие языковых особенностей очень хорошо; это также объясняет существование указателей, которые на самом деле являются просто конструкцией, чтобы заставить компилятор работать меньше - любой код, созданный с помощью указателей, мог бы быть создан без него (так же хорошо оптимизирован), но создавать такой компилятор становится намного сложнее.