Стоит ли изучать C, чтобы глубже понять операционные системы и компьютеры в целом? - PullRequest
8 голосов
/ 29 июня 2009

В настоящее время я работаю разработчиком Actionscript 3 и Php. Я начал изучать Php, затем перешел к Actionscript 3, и теперь я изучаю Python. Эти 3 языка являются языками высокого уровня, и ни в одном из них вам не нужно беспокоиться о низкоуровневом управлении памятью и таких вещах, как знание, какой тип данных использовать для разных чисел.

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

Так что мой вопрос к вам довольно прост. Буду ли я получать пользу от изучения C, даже если я не собираюсь работать с ним в своей сфере деятельности?

Ответы [ 18 ]

12 голосов
/ 29 июня 2009

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

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

11 голосов
/ 29 июня 2009

Изучение чего-либо редко является пустой тратой времени. И С - довольно простой язык для изучения. Раньше я учил этому на коммерческой основе, и мы сделали это за 4,5 дня. Поэтому я бы сказал, попробуйте.

6 голосов
/ 29 июня 2009

Предлагаю вам прочитать эту статью Джоэла:

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

Это более или менее делает сравнение между Java и C / C ++, но я думаю, что это решает довольно много ваших проблем.

3 голосов
/ 29 июня 2009

Прежде всего, вам никогда не должно быть стыдно, если вы чего-то не знаете. Кроме того, переполнение стека не очень сложно понять (ответ в самом названии).

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

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

2 голосов
/ 29 июня 2009

Может быть. На данный момент я пишу C исключительно, потому что работаю снизу вверх. У меня есть куча времени, чтобы убить, прежде чем я поступлю в колледж, поэтому я подумал: я мог бы (хотя бы в некоторой степени) хорошо разбираться в архитектуре программного обеспечения, прежде чем начать. Это делает (в некоторых случаях) концепции более высокого уровня более легкими для изучения, повышает вашу способность решать проблемы и т. Д. Когда я был намного моложе, я изучал PHP и VB6. Когда я перешел на C и сборку, мне было тяжело понять, что «строка» - это не одно значение, а массив отдельных значений - и я не мог просто сравнить одно с другим - я приходилось обходить каждый массив символов и находить разницу - и т. д. Такие мелочи заставили меня переосмыслить и заново понять, как на самом деле работают компьютеры. Я имею в виду, до того, как я обнаружил эту вещь о строках - я думал, что регистры процессора совершенно бесполезны (как вы могли бы поместить что-нибудь полезное в 32 бита!?).

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

Если вы изучите C, чтобы узнать об архитектуре - и о том, как на самом деле работает под капотом - возможно, попробуйте то, что я делаю. Я часто компилирую в ассемблерный код, чтобы увидеть, как компьютер на самом деле справляется с тем, что я прошу. Чтобы увидеть каждый отдельный шаг, который делается для каждой задачи. Собственно, так я и понял разницу между char *a = "a string" и char a[] = "a string". Однако лучшим преимуществом для вас будет понимание того, насколько безобидными являются языки высокого уровня: P.

Для записи - каждому процессу дается стек вызовов. Это блок памяти, который имеет заранее определенный размер. Используется в основном для локальных переменных. Каждый раз, когда вы создаете локальную переменную, ее содержимое добавляется в конец стека - и когда функция возвращается (и эти переменные выходят из области видимости), эти данные отбрасываются. Переполнение стека происходит, когда в конец стека добавляется слишком много материала, и вы переполняете предварительно выделенное пространство памяти. Обычно это происходит в результате размещения ОГРОМНЫХ объектов в стеке или слишком большого количества рекурсии (функция, вызывающая себя сама). Также я думаю, что если вы просто слишком запутались в вызовах функций внутри вызовов функций, что в основном (в данном случае) совпадает с проблемой рекурсии.

2 голосов
/ 29 июня 2009

Если вы хотите стать серьезным программистом, вам определенно следует.

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

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

И: то, что я нашел очень поучительным с точки зрения понимания того, что ООП - это кодирование объектно-ориентированного кода на простом С.

http://www.state -machine.com / DevZone / cplus_3.0_manual.pdf

1 голос
/ 29 июня 2009

Я думаю, вы должны выучить C.

Что ж, вместо того, чтобы (просто) изучать C, вы должны читать K & R2.

Вот список того, чему K & R2 учит вас:

  • C
  • Сортировка
  • Двоичные деревья поиска
  • Хеш-таблицы
  • Алгоритмы выделения памяти
  • Архитектура машины с плоской памятью Von-Neumann
  • Системное программирование (wc --- или может быть сделано --- на удивление сложным)
  • Взаимодействие с ядром

Когда вы действительно «получаете» C, у вас также есть легкий доступ к голому металлу; становится намного проще добраться до машинного стека вызовов. Как только вы увидите сходство между указателями на функции, блоками if-then-else, «goto» и «return», станет намного проще понять, как работает эксплойт переполнения буфера.

Обучение С - хорошая вещь. Не потому, что он автоматически учит вас всему, как работают программы, а потому, что он заставляет вас стремиться к этим знаниям.

1 голос
/ 29 июня 2009

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

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

Теперь до этого звучит все романтично. позвольте мне перефразировать. Вам нужно будет понять основную систему, если вы хотите написать что-то стоящее на C. Это означает, что прежде чем вы получите что-то более удаленное, чем вывод «Hello World», вы будете много читать, много ошибаться. понимание и повторное чтение, потому что парни, пишущие документы, понимают, о чем они говорят, а парни, читающие документы, не понимают, иначе они бы их не читали.

Синтаксис C очень, очень прост, а «писать» программу очень легко. Налаживание взаимодействия между вашей программой, базовой ОС и аппаратным обеспечением - вот в чем проблема. В C нет ничего бесплатного, но есть! это прекрасный язык.

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

1 голос
/ 29 июня 2009

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

1 голос
/ 29 июня 2009

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

Кстати ... Переполнение стека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...