fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Solved Какой хороший бесплатный способ выучить язык C?

Решено Какой есть хороший бесплатный способ выучить C?

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

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

shepherdAZ

LCTHW – это, безусловно, отличный ресурс (работа в процессе). Также рассмотрите “C Boot Camp” Пола Гриббла на .

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

Я также очень рекомендую “Expert C Programming” Питера ван дер Линдена. Это выдающаяся книга, которая стоит того, чтобы потратить время на ее прочтение, и которую обычно можно недорого купить в большом книжном интернет-магазине. Не забудьте проверить, что в книге есть ошибки, по адресу .

deathbyfreezeray

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

nakal

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

  • Время: много времени. Чтобы изучить концепции программирования, нужны годы интенсивной работы. Сам язык C не требует столько времени.
  • Мотивация: вам нужно найти проблемы, которые вы можете решить с помощью программирования, иначе вы не будете продуктивны и, что гораздо важнее, не будете чувствовать радости от того, что чего-то достигли.
  • Восполняйте пробелы, копируя других: не бойтесь смотреть на код других людей. Вы можете научиться понимать многие новые вещи. Если что-то хорошо, реализуйте это сами, глядя на чужой код. Это важно только пока вы учитесь, позже у вас будет полный репертуар решений проблем, потому что вы уже сталкивались с этой или похожей проблемой. Это нужно только для поддержания мотивации, потому что заполнение пробелов иногда завершает ваш проект и делает его полезным.

редиска

Не то чтобы я был экспертом, но я выучил C++, написав большую программу, которая делала все, но практическим способом. Отчеты об ошибках в clang(1) – это здорово.

drhowarddrfine

Хорошие замечания. Особенно насчет обучения путем написания кода для проекта, который вам интересен. Я был программистом на языке ассемблера, которого нехотя заставили изучать C по “белой книге” много лет назад. Сегодня Google – ваш друг, а также страницы man, StackOverflow.com и еще несколько сайтов, которые могут что-то объяснить.

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

deathbyfreezeray

Спасибо за предложения. Я проделал некоторую работу по изучению Python, но потом обнаружил, что C имеет для меня гораздо больше смысла. Если посчитать, я знаю TI-BASIC, язык сценариев для калькулятора TI-89 (Texas Instruments). Со временем я хочу выучить и Python, но я решил сначала выучить C, так как он для меня проще.

  • Реализация гибернации/спящего режима на уровне ОС (если это еще не в процессе).
  • Исправление ошибок и улучшения для порта FreeBSD KDE.
  • Клоны различных программ для Windows, таких как PC profiler (инструмент для Dungeons and Dragons).

deathbyfreezeray

Вообще-то, после некоторых размышлений я понял, что во FreeBSD нет эмуляторов PlayStation 1. Я мог бы поработать над портированием одного из них.

Edit: Черт, оказывается, у вас даже это есть. Сообщество FreeBSD слишком хорошо выполнило свою работу.

Maelstorm

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

  • Язык программирования C 2-е издание, Брайан В. Керниган и Деннис М. Ричи, ISBN 0-13-110362-8
  • C: Как программировать, Х. М. Дейтел и П. Дж. Дейтел, ISBN 0-13-118043-6
  • C по дискавери, Л. С. Фостер, ISBN 0-9624320-2-5
  • Практическое программирование на C, Стив Уоллин, ISBN 1-56592-306-5

deathbyfreezeray

Мне нравятся книги O’Reilly, у меня есть одна из них по Python, которую я еще не до конца прочитал, потому что решил сначала изучить C. Спасибо за все предложения.

vyalmicro

Выучить C и сделать на нем что-то полезное – это две разные вещи, часто несовпадающие. Изучение языка не означает, что вы автоматически станете доктором наук.

  1. Базовый язык – C Primer Plus (6-е издание) Стивена Прата.
  2. Datastructures and Algorithms – Mastering Algorithms with C by Kyle Loudon
  3. Advanced Programming in C – Object-Oriented Programming With ANSI-C (PDF)
  1. Основы ассемблера и организация компьютера – Искусство языка ассемблера, 2-е издание, автор Рэндалл Хайд
  2. NASM Assembly – Assembly Language Step-by-Step: Программирование в Linux – Джефф Дантеманн
  3. Разработка операционных систем – Операционные системы: Принципы и практика” Томас Андерсон
  4. Разработка и внедрение операционной системы FreeBSD, 2-е издание, автор Маршалл Кирк МакКусик.

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

Лично я больше не использую C, я использую подмножество C в C++. В основном потому, что библиотеки, которые мне нужны, в основном на C++, и перенос полезных функций из него был головной болью. А потом std::string проще поддерживать (по сравнению с char*).

deathbyfreezeray

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

