百科问答小站 logo
百科问答小站 font logo



C 与 C++ 的真正区别在哪里? 第1页

  

user avatar   GeekerSu 网友的相关建议: 
      

C 面向机器编程
Cpp 面向编译器编程

面向编译器编程实在太有意思了

别点赞我了,我已经叛变到Rust了 ‍

结果Rust更加面向编译器编程,从一个坑,跳进另一个坑


user avatar   chao-ge-3-59-61 网友的相关建议: 
      

C是中餐厨师的菜刀,做啥菜就那一把刀,切菜切肉切鱼,都是这一把刀,刀工好的师傅,豆腐都能切成一朵花。无论你提什么概念,都能用指针给你做出来,如果不行,那就用指向函数的指针,指针的指针,指向函数指针的指针。。。。


C++就是西餐厨师的刀,有一大堆不同款式的刀,切不同的东西得用不同的刀,每种刀还有不同的手法,显得非常专业,高大上。


中厨刀,简单,但深入高阶难,难在复杂使用技巧,做啥都是这一把刀,要切出花来,刀工需要练的,一般人练不好。

西厨刀,复杂,但是使用难度相对低,需要掌握一堆刀的功能限制。但刀太多,功能干涉太多,没准啥时候没吃透就踩坑了。真正吃透也很难。


西餐厨师离开这些功能复杂的西厨刀,就会显得手忙脚乱,如果只有一把中厨刀,甚至不会做菜了。

中餐厨师用这堆西厨刀,会不耐烦,最后还是挑出一把最顺手的,当成中厨刀用,其他的闲置。


西餐厨师经常炫技方式就是这刀我会用,那刀我也会用,组合起来还会用。一大堆使用西厨刀的术语名词和隐藏小技巧。

中餐厨师炫技方式就是,随便你提啥需求,我都是用这一把刀给你切出来,刀工还强。


西餐厨师看不起中餐厨师,就一把刀,太简陋,没逼格。

中餐厨师看不起西餐厨师,一大堆刀,也没见菜更好吃,而且那一堆西厨刀的功能,咱就一把中厨刀也能切出来。

是的,C++所有新特性,用C都能做出来,无论是面向对象还是函数式编程还是元编程。所以,不要再说C++是面向对象的,而C是面向过程的,这不是本质区别。但C脑补编译器确实也不是轻松的活。


初级阶段,C比C++容易学,毕竟语法简单,关键词少。

中级阶段,C++更容易更强大。毕竟有强大的编译器支持,只要掌握这些语言特性,就已能实现强大的高级功能。而C还需要脑补编译器,才能实现面向对象等高级特性,不是每个人都能做到,大学课程也不教这些。

高级阶段,C++可能变成语言发烧友,各种特性组合会成为泥潭,牵扯极大的精力。而用C度过中阶段后,更深入理解计算机和程序的哲学本质后,会有一种无所不能的感觉。C反而是束缚更少,更自由,更高效的工具。


一个C++高手,能准确掌握更多更复杂的高级语言特性组合,高效率响应业务需求,快速迭代,代码优雅简洁,鲁棒性好,维护性好,扩展性好。

一个C高手,能掌握更多的基础模块实现方案,什么无锁消息队列,内存管理,线程调度器,时钟,各种算法库,甚至不同风格的面向对象的架构,这都是自己纯手工打造,然后根据业务需要定制这些基础模块的设计方案和参数,以追求应用业务的极致性能,和极致可靠。


C高手往往不太喜欢C++那一套,因为很多东西不能自己掌控。这让习惯掌控一切的C程序员觉得脚下有些发虚。

C++高手往往也不太喜欢C,因为很多轮子要自己造。让习惯快速响应迭代的C++程序员无比烦躁。


都是图灵完备的语言。C能做到的,C++肯定能做,毕竟C++是C超集。而C++能做到的,其实C也能做到,只需要脑补一种编译范式而已。

如果非要在哲学上说C和C++有什么区别,那么C是心法派,C++是语法派。

每当有新概念新范式出现,C++标准组织就会开发新特性新语法,以提供这种新范式。

