Действительно ли стоит изучить C для получения более глубокого понимания OS'es и компьютеров в целом?

Не все программисты созданы равными

Довольно часто менеджеры думают, что DeveloperA == DeveloperB просто потому, что у них одинаковый уровень опыта и так далее. На самом деле производительность одного разработчика может быть в 10 раз или даже в 100 раз выше, чем у другого.

Говорить об этом политически рискованно, но иногда мне хочется отметить, что, хотя некоторые члены команды могут казаться с равным мастерством, это не всегда так. Я даже видел случаи, когда ведущие разработчики были «вне надежды», а младшие разработчики выполняли всю реальную работу - хотя я и удостоверился, что они получили кредит. :)

8
задан JMax 29 August 2012 в 12:14
поделиться

18 ответов

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

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

12
ответ дан 5 December 2019 в 04:49
поделиться

Мой ответ: возможно. Эти вопросы могут помочь вам решить:

  1. Нужно ли вам решать сложные математические задачи, связанные с численные методы (исчисление, линейные алгебра, diff-eq, конечный элемент анализ и т. д.)? Многие из лучших библиотеки написаны на C, и понимание того, как реализовать эти алгоритмы на другом языке требовать от вас понимания C, чтобы вы мог бы их перевести.
  2. Вам нужно разработать компактные данные структуры, которые не тратят впустую память? Мой опыт в C позволил мне создать коллекции и строковые классы в Java, использующая гораздо меньше памяти, чем стандартные классы, представленные в Библиотека J2SE.
  3. Нужен ли вам интерфейс с устаревшей Приложения? Многие написаны на C или C ++.

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

0
ответ дан 5 December 2019 в 04:49
поделиться

I'm also an Actionscript 3 developer (with some Python thrown in). Learning C is a current project. I have dove into Objective-C a bit and submitted my first app to the AppStore, but I want a lower level understanding of what I am doing. I don't have much interest in writing a compiler or hacking at the Linux kernel, but essentially everything I touch is C/C++ at the core, so I figure it is worth my time to at least get a cursory understanding of the language.

In terms of leveraging it with your existing experience, the Alchemy project is pretty sweet, and allows you to leverage C/C++ libraries in AS3. There are some exciting ramifications of this.

Personally I have a loose goal of learning a language every year. This year it is Objective-C, but getting into that has made me want to take a step back and learn straight C. It certainly can't hurt, and will make you a better programmer in the long run.

0
ответ дан 5 December 2019 в 04:49
поделиться

For example I don't even know what a stack overflow [... is ...] and why it occurs.

Whenever one function calls another, the computer needs to remember where in the execution of the caller it was. This information is stored in a stack: calling a function pushes a new record saying "return to $HERE when done", whereas returning from a function pops the return address and goes back to there (or rather, the next thing after the function call that has just been returned from).

Typically (determined by the OS or language runtime) you only have a limited amount of space for this stack. Running out of that space is called a stack overflow.

See also http://en.wikipedia.org/wiki/Stack_overflow

0
ответ дан 5 December 2019 в 04:49
поделиться

Like others have pointed out, learning something new is always worth it.

However, speaking as someone who learned C in the past couple of years; I think the answer to your question depends on if you have any practical applications to learning C.

In my instance; I enjoy C in server programs, embedded programming and basically anywhere you want to control as much as possible (without risking further insanity in assembly).

So my suggestion is that you find some mini-project that interests you that would make sense to develop in C. Then learn by doing.

0
ответ дан 5 December 2019 в 04:49
поделиться

Ответ тоже прост: да, можно.

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

Если вам это нравится, сделайте это!

0
ответ дан 5 December 2019 в 04:49
поделиться

Это постоянный вопрос, и на эту тему было выложено много битов. Ответ: да.

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

  • Вы будете использовать эти знания (и в некоторых случаях C сам) чаще, чем вы думаете.

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

C также довольно прост, поэтому его легче выучить, чем обычно думают. Книга C K&R компактна не зря. Многие языки, такие как Python, Lua или Tcl, допускают включение модулей, написанных на C - часто это хороший способ разработки системы.

Итак, поскольку этот спор, кажется, всегда разрешается: Да. Изучите C. Вы увидите много преимуществ.

поскольку этот спор, кажется, всегда разрешается: Да. Изучите C. Вы увидите много преимуществ.

поскольку этот спор, кажется, всегда разрешается: Да. Изучите C. Вы увидите много преимуществ.

0
ответ дан 5 December 2019 в 04:49
поделиться

I think you should learn C.

Well, rather than (just) learning C, you should be reading K&R2.

Here's a laundry list of what K&R2 teaches you about:

  • C
  • Sorting
  • Binary search trees
  • Hash tables
  • Memory allocation algorithms
  • The Von-Neumann flat-memory machine architecture
  • Systems programming (wc is---or can be made---surprisingly complex)
  • Interfacing with the kernel

When you truly "get" C, you also have easy access to the bare metal; it becomes much easier to get at the machine-native call stack. Once you see the similarity between function pointers, if-then-else blocks, "goto" and "return", it becomes much easier to understand how buffer overflow exploits work.

Learning C is a good thing. Not because it automatically teaches you everything about how programs work, but because it makes you gravitate towards that knowledge.

1
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

Проверьте эту ссылку.

PS

0
ответ дан 5 December 2019 в 04:49
поделиться

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

1
ответ дан 5 December 2019 в 04:49
поделиться

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

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

1
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

3
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

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

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

2
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

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

2
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

6
ответ дан 5 December 2019 в 04:49
поделиться

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

11
ответ дан 5 December 2019 в 04:49
поделиться

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

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

А пока это звучит романтично. позвольте мне перефразировать. Вам НЕОБХОДИМО понимать основную систему, если вы хотите написать что-то стоящее на C. Это означает, что прежде чем вы получите что-то более полезное, чем вывод «Hello World», вам придется много читать, много неправильно понимать и еще больше перечитывать, потому что ребята, пишущие документы, понимают, о чем они говорят. о, но парни, читающие документы, не делают иначе, они бы не стали их читать.

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

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

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

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

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

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

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

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

В C нет ничего бесплатного, но Aye! это прекрасный язык.

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

В C нет ничего бесплатного, но Aye! это прекрасный язык.

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

1
ответ дан 5 December 2019 в 04:49
поделиться

Большую часть времени вы довольны тем, что знаете, как что-то делать. Но со временем вы поймете, как и почему. Когда вы спрашиваете, почему вы что-то делаете, C часто может дать вам этот ответ из-за его низкоуровневой природы. Конечно, любой другой «сырой» язык даст вам те же ответы. Под необработанным я имею в виду язык, который позволяет вам прямой доступ к компьютеру, а не скрыт под множеством уровней и классов API.

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

0
ответ дан 5 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

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