it-roy-ru.com

Я не знаю C. А зачем мне это учить?

Мой первый язык программирования был PHP ( вздох ). После этого я начал работать с JavaScript. Я недавно сделал работу в C #.

Я никогда не смотрел на языки низкого или среднего уровня, такие как C.

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

Я не согласен. Я утверждаю, что:

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

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

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

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

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

58
Stephen

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

Единственный уровень ниже C - это сборка, на которой говорит конкретный процессор.

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

113
Frank Shearar

Я не думаю, что какой-либо из ответов здесь действительно является тем, что искал ОП, поэтому я собираюсь добавить свое собственное мнение.

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

Однако на практике то, знаете ли вы действительно, что вы делаете как программист, не обязательно мешает вам разрабатывать действительно классное, полезное программное обеспечение с использованием высокоуровневых инструментов. Я имею в виду, что создатель Stack Overflow Джефф Этвуд, очевидно, даже не знает C, и все же я бы сказал, что Stack Overflow - чертовски хорошее веб-приложение.

Решите ли вы изучать C (или C++, или Assembly), зависит от того, каким программистом вы хотите быть. Если вы просто хотите разрабатывать классные веб-приложения или бизнес-приложения, это нормально - нет необходимости изучать C. Но если вы действительно хотите Excel в том, что вы делаете - если вы действительно хотите работать - круто проекты, которые выдвигают современное состояние, тогда вам действительно нужно воспринимать себя как программиста достаточно серьезно, чтобы по-настоящему понять как работают компьютеры. Поскольку C по сути является языком операционной системы OS, а также языком, который поддерживает практически все остальное (от ядра Linux до большинства Java ВМ, до Python) = и Ruby интерпретаторы, базы данных SQL, веб-серверы и почти все драйверы устройств) глубокое понимание языка имеет большое значение.

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

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

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

72
Charles Salvia

Практическое практическое правило заключается в том, что вам необходимо понимать хотя бы один уровень абстракции ниже того уровня, на котором вы обычно работаете. Учтите, что ваш PHP или интерпретатор JavaScript на самом деле может быть реализован на C или C++. В конце концов вы столкнетесь с ошибкой в ​​интерпретаторе или даже с ошибкой во время выполнения C. Если вы не понимаете C, вы ограничитесь отправкой отчета об ошибке сопровождающему, надеясь, что он сможет воспроизвести его и позаботиться об этом, и затем поворачивая пальцы. Если вы знаете C, вы можете сказать им точно, где проблема и в чем она.

Это также означает, что если вы работаете в C/C++, вы должны по крайней мере иметь возможность читать Assembly на вашей платформе.

Что касается изучения C, когда вам это нужно: я заметил, что большинство программистов могут изучать Perl/Python/Javascript по требованию, но ассемблер/C/LISP, похоже, требует гораздо больше времени, поэтому стоит изучить хотя бы некоторые основы перед необходимостью возникает.

12
Charles E. Grant

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

Изучение этих понятий низкого уровня дает удивительную способность рассуждать о вещах высокого уровня. Например, в C++ и D аргументы по умолчанию для виртуальных функций определяются статическим типом (время компиляции) объекта, а не динамическим типом (время выполнения). Это не имеет смысла, если вы не понимаете, как работают vtables и соглашения о вызовах и почему было бы крайне сложно реализовать виртуальные функции противоположным образом.

7
dsimcha

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

Для фактической разработки используются другие языки являются - C # является популярным, как и Java, в то время как PHP и Python популярны для внутренние проекты, и всегда полезно иметь под рукой хотя бы базовые знания в этой области, если вы выбираете проект с открытым исходным кодом PHP проект, скажем, для вашей системы отслеживания ошибок. Однако, работа спецификации все еще исходят из того стандартного шаблона, который был написан 25 лет назад.

7
JohnL

Какой отличный слаг-фестиваль! (Как якобы говорят: это личный бой или кто-нибудь может присоединиться?)

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

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

Итак, Стивен, вы можете быть правы. Я бы так не думал, но раньше ошибался.

6
Mike Dunlavey

Как бы мне не хотелось размещать обязательную запись в блоге Джоэла, я согласен с ним здесь . С - это язык программирования. Я не могу придумать ни одного языка высокого уровня, который не может каким-либо образом взаимодействовать с ним. Из-за этого C все еще является популярным выбором для системного программирования. Вы просто не можете взаимодействовать с некоторыми вещами уровня ОС без C.

