Какие определенные примеры имеют там знание C создание Вас лучший программист высокого уровня?

Я знаю о существовании вопроса, такого как этот и этот. Позвольте мне объяснить.

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

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

Joel дал несколько примеров: Двоичные базы данных по сравнению с XML и строки. Но два примера действительно не выравнивают по ширине изучение C и/или блок. Таким образом, мой вопрос - это: Какие определенные примеры имеют там знание C создание Вас лучший программист высокого уровня?

14
задан Community 23 May 2017 в 12:24
поделиться

10 ответов

Хорошо, поэтому я заглянул в это немного глубже. Я использовал ваш сценарий точно, но использовал нашу версию JQuery, сделав его таким:

// ==UserScript==
// @name           My Script
// @namespace      http://www.google.com
// @description    My test script
// @include        http://www.google.se/*
// @include        http://www.dn.se/*
// @require        http://myserver/jquery-1.3.2.js
// ==/UserScript==

GM_log("Hello");

Это работает просто хорошо для меня, я полагаю, JQuery вверх на google api не хватает некоторых функций. Потому что этот код выше, работает нормально. Также обратите внимание на /* в конце каждого url, пожалуйста, включите это.

Попробуйте другой JQuery и изменить urls и он должен мир должным образом.

-121--3080528-

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

Моя девушка один семестр после окончания MIT (где они в основном используют Java, Scheme и Python) со степенью Computer Science, и она в настоящее время работает в компании, кодовая база которой находится в C++. В течение первых нескольких дней ей было трудно понять все указатели/ссылки/и т.д.

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

Аналогично, в C/C + + гораздо более очевидно, что примитивы являются просто компилятором, обрабатывающим одни и те же наборы битов по-разному, в отличие от языка, такого как Python или Ruby, где все является объектом со своими собственными отличными свойствами.

-121--2444779-

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

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

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

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

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

15
ответ дан 1 December 2019 в 07:51
поделиться

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

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

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

2
ответ дан 1 December 2019 в 07:51
поделиться

Простой (не совсем реалистичный) пример, чтобы проиллюстрировать некоторые из советов выше. Рассмотрим, казалось бы, безвредное

while(true)
   for(Iterator iter = foo.iterator(); iter.hasNext();)
       bar.doSomething( iter.next() )

или еще более высокий уровень

while(true)
    for(Baz b: foo)
        bar.doSomething(b)

Возможная задача Вот что каждый раз вокруг , в то время как создается новый объект (итератор). Если все, что вы заботитесь о том, - это удобство программиста, то последнее определенно лучше. Но если цикл должен быть эффективным или машина ограничена ресурсом, то вы в значительной степени по милости конструкторов вашего высокого уровня.

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

Одним из возможных решений (все еще на языке более высокого уровня) было бы ослабиться на удобство итератора к чему-то вроде

Iterator iter = new Iterator();
while(true)
    for(foo.initAlreadyAllocatedIterator(iter); iter.hasNext();)
       bar.doSomething(iter.next())

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

-2
ответ дан 1 December 2019 в 07:51
поделиться

Знание материала низкого уровня, может много помогать.

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

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

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

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

Если вы понимаете, как обрабатывается рисунок, вы можете использовать умные трюки для улучшения скорости рисования. например Вы можете нарисовать доску по альтернативно, рисуя 64 белых и черных квадратов. Но часто быстрее нарисовать 32 белых SQares, а затем 32 черных (потому что вам нужно только изменить чертежный цвет дважды вместо 64 раза). Но вы действительно можете нарисовать всю доску черный, затем XOR 4 полосы через доску и 4 полоса вниз по доске в белом, и это может быть намного быстрее всего (2 изменения цвета, и только 9 прямоугольников, чтобы нарисовать вместо 64). Этот Chessboard Trick преподает вам очень важный навык программирования: боковое мышление. Проектируя свой алгоритм хорошо, вы часто можете иметь большое значение, насколько хорошо работает ваша программа.

9
ответ дан 1 December 2019 в 07:51
поделиться

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

Проблема в том, что, поскольку мы создали постоянно растущие уровни абстракции, мы сами делаем много программирования «LEGO Block», не понимая, как на самом деле функция Legos. И имея почти бесконечные ресурсы, мы начинаем лечить память и ресурсы, такие как вода, и, как правило, решают проблемы, бросая больше железа в ситуацию.

Несмотря на не ограничиваясь от C, существует огромная выгода для работы на низком уровне с гораздо меньшим, ограниченным системам памяти, таких как 8-битные процессоры Arduino или Old-School. Он позволяет вам испытать близко к металлическому кодированию в гораздо более доступной упаковке, а после проведения времени сжимающих приложений в 512K, вы примените к этим навыкам на больший уровень в пределах вашего повседневного программирования.

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

5
ответ дан 1 December 2019 в 07:51
поделиться

Просто «зная» C не сделает вас лучше.

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

Например, как кэширует кеши l1 / l2 влияет на вашу работу, и как вы должны написать свой код, чтобы иметь больше хитов в кешах L1 / L2. При работе с C / C ++ и делая тяжелые оптимизации, вам придется идти до такого рода вещей.

1
ответ дан 1 December 2019 в 07:51
поделиться

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

С другой стороны, знание языка Си поможет вам понять, как использовать возможности операционной системы более низкого уровня. Вам это нужно не часто, но иногда вам могут понадобиться файлы mapped памяти, или использовать marshalling на C#, и C сильно поможет понять, что вы делаете, когда это происходит.

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

2
ответ дан 1 December 2019 в 07:51
поделиться

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

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

Более важным, на мой взгляд, является хорошее понимание операционных систем, архитектур памяти и алгоритмов. Если вы понимаете, как работает ваш алгоритм, почему лучше выбрать один алгоритм или структуру данных, а не другой (например, HashSet vs. List), и как ваш код отображается на машине, то не имеет значения, какой язык вы используете.

1
ответ дан 1 December 2019 в 07:51
поделиться

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

Моя подруга - один семестр от окончательной работы MIT (где они в основном используют Java, схему и Python) с образованием компьютерной науки, и она в настоящее время работает в компании, чья кодовая база находится в C ++. В течение первых нескольких дней у нее было трудно понять все указатели / ссылки / и т. Д.

С другой стороны, я нашел переход от C ++ в Java очень легко, потому что я никогда не путал в пропускной ссылке по сравнению с Pass-Littions-by-Value VS Pass-Reference.

Аналогичным образом, в C / C ++ гораздо более очевидно, что примитивы - это просто компилятор, обрабатывая те же наборы битов по-разному, в отличие от языка, такого же, как Python или Ruby, где все является объектом со своими отдельными свойствами.

0
ответ дан 1 December 2019 в 07:51
поделиться

Это мой опыт того, как я узнал и научил себя программированию, в частности, понимая C, это возвращается к началу 1990 года, так что может быть немного антиквариатом, но страсть и График важен:

  • Научитесь понимать принципы низкого уровня компьютера, например, программирование EGA / VGA, вот ссылка к архиву Simtel на Руководстве программиста C-программиста к ПК.
  • Понимание работы ТСР
  • Скачать весь архив Фрагменты Боба Stout , которая является большой коллекцией C-кода C, который делает одно только - изучить их и понять, не только что коллекция фрагментов стремится быть портативным.
  • Обзор на международном конкурсе CBFUSCIED C кодона ( IOCCC ) онлайн, и посмотрите, как код C может быть оскорблен и понять внутривенные внутри страны. Худший злоупотребление кодом - победитель! Скачайте архивы и изучите их.
  • Мне нравится, я любил печально известное понцо-учебное пособие, которое помогло мне чрезвычайно, к сожалению, архив очень трудно найти. Если кто-то знает, откуда их получить, пожалуйста, оставьте комментарий, и я изменим этот ответ, чтобы включить ссылку. Есть еще один, который я могу вспомнить - урок Coronado [Generic?] C, опять же, моя память на этом тумано ...
  • Посмотрите на журнал Dr. Dobb и C Journal journal - здесь Я не знаю, если вы все еще можете получить их в печати, но они были классическими, могут вспомнить ощущение проведения печатной копии в моей руке и разрывая домой, чтобы ввести код, чтобы увидеть, что произойдет!
  • Возьмите древнюю копию Turbo C V2 , которые я считаю, вы можете получить от Borland.com и просто играть с 16-битным программированием C, чтобы почувствовать и беспорядок с указателями ... Конечно, это древнее И старые, но играя с указателями на это в порядке.
  • Понимать и изучать указатели, ссылку здесь на наследие SIMTEL.Net - важная ссылка на достижение C гуру для желания лучшего слова, также найдете Густой загрузки, относящиеся к языку программирования C - я помню, как на самом деле заказывая архив CD Simtel и ищет C-материала ...
1
ответ дан 1 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: