Код, где Вам нужен неограниченный контроль по управлению памятью. Код, где необходимо крайне проконтролировать скорость по сравнению с компромиссами памяти. Управление файлом очень низкого уровня (такое как доступ к неструктурированным устройствам).
Примеры включают ядро ОС и встроенные приложения.
в конце 1980-х, я был главой команды обслуживания в системе C, которая была больше чем миллионом строк кода. Это сделало доступ к базе данных (Oracle), графика X-окон, межпроцессные взаимодействия, все виды хорошего материала. Это работало на VMS и нескольких вариантах Unix. Но если бы я должен был воссоздать ту систему сегодня, я уверенный не использовал бы C, я использовал бы Java. Другие, вероятно, использовали бы C#.
Ну, если Вы хотите изучить C и иметь некоторую забаву одновременно, я мог бы предложить получить NXC и набор Lego Mindstorms? NXC является компилятор C для Lego Mindstorms.
Другое преимущество этого подхода состоит в том, что можно сравнить усилие программировать Mindstorms "кирпич" с C и затем попробовать LEJOS и видеть, как это идет с Java.
Все отличное развлечение.
Я сказал бы, что с крохотной средой выполнения и это - автономная природа, Вы могли бы запустить путем создания некоторых утилит CLI, таких как grep или хвост (или половина команд в Unix). Что-либо, что использует только STDOUT, STDIN и управление файлом, является хорошим кандидатом.
Это точно не отвечает на Ваш вопрос, потому что я на самом деле не ПРИНЯЛ БЫ РЕШЕНИЕ использовать C в таком приложении, но я надеюсь, что это отвечает на вопрос, Вы означали спрашивать - "каков будет хороший тип приложения для использования, изучают C на?"
C не на самом деле, что плохо язык - это довольно легко для понимания кода на уровне ассемблера, который довольно полезен, и конструкции языка - немногие, оставляя очень редкий язык.
Для ответа на фактический вопрос самое лучшее использование C является тем, для которого это было создано - портирование себя (и UNIX) к другим архитектурам ЦП. Это объясняет отсутствие функций языка очень хорошо; это также объясняет существование Указателей, которые являются действительно просто конструкцией, чтобы заставить компилятор работать менее - любой код, созданный с указателями, мог быть создан без него (точно также оптимизированный), но становится намного более трудно создать компилятор, чтобы сделать так.
Следование, что кто-то еще сказал. C кажется хорошим языком для реализации языка, на котором Вы пишете остальную часть Вашего программного обеспечения.
И (с необходимыми изменениями) виртуальная машина, которая выполняет остальную часть Вашего программного обеспечения.
Любое место, где базовые библиотеки находятся полностью в C, является хорошим кандидатом на пребывание в C - openGL, расширения Lua, расширения PHP, олдскульный windows.h, и т.д.
Интересно, почему никто не заявил очевидное:
веб-приложения.
Не рассматривайте C как увеличенный ассемблер. Я сделал некоторое серьезное приложение в нем, когда это был естественный язык (например, целевая машина была полем Solaris с X11).
Запись что-то с некоторой сутью на нем. Запишите клиент-серверную шахматную программу, где AI находится на сервере, и UI отображается в X11; как только Вы сделали это, Вы будете действительно знать C.
Фильтры плагина Photoshop. Партии и большое интересное графическое управление, которое можно сделать с теми и Вам будет нужен чистый C для выполнения в нем.
, Например, это - шлюз к фрактальному поколению, преобразованиям Фурье, нечеткие алгоритмы и т.д. и т.д. Действительно что-либо, что может управлять данными изображения/цвета и дать интересные результаты
Прежде на самом деле запись C код, я предложил бы сначала чтение хороший код C.
Выбирают предмет, на котором Вы хотите сконцентрироваться, в основном любое приложение может быть записано в C, но я предполагаю, что приложение GUI будет не Вашим предпочтительным вариантом и найдет немного проектов с открытым исходным кодом изучить.
Не любой проект с открытым исходным кодом является лучшим кодом для взгляда. Я предполагаю, что после выбора предмета существует место для другого вопроса, попросите лучший проект с открытым исходным кодом в поле.
Игра с ним, поймите, как это работает, изменяют некоторую функциональность...
Лучший способ учиться, учатся от кого-то хорошего.
примеры: встроенные приложения, код ядра, драйверы, неструктурированные сокеты.
Однако, если Вы находите себя более продуктивными в C тогда, идут вперед и создают то, чего Вы желаете. Используйте язык в качестве инструмента для решения проблемы.
Исследования в математике и физике. Существует, вероятно, две альтернативы: C и C++, но такие функции последнего, поскольку инкапсуляция и наследование не очень полезны там. Можно было предпочесть использовать C++ "в качестве лучшего C" или просто оставаться с C.
Несколько видов, о которых я могу думать:
В основном, C предоставляет Вам портативный, эффективный доступ к собственным возможностям машины; все остальное - Ваша ответственность. В частности, обработка строк в C утомительна, подвержена ошибкам, и вообще противна; самый эффективный способ сделать обширные строковые операции с C могут быть должны использовать его для реализации языка, который обрабатывает строки лучше...
Неявный в Вашем вопросе предположение, что 'высокоуровневый' язык как Python или Perl (или Java или...) является достаточно быстрым, достаточно маленьким... достаточно для большинства приложений. Это, конечно, верно для большинства приложений и некоторого выбора X из языка. Учитывая, что, Ваш предпочтительный язык [почти 111], конечно имеют внешний функциональный интерфейс (FFI). Так как Вы обращаетесь , изучают C, создают модуль в FFI, созданном в C.
, Например, давайте предположим, что Вашим предпочтительным инструментом является Python. Повторно реализуйте подмножество Numpy в C. Так как C является довольно быстрым языком и имеет в C99, ясном числовом интерфейсе библиотеки, Вы получите возможность испытать питание C в соответствующей установке.
Встроенный материал, где использование памяти и вопросы скорости ЦП.
часть обработчика прерываний ОС (и возможно две или еще три функции в нем).
, Даже если некоторые из Вас теперь начнут колотить в большой степени на мне теперь:
я не думаю, что любое достойное приложение должно быть записано в C - это слишком подвержено ошибкам. (и да, я действительно знаю то, о чем я говорю, записав очень много кода в C сам (Ose, компиляторы, VMs, сетевые протоколы, материал управления RT и т.д.).
Используя высокоуровневый язык делает Вас настолько более продуктивными. Скорость обычно получается путем имения в виду правила 10-90: 90% процессорного времени потрачены в 10% Вашего кода (который необходимо оптимизировать сначала). Кроме того, использование правильного алгоритма могло бы дать больше производительности, чем оптимизация битов в C. И делать правильно вещи в C является настолько большей проблемой.
пз: Я действительно имею в виду то, что я записал во втором предложении выше; можно записать полную высокопроизводительную ОС на высокоуровневом языке как Lisp или Smalltalk только с несколькими незначительными частями в C. Думайте, как LISP-компьютеры 70-х полетели бы на сегодняшних аппаратных средствах...
, Где Вы чувствуете потребность в 100%-м управлении Вашей программой. Это часто имеет место на нижнем уровне материал ОС как драйверы устройств или реальные встроенные устройства на основе MCU:s и т.д. и т.д. (все это и другой уже упомянуты выше)
, Но обратите внимание на то, что C является зрелым языком, который был вокруг много лет и будет вокруг в течение значительно большего количества лет, это имеет много действительно хороших средств отладки и все еще огромное количество от разработчиков, которые используют его. (Это, вероятно, проиграло много более модным языкам, но это все еще огромно), Все его достоинства и недостатки, хорошо знают, язык не будет, вероятно, больше изменяться. Таким образом, нет большого количества места для неожиданностей...
Это также означает, что, вероятно, был бы хороший выбор, если у Вас есть приложение с долгим ожидаемым жизненным циклом.
/Johan
Загрузчик. Некоторый блок также потребовал, который на самом деле очень хорош..
Что-либо, где Вы думаете об использовании блока.
Небольшие приложения, которые не имеют UI, особенно когда Вы пытаетесь учиться.
Редактирование: После размышления немного больше на этом, я добавил бы следующее: если Вы уже знаете высокоуровневый язык, и Вы пытаетесь узнать больше о C, хороший маршрут может быть, чтобы не создать совершенно новое приложение C, но вместо этого создать DLL C и добавить функции к нему, что можно звонить с более высокого языка. Таким образом можно заменить простые функции, что высокий язык уже должен гарантировать, что Вы, функция C делает то, что это должно (дает Вам предварительно созданное тестирование), позволяете Вам кодировать главным образом, в каком Вы знакомы с, использует язык в проблеме, с которой Вы уже знакомы, и учит Вас interop.
Много людей говорит драйверы ядра ОС и драйверы устройств, которые являются, конечно, хорошими приложениями для C. Но C также полезен для записи любых важных приложений производительности, которые должны использовать каждый бит производительности, к которой аппаратные средства способны.
я думаю о приложениях как системы управления базами данных (MySQL, Oracle, SQL Server), веб-серверы (апач, IIS), или даже мы браузеры (посмотрите на способ, которым хром был записан).
можно сделать столько оптимизации в C, которые просто невозможны на языках, которые работают в виртуальных машинах как Java или.NET. Например, базы данных и серверы поддерживают многих одновременных пользователей и потребность масштабироваться очень хорошо. База данных, возможно, должна обменяться данными структуры между многочисленными пользователями (потоки/процессы), но сделать так способом, который эффективно использует кэши ЦП. В C можно использовать вызов операционной системы, чтобы определить размер кэша, и затем выровнять структуру данных соответственно к строке кэша так, чтобы строка не делала "пинг-понга" между кэшами когда несколько доступов потоков смежные, но несвязанные данные (так называемая "ложь, совместно использующая). Это - один пример. Существуют многие другие.
Те 100 строк кода Python, которые составляли 80% Вашего времени выполнения.
Можно использовать C для записи чего-либо. Это - язык очень общего назначения. После выполнения поэтому на некоторое время Вы поймете, почему существуют другие "высокоуровневые" доступные языки.
"Изучают C", любой ценой, но не делают не, придерживаются его слишком долго. Другие языки намного более продуктивны.
я думаю суть людей, которые говорят, что необходимо узнать, что C - то, так, чтобы Вы поняли отношения между кодом высокого уровня и внутренностями машины и какой exaclty происходит с битами, байты, выполнение программы, и т.д.
Узнает, что, и затем идут дальше.
Низкий уровень функционирует, такие как ядро ОС и драйверы. Для тех C непобедим.
ISAPI фильтрует для Сервера информации об Интернете.
Сборщики "мусора"!
кроме того, просто программы, основное задание которых должно выполнить вызовы операционной системы. Например, я должен записать короткую программу C, названную timeout
, что
, эффект будет состоять в том, чтобы выполнить команду с пределом на тактовое стеной время.
я и другие на этом форуме попробовали несколько различных решений с помощью оболочек и/или жемчуга. Все являются замысловатыми, и ни один вполне не делает правильную вещь. В C решение будет легко, потому что все средства ОС являются правильными, где можно достигнуть их.
Что-либо, где Вы нуждаетесь в минимуме "волшебства" и нуждаетесь в компьютере, чтобы сделать точно , что Вы говорите ему, не больше и не меньше. Что-либо, где Вы не доверяете "волшебству" сборки "мусора" обработать Вашу память, потому что не могло бы быть столь же эффективно как что Вы можете ручной код. Что-либо, где Вы не доверяете "волшебству" встроенных массивов, строк, и т.д. для не траты слишком большого количества пространства. Что-либо, где Вы хотите быть в состоянии обосновать о точно, что инструкции ASM компилятор испустят для данной части кода.
, Другими словами, не слишком много в реальном мире. Большинство вещей извлекло бы выгоду больше из высокоуровневой абстракции, чем от этого вида управления. Однако код ОС, драйверы устройств и несколько вещей, которые должны быть почти оптимальными в и пространство и скорость, могли бы иметь смысл писать в C. Высокоуровневые языки могут сделать вполне прилично конкуренцию с C на скорости, но не обязательно на пространстве.
Я предпочитаю C для чего-либо как парсинг, генерация кода - что-либо, чему не нужна большая структура данных (ООП чтения). Это - место библиотеки, очень легко, потому что библиотеки классов не существуют. Я понимаю, что я необычен в этом, но так же, как много вещей "считают вредным", я пытаюсь/использовать как можно меньше структуры данных.
Короткий ответ ни один . Немного более длинный ответ был бы любым временем, Вы имеете задачу программирования системы и не имеете доступа ни к какому компилятору для лучшего языка.
Для задач программирования системы, Вы намного лучше обслуживаетесь при помощи чего-то в качестве мощных, но более безопасных и менее подверженных ошибкам как Ada. Для программирования OO общего назначения языки как C++, Java и Ada снова являются намного лучшим выбором. Для большого количества определенных задач, как обработка строк или поколение веб-сайта, существуют проблемно-ориентированные языки, которые сделают Ваше задание намного легче для Вас.