Как разработчик Java, C или С++?

Я профессионально пишу Java на протяжении последних 5 лет. Недавно мне пришлось немного копаться в JNI, чтобы назвать некоторые специальные функции Windows.

Этот опыт показал мою бедную команду языка C (или С++). Мое единственное введение в C было краткой книгой "манекенов", которую я прочитал в средней школе 11 лет назад.

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

Было бы уместным, чтобы я изучил C или С++? Какие книги были бы лучше?

Есть ли у людей также рекомендации по программированию Windows? Я могу читать MSDN достаточно хорошо, чтобы понять некоторые вызовы API, но у меня есть чувство, что я пропускаю вещи в отношении "большой картины".

Спасибо

Ответ 1

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

Проблема в том, что Java и С++ на самом деле не имеют много общего. Java-программисты часто считают, что Java был вдохновлен С++, но это только верно, если на С++ вы имеете в виду самые ранние версии С++, которые более целесообразно назвать "C с классами". С тех пор С++ полностью преобразился на свой собственный язык со своим собственным способом делать вещи. Вероятно, с тех пор он значительно изменился, чем Java. Тогда программист на Java мог бы понять смысл кода Java. Не так для С++. Поэтому я бы сказал, что C на самом деле ближе к Java, чем "современный С++". C - это то, что вы получаете, если возьмете Java и уберите GC, а также концепцию классов и несколько других абстракций. Чтобы прибыть на С++, вы должны добавить аналогичное количество функций в нашу гипотетическую усеченную Java.

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

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

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

Об обучении Win32, вы правы, все детали, которые вам нужны, находятся на MSDN. Если вам нужна большая картина, Petzold - это книга по этому вопросу.

Ответ 2

Я думаю, это зависит от ваших целей.

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

Если вы хотите дополнить свое знание уровня OO, подобного Java, над C, тогда С++.

Ускоренный С++ (санированная ссылка Amazon) - это потрясающая книга для изучения С++ с точки зрения С++, а не только C с другими бит, прикрепленный,

И K'n'R C (санированная ссылка Amazon) по-прежнему подходит для обучения C IMHO!

BTW Для С++ следуйте мудрости Скотта Мейерса в Эффективных книгах на C++! И его эффективная книга STL также.

НТН

веселит,

Rob

Ответ 3

Усвоить достаточно С++, чтобы использовать его как "лучше C". Вам не нужно пытаться сопоставить все это с пониманием Java. Все, что вы хотите, - это использовать объекты С++ как абстрактные типы данных, новые и удалять и т.д. Если STL подходит для езды, тем лучше.

Реальный вопрос: почему вы думаете, что JNI является такой абсолютной необходимостью? Вызовы Windows разрушат любую мысль о переносе вашего приложения на портативный компьютер. Я сижу рядом с парнем, которому приходится копаться в Java-приложении, которое использует JNI. Он беспорядочно сбивает сервер с SEG FAULT. Его гипотеза заключается в том, что куча заполняется, вызов JNI выполняется в рутину, которая вызывает malloc для выделения пространства в куче. Он недоступен, процедура не проверяет возвращаемый указатель на нуль, освобождает его, а вниз - сервер. Он по-прежнему пытается воспроизвести ошибку локально, потому что он требует точного времени для вызова метода JJNI непосредственно перед запуском GC.

100% уверены, что они требуются? Просто спрашиваю....

Ответ 4

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

Если вы серьезно относитесь к изучению обоих языков, я бы рекомендовал "Язык программирования С++" Бьярне Страуступа и "Язык программирования C" Денниса Ритчи.

Ответ 5

Я думаю, что С++ будет намного легче освоиться, чем C.

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

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

Как только вы овладеете этим, узнайте о механизмах наследования в С++ и о том, как он отличается от Java (например, множественное наследование).

Ответ 6

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

Я бы предложил "Язык программирования C" Кернигана и Ричи в качестве окончательного руководства для обучения C. http://www.amazon.com/Программирование-Language-Dennis-M-Richie/дп/0876925964

Если вы находитесь в системе * nix, в файлах для различных функций имеется достаточная документация. Например,

bash $man malloc

Ответ 7

Если вам нужен отличный ресурс для C, "Диск для программирования на языке C" Денниса Ритчи - это книга, которую нужно получить.

Ответ 8

Если вы намерены продолжить писать код JNI, я бы определенно рекомендовал С++.

В частности, интерфейс JNI требует, чтобы вы приобретали (и впоследствии выпускали) ссылки на объекты Java. Используя автоматические переменные С++, вы можете получить эти ссылки, используя методы "RAII" (Resource Allocation is Initialisation), которые значительно упрощают управление памятью.

Ответ 9

100% уверены, что они требуются? Просто спрашивать....

К сожалению, да.

Спасибо всем за ваши ответы.

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

Ответ 10

В частности, интерфейс JNI требует, чтобы вы приобрели (и впоследствии выпускать) ссылки на Java-объекты. Использование автоматических переменных С++ вы можете получить эти ссылки, используя "RAII" (выделение ресурсов Инициализация), которая управление памятью намного проще.

Спасибо, это полезно. Одна из областей, которая вызвала растущую обеспокоенность в моем животе, заключалась в том, чтобы вручную управлять памятью, связанной с объектами JNI

Ответ 11

Если ваша "главная цель" здесь заключается в программировании окон, я бы рекомендовал С# над C или С++. Однако я считаю, что каждый программист на Земле и на нижней орбите ДОЛЖЕН знать C. Не знаю, что С++ приемлемо, хотя вас могут не пригласить на несколько вечеринок:) Но C - это что-то вроде обряда между приложениями (high- уровень) программист и программист библиотеки (низкоуровневый).