Я не знаю C. А зачем мне это учить? [закрыто]


58

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

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

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

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

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

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

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

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

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


@ Стефан Ох, прости ... Я неправильно понял. (но вы понимаете, почему вам нужно выучить c / c ++, верно?)
ApprenticeHacker

1
@burningprodigy Да, в случае, когда мне нужно что-то делать, когда требуется C / C ++ или имеет смысл, конечно, я бы изучал C. Моя проблема в том, чтобы говорить с людьми, которые говорят, что вам нужно изучать C, чтобы иметь возможность эффективно развиваться на языках высокого уровня. И это абсурдно.
Стивен


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

Если бы был один язык, который я хотел бы выучить, это был бы Common Lisp, а не C. Как в первую очередь разработчик C #, я уверен, что получил бы от этого больше пользы. У нас уже есть указатели в C #. В основном, я бы лучше изучил больше способов решения проблемы, чем пытался бы реализовать свое решение более сложным способом. (Как примечание, я наполовину лгу. Я сделал немного Си, и я знаю, что у него есть свои преимущества. Просто хотел отдать должное невероятно мощному и выразительному языку, который предшествовал Си на десятилетие.)
Магус

Ответы:


113

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

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

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


12
Фрэнк: Ты ударил ногтем по голове. Понимание того, как работает компьютер, управление памятью и ее распределение, а также идея, что вы можете еще больше оценить языки высокого уровня, является причиной для изучения C. Мне повезло, что нам пришлось изучать C для реализации проектов класса, таких как реализация базового уровня TCP через UDP ,
Крис

12
Я согласен с этим, хотя: С приближает вас на несколько шагов ближе к корням, а не к земле. Хорошо, есть вещь, называемая макетом памяти. Но что это значит физически? Вы понимаете, как работает компьютер, если вы не понимаете электронику? Квантовая механика? И так далее. Я не уверен, существует ли в мире какой-то разум, который глубоко понимает всю пищевую цепочку от языка высокого уровня, через C, до квантовой механики.
Joonas Pulakka

14
Мой вопрос: как вы можете узнать, как работает компьютер? Что вы получаете? Признание того, что у вас есть сейчас, не очень хорошая причина для изучения языка очень низкого уровня, такого как C. Это все равно, что сказать, что я должен выучить Фортран, чтобы оценить то, что у меня есть сейчас
TheLQ 26.10.10

18
@TheLQ У меня нет слов. Какую пользу может принести знание того, как компьютер работает внутри? Вы получаете более четкое понимание того, что вы делаете, это то, что вы получаете. Скорее: вы сначала узнаете, что именно вы делаете с машиной.
Фрэнк Шиарар

15
Я собираюсь отметить это как правильный, поскольку это, кажется, любимый ответ. Тем не менее, мне все равно, «как компьютер работает» на фундаментальном уровне, поскольку это действительно не помогает мне разработать следующую классную функцию моего приложения. Это похоже на вождение автомобиля: я очень хорош в этом, но мне наплевать, как работает давление разрыва жидкости. Он просто останавливается, когда я нажимаю на педаль тормоза. Кроме того, я уверен, что я был бы признателен за вождение автомобиля, если бы мне пришлось пять лет кататься на лошадях и багги. Это не значит, что я не в состоянии предположить, насколько лучше обстоят дела с машиной, а не с багги.
Стивен

72

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

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

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

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

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

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

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


5
Ты не кажешься этим снобом. Хорошо, может быть, немного. :)
Стивен

7
Отличный ответ. Я успешно программировал в течение десяти лет, не изучая C и C ++, и мог бы пройти оставшуюся часть моей карьеры, даже не научившись этому. Но так как я изучил это в прошлом году, я написал лучшее программное обеспечение, не только на C ++, но и на других моих языках.
Джон М Гант


3
Почему было бы «совершенно неправильно» сравнивать C с латиницей? Я думаю, что это отличная аналогия. Латынь повсюду вокруг нас. На 58% английского словаря влияет латынь (напрямую или через другие романские языки). Латынь также держит ключ к пониманию нашей культуры. Закон, демократия, религия, инфраструктура, градостроительство и ряд других областей можно проследить до Римской империи. Вы можете игнорировать C так же, как вы можете игнорировать латынь, но вы никогда не сможете избежать их. «Латынь и греческий не мертвые языки. Они просто перестали быть смертными». (JW McKail)
Андерс Шеквист

