Подтвердить что ты не робот

C для Java-программиста?

Возможный дубликат:
Должен ли я изучать C перед изучением С++?

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

Два вопроса:

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

  • Каковы наилучшие ресурсы (книги, учебные пособия, практические программы, код ссылки) для Java-разработчика, такого как я.

Спасибо

4b9b3361

Ответ 1

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

Я бы порекомендовал познакомиться с toolchain GCC на вашем Linux-боксе, через учебные пособия в Интернете. Затем прочитайте Язык программирования C и копию Разработка приложений для Linux не болит. Кроме того, на Linux glib позволит вам не изобретать колесо... но, по крайней мере, попытаться создать свой собственный связанный список, hashmap, графика и другой API для изучения. Важным является арифметика указателей, массивы и обучение тому, что такие элементы, как структуры, просто присваиваются именам в двоичном фрагменте. Проведите время с malloc и free и memcheck. С C ваши инструменты и инструментальная цепочка очень важны, и IDE не обязательно является вашим другом при обучении.

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

Лучшее, что вы можете сделать, это применить то, что вы узнаете в реальном проекте. Но будьте готовы к bash вашей голове против стены в Valgrind и GDB. Я программировал C годами, и я до сих пор не мошенник C.

Я согласен с тем, что C - отличный язык, он показывает плохого программиста. Но помните:

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

Мораль которого также изучается на других языках, а не только на C-полученных! Рассмотрим некоторый диалект Lisp, Erlang (что сейчас классно), Haskell и т.д. Они расширят ваши горизонты из ячейки 2x2 Java. Рассмотрим также SICP.

Ответ 2

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

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

  • чувствовать себя неуверенно, поскольку она должна решить многие вещи, такие как организация и структура программы.
  • почувствуйте удивление указателями и управление памятью: выделение и освобождение, которые нужно тщательно продумывать - открытие мира утечек памяти.
  • чувствуют себя обескураженными, так как ошибки не будут казаться черными на белом фоне в консоли, продиктованной JVM, на 200 строк трассировки стека, но могут произойти на более глубоком/системном уровне, возможно, попадаются благодаря IDE, перед которой Java-программист рассмотрит некоторый код сборки в первый раз в своей жизни.
  • чувствую недоумение относительно того, какой алгоритм и как его реализовать, тот, который был интегрирован в Java, о котором ей никогда не приходилось беспокоиться...

Итак, теперь моя задача - помочь вам чувствовать себя уверенно, уверенно и мотивировано, прежде чем изучать C/С++!

Мой совет - начать с C, потому что

  • C сам по себе владеет всеми теми понятиями, с которыми вам никогда не приходилось сталкиваться с Java
  • как программист Java, у вас уже есть подход к классам, и, начиная с С++, у вас может возникнуть соблазн придерживаться принципов Java OO. Принципы
  • C ограничены несколькими. C выглядит как самая последняя человеческая вещь, прежде чем войти в темный мир ассемблера.

То, что я хотел бы подчеркнуть во время исследования C, - это, например,

  • Указатели Java использует указатели, конечно, но скрывает свой доступ, фактически передавая классы методам в качестве указателей. В C вам нужно будет узнать разницу между value и reference. Кроме того, более тонкая разница между char x[3] и char *x = "ab". И как удобные указатели должны пройти через массив и т.д., Вы знаете *++x или *x++. Много сказано о указателях, мой совет будет

    • всегда держите управление, т.е. не ставьте слишком много указаний, когда это не необходимо
    • не typedef указатели, например typedef int *pointerToInt; сначала кажется легче (pointerToInt pi вместо int *pi) после нескольких уровней, я предпочитаю считать звезды, чем "pointerTo" [некоторые большие cies делают это]. Кроме, может быть, указатели на функции, нечитаемые в любом случае.
  • Память. Когда вам нужна память, вы ее выделяете, а когда она вам больше не нужна, вы ее освобождаете. Легко. Дело в том, чтобы выделить нужную сумму, а не освобождать ее дважды... Придется привыкнуть к этому. И привыкнуть к куче, стек... И Когда ваша программа запустится и адрес NULL (0), у вас может быть видимое исключение. Возможно, нет.

  • Структура данных. Итак, вы хотите использовать удобную HashMap? Конечно, после того, как вы его разработали. Или есть некоторые библиотеки, которые вы можете связать, которые делают такие вещи, просто выберите правильный. Справедливости ради следует отметить, что при программировании на C вы [должны] думать иначе, и может найти более подходящий алгоритм, чем карта для данной проблемы.

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

Ответ 3

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

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

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

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

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

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

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

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

Изучение любого языка - это хорошо, но что лучше изучает что-то другое.

Изучите SML или Схему или Haskell. Или Ruby, Python или Smalltalk. Как насчет Эрланга или Оккама? Или Пролог.

Изучите что-то, что не является Java-братом или предком, что-то, что создано с нуля, чтобы не иметь ничего общего с Java. Изучите функциональный язык, такой как SML, или динамически типизированный, например Python, или тот, который радикально меняет ваш подход к concurrency, например, Erlang.