Я лично сделал все наоборот и заплатил за это свою цену. Итак, начнем:

Сначала выучите хотя бы два других языка!

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

Возможно, это поможет взглянуть на это с определенной точки зрения: существуют чрезвычайно удобные языки, такие как Python. Они действительно высокоуровневые и, как правило, нетипизированные/нетипизированные/динамически типизированные. На крайнем противоположном конце находятся ассемблеры. Они крайне неэффективны (я вернусь к этому через секунду) и чрезвычайно мощны. И есть золотая середина с такими языками, как Modula-2 или OCaml, которые предлагают хороший (или даже отличный) баланс между сырой мощностью, эффективностью, удобством и безопасностью.

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

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

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

Вот тут-то мы и возвращаемся к С. В С ответ прост: Эффективность на стороне рома и полностью отсутствует на стороне разработки.

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

Теперь, очевидно, что ни один университет не будет делать операции на сердце пациентов на курсе “Медицина 101”, и ни один ученик-электронщик не будет разумно начинать с проектирования ПЛИС. Точно так же к языку C или ассемблеру следует подходить только с большим опытом.

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

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

Наконец, “золотое правило” для руководства: при подходе к задаче разработки всегда используйте язык, который предлагает достаточно сырой мощности, но при этом максимально удобен (и достаточно безопасен!).

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

BSDBernd

Если бы у меня было время (возможно, я найду время), я бы точно знал, каким проектом по программированию я бы занялся: Я бы попытался перенести следующий драйвер: . Это драйвер Broadcom WiFi для моего Macbook.

Самое интересное в нем то, что код можно скачать (он лежит в моей домашней директории), он там есть и я, в принципе, могу начать. Вы можете посмотреть исходный текст, и, похоже, вы всего в нескольких изменениях от того, чтобы иметь WiFi на вашем Mac, используя FreeBSD. Это было бы настоящей мотивацией для реальной работы.

deathbyfreezeray

deathbyfreezeray

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

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

drhowarddrfine

drhowarddrfine

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

Конечно, у нас есть PHP и

node.js и Python для некоторых наших вещей, но это потому, что кто-то предоставил интерфейс для них, и мы должны были использовать его, но дайте мне C в любой день недели, если я не могу использовать ассемблер.Я скучаю по тем временам. У меня был начальник, выпускник MIT, и он заставил нас всех купить “белую книгу” (но первое издание) и начать кодировать на C вместо моего любимого ассемблера 68K, и я никогда ему этого не прощу.

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

MOV B" - это не "MOV.BЧто касается этой книги: “.

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

wblock@

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

deathbyfreezeray

deathbyfreezeray

mingw ограничен, и я бы не хотел начинать работу с готовой коллекцией функций Microsoft).drhowarddrfine Со временем я захочу изучить и ассемблер, так как должен согласиться, что один из моих любимых аспектов C – это уровень контроля. Хотя я рассмотрю советы, которые дал vyalmicro, в конечном итоге я начну другую тему, когда буду готов к ассемблеру (что, по моим оценкам, произойдет по крайней мере через год или два).

rmoe Я много думал над этим утверждением, и вы, конечно, не первый, кто говорит мне, что сначала нужно изучать другие языки. Я изучал и потратил много времени на Python, и я изучил несколько других языков, но я обнаружил, что мне категорически не нравятся языки более высокого уровня, особенно python. Хотя я согласен с тем, что язык C может быть неэффективным из-за времени отладки и возможности (или, точнее, гарантии) ошибок, тем не менее, я обнаружил, что язык C имеет гораздо больше смысла для меня и оказался гораздо проще в изучении, чем языки более высокого уровня. Это чисто личные предпочтения. Я согласен, что в конечном счете мне понадобятся и языки более высокого уровня.

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

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

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

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

В чем вообще разница между C и другими императивными типизированными языками? Если смотреть с определенной точки зрения, то это более или менее синтаксис и пара специфических особенностей. В конечном итоге речь всегда идет о реализации алгоритмов и структур данных – и вуаля, вот вам “более абстрактные представления вещей”; даже в Python (но, может быть, вы имели в виду “загадочный” или “крутой”?).

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

Позвольте мне пролить свет на C в некоторых важных аспектах. Один из моментов, в котором языки низкого уровня, в частности C, сильно отличаются от языков более высокого уровня, это то, что многие называют “housekeeping” или, более абстрактно, расстояние между алгоритмом и его реализацией (на языке низкого уровня). В языке Си затраты на ведение домашнего хозяйства очень высоки – как и мощность. Очевидно, возникает вопрос: “Стоит ли выгода/мощность (для данного проекта/ситуации) затрат/хаускипинга?”.

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

Помните, что разработчики ядра FreeBSD не только (и даже не столько) являются разработчиками ядра FreeBSD.

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *