C for Java Programmer? [duplicate]

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

7 ответов

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

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

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

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

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

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

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

29
ответ дан 28 November 2019 в 22:18
поделиться
  1. Это зависит от того, что вы хотите выучить. Я думаю, что, вероятно, лучше всего расслабиться и подумать, почему вы действительно хотите это сделать. Если Java делает то, что вы хотите, и вы делаете это просто из неуместного чувства долга, я думаю, что, вероятно, есть лучшие способы провести время. Репутация C ++ как «кошмарного бегемота» распространяется в основном небезопасными Java-программистами, пытающимися оправдать то, что в глубине души они считают второстепенным выбором 1 .
  2. Есть пара книг, специально написанных для Java-программистов, изучающих C и / или C ++. Хотя это не специально для программистов на Java, если вы решите использовать C ++, а не C, я бы рассмотрел Acclerated C ++ .

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

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

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

7
ответ дан 28 November 2019 в 22:18
поделиться

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

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

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

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

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

4
ответ дан 28 November 2019 в 22:18
поделиться

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

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

5
ответ дан 28 November 2019 в 22:18
поделиться

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

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

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

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

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

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

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

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

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

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

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

11
ответ дан 28 November 2019 в 22:18
поделиться

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

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

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

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

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

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

Что я бы подчеркнул при изучении C, так это, например,

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

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

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

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

25
ответ дан 28 November 2019 в 22:18
поделиться

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

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

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

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