Кроме того, что вы планируете делать, если ваш язык высокого уровня недостаточно быстр? Умение писать на C особенно важно, когда вы используете высокоуровневый динамически типизированный язык, такой как Ruby, Python или PHP. Но даже Java и C # программисты должны время от времени переходить на C.

6
Jason Baker

Я думаю, это прогресс.

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

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

Это не обязательно правда. Стандартный C не приближает вас к металлу ближе, чем любой другой 3GL (Pascal, Fortran и т.д.). Некоторые C реализации могут предоставлять хуки, которые дают вам больший доступ к некоторым областям, но в целом голые указатели примерно такие же близкие, как и вы, что совсем не близко. Например, вы не можете напрямую получить доступ к регистрам или статусным словам.

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

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

4
John Bode

Произвольно спросил: Вы спрашиваете подтверждение, что вам не нужно изучать C? Если вы изучите чисто C (не обязательно C++), вы получите полное представление о модели выполнения компьютера. Особенно о памяти и распределении. Этот материал также важен для людей, программирующих на языках высокого уровня.

Для программиста PHP) просто менее прозрачно, как выполняется код на данной машине. Для программиста PHP это не имеет значения, так как передача по сети является узким местом в приложении и т. д.

Простой PHP/Python/C # имеет много уровней абстракции между языком и процессором. Эти слои настолько толстые, что не позволяют просматривать их. Когда вы изучите C, между вами, процессором и операционной системой будет тонкий лист. Это не облегчает программирование (и может быть даже лучше). Но вы на самом деле можете узнать, как работает процессор. Зная "средний" C, вы можете начать связывать эти знания с языком более высокого уровня. Это немедленная выгода, которую вы получите.

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

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

2
wirrbel

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

Помимо этого - базовая грамотность в C и базовое знакомство с базовой машиной - вам лучше всего потратить учебное время на реальные вещи, такие как SICP, TCP/IP Illustrated или книги по бетонной математике, алгоритмам или структуре данных , Реальные вещи.

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

Пот трудные вещи.

2
naftalimich

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

Я пишу код для встраиваемых систем с сильно ограниченными ресурсами памяти (самое большое, что я сделал за последнее время - это 16 Кбайт, и это было ОГРОМНО). На этом рынке C или ассемблер являются единственными вариантами, и любой из пушистых языков высокого уровня просто не работает.

2
uɐɪ

По моему опыту, C/C++ был хорошим буфером, который отделял хороших программистов от VB6-кодеров. После пяти с лишним лет C/C++ я получил работу в VB6. Я был поражен качеством (или его отсутствием) кодеров. Их мало интересовали внутренности языка, дизайн или производительность. К сожалению, когда компания перешла на .Net, кодеры C/C++ и .Net использовали одни и те же инструменты. Кодеры VB были еще хуже кодеров VB.Net. Ситуация ухудшилась, когда вся разработка перешла на ASP.NET. Внезапно любой, кто мог перетащить элемент управления, стал программистом.

Однако на рынке труда было не так много разграничить хардкорных кодеров (например, C/C++) и туристов.

Таким образом, наличие C или C++ в вашем резюме может помочь отличить вас от риффа.

2
dave

C (и, возможно, C++) - это море, в котором вы плаваете. ОС, которая будет выполнять ваш код, вероятно, написана на C (и C++). Таким образом, ваш родной API для доступа к службам ОС будет в C.

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

Это также основано на вашей специализации областей развития. Например, веб-разработчику, который пишет HTML, Javascript и некоторые сценарии на стороне сервера, возможно, никогда не потребуется знать что-либо о C, но разработчик распределенной системы или игры узнает.

Никогда не повредит потратить несколько недель на изучение чего-то столь важного для вашей профессии.

1
Mert Akcakaya

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

Если вы не знаете C, вы не знаете, как другие языки достигают результатов, которые они делают.

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

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

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

1
Bill Michell

С имеет много преимуществ:

  1. C - это язык низкого уровня. Вы можете использовать c для разработки ядра и драйвера.
  2. C - самый быстрый язык. Многие мощные программы разрабатываются c. Например: memcached, redis, nginx, Apache, mysql и т.д.
  3. C является кроссплатформенным языком. Программа, разработанная c, может работать на любой платформе. Другие кроссплатформенные языки не могут этого сделать. Java, python, php и т.д. Не могут работать на платформе iOS.
  4. C++ не может работать на многих встроенных системах.
1
Edward Shen