而C则脑补一种新的心法(数据结构和算法)来解决,在语法层面尽量少增加特性,几乎很少变化。


C和C++又有点像武侠之气宗和剑宗

入门是气宗C简单,入门要学的东西少。而剑宗C++不仅要学气宗的C,还需要学剑宗的这些++,入门就复杂一些。

修炼进展,是剑宗C++来的快,毕竟有一大堆现成的语法范式,不需要知其所以然,只需会用,就能发挥剑宗招式的威力。而气宗C还要掌握一大堆基础数据结构和算法以及设计范式,研究精深,知其所以然,才能真正发挥威力。

上限,是气宗C来的高。等真正深入到高阶编程,会发现每一种现成的语法范式和库,某种意义上,便捷的另一面就是束缚。语言编译器做的工作越多,库越强大,编程束缚反而越大;而语法越少编译器越简单,反而自由度越高而且越稳定可靠,可供发挥的上限也越高。

对于以C为主的高水平团队,C现有的语法不是太少,而是多了,反而还要设定一些编程规范加以限制。所以一些真正经典优美的C代码,往往都是朴实无华的,很少在语句技巧层面炫技。

以C++为主的高水平团队,也常常制定编程规范,对语法使用加以限制,限制可能比C更多。

一个团队水平高低,从其编程规范就可见一斑。水平越高,往往规矩越多。

当然,真正的高手,都是气剑双修的,在语法层面几乎都是朴实无华,从不炫技,人家炫的是思想。




有人想听Python是什么刀。

嗯,窃以为,Python更多像速冻食品。

速冻食品能快速的满足需求填饱肚子,而不是饿着肚子还需要洗切烹饪,在底层原料处理环节消耗大量的时间精力。

Python最大优势就是用起来方便。不是每个人都需要懂编译器实现,各种算法的细节,各种指针的奇技淫巧。大部分人需要的只是快速方便的解决现实问题。

所以,与其说Python兼容面向对象和面向过程,不如说Python是面向问题的。

Python的编译器,和大量的库,都是用C/C++写的,会熟练使用这些库,也就站在了巨人的肩膀上,还不是一个,是一群巨人。掌握这些,足以快速的解决多数问题。

那么速冻食品就没有逼格,手工现做就有逼格?其实也不是,一切从现实需求出发,能最快最好满足需求的工具,就是最好的工具。

Python高手,会掌握大量的库和设计范式,信手拈来,快速满足需求。

而进阶Python高手,还会自己用C来做库,以在某些特殊场景下,突破开源库的功能和规格束缚。




又有朋友问,JAVA,C#,VB,VBA是什么刀?

这真当咱是刀匠吗?还是铁匠? 嗯 ? ~ o(* ̄▽ ̄*)o

好吧,所有的刀款式,这回一次性解决。



所有编程语言,本质上都是工具。

所有刀,本质上也是工具。

都是工具,工具间,自然有类似特征,会有些相通之处。

理解这些有趣的相通之处,有利于我们快速的掌握一种新工具。而不是迷失在新工具的细节之中。


而这些有趣的相通之处,其实并不是孤立零散的。

掌握这些有趣相通之处的分布规律,可以更深刻的理解这些相通之处。

然后,对新工具理解,就是二次方的深刻度。


就像练武,学会心法,招式训练效果倍增。

而学会心法的心法,功力提升速度则加速到二次方。


二次方程,需要一个坐标轴。

建立坐标轴,首先需要一个零点,然后需要一个无穷远。

从零点到无穷远,就是一个数轴。


当你内心建立起这样一个数轴,所谓心法的心法,就水落石出,一目了然,不需要别人告诉你特征,打比方解释给你听,扯什么中式菜刀和西式厨刀的故事。

你自己就可以发现规律。

你自己就可以打无数的比方,信手拈来。


那么,编程语言的零点,在哪里?

图灵机。

是的,图灵机,是近几十年来一切计算机技术的起点。


那么,无穷远,又在哪里?

宇宙间万事万物的无限复杂度,不正是无穷远吗?


当我们从图灵机出发,去解决宇宙间万事万物的无限复杂的过程,就是从零点到无穷远的过程,就产生了数轴。

