Может ли знание C повредить код, который вы пишете на языках более высокого уровня? - PullRequest
35 голосов
/ 21 мая 2010

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

Или ты?

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

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

Тогда меня поразило: C это просто еще одна абстракция , как и все остальные. Даже сам процессор - это только абстракция! Я просто никогда не видел, чтобы это сломалось, потому что у меня нет инструментов для его измерения.

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

Подводя итог: есть ли смысл знать больше, чем говорят мне документы API?

РЕДАКТИРОВАТЬ: Сделано CW. Конечно, это также означает, что теперь вы должны публиковать примеры оптимизации интерпретатора / среды выполнения лучше, чем мы:)

Ответы [ 19 ]

2 голосов
/ 21 мая 2010

нет.

Если вы утратите желание знать и улучшаться, хотя вы и повреждены.

1 голос
/ 28 мая 2010

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

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

1 голос
/ 22 мая 2010

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

1 голос
/ 21 мая 2010

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

По крайней мере, это то, что я предполагаю здесь

1 голос
/ 21 мая 2010

Будет больно, если вы примените эти знания к языкам более высокого уровня, когда они действительно не требуются. Конечно, имея некоторый опыт написания собственных классов C на низком уровне, я мог бы делать это, скажем, на Java. Но будет ли это лучшей альтернативой существующей библиотеке коллекций (как Java API, так и дополнения Commons Collections)? Может быть.

На практике вам придется рассчитывать, стоит ли потраченное время.

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

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

1 голос
/ 21 мая 2010

Коротко и сладко:

Чтобы быть хорошим программистом, нужно уметь мыслить организованно. C или LUA или Java, что угодно.

1 голос
/ 21 мая 2010

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

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

Каждая абстракция разработана с определенной целью, выберите ту, которая лучше всего подходит для ваших нужд. Знание Linux затрудняет знание Windows или Mac OS? Это признание того, что они отличаются .

0 голосов
/ 21 мая 2010

Знание C, а затем работа на моем любимом языке очень высокого уровня (Python), например, является примером того, почему я считаю полезным знать C.

Знание C, когда я используюPython полезен несколькими способами:

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

(b) Python написан на C. Будучи программистом на C, также означает, что если Python поможет мне на 99% пути, но некоторая дополнительная абстракция может быть полезна в Python, я могу написать эту абстракциюPython.Я могу заглянуть в исходный код интерпретатора CPython и понять, что происходит внутри.По сути, я, как программист на Python, все еще использую нечто, построенное на языке Си.Таким образом, знание этого языка по-прежнему ценно.

Все, что я сказал выше, верно и для людей, использующих Perl, Ruby и PHP.

0 голосов
/ 21 мая 2010

Понимание нескольких языков / рамок и парадигм программирования никогда не должно повредить - это должно быть полезно.

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

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

...