Может знание C, на самом деле повреждает код, который Вы пишете на высокоуровневых языках?

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

Или Вы?

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

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

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

Я смущен. Мой ум был искалечен вне восстановления, как Dijkstra сказал об ОСНОВНОМ? Я живу в постоянном состоянии преждевременной оптимизации? Есть ли надежда на меня, теперь, когда я понял, что ничего не знаю ни о чем? Там что-нибудь должно знать, даже? И почему это является столь захватывающим, что все, что я записал за прошлые пять лет, возможно, было существенно неправильно?

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

Править: Сделанная CW. Конечно, это также означает теперь, что необходимо отправить примеры интерпретатора/времени выполнения, оптимизирующего лучше, чем мы :)

35
задан 4 revs 23 May 2017 в 12:09
поделиться

19 ответов

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

Старая поговорка гласила, что "настоящие программисты могут писать на FORTRAN на любом языке". Если вы делаете то же самое, используя C, это не является улучшением. Если вы пишете на Lisp, пишите на Lisp. Если вы пишете Python, пишите Python. То, что уместно и разумно для C, не подходит ни для одного из этих языков (или многих других).

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

Знание уровня абстракции языка Си не повредит. Незнание альтернатив может (и будет).

38
ответ дан 27 November 2019 в 06:32
поделиться

Кратко и мило:

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

1
ответ дан 27 November 2019 в 06:32
поделиться

Знание C не повредит качеству вашего кода, но знание «только C» наверняка

3
ответ дан 27 November 2019 в 06:32
поделиться

Для плохого разработчика любые знания могут быть опасны.

Для хорошего разработчика любой тип знаний является преимуществом.

12
ответ дан 27 November 2019 в 06:32
поделиться

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

20
ответ дан 27 November 2019 в 06:32
поделиться

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

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

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

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

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

0
ответ дан 27 November 2019 в 06:32
поделиться

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

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

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

0
ответ дан 27 November 2019 в 06:32
поделиться

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

1
ответ дан 27 November 2019 в 06:32
поделиться

нет.

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

2
ответ дан 27 November 2019 в 06:32
поделиться

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

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

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

1
ответ дан 27 November 2019 в 06:32
поделиться

Программирование - это не языки программирования. Это решение проблем. Инструменты , используемые для решения проблем, просто являются языками программирования. Вы не пишете код для написания кода, вы пишете код для его выполнения и решения проблемы.

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

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

Хотя это не самое эффективное решение, оно по-прежнему является действующим и рабочим решением. Когда вы освоитесь с инструментом, который вы использовали, вы, наконец, узнаете, как можно написать отвертку, когда API ее не предоставляет.

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

6
ответ дан 27 November 2019 в 06:32
поделиться

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

2
ответ дан 27 November 2019 в 06:32
поделиться

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

В моем университете мы взяли курс «Языки программирования», на котором изучали LISP, SNOBOL и ADA. Эти языки открывают ваш разум для различного концептуального мышления при решении задач программирования. Резюме заключалось в том, чтобы выбрать язык, который лучше всего подходит для задачи.

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

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

2
ответ дан 27 November 2019 в 06:32
поделиться

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

Я согласен с этим.

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

3
ответ дан 27 November 2019 в 06:32
поделиться

Чтобы расширить комментарии других ... Хотя я не уверен, что верю в http://en.wikipedia.org/wiki/Whorfian_hypothesis"> Гипотезу Уорфа, когда речь идет о естественных языках, это совершенно очевидно, когда дело доходит до программирования. Языки, которые вы знаете, влияют на то, как вы решаете проблему. Два примера:

1) От профессора, которого я работал много-много лет назад: он пытался найти если в его массиве строк были какие-либо дубликаты. Это в 70-х годах, поэтому он писал это на FORTRAN. Его реализация методом грубой силы n ^ 2 занимала слишком много времени. Поэтому он поговорил с другом. Его друг знал PL1 (я думаю, что это было, может быть, это был APL), в котором есть оператор сортировки. Итак, на этом языке вы узнаете, как сортировать вещи, и насколько это может быть полезно, потому что это легко. Друг придумал сначала очевидную сортировку, затем посмотрите на соседних элементах.Гораздо быстрее, и моему профессору, пишущему на Фортране, это не пришло бы в голову, даже если бы это было прекрасно реализовано на ФОРТРАНЕ.

2) Когда я учился в аспирантуре, моим соседом по комнате был студент-физик. Он поступил в Массачусетский технологический институт и прошел только один курс программирования, конечно, на Scheme. Однажды я зашел в его офис, и он сказал: «Привет, Брайан, можешь взглянуть на этот код и сказать мне, должен ли он работать?» Это была рутина сортировки.Я взглянул на него и сказал, что это не может сработать, потому что он явно был пузырьковой сортировкой, и все же у него был только один цикл (и нет, это был не тот забавный цикл, с помощью которого вы можете написать пузырьковую сортировку, если вы больны и скрученный). Итак, я сказал это. Он ответил: "О, но у него есть рекурсивный вызов внизу!" Мне никогда бы в голову не пришло написать рекурсивную пузырьковую сортировку. Но что более важно, HIM никогда бы не пришло в голову написать нерекурсивную функцию!

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

4
ответ дан 27 November 2019 в 06:32
поделиться

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

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

.
1
ответ дан 27 November 2019 в 06:32
поделиться

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

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

7
ответ дан 27 November 2019 в 06:32
поделиться

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

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

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

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

1
ответ дан 27 November 2019 в 06:32
поделиться

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

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

1
ответ дан 27 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

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