Ответ 4

  • Это зависит от того, что вы хотите узнать. Я думаю, что лучше всего сидеть сложа руки и подумать, почему вы действительно хотите это сделать вообще. Если Java делает то, что вы хотите, и вы просто делаете это из-за какого-то неулокального чувства долга, я думаю, что есть, вероятно, лучшие способы потратить ваше время. Репутация С++ как "кошмарного бегемота" распространена в основном небезопасными Java-программистами, которые пытаются оправдать то, что в их сердцах они знают, что это был второй вариант выбора 1.
  • Есть несколько книг, специально написанных для Java-программистов, изучающих C и/или С++. Хотя это не специально для Java-программистов, если вы решите С++, а не C, я бы рассмотрел Acclerated С++.

1 Я, по крайней мере, шучу, но есть почти удивительное количество программистов на Java, у которых, похоже, есть чип на плече. Если вы скажете кому-то, кто использует Python или Ruby (всего за пару примеров), что он медленный, типичная реакция - это немного озадаченный и говорящий что-то вроде: "Если вы так говорите - это кажется мне достаточно быстрым". Предлагая то же самое о Java, практически гарантированно предъявлять претензии, что вы явно невежественны и не выражаете ничего, кроме слепой ненависти.

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

Перемещение непосредственно с Java на C похоже на то, чтобы взять кого-то, чья идея спортивной машины - это когда он управляет автомобилем Lincoln Town, вместо того, чтобы быть шофером в лимузине, и когда он решает, что гонки круты, вы сбрасываете его прямо на сиденье из спринтерского автомобиля Outlaw. Дайте ему шанс (не только намного безопаснее, но фактически быстрее) уличный юридический спортивный автомобиль сначала...

Ответ 5

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

Для (2) я бы очень рекомендовал K & R. Он предполагает некоторое знакомство с программированием, краток, до сути, но также достаточно глубок, чтобы объяснить концепции. Однако он не включает упражнения, которые вам придется найти в другом месте. Я изучил C на работе, я боюсь (и все еще плачу за это!), Поэтому я не могу дать вам образованную помощь.

Ответ 6

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

Небольшое предисловие до того, как я уточню: я работал в основном с С++ и никогда не работал с C-кодом любого значительного размера. Теперь я работаю с С# по большей части, но только с использованием С++ в редких случаях.

Я думаю, что С++ - лучший вариант, потому что:

  • Это частичный супер-набор программ C: C, как правило, не компилируется как программы на С++, но совпадение между этими двумя языками достаточно существенное, чтобы вам не было сложно повторить -target ваши навыки работы с кодом C, если вам нужно.
  • С++ представит вам больше понятий:. Вы получите удовольствие от управления памятью и бит-скручивания, которые вы можете сделать на C. Но вы также сможете увидеть дженерики, никогда не видели их раньше, как алгоритмы могут быть написаны независимо от контейнеров, как сделать полиморфизм времени компиляции, как многократное наследование может быть действительно полезно иногда и т.д.
  • Вы научитесь ценить дизайн языка Java намного больше: С++ - это сложные языки со многими ошибками и крайними случаями (см. FAQ и FQA для некоторых примеров). Почувствовав их для себя, вы сможете лучше понять многие дизайнерские решения, принятые как для Java, так и для С#.

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

Ответ 7

С++, вероятно, будет более знаком вам, чем C, и, вероятно, будет легче получить производительность с летучей мыши. Однако C - намного меньший язык и должен быть достаточно простым, чтобы учиться (хотя будьте осторожны, обучая C, вы рискуете постоянным повреждением головного мозга). Моя личная ссылка - "C: Справочное руководство" Харбисона и Стил (в настоящее время 5-е издание). Для С++ я просто использую книгу O'Reilly nutshell.

Как программист на С++ с опытом работы на С++ и в настоящее время осуществляющий переход на Java, я могу рассказать вам о C, которые, вероятно, скоро будут вас трогать:

  • C имеет очень мало способов абстракций; указатели и байтовые потоки в значительной степени. Нет стандартных типов контейнеров (списки, карты и т.д.). Вы хотите что-нибудь более сложное, чем массив фиксированной длины, вам придется сворачивать свой собственный (или использовать библиотеку, разработанную кем-то еще).
  • Нет никакой вещи, как сбор мусора в C. Каждый байт, который вы распределяете динамически (через malloc() или calloc()), вы находитесь на крючке для освобождения (через free()).
  • Массивы в C не ведут себя как массивы на Java; есть некоторые фанковые правила в отношении типов массивов, которые при первом румянце не имеют смысла (и не будут, пока не наступит достаточное повреждение мозга). Нет проверки границ в массивах, а некоторые стандартные функции библиотеки (особенно gets() и scanf()) делают переполнение буфера, что приводит к реальному риску.
  • Синтаксис объявления C может сильно исказиться. В то время как вы, вероятно, не увидите ничего такого уродливого, возможны объявления типа int *(*(*(*f)())[10])(); (f является указателем на функцию, возвращающую указатель на 10-элементный массив указателей на функции, возвращающие указатель на int`.
  • C пределы реализации могут варьироваться от платформы к платформе; например, в стандарте языка задаются минимальные диапазоны для таких типов, как short, int и long, но они могут быть более широкими, чем минимальные требования. Если вы ожидаете, что int всегда будет того же размера, независимо от платформы, у вас появятся сюрпризы.
  • Обработка текста на C - это боль в заднице. Шутки в сторону. C не имеет типа строки как таковой.