C++ или Java?

Crazy

Developer
Автор оригинала: Alexandre
если я не прав, то в чем?
Дружище, представь, что кто-то на полном серьезе будет тебе рассказывать, что пиво -- это то же самое, что яблочный сок, только с другим запахом. Ты стал бы всерьез спорить с этим утверждением?

Ну и я не стану, извини.
 

Alexandre

PHPПенсионер
а я и не спорю,
я привел аналоги типа:

цветом похожи, только нет пены :)
 

neko

tеam neko
о до RMI уже дошли
хорошо
[с нетерпением ждет когда наконец начнут обсуждать язык и JVM по отдельности]

кстати
> Есть мнение, что учиться нужно не на примере гиперассемблера
> под названием "C", а на примере Smalltalk.
это смотря чему есть желание научиться и какой background присутствует
т.е. тут возможны разные советы...

-~{}~ 10.03.05 16:40:

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

а вот с изучением тут все не так просто
 

valyala

Новичок
Наткнулся сегодня на статью Дмитрия Котерова "Код и шаблон страницы, или понемногу о многом" http://dklab.ru/chicken/nablas/16.html. Энтузиасты Java, предлагаю обсудить интересный отрывок из этой статьи:
Код:
#!/usr/bin/perl -w
use CGI::WebOut;
print "<HTML><BODY>\n";
print "<h2>Последние новости:</h2>";
open(local *F, "news.txt");
for(my $i=1; !eof(F) && $i<=5; $i++) {
    print "<li>$i-я новость: ".<F>;
}
print "</BODY></HTML>\n";
Не надо быть президентом компании Sun, чтобы заметить: сервлеты имеют точно такой же недостаток, как и приведенная выше «CGI-программа». Это не умаляет имеющихся у сервлетов достоинств, однако и не «возвышает» их, как это почему-то принято делать в обстановке энтузиастов.
 

Crazy

Developer
Автор оригинала: valyala
предлагаю обсудить интересный отрывок из этой статьи:
Нет смысла обсуждать, что 3 года назад говорил о Java человек, весьма отдаленно знакомый с языком и его применением.
 

valyala

Новичок
Предлагаю продолжить увлекательный спор на тему: "чьи яйца круче - Страуструпа или Гослинга".

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

template<template<class,int>class X>template<template<class,int>class Y>inline A<X>::eek:perator const typename A<Y>::type*const A<Y>::*const&()const{return reinterpret_cast<const typename A<Y>::type*const A<Y>::*const&>(this->template f<X>());}
Надеюсь, что опровержение моего заблуждения насчет сложности C++ и простоты java появится достаточно быстро, т.к. я обожаю жаркие споры.
 

Crazy

Developer
valyala, ты правда не в курсе, что template'ы уже появились в Java? :)

А аннотации (метаданные) уже в C++ есть или как? :)
 

AnToXa

prodigy-одаренный ребенок
Crazy
насколько я знаю в яве шаблоны появились далеко не в том виде, что в C++, или ты можешь в яве сделать аналог boost::mpl?
там вроде как даже частичной специализации нету.
насколько я знаю в яве шаблоны чисто для того чтобы не кастить каждый раз при выдергивании элемента из контейнера, ну и проверка типов еще.
 

ONK

Пассивист PHPСluba
Автор оригинала: Crazy
valyala, ты правда не в курсе, что template'ы уже появились в Java? :)

А аннотации (метаданные) уже в C++ есть или как? :)
Да ладно, одно переопределение (определение) операторов для произвольных типов в С++ позволяет признать его более сложным, чем Java.

Да и ваще Java отстой... тушим пожар бензином :)
 

AnToXa

prodigy-одаренный ребенок
valyala
или мне показалось, или твой код не скомпилится :) там с угловыми скобочками беда, да и не мешало бы юзать typedef аха :)
 

Crazy

Developer
Автор оригинала: AnToXa
насколько я знаю в яве шаблоны появились далеко не в том виде, что в C++, или ты можешь в яве сделать аналог boost::mpl?
Что кроме лени мне помешает? Конкретную нереализуемую фичу, please.

-~{}~ 09.04.05 17:52:

Автор оригинала: ONK
Да ладно, одно переопределение (определение) операторов для произвольных типов в С++ позволяет признать его более сложным, чем Java.
Если под "более сложным" имелось в виду "пригодный для написания как можно менее понимаемых программ" -- то да. :)
 

