在文章:为什么选择POCO中,有这句话:
Maciej Sobczak很好地指出:“我只是不喜欢有人给我一半的语言,并告诉我这是为了我自己的保护”。
我不明白他的意思,尽管C#是微软拥有与Java的由Oracle拥有的,但这并不意味着他们持有一半的语言,不是吗?我没有发现任何证据可以证明这一句话,对此我感到很好奇。甚至对“为了我自己的保护”部分感到好奇。
在文章:为什么选择POCO中,有这句话:
Maciej Sobczak很好地指出:“我只是不喜欢有人给我一半的语言,并告诉我这是为了我自己的保护”。
我不明白他的意思,尽管C#是微软拥有与Java的由Oracle拥有的,但这并不意味着他们持有一半的语言,不是吗?我没有发现任何证据可以证明这一句话,对此我感到很好奇。甚至对“为了我自己的保护”部分感到好奇。
Answers:
Sobczak并不是在谈论公司所有权。他缺少的“半”语言是您在许多现代语言中无法做到的所有事情,尽管作为一名受过良好教育的计算机专家,他知道可以实现:从您喜欢的许多类中继承。将任何对象分配给任何其他没有类型约束的对象。手动控制分配和释放资源,而不是信任编译器和运行时来为他完成任务。
事实是,所有这些限制都是出于某种原因而被编入编程语言的。我们确实有允许所有这些的语言。随着时间的流逝,我们发现普通程序员在一定数量的限制和手动操作下会变得更好,因为犯下真正糟糕的错误的潜力实在太大了,以至于不值得拥有额外的功能和表现力。
(显然,这有时会使真正不需要那么多手把手的程序员感到烦恼。他们的抱怨有时是合法的。但是众所周知,人们在评估自己的技能方面很糟糕,而且许多认为不需要安全防护措施的人在实际上,很难区分真正的高级智力和普通编码人员,他们认为高级语言的限制使他们感到束缚,而普通编码人员只是认为抱怨会使他们看起来更高级,或者不知道好点。)
dynamic
?
这在引用的原始来源中得到了很好的解释:
我决定学习更多有关C ++的知识,并成为其忠实的热情者–这包括我对这种语言可能发展的方式的兴趣。而且,我注意到,开发有用的库而不是实际应用程序需要最高端和最先进的技术。考虑到这一点,我尝试编写一些自己的库以用于不同目的(请参见下载页面),并且还尝试研究C ++ Boost开发人员的肩膀(请参见链接页面)以了解这些内容。高端技术。真正需要同时花时间开发本来应该通用且有用的库。这就是程序员永不停止学习的原因。
[…]
我一直在玩C ++和编写健壮软件的技术。为了在可靠软件领域获得更广阔的视野,我决定花一些时间来学习Ada(及相关知识),尽管Ada确实为复杂而可靠的设计而设计,但该语言似乎已被企业完全抛弃。系统。我必须承认,学习Ada确实对我有好处,因为它使我能够对自己的工作和开发方法有了更新鲜的了解。最重要的是,Ada世界中的某些想法或多或少可以直接应用于C ++,在健壮性和正确性方面取得良好的效果。
[…]
好我忘了 我发誓一天不学习Java。但是我做到了。好吧,在某种程度上,我可以读写工作代码。我读过“ Thinking in Java”(在线免费)和“ Core Java”(非在线,不是免费),我也间接参与了某些Java开发,而且...嗯,我不买它。我只是不喜欢有人给我一半的语言并告诉我这是出于我自己的保护。就像纸锤一样,它发光了,所以没有人在敲手指时会伤到自己……同样适用于C#。我选择钢制大锤,这样我就可以确定,当我要演奏男子气概时,它可以承受。
问题是-为什么这么多人使用它(Java,C#等)?嗯...也许是因为在某些地方很好。但是在某些情况下,语言和库都表明它们(最初)是为applet设计的,而不是成为万能的实用程序。它只提供了太多的东西,而提供的却很少。或作为一种解决方案,可能会加剧竞争。当需要最大的功能和更广阔的视野时,我喜欢C ++。在C ++的表达能力不是必须的地方,像Tcl或Python这样的语言似乎很合适。它们不仅在进化方面是开放的,而且可以根据特定需要对其进行扩展和嵌入。在这些技术中,我看到了很多梦想。我也倾向于放弃C作为常规编程的语言-这似乎只是作为代码生成目标的一个合理选择,否则它很容易出错。今天,如果我有自由选择的权利(不幸的是,大多数时候并非如此),Ada可能是我更认真的项目的第二选择。
因此,换句话说,该引用的作者喜欢C ++,但他不喜欢Java,他认为Java缺少了一半的C ++。这就是报价的全部内容。
您发布的博客中与之链接的文章已被删除,因此很难确定,但是正如Kilian所说,当他说“一半的语言”时,他可能意味着C#和Java感觉像C ++,但有很多删除了功能和结构,以使其更易于使用或更安全。
早在2006年,当撰写本文时,C#相对较年轻,Java在许多方面都还不成熟,并且在权衡安全与安全之间似乎是一个权衡取舍,而您只能选择一个,这并不是完全不合理的立场。
这些天来,这个职位根本不合理。仅考虑主流语言,C#和Java便已日趋成熟,它们借鉴了其他语言(特别是功能性)的功能来促进编写安全代码。我们也有从头开始构建的Rust和Swift等语言。
如果有人因为握住您的手而看不起一种语言,或者说某种语言难用是件好事,那么我会对他们所说的一言不发。您只需要查看由业界最聪明的人编写的每天都依赖于我们的代码中令人尴尬的错误数量,而使用“安全”语言可以避免这些错误,以了解原因。
回顾档案,似乎这句话是2003年的(尽管该文章引用的是2006年的)。当时,C#的版本为1. x,它缺少许多现代功能:
新的功能
C#2.0
- 泛型
- 部分类型
- 匿名方法
- 迭代器
- 可空类型
- getter / setter分别的可访问性
- 方法组转换(委托)
- 代表的协方差和反方差
- 静态类
- 委托推理
C#3.0
- 隐式类型的局部变量
- 对象和集合初始化器
- 自动执行的属性
- 匿名类型
- 扩展方式
- 查询表达式
- Lambda表达式
- 表达树
- 部分方法
C#4.0
- 动态绑定
- 命名和可选参数
- 通用协和逆
- 嵌入式互操作类型(“ NoPIA”)
C#5.0
- 异步方法
- 来电者信息属性
C#6.0
- 编译器即服务(Roslyn)
- 将静态类型成员导入名称空间
- 异常过滤器
- 等待捕获/最终阻止
- 自动属性初始化器
- 仅限吸气剂的属性的默认值
- 表情健全的成员
- 空传播子(空条件运算符,简洁的空检查)
- 字符串插值
- 运营商名称
- 字典初始化器
C#7.0
- 输出变量
- 模式匹配
- 元组
- 解构
- 本地功能
- 数字分隔符
- 二进制文字
- Ref返回和本地人
- 广义异步返回类型
- 表达式身体构造器和终结器
- 表情浓郁的吸气剂和坐便器
C#7.1
- 异步主
- 默认文字表达式
- 推断的元组元素名称
- “ C Sharp”,维基百科(已删除参考和链接)
在这种情况下,C#似乎是一种半语言,这可能更容易理解,因为它缺乏当今C#的许多功能。奇怪的是,它甚至没有static
上课!
由于C#已与.NET绑定,因此也缺少更多内容。例如,WPF那时还不存在。都是WinForms。
static
类看起来像是一个原始特征。我有点想像它们早于实例化类。
static
在大多数情况下,我都不是上课的忠实粉丝。老实说,我选择它作为调用的功能,因为它看起来确实很简单,是C#的原始部分。我不认为它们不是Java语言。
他抱怨缺乏可进行细粒度控制的语言功能。这些包括用于
const
关键字)这使我想起了我对Java的批评之一:
一切都是指针,但指针不存在。
在C ++对象中,指针和引用是三个具有清晰语义的不同概念。在Java中,您只有伪对象指针。通过将它们混合并避免使用真正的指针语义,对象模型将变得不太清晰。
在定义良好的C ++程序中,程序员可以期望引用是有效的且非null。由于其简化的模型,Java无法做出相同的保证。
这种不太清晰的模型的症状包括空对象模式和yoda条件,例如5.equals(potentiallyNullIntegerReference)
。
Map.merge
何时仅想更新地图中的值)。
const
。它确实提到了“函数式编程”,但是,他使用的语言是Scheme,它不是一种纯粹的函数式语言(实际上,Scheme的设计者要小心避免使用“ function”一词,并谈论“程序”),因此似乎他使用的是FP的“一流子程序”解释,而不是“参照透明性”。
我同意@Kilian的回答,但我会添加一些内容。
1-针对虚拟机而不是操作系统运行
由于Java和C#是通过虚拟机运行的,因此从逻辑上讲,由于直接在OS上进行操作,因此您可能无法完全按照自己的意愿进行操作,因为您可能会破坏VM中的某些内容。而且,由于Java被视为与平台无关的语言,因此它更具逻辑性。
2吨的应用程序不需要您需要这些东西。
确实有很多应用程序不需要您深入了解很多细节,但是如果使用要求您完成操作的语言来进行操作,则会得到:
3-语言是根据某些选择权重成本/使用/风险来决定的,例如...一切。
使用C ++,您几乎可以做任何您想做的事情,这是C ++人员的选择。但是,数量越多,您需要处理的越多。
因此,诸如多重继承之类的事情不会仅仅因为它们是危险的事实而被放弃,它们之所以被放弃是因为实现它们需要付出一定的成本(开发,维护),而所有这些都是因为很少能正确使用并且可以通常以不同的方式重写。
B
在中产阶级中被覆盖M
,则B
该成员的版本只能通过M
' 访问。覆盖 (2)给定type的任何引用T
,将其转换为任何超类型并转换回T
将产生与原始等价的引用。这两种保证都是有用的,并且支持多重继承将需要放弃至少一个。
只需将所有限制放在高级语言(如C#和Java)中即可保护程序员。它们的存在并不是为了保护程序员免受他/她自己的侵害,而是为了保护程序员免受其他程序员的侵害!
作为程序员,我们有多少次遇到的库在其编码实践和设计上是彻头彻尾的,但是由于某种原因而被迫使用?
这些程序通常具有旧的过程编程方法的特点,缺乏封装性,大量直接内存写入,几乎没有错误捕获或处理。当在任何大型项目中尝试使用段隔离时,段追求的都是大量的。
这就是Java和C#等语言非常有用的地方。并不是说我们喜欢他们不让我们做其他语言所做的所有整洁的事情,而是因为我们享受着不必忍受的头痛,因为其他程序员会滥用其他语言可以做的整洁的事情做。
在我看来,接口在内存或执行速度方面都值得进行任何形式的权衡。我希望您可以看到,在任何限时任务关键型应用程序中,所有这些保护措施,适当的错误处理以及通常确定内存没有被占用都是好事!
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!
还是要保护其他程序员免受程序员侵害?