C++ 是C++;当程序员试图以从未被设计过的方式使用它时,显示它的年龄?

C++ 是C++;当程序员试图以从未被设计过的方式使用它时,显示它的年龄?,c++,C++,背景 使用boost和其他类似的库是发现编译器缺点的最简单的方法,但是是否有一个阶段会走得太远呢 这个破损的符号: _ZTSN5boost6spirit2qi6detail13parser_binderINS1_11alternativeINS_6fusion4consINS1_8sequenceINS6_INS1_16lexeme_directiveINS7_INS6_INS1_6actionINS1_9referenceIKNS1_4ruleIN9__gnu_cxx17__normal_it

背景

使用boost和其他类似的库是发现编译器缺点的最简单的方法,但是是否有一个阶段会走得太远呢

这个破损的符号:

_ZTSN5boost6spirit2qi6detail13parser_binderINS1_11alternativeINS_6fusion4consINS1_8sequenceINS6_INS1_16lexeme_directiveINS7_INS6_INS1_6actionINS1_9referenceIKNS1_4ruleIN9__gnu_cxx17__normal_iteratorIPKcSsEEFN7xxxxxxx2ir8carry_op2OpEvENS5_11unused_typeESM_EEEENS_7phoenix5actorINSQ_9compositeINSQ_11assign_evalENS5_6vectorINS0_14local_variableILi0EEENS0_8argumentILi0EEENS5_5void_ESZ_SZ_SZ_SZ_SZ_SZ_SZ_EEEEEEEENS6_INS1_10char_classINS0_3tag9char_codeINS15_5spaceENS0_13char_encoding5asciiEEEEENS5_3nilEEEEEEEEENS6_INS9_INS7_INS6_INSA_IKNSB_ISG_FSbIwSt11char_traitsIwESaIwEEvENSH_6parser11white_spaceISG_EESM_EEEENS6_INS1_12literal_charINS18_8standardELb1ELb0EEENS6_IS1R_NS6_IS1U_NS6_IS1R_NS6_IS1U_NS6_IS1R_NS6_IS1U_NS6_IS1R_S1C_EEEEEEEEEEEEEEEEEEEENSR_INSS_IST_NSU_INS0_9attributeILi0EEENSS_INSQ_6detail14construct_evalISJ_EENSU_ISW_SY_NSX_ILi1EEENSX_ILi2EEENSX_ILi3EEENSX_ILi4EEESZ_SZ_SZ_SZ_EEEESZ_SZ_SZ_SZ_SZ_SZ_SZ_SZ_EEEEEEEES1C_EEEEEENS6_INS7_INS6_IS1G_NS6_INS9_INS7_INS6_IS1R_NS6_IS1U_NS6_IS1R_NS6_IS1U_NS6_IS1R_NS6_IS1U_NS6_IS1U_S1W_EEEEEEEEEEEEEEEENSR_INSS_IST_NSU_IS26_NSS_IS29_NSU_ISW_SY_S2A_S2B_NSQ_5valueINS_8optionalIS1K_EEEES2C_SZ_SZ_SZ_SZ_EEEESZ_SZ_SZ_SZ_SZ_SZ_SZ_SZ_EEEEEEEES1C_EEEEEENS6_INS7_INS6_IS1G_NS6_INS9_INS7_IS21_EENSR_INSS_IST_NSU_IS26_NSS_IS29_NSU_ISW_SY_S2A_S2B_S2C_S2Y_SZ_SZ_SZ_SZ_EEEESZ_SZ_SZ_SZ_SZ_SZ_SZ_SZ_EEEEEEEES1C_EEEEEES1C_EEEEEEEEN4mpl_5bool_ILb0EEEEE
(1388个字符)

翻译成(感谢c++过滤器!):

boost::spirit::qi::detail::parser\u binder
(12980个字符)


问题


