the unreasonable effectiveness of C

Всичко за програмирането на игри - архитектура, графика, звук, изкуствен интелект, мрежи.

aSmith
Regular User
Regular User
Мнения: 80
Регистриран: 11 авг 2004 20:09
Местоположение: София

Re: the unreasonable effectiveness of C

Мнение от aSmith » 18 яну 2013 03:05

C vs C++ flame war 2013

gemicha
Site Admin
Site Admin
Мнения: 2930
Регистриран: 20 ное 2003 22:20
Местоположение: USA

Re: the unreasonable effectiveness of C

Мнение от gemicha » 18 яну 2013 09:54

Това май го обсъждахме и извода беше ... всеки да ползва това, за което му плащат :)

Потребителски аватар
stoiko
Power User
Power User
Мнения: 617
Регистриран: 04 дек 2003 15:44
Контакти:

Re: the unreasonable effectiveness of C

Мнение от stoiko » 18 яну 2013 11:00


Потребителски аватар
themean
Power User
Power User
Мнения: 860
Регистриран: 02 дек 2010 22:51

Re: the unreasonable effectiveness of C

Мнение от themean » 19 яну 2013 14:36

Аз пък с голям кеф бих написал неща на чисто C да видя как е.

pdimov
gosu
gosu
Мнения: 871
Регистриран: 02 дек 2003 01:04

Re: the unreasonable effectiveness of C

Мнение от pdimov » 21 яну 2013 16:53

themean написа:Аз пък с голям кеф бих написал неща на чисто C да видя как е.
Прекрасна идея!

(Което ме навежда на мисълта дали C програмистите не обичат сарказма по същата причина, по която не обичат и C++ - пишеш едно, а то значи съвсем друго.)

Stilgar
Power User
Power User
Мнения: 824
Регистриран: 12 яну 2006 22:15
Контакти:

Re: the unreasonable effectiveness of C

Мнение от Stilgar » 21 яну 2013 21:11

Аз от тея статии нищо не разбрах. При Ц било ясно какви компромиси правиш. От там нататък го разтяга едни локуми като анализите дето ни караха да пишем в училище по литература. Нито разбрахме какви проблеми е имал като са го излъгали другите езици, нито видяхме код, нито ни обясни защо да е ясно и да ти се навира в очите през цялото време е по-ефективно от да имаш по-високо ниво на абстракция и да дълбаеш за причината когато имаш проблем. Въобще в тая статия нищо не се казва.

SuryIIID
Power User
Power User
Мнения: 431
Регистриран: 01 яну 2004 21:03
Местоположение: София
Контакти:

Re: the unreasonable effectiveness of C

Мнение от SuryIIID » 22 яну 2013 16:09

Сорри, ако е пускано и преди. Linus Torvads' rant

pdimov
gosu
gosu
Мнения: 871
Регистриран: 02 дек 2003 01:04

Re: the unreasonable effectiveness of C

Мнение от pdimov » 22 яну 2013 17:39

Е как. Естествено, че е пускано. Може ли да се пропусне подобен случай. :-)

Потребителски аватар
stoiko
Power User
Power User
Мнения: 617
Регистриран: 04 дек 2003 15:44
Контакти:

Re: the unreasonable effectiveness of C

Мнение от stoiko » 22 яну 2013 21:50

не, малко сарказъм е приемлив. но C++ е лоша шега. като стана въпрос за скрит смисъл: C++ е много изразителен. толкова изразителен че човек може да си създаде собствен език от него. да кажем "sarcacstic DSL", "DSL с намеци и намигвания" или моя любим "cloak-and-dagger-f.ck-the-maintainers DSL". да вземем например следната крайно изразителна програма (EBNF DSL):

Код: Избери всички

#include <boost/spirit/home/qi.hpp>
 
