Перейти к содержимому

Как перейти с java на c

  • автор:

Стоит ли изучать С и С++ после Java

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

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

Однако у Java есть и некоторые минусы, которые могут натолкнуть вас на мысль о переходе на другой язык программирования.

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

Зачем переходить на C/C++ после Java

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

Основное преимущество C++ заключается в том, что он не обременяет новичка концепциями объектов. Также C++ лучше поддерживает более поздние классы, которые используются в написании операционных систем и построении компиляторов. Написание ОС в Java осложняется тем, что JVM сама по себе является подобием ОС.

Если вам нужно написать код, который управлял бы железом устройства, изучение байт-кода JVM не рекомендуется: он плохо переводится на язык ассемблера. Код Java “живет” в JVM, которая отрывает программу от железа.

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

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

Однако код на C/C++ более гибкий, и как только вы его изучите, вы поймёте, что можете решить проблему множеством способов. В Java при этом обычно поощряется один способ решения задачи.

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

Резюмируя, вот причины, по которым вам стоит перейти с Java на C/C++:

  1. Вам нужно написать программу, которая тесно взаимодействовала бы с железом.
  2. Вы хотите изучить низкоуровневый язык программирования.
  3. Вы хотите следить за последними обновлениями в языках программирования.
  4. Вам хочется писать на “гибком” языке программирования, который предложил бы несколько решений проблемы.
  5. Вы хотите писать лаконичный код.

Зачем учить С

Обычно С предлагают учить перед С++, потому что кажется, что сперва нужно изучить менее развитый язык и понять концепции низкого уровня вроде malloc и free. И, конечно, эта точка зрения имеет право на жизнь.

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

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

То же касается и геймдева: если игра требует быстрых вычислений, С станет отличным инструментом.

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

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

Также способ управления памятью в C сильно отличается от C++, даже несмотря на то, что он построен на низкоуровневых абстракциях. Как ни странно, проще понять управление памятью через конструкции std::move() и std::unique_ptr в С++, чем malloc/free в C. Ещё один нюанс низкоуровневого С — сложность массивов.

Также в C++ есть выражения, которые были заимствованы из более современных языков и которых нет в C.

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

Плюсы в пользу C после Java

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

Минусы изучения C после Java

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

Зачем учить С++

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

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

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

Недостатком Java является относительно плохая настройка производительности. В Java нет особого контроля над распределением памяти, и часто возникает нехватка высокопроизводительных числовых пакетов.

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

Плюсы в пользу C++ после Java

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

Минусы изучения C++ после Java

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

Заключение

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

Приглашаем вас присоединиться к дискуссии. Какие аргументы в пользу С/С++ мы забыли упомянуть? Или, может быть, есть и другие языки, которые закрывают проблемы Java, но на которые перейти было бы удобнее, чем на С-языки? Напишите в комментариях! ?

Язык «С» сложней чем Java ?