2
@ AndersSjöqvist, это было бы неправильно, потому что никто больше не говорит на латыни, хотя это сильно повлияло на развитие современных языков. Принимая во внимание, что C активно используется и используется везде - практически в каждой ОС, ВМ, базе данных или интерпретаторе. Латынь больше похожа, скажем ... на симулу - в основном мертвый язык, который глубоко повлиял на живые языки, но не используется вне академических кругов.
Чарльз Сальвия

12

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

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

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


9
Хорошо, "C / C ++", с которым я могу жить (проклятые юристы). И «Perl / Python / Javascript» вполне разумен. Но ради бога, зачем "ассемблер / С / Лисп"? Это все равно что сказать "яблоко / апельсин / Барак Обама". Эти три языка не имеют ничего общего друг с другом.
Джейсон Бейкер

@ Джейсон, единственная общность, которую я предлагал, заключается в том, что большинство людей считают, что трио языков сложнее подобрать на лету, и поэтому, возможно, стоит потратить некоторое время на то, чтобы ОП потратил некоторое время с ними, прежде чем возникнет непосредственная необходимость их использования. Арифметическое и функциональное программирование указателей не имеет много общего, за исключением того, что людям, кажется, приходится дольше смотреть на них, прежде чем они обретут смысл.
Чарльз Грант

Я не мог согласиться больше. Если перейти на другой уровень, к более высоким уровням абстракции, «офисный ИТ-парень / гал», который может хотя бы немного программировать, обычно будет лучше, чем тот, кто не может.
Эммет

7

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

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


2
Научитесь читать на ассемблере. Проблема в том, что у меня более 10 различных семейств процессоров, которые я использую, и изучение всех самых разных вариантов - это рецепт путаницы и хаоса. Попробуйте сравнить AMD SHARC с Atmel AVR32 и TI MSP430.
uɐɪ

@ Ян: Верно. В идеале вы должны изучать язык ассемблера любой арки, для которой вы разрабатываете больше всего. Я думаю, что для большинства людей это будет либо x86, либо ARM.
дсимча

3
«Все серьезные программисты должны в конечном итоге научиться хотя бы читать ассемблер». Именно такие комментарии заставили меня начать этот вопрос. Я думаю, что вы просто предвзяты, сэр. Хотя мне нравится то, что вы сказали о неплотных абстракциях. Это имеет смысл. С другой стороны, эти вещи не имеют большого значения в реальном мире на моей арене. Я все еще использую абстракцию высокого уровня, негерметичную или нет.
Стивен

1
@Stephen, вы должны попробовать написать язык ассемблера. 8-битные процессоры не сложны, и попытка реализовать одну и ту же мелочь и в 6502 (например, в C64), и в Z80 (например, для бизнес-машин CP / M) на самом деле очень познавательна. опыт из-за некоторых очень базовых конструктивных различий (страница индекса и регистры).

+1 несмотря на явно ложное All abstractions are leakyутверждение.
Томас Эдинг

7

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

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


6
«спецификации работы по-прежнему исходят из того стандартного шаблона, который был написан 25 лет назад». Вы не могли бы быть более правильным.
Стивен

Поздравляю, Джон!
Марк С

6

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

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


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

3
@ Стефан: Если вы хотите, чтобы люди действительно вас заметили, то возьмите их с собой или заплатите.
Фред Нурк

@ Фред Отличный совет, лол.
Стивен

6

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

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

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

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


4

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

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

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

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

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

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


Я думаю, «оценка» является одним из способов выразить это. В моем классе программирования в старшей школе это были в основном вопросы «Мне нужно использовать эту функцию. Как мне преобразовать LOLOMGCHAR * в WTFBBQCHAR *?»
Katana314

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

2

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

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


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

Конечно, можно писать крупномасштабные производственные приложения, не приближаясь к C. Я написал код за 10 лет до того, как начал использовать C. Я использовал PL / M, Pascal, ADA, а также ассемблер. Они были так же хороши, как C, для изучения базовой механики машины, и часто лучше для создания безошибочного кода.
uɐɪ

Отлично - хотя ваш ответ выше не
создавал у

У вас есть опыт работы с движками Java, ориентированными на использование встраиваемых систем?

2

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

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

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


2

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

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

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

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

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


2

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

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

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

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


1

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

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

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

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

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


1

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

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

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

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


1

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

  1. C - это язык низкого уровня. Вы можете использовать c для разработки ядра и драйвера.
  2. C - самый быстрый язык. Многие мощные программы разрабатываются c. Например: memcached, redis, nginx, apache, mysql и т. Д.
  3. C является кроссплатформенным языком. Программа, разработанная c, может работать на любой платформе. Другие кроссплатформенные языки не могут этого сделать. Java, python, php и т. Д. Не могут работать на платформе iOS.
  4. C ++ не может работать на многих встроенных системах.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.