Подтвердить что ты не робот

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

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

Или вы?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Для хорошего разработчика любой вид знаний - это актив.

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

нет.

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

Ответ 10

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

Ответ 11

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

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

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

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

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

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

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

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

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

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

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

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

Ответ 19

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

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

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

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

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