AnToXa

prodigy-одаренный ребенок
Автор оригинала: Crazy
Что кроме лени мне помешает? Конкретную нереализуемую фичу, please.

-~{}~ 09.04.05 17:52:


Если под "более сложным" имелось в виду "пригодный для написания как можно менее понимаемых программ" -- то да. :)
я говорил, что не знаю как точно реализованы шаблоны в яве,и если бы ты потрудился прокомментировать мои слова насчет частичной специализации, то я бы мой ответить на твой вопрос.
+ вопрос: происходит ли recursive template instaniation в яве?
+ могут ли аргументами шаблона быть не типы, а скажем int?
+ есть ли template template parameters?
+ можно ли делать template (member) functions ?
+ есть ли argument dependent lookup?

-~{}~ 09.04.05 18:02:

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

или я хочу например запретить класть объекты некоторого типа в некоторый __стандартный__ контейнер.
 

Crazy

Developer
Автор оригинала: AnToXa
например вот нереализуемая фича: я хочу чтобы юзер моего класса "интексированной коллекции" мог указывать какие конкретно индексы он хочет чтобы присутствовали.

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

или я хочу например запретить класть объекты некоторого типа в некоторый __стандартный__ контейнер.
А смысл?

-~{}~ 10.04.05 15:34:

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

Код:
class Foo<T> extends T
Смысла я в этом не вижу никакого -- т.е. не вижу ни одного случая, когда это может быть фичей, необходимой для реализации чего-то осмысленного. Компилятор Java такое, к счастью, не разрешает. Аналогично, нельзя написать так:

Код:
Foo<int>
Но и смысла так писать я тоже не вижу --- в отличие от C в Javа совсем другая номенклатура примитивных типов, а кроме того -- есть объектный враппер для каждого из их. Ни одного случая, где мне это помешает, я придумать не смог. Рекурсивное применение шаблонов есть, хотя придумать разумный пример было непросто. :)

Есть ли в Java emplate (member) functions я сомневаюсь, но опять таки не вижу, чему это помешает. Аналогично -- argument dependent lookup.

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

Так что если ты считаешь приведенные фичи (возможно -- не все) критически важными, то хотелось бы увидеть на каждую из таких фич пример практической задачи, для решения которой она жизненно важна.
 

AnToXa

prodigy-одаренный ребенок
философия другая все-таки :)
в яве у нас шаблоны в run-time ведь преобразовываются?
тогда точно нет смысла применять C++ техники для этих дел.

1. насчет Foo<int>, я могу например посчитать факториал числа в compile time, или сделать объектный враппер для числа для использования скажем в lambda, или сделать перегрузку по numeric constant преобразовав ее в тип.

2. насчет template<class T> Foo : T
можно удобно реализовать стратегии, хотя это и не является критичным, просто когда это делается в compile time, все несколько быстрее потом работает, или опять же реализовать списки типов, чтобы я мог их использовать в примере про контейнер с несколькими индексами, написать
Код:
multi_index_container<element_type, indexed_by<ordered_index<...>, hashed_index<...>, sequenced_index<...> > >
и т.д.
при этом там все внутри отнаследуется от node_type каждого индекса и получится в итоге одна структурка с итоговым node_type, в котором буддут все поля нужные. memory footprint этого дела буддет очень компактным, плюс сама реализация конейнера такого довольно проста уже после того как все хитрости с шаблонами решены.
пример: boost::multi_index.

да, это все можно реализовать через делегирование и виртуальные вызовы, но это несколько сложнее на мой взгляд, да и тормозит :)

философия языков разная все-таки.
 

Crazy

Developer
Автор оригинала: AnToXa
в яве у нас шаблоны в run-time ведь преобразовываются?
Без понятия. То, что ты их применения, в отличие от C++, не требуется наличия исходников -- факт.

1. насчет Foo<int>, я могу например посчитать факториал числа в compile time, или сделать объектный враппер для числа для использования скажем в lambda, или сделать перегрузку по numeric constant преобразовав ее в тип.
Для этого не нужны шаблоны.

2. насчет template<class T> Foo : T
можно удобно реализовать стратегии
Для реализаций стратегий как таковых это не требуется. Если мы говорим о каком-то особом случае, то его стоит озвучить.

