Что является примером, в котором знание C заставит меня писать лучший код на любом другом языке? - PullRequest
15 голосов
/ 06 апреля 2009

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

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

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

Редактировать: Чтение некоторых ответов, которые вы, ребята, представили, было великолепным, но все равно не имеет для меня никакого смысла в этом отношении:

Возьмите пример с strcat. Есть правильный и неправильный способ комбинировать строки в C. Но почему я (как разработчик высокого уровня) должен думать, что я умнее Ларри Уолла? Почему бы разработчикам языка не написать правильный код для работы со строками?

Ответы [ 20 ]

0 голосов
/ 07 апреля 2009

Знание C - это здорово, потому что оно ничего не делает за вашей спиной (GC, проверка границ и т. Д.). Это делает только то, что вы говорите тоже. Ничего не подразумевается. Даже C ++ делает то, о чем вы тоже не говорите с RAII (конечно, подразумевается, что объект разрушается, когда он выходит из области видимости, но вы на самом деле этого не пишете). C - отличный способ узнать, что происходит «под капотом» компьютера, без необходимости писать ассемблер.

0 голосов
/ 07 апреля 2009

В Python, скажем, у вас есть функция

def foo(l=[])
  l.append("bar")
  return l;

В какой-то версии Python, доступной около года назад, с запуском foo () для раз, вы получите действительно интересный результат (т.е. ["bar","bar","bar","bar]).

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

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

Я нахожу все глупыми вопросы "зачем беспокоиться о C / C ++ / ASM". Если вы достаточно склонны изучать язык, это означает, что вы достаточно любопытны, чтобы освоить его. Зачем останавливаться прямо перед C?

0 голосов
/ 07 апреля 2009

Технически, все недостатки C вынуждают вас кодировать их; заставить вас писать больше кода -> сделать вас более опытным в целом. Например, из-за отсутствия переносимого целого числа, большего 32-битного, в прошлом я заставлял меня писать собственную библиотеку bignum.

Отсутствие неявного управления памятью, ресурсами и ошибками (сборка мусора, RAII, автоматически вызываемые конструкторы / деструкторы, возможно, исключения) вынуждает пользователей C писать много кода инициализации, обработки ошибок и очистки. Это может быть только я, но я никогда не уставал писать такой код. Я иду и читаю документацию по каждой внешней функции, которую я вызываю, возвращаюсь к своему коду и проверяю каждое возвращаемое значение и другие вещи, указывающие на ошибку. Это даже заставляет меня чувствовать себя в безопасности!

Это последнее замечание, вероятно, является самым важным в пользу аргумента. Вы можете написать столько пар malloc () / free () только перед тем, как начать анализировать время жизни каждой переменной, с которой вы сталкиваетесь на каждом языке! Объекты автоматического хранения в C ++ также не помогают в этом расстройстве.

Для написания действительно переносимого кода на C часто требуется, чтобы программист был свободен от множества предположений о хост-системе - например, sizeof (), CHAR___BITS, unsigned long, UINT_MAX. Хотя это не помогло мне написать лучший код на других языках, оно помогло мне подумать о возможных альтернативных реализациях: как крошечный микропроцессор все еще может выполнять мой код C, генерируя инструкции RISC на gazillion для моего простого однострочного оператора. (Это другое дело; не так много других языков сопоставляются с заданным языком ассемблера так легко в моей голове. Опять же, это может быть только я.)

Конечно, ни один из этих аргументов не относится только к C. @ S.Lott имеет правильную точку - Fortran может быть столь же хорошей альтернативой. Но вокруг столько кода C! Целая система персональных компьютеров сверху вниз - приложения к библиотекам, драйверам к ядру - доступна в исходном коде на языке C. Если вы не сможете прочитать ее, это будет пустой тратой.

0 голосов
/ 06 апреля 2009

Не думаю, что может быть какой-то конкретный пример.

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

Это не заставляет вас писать лучший код на python, это просто делает вас больше компьютерным ученым.

Ссылка, которую Ведж сделал на статью Джоэля, в которой упоминается художник Шлемьель, интересна, но здесь не имеет никакого отношения. Этот алгоритм никак не связан с C (хотя он проявляется в цепочках с нулевым символом в конце).

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

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

Считайте, что:

a = a + b 

делает копии как a, так и b. Он не изменяет строку, на которую ссылается a, он создает новую строку, выделяя больше памяти и т. Д.

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

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

0 голосов
/ 06 апреля 2009

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

0 голосов
/ 06 апреля 2009

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

В частности, подумайте об управлении памятью, драйверах hardwar, физических движках, высокопроизводительной трехмерной графике, стеках TCP, двоичных протоколах, встроенном программном обеспечении, создании языков высокого уровня, таких как Perl

0 голосов
/ 07 апреля 2009

неэффективный код (например, циклы строки + =) обычно неэффективен на любом языке. какая разница, если кто-то объясняет, почему он неэффективен на одном или другом языке? знание C, но не понимание того, что метод неэффективен, ничем не отличается от знания Python и не реализации того же самого.

0 голосов
/ 06 апреля 2009

Вы не можете написать ядро ​​ОС на Perl; C был бы намного лучшим выбором для этого, потому что он достаточно низкоуровневый, чтобы выразить все, что должно делать ядро, и достаточно переносим, ​​чтобы позволить вам перенести ядро ​​на разные архитектуры

0 голосов
/ 09 апреля 2009

Я думаю, что стоит знать некоторый язык низкого уровня, и есть прагматичные причины выбрать C:

  • Это низкий уровень, близкий к ассемблеру
  • Это широко распространено

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

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

В C обычно реализовано следующее:

  • операционные системы (варианты Unix, Windows, многие встроенные операционные системы)
  • языки программирования более высокого уровня (многие популярные реализации Java, Python и т. Д.)
  • (очевидно) множество популярных проектов с открытым исходным кодом

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

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

В качестве предостережения, я думаю, стоит также изучить ассемблер. Хотя C близок к металлу, я не до конца понимал C, пока мне не понадобился ассемблер. Иногда полезно понять, как на самом деле выполняются вызовы функций, как реализованы циклы for и т. Д. Менее важным, но также полезным является (хотя бы один раз) иметь дело с системой без виртуальной памяти. При использовании C в Windows, Unix и некоторых других операционных системах даже скромный malloc выполняет большую часть работы под прикрытиями, которую легче оценить, отладить и / или настроить, если вам когда-либо приходилось иметь дело с ручной блокировкой и разблокировка областей памяти (не то, чтобы я рекомендовал делать это регулярно!)

0 голосов
/ 06 апреля 2009

Знание C не является обязательным требованием для способности эффективно использовать языки более высокого уровня, но оно, безусловно, может помочь общему пониманию работы компьютеров и программного обеспечения - я думаю, что это похоже на утверждение, что знание некоторого языка ассемблера или архитектуры компьютера / Аппаратная логика (и / или / nand gates, и т. д.) может помочь программисту C стать лучшим программистом.

Иногда для решения проблемы полезно знать, как все работает «под» тем, что вы делаете.

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

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