Должен ли я изучать язык ассемблера или C, чтобы понять, как работает настоящее программирование?

Я веб-разработчик, в основном работаю на Ruby и C # ..

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

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

Итак, мой вопрос ...

Может ли Learning C научить меня достаточно теории информатики / низкоуровневого программирования, чтобы не выглядеть обычным денди (полноценный инструмент)?

Спасибо!

Даниэль


Спасибо, парни!

Некоторые действительно отличные ответы,

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


person Daniel Upton    schedule 30.12.2010    source источник
comment
Информатика и то, как работают компьютеры, - два очень разных зверя.   -  person Ignacio Vazquez-Abrams    schedule 30.12.2010
comment
Я не впервые сталкиваюсь с этими вопросами: stackoverflow.com/questions/296/should-i- learn-c stackoverflow.com/questions/ 105190 /   -  person Madhur Ahuja    schedule 30.12.2010
comment
Я предлагаю вам программировать машинный код, как Настоящие программисты пишут машинный код, используя двоичный код, без помощи компиляторов, компоновщиков или ассемблеров. Настоящих программистов волнует не производительность, а то, как лучше всего использовать возможности машины, используя наименьшее количество инструкций! ;-)   -  person Thomas Matthews    schedule 31.12.2010
comment
Что касается впечатления вашего начальника, просто завершите задачи до крайнего срока и убедитесь, что они надежны и правильны (дают правильные результаты) и задокументированы, чтобы вам не приходилось консультироваться по поводу прошлых работ.   -  person Thomas Matthews    schedule 31.12.2010
comment
@Thomas Matthews Хороший крик! В любой момент я лучше буду надежным разработчиком, чем ботаником-пуристом!   -  person Daniel Upton    schedule 01.01.2011


Ответы (11)


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

Если вы планируете работать на C # и Ruby, я не вижу смысла изучать ассемблер только ради этого.

Вы будете хорошо изучать только C, так как это C.

Вы можете заниматься «настоящим программированием» на любом языке, если делаете это правильно.

person darioo    schedule 30.12.2010
comment
+1 за упоминание алгоритмов и структур данных как общих оснований. Я рекомендую OP прочитать книгу по этой теме, прежде чем переходить к управлению памятью. Тем более что он работает с gc. - person P.Brian.Mackey; 03.01.2011

Сможет ли Learning C научить меня достаточно теории информатики / низкоуровневому программированию, чтобы не выглядеть обычным денди (полноценный инструмент)?

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

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

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

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

person GilesDMiddleton    schedule 30.12.2010
comment
О, и не забывайте теорию баз данных! - person GilesDMiddleton; 30.12.2010
comment
Я согласен, изучение синтаксиса вовсе не означает, что вы умеете его использовать и правильно используете. - person bjd2385; 30.10.2014

Изучение C предоставит вам всю необходимую информацию и позволит выполнять задачи в разумные сроки.

Я предлагаю вам сделать несколько значимых проектов на C, затем один или два на диалекте Assembler, возможно, для микроконтроллера или специализируясь на SSE / MMX.

person EnabrenTane    schedule 30.12.2010

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

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

Это то, что было бы полезно знать для повседневной работы или чтобы произвести впечатление на начальника? Может быть. Я не уверен, как бы вы применили эти знания в своем коде C # или Ruby, который работает на виртуальной машине (в отличие от собственных двоичных файлов, сгенерированных из C).

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

person John Bode    schedule 30.12.2010

Я не думаю, что знание Ассемблера сделало бы вас лучшим программистом на Ruby / C #.

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

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

person Linus Kleen    schedule 30.12.2010
comment
Я с тобой не согласен. Знание сборки, по крайней мере, немного, очень помогает, потому что вы точно знаете, что происходит, даже если вы никогда не писали ни одной строчки из этого. - person BlackBear; 30.12.2010
comment
@BlackBear: Как это помогает? Где бы вы применили эти знания в коде C # или Ruby? - person John Bode; 30.12.2010
comment
знания, которые вы получаете с помощью сборки (а не самой сборки), помогают вам писать эффективный код. Попробуйте книгу Рэндалла Хайда «Напиши великий код, том 2» - person BlackBear; 30.12.2010

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

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

person frast    schedule 30.12.2010

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

C и Ассемблер - не лучшие языки, если вы хотите изучать информатику. Поскольку вы знаете Ruby и C #, я думаю, вы знаете некоторую объектную ориентацию.

person onemasse    schedule 30.12.2010

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

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

Изучение ASM, конечно, также полезно, но, вероятно, оно неуместно, если вы хотите применить его в своей работе. Тем не менее, это может научить вас нескольким полезным концепциям или, по крайней мере, помочь вам лучше понять, как работает CLR (или в целом, как компиляция байт-кода и скомпилированный в байт-код код делают свое дело). Может быть, вы могли бы попробовать изучить ASM для более старой / более простой платформы; вокруг все еще есть тяжелая сцена с Atari 2600, и из-за присущих платформе ограничений некоторые из хаков, которые они делают, чтобы выжать некоторые дополнительные функции в игре, довольно крутые. Современная архитектура x86_64 довольно сложна и несколько запутана, хотя это скорее личное мнение, чем реальный факт. Обучение использованию микроконтроллера также может выполнить свою работу, но имейте в виду, что многие (большинство?) Используют архитектуру Гарварда (то есть отдельную память для программ и данных), которая отличается от архитектуры типичного ЦП общего назначения.

person donkey_lz    schedule 30.12.2010

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

person devsmt    schedule 30.12.2010

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

Это похоже на правду во многих аспектах, я изучил C ++ и haskell по тем же причинам, я не жалею, так как они научили меня многим вещам, но я понимаю давление со стороны сверстников.

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

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

Есть также «Искусство программирования» Дональда Кнута. Кнут особенно хорошо разбирается в машинных языках и других вещах низкого уровня.


Остерегайтесь, хотя обе эти работы очень плотные.

Вот мои два цента за то, как к ним подойти. Во-первых, это не «учебники», которые приукрашивают ваш путь к навыку, они представляют научную дисциплину соответствующим образом, так что образ мышления: «Что я собираюсь с этим делать? Как я могу это использовать? " следует заменить на «как это работает? Что это делает? Почему это так?».

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

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

person Kaan E.    schedule 06.04.2020

Что ж, «настоящее программирование» не относится к конкретному языку или языкам низкого уровня. На мой взгляд, «настоящее программирование» - это процесс анализа задачи, определения наилучшего способа ее решения и включения этого метода в набор простых шагов с последующим пересмотром и редактированием по мере необходимости до тех пор, пока вы не достигнете своей цели. Исходя из этого, язык на самом деле не имеет значения, это все в мыслительном процессе. Кроме того, в языках высокого уровня нет ничего плохого, я все время использую python и люблю его. Однако изучение языков низкого уровня действительно может помочь вам развить понимание программ и компьютеров в целом. предложил бы c, потому что именно отсюда возникли C # и C ++, и предоставил бы основы для понимания обоих этих языков.

person MEv2.0    schedule 28.10.2013