我的问题是,鉴于这些(技术上不符合我理解的标准,因为被损坏的名称超过1024个字符),这是不是C++显示其最新概念的最新概念?或者这仅仅是一种迹象,表明程序员对该语言的期望过高,而boost等模板库正在尽最大努力促进这一点?

我认为这是一种老化的迹象,因为标准将损坏的名称限制为
1024
个字符;-)

> Pr>当一个扳手被钉在钉子上时,它的年龄就显示出来了。

< P> C++中,被损坏的符号名相当于其他语言的调用堆栈。

给一个20世纪70年代的asm程序员看一个23层的调用堆栈,他们会说‘这肯定让这种新型函数的东西走得有点远了吗?你怎么可能调试和分析这么复杂的东西?你需要一个特殊的工具来计算出所有东西都在内存中的位置”

事实上,在没有调试器的情况下,当事情正常运行时,使用嵌套得那么深的函数实际上是不切实际的,但是当它们中断时,将内存映像与代码关联起来就变得不可能了

EclipseCDT实际上有一个非常好的特性,它可以获取预处理器宏,并通过后退和前进按钮一步一步地展开它们。模板的显示,特别是在错误消息中,需要类似的东西。因此,您可以在

list<T>
list<ptr<t>>
list<ptr<string<T>>>>
列表
列表
列表>

请记住,原始C++(C类)是一个黑客攻击C。它的目标是很好的,通过引入OOP世界的思想,能够更好地组织C程序。目标是好的,但它的方式是坏的。随着时间的推移,C++在其微小C基上的特征上增加了堆积特征,这是为简单起见而设计的。如果你在一个2层的房子里建造一个100层的建筑物,将会发生什么?这就是C++发生的灾难。它以围绕“概念”的混乱而达到高潮,而“概念”现在已经过时了。许多这些新特性都是为了解决核心C++固有的弱点而添加的。我认为静态类型语言不可能是面向对象编程的好工具,至少如果你遵循这种范式的话。当我使用C++时,我尝试坚持基本特征,比如命名空间、标准模板库和异常。只有当类型的层次结构在当前上下文中绝对意义时,才会创建C++类。我忽略了“先进”的其他复杂的东西。

< P>我认为,人们不断地使用C++的新方式,是它的灵活性和力量的标志,而不是它的老化。如果人们不把它应用于新的、更大的问题,那么语言就不能显示它的时代了吗? <>我认为这正好相反——它表明C++能够做比在最早的语言版本中更复杂的事情。这是怎么“显示它的年龄”的?如果C++仍然被用于15年前流行的半烘烤java类OOP风格,它将显示它的时代。 我认为,即使在实际标准不变的情况下,这种语言的使用仍在不断发展,这是一种力量的表现


当然,C++在其他方面也显示了它的时代,但我不认为这是其中之一。相反,这是C++的一个弥补功能。

产生的大多数名称是“noise”,因为它要么由typedef指定,要么参数是默认值

这个IMHO更像是一个编译器实现者决定集中精力的问题。大多数编译器厂商花费更多的时间确保他们正确地执行(复杂的)C++标准,以产生尽可能快的代码。 为大多数人提供漂亮的名字是对上述问题的一种思考