int main()
{
    using namespace boost::spirit::qi;
    rule<char const *> expression, term, factor;
 
    expression  = term >> *( ( '+' >> term ) | ( '-' >> term ) ) ;
    term        = factor >> *( ( '*' >> ~factor ) | ( '/' >> factor ) ) ;
    factor      = uint_ | '(' >> expression >> ')' | '-' >> factor ;
}
забелязвате ли синтактичната грешка в нея? аз също. но нека погледнем изхода на компилатора:

Код: Избери всички

In file included from /usr/include/boost/spirit/home/qi/nonterminal/meta_grammar.hpp:12,
                 from /usr/include/boost/spirit/home/qi/nonterminal.hpp:10,
                 from /usr/include/boost/spirit/home/qi.hpp:16,
                 from a.cpp:1:
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp: In member function ‘boost::spirit::qi::rule<Iterator, T0, T1, T2>& boost::spirit::qi::rule<Iterator, T0, T1, T2>::operator=(const Expr&) [with Expr = boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&, const boost::proto::exprns_::expr<boost::proto::tag::dereference, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, const boost::proto::exprns_::expr<boost::proto::tag::complement, boost::proto::argsns_::list1<boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&>, 1l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&>, 2l>&>, 2l>&>, 1l>&>, 2l>, Iterator = const char*, T0 = boost::fusion::unused_type, T1 = boost::fusion::unused_type, T2 = boost::fusion::unused_type]’:
a.cpp:8:   instantiated from here
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:86: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ 
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:86: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ 
In file included from /usr/include/boost/proto/transform/when.hpp:21,
                 from /usr/include/boost/proto/matches.hpp:44,
                 from /usr/include/boost/proto/core.hpp:23,
                 from /usr/include/boost/spirit/home/support/component.hpp:12,
                 from /usr/include/boost/spirit/home/support/meta_grammar/basic_transforms.hpp:12,
                 from /usr/include/boost/spirit/home/qi/meta_grammar.hpp:11,
                 from /usr/include/boost/spirit/home/qi/skip.hpp:10,
                 from /usr/include/boost/spirit/home/qi/char/char_parser.hpp:11,
                 from /usr/include/boost/spirit/home/qi/char.hpp:10,
                 from /usr/include/boost/spirit/home/qi.hpp:10,
                 from a.cpp:1:
/usr/include/boost/proto/transform/call.hpp: At global scope:
/usr/include/boost/proto/transform/call.hpp: In instantiation of ‘boost::proto::call<boost::spirit::qi::expr_transform<boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&, const boost::proto::exprns_::expr<boost::proto::tag::dereference, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, const boost::proto::exprns_::expr<boost::proto::tag::complement, boost::proto::argsns_::list1<boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&>, 1l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, boost::spirit::qi::rule<const char*, boost::fusion::unused_type, boost::fusion::unused_type, boost::fusion::unused_type>&>, 2l>&>, 2l>&>, 1l>&>, 2l>, void> >’:
/usr/include/boost/proto/transform/lazy.hpp:41:   instantiated from ‘boost::proto::lazy<boost::spirit::qi::expr_transform<boost::proto::wildcardns_::_, void> >::impl<boost::proto::exprns_::expr<boost::proto::tag::shift_right, boost::proto::argsns_::list2<boost::spirit::qi::rule<const char*, boost::fu 
... 
...
...
!160 килобайта! безполезни глупости. и този проблем не е от вчера както знаем.
ние обичаме сарказма, мразим неяснотите, намеците и разбира се C++.
мишо, човека е ментейнър на couchDB и е минал през тонове други проекти и това си е неговото Мнение. неговото мнение обаче тежи повече от твоето и моето взети заедно.

pdimov
gosu
gosu
Мнения: 871
Регистриран: 02 дек 2003 01:04

Re: the unreasonable effectiveness of C

Мнение от pdimov » 22 яну 2013 23:54

Възможно е, чисто хипотетично, да ползваш C++ без да ползваш Spirit. Да, съзнавам, че е изключително радикално.

Този -factor си изглежда нарочно сложен, между другото, въпреки че "нормални" грешки също дават подобен резултат. То тази грешка не е от най-лошите дори, понеже е static assert. В C++11 дори можеше и съобщение да ти изведе. Хипотетично.

