Программистское: C++ vs. Java
Jul. 13th, 2006 10:16 amПочти пять лет я программировал на Java, а вот теперь на новой работе буду программировать на С++, в связи с чем его повторяю (по очень, кстати, хорошим книжкам Scott Meyers "Effective C++" и "More Effective C++"). Складывается у меня впечатление - после долгого перерыва - что, когда пишешь на С++, нужно держать в голове кучу, КУЧУ всяких разных вещей, которые в принципе ничего не прибавляют к программе, а только делают её более запутанной, а работу гораздо более сложной. Всё время нужно думать о том, кто именно освобождает память; писать специальные wrappers, которые эту память будут автоматически освобождать; переопределять их операторы; помнить о том, какие именно операторы переопределены; следить, чтобы деструкторы на бросали exceptions; думать, как лучше exceptions ловить - by value, by reference, by address - и кто будет освобождать после них память; всё время следить за тем, деструктор какого объекта вызывется в каком блоке; и так далее, и так далее...
Интересно было бы услышать ваше мнение - а есть ли хоть что-то, в чём С++ удобнее Java ? Я имею в виду не быстродействие, а именно силу и удобство языка. Я, например, ни одного такого свойства назвать не могу.
Интересно было бы услышать ваше мнение - а есть ли хоть что-то, в чём С++ удобнее Java ? Я имею в виду не быстродействие, а именно силу и удобство языка. Я, например, ни одного такого свойства назвать не могу.
no subject
Date: 2006-07-13 02:08 am (UTC)no subject
Date: 2006-07-13 04:13 am (UTC)все что вы описали
Date: 2006-07-13 04:27 am (UTC)о фичах конкретно языка - мне нравиться четко определенное время жизни объекта в скопе - вышел вон, позвали деструктор.
но вобщем и целом - какя разница на чем писать профессионалу? надо будет и на бейсике сбацаем. TCP мессадж останется TCP мессджем no matter what.
no subject
Date: 2006-07-13 04:52 am (UTC)no subject
Date: 2006-07-13 06:38 am (UTC)no subject
Date: 2006-07-13 06:47 am (UTC)В С++ есть детерминированное уничтожение - то есть в С# оно тоже есть, но то что будет писаться в С++ как (не знаю про Яву, думаю там тоже нет)
{
Class a;
...
// тут уничтожаем
}
в С# будет писаться как
using (Class a = new Class())
{
...
//тут уничтожаем
}
Конечно,Java намного красивее и удобнее С++ в целом, но вообще они нужны для абсолютно разных задач, и С++ разрабатывался в первую очередь с уклоном в сторону производительности а не usability.
no subject
Date: 2006-07-13 08:53 am (UTC)По наличию готовых библиотек плюсы на первом месте.
Легче, чем на Java, работать с железом и в режиме реального времени.
Хотя на мой взгляд Cyclone и OCaml вместе покрывают все приложения C++ и каждую конкретную задачу решают значительно лучше.
no subject
Date: 2006-07-13 09:57 am (UTC)Я слабо знаю Яву (как-то пришлось написать пару "сноповязалок", правда с разбором XML и обращением к БД), так вот меня сильно раздражало то, что невозможно определить когда об"ект действительно умрет (ну разве что постоянно вручную звать GC, и то не всегда помогает), из-за этого привычные С++ шаблоны поведения перестают работать ...
no subject
Date: 2006-07-13 09:58 am (UTC)no subject
Date: 2006-07-13 10:02 am (UTC)no subject
Date: 2006-07-13 10:03 am (UTC)no subject
Date: 2006-07-13 10:06 am (UTC)На самом деле, когда привыкаешь к Java, то уже не думаешь о том, когда объект умрёт - просто не обращаешь внимания. Вместо этого думаешь о том, когда правильно вызвать какую-нибудь деструктивную функцию. То есть, это примерно то же самое, но мне гораздо больше нравится, что это поддаётся чёткому управлению и не происходит автоматически.
Впрочем, достаточно поработать на С++ немного и всё станет наоборот :)
no subject
Date: 2006-07-13 10:07 am (UTC)no subject
Date: 2006-07-13 10:22 am (UTC)1. В JDK 1.5 есть темплейты.
2. В Java нет нужды в уничтожении - есть Garbage collector.
no subject
Date: 2006-07-13 10:31 am (UTC)Опять же, templates разрабатывались в первую очередь с точки зрения производительности, и являются просто продвинутым #define
no subject
Date: 2006-07-13 10:34 am (UTC)Я не думаю об этом специально, но есть масса удобных техник, на этом построенных ... В результате пишется сильно меньше кода "отката состояния", например ...
теоритические размышления
Date: 2006-07-13 01:00 pm (UTC)пишу я это, потому что мне страно что никто ещё не упомянул, то о чем говорю я, а имено то, что в Java, как мне кажется, всё равно надо думать о памяти.
В то время насколько я понимаю языки программирования, "оканчивающие" функции Java семантически более обоснованы, чем традиция вызывать "заканчивающий" код в деструкторах, которые на мой взгляд были разработаны для отчистки памяти (что в принципе объясняет их почти-отсутствие в Java). Тоесть по-моему, деструкторы не для "заканчивающего" кода. Это либо традиция, либо стиль или bad habit%) моего опыта не хватает для вынесения вердикта
no subject
Date: 2006-07-13 02:47 pm (UTC)Ьольшенство библиотек, с которыми я сталкивался, изначально были плюсовые, а потом обернутые врапперами для других языков - в том числе и для Java.
Кстати, стыковка с другими языками в плюсах легче.
Off
Date: 2006-07-13 04:57 pm (UTC)Слушай, приезжайте уже в гости, а?
Re: Off
Date: 2006-07-15 04:17 am (UTC)Выходи на связь!
no subject
Date: 2006-07-21 06:39 pm (UTC)На С++ можно писать полезные программы. На Жабе нет. Любая с виду полезная программа на Жабе или не работает вообще или работает слишком медленно.
Все остальное упомянутое про C++ - синтаксический клей необязательный к использованию. Большинство людей использует C++ как "better C", без шелухи.