【问题标题】:Scala strict type system vs C++ type systemScala 严格类型系统 vs C++ 类型系统
【发布时间】:2011-04-05 05:52:43
【问题描述】:

Scala 的严格类型系统的粉丝,但 C++ 的粉丝:

  • 是否可以强迫自己以同样严格的方式编写C++? (不使用void*,不进行大量转换,装箱简单值类型,即struct Month {int value;};)。
  • 或者 默认情况下 C++ 是否比 Scala 更严格(如果您不努力使用强制转换)?尽管有 C++ 模板的“鸭子类型”——如果它不合适,它仍然不会让你编译,对吧?
  • C++0x (wrt to C++03) 是否为愿意接受完全类型安全编程的人添加了一些东西

【问题讨论】:

    标签: c++ scala c++11 meta type-safety


    【解决方案1】:

    简短的回答:是的,您可以达到相同的类型安全级别,但这会给程序员带来负担。这不仅仅是提供相同安全性的问题,类型系统还必须足够强大和灵活以促进类型安全编程,在这方面 Scalas 类型系统优于 C++。

    C++0x 将添加 lambda 表达式,这将有助于使用 HOF,如 map、filter、flatMap 等。

    【讨论】:

    • Scala 类型系统确实更健壮。我会将第一条语句重新表述为:C++ 与 Scala 一样类型安全,但缺乏 Scala 的灵活性,需要不同的程序员资格才能有效地使用它。
    • Basilevs,C++ 不是类型安全的。对不起。它与 C 共享一个属性,即许多类型检查的程序没有定义的含义。
    • C++ 可以用作类型安全语言,但某些 C 结构和强制转换是被禁止的。
    • 说 C++ 是类型安全的,如果你不使用 C 语言的一半是没有意义的。首先,有些 C++ 结构仍然存在问题(例如 new、new[]、delete 和 delete[]),其次,如果你不做 X、Y 和 Z,那么说 C++ 是类型安全的只是另一种方式说 C++ 语言不是类型安全的语言。
    • 你是正确的。问题是人们倾向于将 C++ 视为 C,因此进一步降低了其类型安全性。
    【解决方案2】:

    C++ 类型系统比 Scala 更严格。

    1. 没有类型擦除(即使在模板代码中)。
    2. 理想情况下,C++ 中不存在类型转换(如果您使用像 dynamic_cast、static_cast 等 C 风格转换的直接转换,您将被指责为糟糕的设计。这些被认为是最后的手段低级工具。)。

    【讨论】:

    • 好点,没有类型擦除。但这不只是实现泛型的编译器方式吗?这不是对外行程序员隐藏的吗?我 100% 同意 2。
    • 类型擦除是一个运行时实现细节。这并不是因为 Scala 在底层做了一些类型转换,导致类型安全性降低。因此,根据您的论点,C++ 类型系统并不比 Scala 更安全。
    • 如果我们谈论编译时类型安全,类型擦除是无关紧要的。这是一个运行时“功能”,当你在做一些在运行时由于擦除可能不安全的事情时,Scala 编译器会告诉你。
    • 类型系统是指在编译时对程序的了解。类型擦除会产生运行时效果,因此不会降低严格性。类型擦除在编译时施加的限制是减少可能的重载,以及特定类型保护的可能性。
    • 继续。 ML 和 Haskell 编译器倾向于使用类型擦除来实现,但它们的类型系统(相对)是防弹的。类型擦除与“instanceof”样式检查(包括 C++ 中的 dynamic_cast 和 Scala 的开放式模式匹配)的组合会导致问题。因此,如果 C++ 中的答案是避免强制转换,那么 Scala 中的答案就是避免强制转换 - 事实上,当您以不安全的强制转换方式使用模式匹配时,Scala 编译器会警告您。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2011-07-16
    相关资源
    最近更新 更多