一旦有了数轴,所有的芯片架构和编程语言,都可以在这数轴上有一个位置,也就是坐标。

当你俯瞰这些坐标构成的散点图,哦,原来如此,不过如此,就像魔术师的技巧被解密了。


让我们出发。

图灵机是零点,第一个点在哪里?

冯诺依曼架构。


图灵机是数学理论上的抽象模型,而冯诺依曼架构个是可落地的工程计算架构。

实现冯诺依曼架构,需要一套指令集、一些指令集配套的寄存器、运算单元、地址总线、数据总线、内存等。然后,就可以开始机器码的编程。

基于CPU指令集的机器码编程,可比基于图灵机的机器码编程来的高效的多。


但,每一步效率的提升,都是拿自由兑换的。

指令集也不例外,有位宽的限制,有指令位宽的区别,有寄存器的区别,有精简指令集复杂指令集区别,等等,等等。

指令集,正是编程遇到的第一次束缚。


所以,从冯诺依曼架构开始出发,有各种各样的指令集。试图用不同的实现折中,来换取不同的效率优化。


机器码编程太累,就有了汇编。汇编跟机器码几乎是一一映射,无损压缩。


汇编还是累,就有了一些初步的高级语言,如广泛应用成熟的C。

C提供了函数,方便了程序设计,但却剥夺了CPU寄存器的可见性,戴上了栈空间的束缚,等等。

C++提供了面向对象的语法便捷,但面向对象却限制了指令交叉访问数据的自由和效率。

Java等语言提供了内存管理便捷,但剥夺了程序自主内存管理的自由和效率。


面向宇宙万物的无限复杂度,每一步编程效率的提升,都是拿自由兑换的,毫无例外。

当我们想要更大的便捷性和功能,就面向具体问题,以可以忍受的些许自由代价,来换取解决具体问题的范式,以此获得效率的提升,也就是更高级的语言。

当我们想要更大的自由度,就向零点回退。

踩着前人的脚步,熟悉每一步自由换取便捷的手法,你心中就有了数轴。

有了数轴,你就可以俯瞰所有的语言、程序、和架构设计。

熟悉这一切,你甚至可以根据需要创造新的编程语言,新的设计范式。

就是这样而已,没什么魔法。


本文完。





课后作业:

图灵机真的是零点吗?

这个轴的负数方向意味着什么?




user avatar   yiwang-er-shen-23 网友的相关建议: 
      

随夫姓不局限于发达国家,但全世界都大差不差。

婚后随夫姓,确实是体现了一种从属关系。如果按今天的政治正确,尤其是按女权思想,简直不可救药。而实际上,把目光放在历史长河当中,能随夫姓简直相当于进了体制内,属于铁饭碗待遇的体现!

苏轼牛不牛?其最爱的小妾,也就是被谪至黄州[1]都没有卖掉[2]的王朝云[3],坟头上也只能写着王氏,而非苏王氏[4]

图片出自百度百科

另外,关于姓氏,咱中国还略好一些,像日本,姓氏取的那么随意,也实在是没有办法!毕竟天皇到今天还没有姓氏[5],而平民拥有姓氏也只是近150年的事情[6]。姓氏上由于太随意,留下了很多奇葩的存在,例如"一二三、我孙子、肛门、猪鼻、上床、浮気[7]、土肥"……

名字就更随意了,男娃就叫大郎、次郎、三郎,至于山本五十六[8],咱也不敢说,咱也不敢问;女娃就是花子、美子、优子、菜子……并不比我们的大柱、二牛、小凤、翠花更高雅……

欧洲也没好到哪去,别看有些人名字里带个"Von/de/Don"之类的很显洋贵,其实11世纪之前这些贵族连姓都没有[9]。至于平民,那就更好办了,要么领个教姓/名[10],要么干脆看情况起一个,比如Fisher(鱼夫),Smith(铁匠),Hunter(猎人),Johnson(约翰之子),苹果CEO cook祖上大概率是厨子……

但毫无疑问的是,家庭作为社会中最基本的利益共同体,能否成为正式的家庭成员当然是极重要的硬指标。