философия языков разная все-таки.
О! Именно. Но если учесть эту разницу, то мы увидим, что каждый из языков -- Java и C++ -- имеет те или иные фичи, отсутствующие в другом. Но фичи эти не имеют критического значения и на сложность языка существенно не влияют.

Соответственно, говорить о том, что сложнее -- Java или C++ -- можно только в целях "а об чем бы пофлеймить". :)
 

AnToXa

prodigy-одаренный ребенок
> Соответственно, говорить о том, что сложнее -- Java или C++ -- можно только в целях "а об чем бы пофлеймить".

а ты думаешь зачем я тут? :D :D :D
 

valyala

Новичок
Да ладно, одно переопределение (определение) операторов для произвольных типов в С++ позволяет признать его более сложным, чем Java.
ONK, попробуй переопределить оператор для встроенных типов. Например operator+(int, int);
Да и ваще Java отстой...
Это заблуждение. Все языки программирования имеют как положительные, так и отрицательные стороны. Различные языки предназначены для решения различных задач. Так что не бывает полностью "ацтойных" или "рульных" языков. Бывают кривые руки, ограниченность кругозора и консерватизм.
или мне показалось, или твой код не скомпилится там с угловыми скобочками беда, да и не мешало бы юзать typedef аха
Код прекрасно компилится на gcc3.3.5. А вот MS Visual C++.NET подкачал - как оказалось, он не поддерживает шаблоны функций, параметризованные шаблонами, находящиеся в шаблоне класса, который также параметризован шаблонами ;)
Если под "более сложным" имелось в виду "пригодный для написания как можно менее понимаемых программ" -- то да.
Общепризнанный чемпион среди языков программирования, "пригодных для написания как можно менее понимаемых программ" - вовсе не C++, а perl.
Много думал. Появилась догадка о том, что может означать "чтобы мой класс наследовал от набора типов указанных мне юзером библиотеки". Пришло в голову такое:
Код:
class Foo<T> extends T
А что насчет определения шаблона класса basic_ostream, входящего в стандартную библиотеку C++:
Код:
template <class Ch, class Tr = char_traits<Ch> > class basic_ostream : virtual public basic_ios<Ch, Tr> {/* */};
. В наследовании класса, инстанцированного из шаблона класса basic_ios нет совершенно никакого смысла? Интересно, что бы по этому поводу сказали разработчики стандартной библиотеки С++.
Есть ли в Java emplate (member) functions я сомневаюсь, но опять таки не вижу, чему это помешает.
Например, в C++ без шаблонных функций-членов нельзя создать конструкторы, зависящие от параметра-класса. Например, есть класс A. Необходимо, чтобы объекты этого класса могли конструироваться из объектов различных классов:
Код:
int a; char b; std::string c;
A aa(a), ab(b), ac(c);
Вместо того, чтобы заниматься cut&paste с последующей заменой имен классов, можно объявить шаблон конструктора:
Код:
template <class T> A(const T&);
А что прикажете делать, если создателю класса A неизвестны все возможные классы, с помощью которых может конструироваться объект, а известен лишь стандартный алгоритм конструирования?
в яве у нас шаблоны в run-time ведь преобразовываются?
Без понятия. То, что ты их применения, в отличие от C++, не требуется наличия исходников -- факт.
Если перед определением шаблона написать export, то при компиляции единицы трансляции, использующей данный шаблон, исходники самого шаблона не потребуются. Необходимо лишь его объявление. Правда, многие известные компиляторы до сих пор не поддерживает export ... Но не будем о грустном. Давайте продолжим увлекательный спор )
 

AnToXa

prodigy-одаренный ребенок
Если перед определением шаблона написать export, то при компиляции единицы трансляции, использующей данный шаблон, исходники самого шаблона не потребуются. Необходимо лишь его объявление. Правда, многие известные компиляторы до сих пор не поддерживает export ... Но не будем о грустном. Давайте продолжим увлекательный спор )
AFAIK НИ ОДИН существующий компилятор не поддерживает export шаблонов, что-то там SGI пытались делать какой-то псевдо объектный(в смысле coff) файл с кодом шаблонным, но у них вроде как не очень и получалось, все. других примеров не знаю.
comeau не приводить в пример, это только фронтенд.
 

ONK

Пассивист PHPСluba
ONK, попробуй переопределить оператор для встроенных типов. Например operator+(int, int);
Термин "произвольные типы" я применил как противиположность встроенным. На сколько я помню именно так его и принято воспринимать.
 
Сверху