为了强调这一点,除最后两项外,以下映射可以在demangler中实现,以便始终发生:

  • 我们可以搜索和替换
    basic_string
    并将其替换为string
  • 我们可以搜索并替换
    basic\u字符串
    ,并将其替换为wstring

  • 我们可以搜索和替换
    \uu gnu\u cxx::\uu normal\u迭代器C是本着“机制,而不是策略”的精神设计的;这意味着它可以处理一些奇怪的地方,比如嵌入式设备或内核,在这些地方可能没有一个像样的标准库。它为编写可移植代码打开了大门(尽管无论如何也不能保证这一点)。重要的是,该语言功能强大,重要的事情不会被视为特殊情况(例如,“printf”只是另一个函数;您不需要特殊运算符来进行字符串格式化或任何类似操作)。这意味着语言可以(在某种程度上)由用户而不是创造者构建

    C++继承了这种精神。本着这种精神,人们创建了既能提供功能又能提供相当简洁语法的库

    C++仍然在廉价的嵌入式系统中使用,因为与C相比,它降低了软件开发成本,但速度仍然相当快(实际上已经移植到系统中)。由于这些原因,我认为C++没有被打破或显示出它的时代。 但是,试图把它变成一种适合“现代”追求的语言是一个简单的使用案例
    list<T>
    list<ptr<t>>
    list<ptr<string<T>>>>
    
    qi::detail::parser_binder<qi::alternative<cons<qi::sequence<cons<qi::lexeme_directive<qi::sequence<cons<qi::action<qi::reference<qi::rule<string::const_iterator, xxxxxxx::ir::carry_op::Op ()(), unused_type, unused_type> const>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<local_variable<0>, argument<0> > > > >, cons<qi::char_class<tag::char_code<tag::space, char_encoding::ascii> > > > > >, cons<qi::action<qi::sequence<cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const> > > > > > > > > > >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<xxxxxxx::ir::carry_op>, vector<local_variable<0>, argument<0>, argument<1>, argument<2>, argument<3>, argument<4> > > > > > > > > >, cons<qi::sequence<cons<qi::lexeme_directive<qi::sequence<cons<qi::action<qi::reference<qi::rule<string::const_iterator, xxxxxxx::ir::carry_op::Op ()(), unused_type, unused_type> const>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<local_variable<0>, argument<0> > > > >, cons<qi::char_class<tag::char_code<tag::space, char_encoding::ascii> > > > > >, cons<qi::action<qi::sequence<cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const> > > > > > > > > > >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<xxxxxxx::ir::carry_op>, vector<local_variable<0>, argument<0>, argument<1>, argument<2>, boost::phoenix::value<boost::optional<wstring> >, argument<3> > > > > > > > > >, cons<qi::sequence<cons<qi::lexeme_directive<qi::sequence<cons<qi::action<qi::reference<qi::rule<string::const_iterator, xxxxxxx::ir::carry_op::Op ()(), unused_type, unused_type> const>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<local_variable<0>, argument<0> > > > >, cons<qi::char_class<tag::char_code<tag::space, char_encoding::ascii> > > > > >, cons<qi::action<qi::sequence<cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const>, cons<qi::literal_char<char_encoding::standard, true, false>, cons<qi::reference<qi::rule<string::const_iterator, wstring()(), xxxxxxx::parser::white_space<string::const_iterator >, unused_type> const> > > > > > > > >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, vector<attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<xxxxxxx::ir::carry_op>, vector<local_variable<0>, argument<0>, argument<1>, argument<2>, argument<3>, boost::phoenix::value<boost::optional<wstring> > > > > > > > > > > > > > >, mpl_::bool_<false> >
    
    cons<qi::reference<qi::rule<string::const_iterator, wstring()()
          , xxxxxxx::parser::white_space<string::const_iterator >
          , unused_type> const>
          , cons<qi::literal_char<char_encoding::standard, true, false>,
    cons<qi::reference<qi::rule<string::const_iterator, wstring()()
          , xxxxxxx::parser::white_space<string::const_iterator >
          , unused_type> const>
          , cons<qi::literal_char<char_encoding::standard, true, false>,
    cons<qi::reference<qi::rule<string::const_iterator, wstring()()
          , xxxxxxx::parser::white_space<string::const_iterator >
          , unused_type> const>
          , cons<qi::literal_char<char_encoding::standard, true, false>,
    cons<qi::reference<qi::rule<string::const_iterator, wstring()()
          , xxxxxxx::parser::white_space<string::const_iterator >
          , unused_type> const>
          , cons<qi::literal_char<char_encoding::standard, true, false>,
    cons<qi::reference<qi::rule<string::const_iterator, wstring()()
          , xxxxxxx::parser::white_space<string::const_iterator >
          , unused_type> const>