在长久的旧时代,宗族/家族出身是极重要的,这是不分国界的。于女性而言,几乎不可能独立生存,如果再得不到家族的实名认证,人生大都是悲惨的。如果说有所区别,大概也只是悲惨的程度和花样。

现在回归问题身本:为什么如今在很多发达国家同样以随夫姓为主流呢?

先说,我国是破了四旧[11],烧了不知多少本家/族谱,否则也不会出现争冠姓权这种事。

一方面是惯性使然。这可不只是习惯问题,更不是简单的一句"传统观念"就能解释的。这种惯性,更多的是一种力量,是利益集团的一个标致,其中并非只有男权,而是整个家族的权力征徽,更类似于一家大企业的名号,其庇护作用是显而易见的。

而平民阶层随夫姓的主要原因是效仿权贵阶层,除了自觉拿到了"皇帝的金锄头",再就是"话事人[12]"原则的体现,也就是每家每户,都要有个撑门面的最强者,而普遍上兼具暴力与理性的男性显然更适合这个位置。就普通家庭而言,其实这个位置并没有多爽,责权一体不是说着玩的!如果放在中国,这个位置就更难坐了,很多中国家庭中享有冠姓权的男性,责任与实权、收益并不成正比。

这里面还有个逻辑推导,既从妻子的角度出发“我随他姓是因为他很强,也比我强,如果反过来,他随我姓就说明我比他强,反推就是他比我弱,如果我还不如多数随夫姓的女子,那则说明我们一家子都还不如别人家最弱的那个,那就没法混了呀!”

所以,姓氏对于小家庭意义并不大,但对家庭某一成员的意义很大。且随夫姓并不见得就亏,反而很可能是赚的,无利不起早,这符合人性中的趋利特点。

那一定有人问“为什么现在很多女性/女权还要争冠姓权呢?”

答案就是:不是姓氏有问题,而是人品有问题!


以上。

参考

  1. ^ 黄冈
  2. ^ 古时候妾属于财产,更接近于随意买卖交易的财物。
  3. ^ https://baike.baidu.com/item/%E7%8E%8B%E6%9C%9D%E4%BA%91/56511
  4. ^ 了解苏轼的应该知道,确有苏王氏,既其第二任妻子王弗。
  5. ^ 日本天皇是真的没有姓氏,虽自称是天照大神的后裔,但客观反应了中古时期(公元600年)之前的日本的蛮荒程度,这与人们普遍认知的日本文化相去甚远。
  6. ^ 明治三年(公元1870年)日本政府作出“凡国民,均可起姓”的决定。可是竟然没有多少人响应,于是,政府不得不在明治八年(1875年)颂布了强制性的《苗字必称令》,规定了“凡国民,必须起姓”。
  7. ^ 意为出轨。
  8. ^ 因其出生时父亲56岁。
  9. ^ 欧洲贵族自11世纪起才普遍以封地为姓氏,之前基本有名无姓。
  10. ^ 出自于宗教典籍,或牧师之类给起的姓氏
  11. ^ 指破除旧思想、旧文化、旧风俗、旧习惯,与其后的"立四新"相对应。
  12. ^ 指在一个组织中做出决定并承担责任,同时享有最高地位的人。



  

相关话题

  for 循环为什么不支持小数? 
  C/C++ 数组大小需要是2的倍数吗? 
  c#匿名委托获取自身的方法? 
  如何将 C 语言发挥到极致? 
  是不是后置类型语言的函数一定要加关键字,不加关键字编译器识别不出吗? 
  C++对比其他语言到底难在哪里?有人对C++异常推崇,除了性能优势,还有什么优点,怎么学好C++? 
  CodeBlocks 的强大之处在哪里? 
  如何向一个零基础的人,解释学习计算机编程的正确顺序和原因? 
  站在 2020 年回看,如何评价 Python 2 到 3 的升级? 
  C的结构体成员变量的命名有必要加前缀吗? 

前一个讨论
大型系统的测试用例是怎么编写的?
下一个讨论
章北海是如何骗过ETO的?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利