Потребителски аватар
KosSiO
Power User
Power User
Мнения: 316
Регистриран: 20 окт 2008 19:29
Местоположение: Targovishte,Sofia

Re: the unreasonable effectiveness of C

Мнение от KosSiO » 23 яну 2013 02:50

Следния пример на С :

void foo()
{
int x;
x = 10;
int y;
}

Ми дава като грешка : syntax error : missing ';' before 'type', която разбира се е много по-сложна от темплейтен клас , от темплейт от темплейт, който...
А да не говорим, като цяло за тая история с позиционирането на променливите и много други....

Ако например сравним какво ще ти каже някой друг компилатор за някой друг език с този на С++, не мисля че, Ц++овския ще даде по-лош отчет за проблемите.

Около шаблоните всеки и всичко може да се обърка, дори и компилатора, колкото повече нараства това което дават, толкова повече нараства неяснотата им(лично мое мнение).
Иначе, кой точно пише такова нещо? Аз никъде не можах да намеря нещо толова грозно или нещо доближило се до това, е може би boost потребителите пишат такива неща, но аз съм на мнение че не трябва да се ползва boost или каквото друго подобно...

Както пише в статията С++ изисква дисциплина, която със сигурност още не съм придобил, но ако е на лице С++ кода едва ли ще е особено грозен, не четлив и с лош фиидбек на грешките

SuryIIID
Power User
Power User
Мнения: 431
Регистриран: 01 яну 2004 21:03
Местоположение: София
Контакти:

Re: the unreasonable effectiveness of C

Мнение от SuryIIID » 23 яну 2013 09:48

Carmack някъде имаше документ за правилата и code style-а, на Doom3 и едно от тях беше "да се избягва overload-ването на функции", понеже стават грешки, както на ниво компилатор, така и на ниво кодер. Например :

Код: Избери всички

	const idAnim *	GetAnim( int index ) const;
	const idAnim *	GetAnim( const char *name ) const;
	const idAnim *	GetAnim( float randomDiversity ) const;
Трябва да се пише така (Доста ми прилича на С ) :

Код: Избери всички

	const idAnim *	GetAnimByIndex( int index ) const;
	const idAnim *	GetAnimByName( const char *name ) const;
	const idAnim *	GetRandomAnim( float randomDiversity ) const;
Защото, примерно такова извикване, не се знаело дали компилатора ще върне анимация по индекс, или рандом.

Код: Избери всички

Anim = GetAnim( 0 );

Потребителски аватар
Kerberos
Power User
Power User
Мнения: 234
Регистриран: 24 фев 2005 16:08
Местоположение: София
Контакти:

Re: the unreasonable effectiveness of C

Мнение от Kerberos » 23 яну 2013 12:13


Stilgar
Power User
Power User
Мнения: 824
Регистриран: 12 яну 2006 22:15
Контакти:

Re: the unreasonable effectiveness of C

Мнение от Stilgar » 23 яну 2013 15:44

Добре де аз разбирам, че е мнението му но защо целия интернет настоява, че трябва да го чета това нещо в което няма никакъв аргумент. Човекът не прави опит да убеди някой, камо ли да докаже, само си казва мнението и аз продължавам да не разбирам защо да е прав.

BTW аз като C# IDE оператор като чуя за C или C++ грешки получавам разстройство. Пропуснал си ] на 5ти ред и ти дава грешка за липсваща запетая на 505ти ред. Няма такава свинщина!

Потребителски аватар
themean
Power User
Power User
Мнения: 860
Регистриран: 02 дек 2010 22:51

Re: the unreasonable effectiveness of C

Мнение от themean » 23 яну 2013 16:03

Според мен и двата езика са достатъчно адекватни.Ако на някой конкретен език му се струва по-добър от останалите това е заради парадигмите, които държи в главата си.
А иначе това, което мен най-много ме притеснява в C-то е липсата на namespace, всичко друго е чудесно (е може би и методи към структорите биха били добра притурка)

Отговори