衡量一种语言(广义,不仅限编程语言)是否复杂,我们可以看其单词数量、词性变化以及语法结构。
根据相关数据显示,到目前最新的C++20为止,C++的关键字大约是99个,还有6个特定上下文当中有特殊含义的名字。
作为对比,C语言,截止到C11,关键字是44个
显然,C++比C复杂,其关键字比C多一倍有余。
但也有观点认为,C++只有在被孤立看待的时候,才会觉得复杂性。
虽然人们都希望有简单的语言,但是人们真正需要的是有助于解决问题的语言。
人们愿意为了语言所提供的强大表现力和高效率而放弃对简单性的要求。
既然如此,那为什么要解决的问题越复杂,工具就不得不复杂?
诸如C++中的初始化和赋值,在许多的语言中几乎都没有什么区别,比如C。
C++允许变量“拥有”一定的资源,如果值改变,就必须放弃这些资源。
当我们在编写那些要处理分配在别处的数据结构的类时,差异就变得十分重要。
1 class String{
2 private:
3 cha* data;
4 int len;
5 //...
6 }
1 String s = "jiangxuehan";
下面的代码在给s赋值时,s其实早就已经有一个值了(默认构造函数)。
1 String s;
2 s = "jiangxuehan"
可以在初始化后紧跟一个析构操作,这样会简化很多程序,但是会使某些类的抽象变得难以实现。
有一些C++的库会提供一种叫片的类,如果有某一个对象包括了某种数据结构,那我们可以创建一个指向该数据结构某部分的片,给这个片赋值,就会影响原数据结构中被选中的那部分。
1 String s = "the dog";
2 s(4,3) = "cat";//s(m,n)表示从字符m开始的n个字符长的s的一片
3 //s的值为"the cat"
4 s(4,0) = "big, fluffy"
5 //s的值为the big, fluffy cat
但如果赋值总等价于紧跟初始化后的析构操作,那此类的抽象就比较难实现了。
还有比如界面设计,在C++中有很多都是给类设计提供一种简化的工具,协助他们解决用户界面的问题。
这会给库设计者提供更策略化的可能性,使得他们能考虑更多。
大家都会觉得,设计一个优秀的变长字符串和负数类十分困哪,但如果把这些东西补充到编译器中,那将会是难上加难。
原因是,用户很少有权利和能力去修改自己的编译器,把这种改变迁移到不同的编译器上就更别提了。
它能允许我们在无需改变编译器内部的工作模式下,就能详细地定义抽象概念的具体行为。
计算机系统复杂且具有阶段性,如果忽略了这种复杂性,不仅不能消除复杂性,还要付出一定的代价。
1 double add(double x, double y, double z){
2 return x+y+z;
3 }
这段代码并不能对1020、-1020、1的所有排列提供精准的答案。
1020+1和-1020将等于1020,1最终会被完全丢掉。
在解决这个问题时,我们可以选择处理掉或者忽略掉复杂性。
如果决定要处理,那么就需要通过确保最精准的可能答案来完成这一点。
部分语言假装复杂性不存在而选择忽略它,给用户提供了一个干净整洁的接口。
如果世界上有些地方不符合他们所设想的模型,就干脆直接忽略掉。
还有一些语言则是把复杂性直接扔给用户。(如果用户可能不管行,就赢得了博弈,这就是为什么那么多不完善的软件产品在尚不完善时就交付了)。
在这里,C++则是采用折中办法,它允许我们编写对操作环境实施最底层控制的程序,也允许我们忽略大部分不那么重要的细节。
灵活性对于库类的设计者来说十分宝贵,他们因此能给用户提供使用不同的抽象级广泛应用领域的功能。
那对于小伙伴来说,你觉得C++是复杂还是简单,复杂的原因是什么呢?欢迎讨论!
学了一年精通c++,学了五年熟练c++,学了十年略懂c++,学了五十年不会c++
秃如其来的希望!Nature新研究:多能干细胞能形成近乎完整皮肤结构,移植小鼠后成功长出毛发。
(免责声明:整理本文出于传播相关技术知识,版权归原作者所有。)