Два лучших языка программирования в настоящее время  —  это C++ (детище Бьерна Страуструпа) и Java (появившийся под влиянием C++ и разработанный Джеймсом Гослингом). У обоих этих чрезвычайно популярных языков есть преимущества и недостатки.

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

C++

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

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

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

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

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

Достоинства 

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

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

А на C++ программист получает доступ к индексам массива объектов (каждый с собственными переменными) и устанавливает изменяющуюся переменную в качестве локального указателя. Допущение перегрузки операторов позволяет здесь сравнивать различные объекты, как если бы они были примитивными типами.

Недостатки

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

Другие недостатки в иерархии классов связаны с возможностью наследования класса от более чем одного класса. Бывает непонятно, какие родительские поля или функции вызываются.

А еще процесс компиляции делает язык менее платформонезависимым, чем другие.

Java

Достоинства

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

Использование классов тестирования  —  одно из лучших достоинств Java (или любых программных пакетов, позволяющих писать код Java).

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

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

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

Недостатки

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

  • реализован сборщик мусора;
  • запрещено множественное наследование;
  • отсутствуют указатели (для всего, что не считается объектом);
  • отсутствует передача по ссылке (кроме объектов, массивов, списков массивов и других структур данных).

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

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

Какой же язык лучше: C++ и Java?

Это зависит от того, чего намерен достичь программист.

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

Например, при проектировании программного обеспечения для военной техники, оборудования для Роскосмоса/НАСА или полиции.

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

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

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Joshua Reingold: C++ vs Java: A Comparative Analysis

Предыдущая статьяВозможности автозаполнения для веб-разработчиков
Следующая статьяPostgreSQL вместо Kafka: способ реализации системы очередей