Доброй ночи ! Коллеги так вышло что сам я пишу на Java но нам кидают очень различные проекты, и в понедельник должен прийти проект (связан с сетевой защитой) для долгосрочной поддержки и баг-фикса который написан на чистейшем «Си» (так нам сказали) типа вспоминайте «Си-шку», а я хоть и окончил ВУЗ но изучал с самого начала php потом Java (даже немного C# после Java), а вот с чистым «Си» как-то не приходилось встречатся и вот дкмаю занятся изучением этого «Си» или идти работу искать так как пока проектов на Java у нас нет !
На первый взгляд вроде простой язык без ООП, а там кто его знает .
Всем большая благодарность кто осмелится ответить хоть строчкой .

Отслеживать
4,720 3 3 золотых знака 29 29 серебряных знаков 46 46 бронзовых знаков
задан 17 янв 2014 в 17:16
Oleg_Samitch Oleg_Samitch
89 1 1 серебряный знак 9 9 бронзовых знаков

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

17 янв 2014 в 17:37

Си более низкоуровневый, значит проще выстрелить себе в ногу (особенно если начинал с высокоуровневых ЯП). С другой стороны это позволяет в некоторых случаях писать более оптимальный код (если ты джедай :). С ещё более другой стороны Java, если ещё неправильно готовить (а знающие люди утверждают что правильно её готовят редко), превращается в адового, сводящего с ума, монстра. А с совсем уж другой стороны жабакодеров гораздо больше чем сишников, можно предположить что спрос на адекватных сишников выше. В общем есть смысл попробовать, хотя-бы для расширения сознания, а вдруг получится.

24 мая 2014 в 12:15

6 ответов 6

Сортировка: Сброс на вариант по умолчанию

Ещё одна проблема — указатели, массивы и строки. Они очень похожи в C синтаксически, что часто приводит к недопониманию.

Отдельный пункт — ручное управление памятью и понимание того, что указатель в C (в отличие от ссылки в Java) может указывать на невыделенную, неинициализированную или освобождённую память.

Ещё одно серьёзное отличие: у ресурсов в отсутствие GC появляется владелец — сущность (код), ответственная за своевременное освобождение ресурса.

Отслеживать
ответ дан 17 янв 2014 в 19:22
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков

@VladD Наличие/отсутствие арифметики указателей. В Си это естественное следствие его низкого уровня. Других различий пока не вижу (кроме именно синтаксических — нет операций & и * ) указатель в C (в отличие от ссылки в Java) может указывать на невыделенную, неинициализированную или освобождённую память. А в отличие от WeakReference?

17 янв 2014 в 23:56

@alexlz: Ну, да, естественное отличие, конечно. Однако адресная арифметика всё же специфична для C, соотношения типа &a[i] = a + i довольно специфичны и не присутствуют, например, в ассемблере. Отличие от WeakReference состоит в том, что вы не можете, имея указатель, гарантировать его валидность «локально»: вам нужно знать всю логику программы, чтобы уметь доказать/опровергнуть этот факт. С WeakReference же ситуация другая: если из него получилась сильная ссылка, то она гарантировано валидна, вам не нужно анализировать program flow, чтобы это выяснить.

18 янв 2014 в 0:26

@VladD Разумеется слабые ссылки — они везде слабые ссылки (и созданы для взаимодействия программы с GC, которого в Си изначально не было предусмотрено). Адресная арифметика — красивое и машинно-эффективное обобщение индексации (которая появилась в конце 50х вроде). В ассемблере не присутствуют потому, что там все эти механизмы должны быть расписаны до инструкций. Кстати, &a[i] == a + i &i[a] == a + i И ещё никто не вспомнил про селекторы структур в K&R C (там вроде селекторы полей не привязывались к структуре, хотя могу и перепутать за давностью).

18 янв 2014 в 1:15

@alexlz: Угу, меня всегда удивляло, что i[a] компилируется. Как мне кажется, это нужно лишь для того, чтобы сказать «а вы знали такое?», и не имеет вообще никакого практического применения. Впрочем, в остальном C очень милый и изящный язык. А что такое селекторы структур? Какой синтаксис и что это даёт? (Я правда не в курсе.)

18 янв 2014 в 1:20

@VladD ну термин скорее из другого языка (хотя, может, и в Си применялся). Имена полей. struct a ; b = a.a1; Ежели не путаю, в K&R Си имена a1, a2 должны быть уникальны и могли применяться к любым структурам. Но дальше — не помню. Откуда ноги растут понятно — «фиктивные секции» ассемблеров для архитектур с базовыми регистрами, где имена задавали смещения относительно базы. Сейчас такой подход используется в haskell.

Легко ли с Java перейти на C++? В чем основные трудности?

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

Леонид ТиторенкоУченик (189) 6 лет назад

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

Кому Какая-Разница Мудрец (12770) Удачи вас. Главное помните, что пока кран не открыт, вода из него не потечет

Сначала надо ответить на вопрос «Зачем?». Эти языки сильно отличаются. Только базовый синтаксис похож. Библиотеки совершенно разные. Назначение языков разное.

Леонид ТиторенкоУченик (189) 6 лет назад

У меня на 2 курсе будет c++, а сейчас на первом джава, мы на ней учимся программировать и пониманию всех основ ООП и алгоритмов.

Голова Робота Просветленный (36308) Тогда зачем спрашивать, если тебе в любом случае придётся изучать С++, независимо от того буду я его хвалить или ругать? С++ сложнее чем Java, на нём сложнее программировать.

не льсти себе. ты в джаве полный ноль.
Леонид ТиторенкоУченик (189) 6 лет назад

А тебе по чем знать!? Ты даже кода моего не видел! Может быть ты и прав, но как можно судить не знаю ситуации !?

Каков наилучший способ перейти от Java/C# к C++?

В моем университете большинство моих занятий были в Java. Я также недавно изучил C# (и среду Visual Studio) на летней стажировке. Теперь я беру введение в класс компьютерной графики, и студент-выпускник, обучающий класс, предпочитает использовать C++ для доступа к привязкам OpenGL через GLUT.

Есть ли у кого-нибудь хорошие ресурсы о том, как сделать хороший переход от Java/C# к C++? Очевидно, указатели будут большой проблемой,но любые другие вещи, которые я должен искать? Любые учебники, руководства и т.д. было бы очень полезно!

Сведения об ответе
VERSUION

01:06, 25th August, 2020

Да, меня укусила та же ошибка. Университет, как правило, опирался на Java, а затем позволял вам выбирать язык, с которым вы хотели работать во время проектов.

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

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

Вот некоторые места, которые я нашел полезными во время обучения

Сведения об ответе
piter

14:21, 14th August, 2020

Если вы уже знаете Java/C#, я бы рекомендовал перейти непосредственно к C вместо C++. Согласно веб-сайту, GLUT имеет те же привязки для C, что и C++, поэтому вы должны быть все настроены. В любом случае, лучший способ узнать C-это купить и прочитать копию «The C Programming Language» и сесть с вашим компилятором C и запустить свой материал.

Сведения об ответе
PAGE

00:56, 2nd August, 2020

У меня была точно такая же проблема. Единственная книга, которую я смог найти, была «Pro Visual C++ 2005 for C# Developers» Дина C. Есть . Это хорошее чтение с отличными примерами, и я думаю, что угол, с которого приходит книга, вероятно, то, что вы ищете.

Сведения об ответе
SKY

19:45, 23rd August, 2020

Effective C++ by Scott Meyers-это отличная книга, которая поможет вам изучить C++. Дает вам обзор языка и вводит много ключевых понятий, которые вы будете использовать на протяжении всей разработки в основном любой программы C++.

Сведения об ответе
LIZA

01:04, 3rd August, 2020

Effective C++ by Scott Meyers-это отличная книга, которая поможет вам изучить C++. Дает вам обзор языка и вводит много ключевых понятий, которые вы будете использовать на протяжении всей разработки в основном любой программы C++.

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

Я не знаю, есть ли он еще в печати, но я нашел навигацию по C++ полезной, но мне также было очень удобно с указателями из Pascal. Конечно, я забываю, что 15 лет назад вы должны были узнать, что такое OOP, теперь это немного более предположительно. Так что, возможно, Мейер не выходит за рамки. Мысли?

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

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