语言是否可以进行编译时检查,但具有动态类型的特征?

问题描述 投票:1回答:4

阅读以下内容:

许多人在定义静态类型和动态类型时会尊重到检查变量类型的地步。使用这个以此类推,静态类型化语言是类型检查的语言在编译时完成,而动态类型化语言是在在运行时进行哪种类型检查。

此类比导致我们上面用来定义静态和动态类型。我相信了解静态和根据明确声明的需要动态分类变量,而不是作为编译时和运行时类型检查。

Source

我以为我们定义静态和动态类型的两种方式:编译时检查和显式类型声明有点像苹果和橘子。所有静态类型语言的一个特征(据我所知)是引用变量具有定义的类型。是否可以使用一种语言,它具有编译时检查的优点(如Java),还可以使变量不受特定类型的约束(如Python)?

注:在Java之类的语言中,类型推断并不完全,因为变量仍被隐式地分配了类型。这种理论语言没有引用类型,因此不会进行任何强制转换。由于混淆,我试图避免使用“静态类型”与“动态类型”。

java c# c++ oop types
4个回答
1
投票

可能,但应该有吗?

想象在假的伪C ++中:

class Object
{
public:
    virtual Object invoke(const char *name, std::list<Object> args);
    virtual Object get_attr(const char *name);
    virtual const Object &set_attr(const char *name, const Object &src);
};

并且您使用的语言会安排:

  • 使Object类成为所有类的根基类
  • blah.frabjugate()转换为blah.invoke("frabjugate")的语法糖]]
  • [blah.x = 10blah.set_attr("x", 10)] >>
  • 此外,还结合了boost :: variant和boost :: any的属性,您有了一个很好的开始。 Python具有C ++或Java的雄辩和坚固性(是的!)的所有动态性(好的和运行时的错误)。通过增加运行时膨胀和散列表查询与调用/ jmp机器指令的效率。

    在像Python这样的语言中,当您调用blah.do_it()时,它可能必须对字符串“ do_it”进行多个哈希表查找,以查明您的instance

等等或其类是否具有可调用的东西“ doit”每次被调用。这是可以想象到的最极端的后期装订:
flarg.do_it() # replaces flarg.do_it()
flarg.do_it() # calls a different flarg.do_it()

您可以让您的假设语言对何时发生绑定进行控制。类似于C ++的标准方法是静态绑定到表观引用类型,而不是实际实例类型。 C ++虚拟方法晚绑定到对象实例类型。类似于Python的属性和方法extremely

绑定到对象实例的当前版本。

我认为您绝对可以使用动态样式的强大静态类型语言进行编程,就像可以使用C ++或Java这样的语言来构建解释器一样。一些语法挂钩可能会使它看起来更加无缝。但是也许您可以反过来做同样的事情:也许是一个自动检查参数类型的Python装饰器,还是在编译时执行它的MetaClass? [不,我认为这是不可能的...]

我认为您应该将其视为功能的结合。 但是您会同时获得最好的[[和

两者都是最糟糕的] ...
是否有一种语言具有编译时检查的优点(如Java),但具有使变量不受特定类型的约束(如Python)的能力?

实际上,大多数语言都支持这两种语言,所以是的。区别在于哪种形式是首选/更容易使用且通常使用。 Java更喜欢静态类型,但也支持动态类型转换和反射。

该理论语言没有参考类型,因此不会进行强制转换。

您必须考虑到语言也需要表现得相当不错,因此您必须考虑如何实现它们。您可能有一个超级类型,但这会使优化非常困难,并且您的代码很可能会运行缓慢或使用更多的资源。

更流行的语言往往会做出务实的实现选择。它们不是纯粹的一种类型,还是愿意借用样式,即使它们不能像“纯”语言一样干净地处理它们。

它们究竟允许编译器或程序员执行动态类型不能执行的操作?

人们普遍认为,发现错误的速度越快,修复它的成本就越低。刚开始编程时,维护的成本并不高,但是一旦您有了更多的经验,您就会意识到,成功的项目维护的成本远比开发和修复长期存在的错误要高得多。昂贵。

静态语言有两个优点

    您提早发现错误,而不是稍后。越早越好。使用动态语言,如果代码从不运行,则可能永远不会发现错误。
  • 维护成本更容易。静态语言可以使代码首次编写时的假设更加清晰,并且如果您没有足够的测试覆盖范围(顺便说一句,您从来没有足够的测试覆盖范围),更有可能检测到问题。
  • 不,你不能。这里的差异归结为早期绑定与后期绑定。早期绑定意味着预先在二进制级别匹配所有内容,并将其固定在代码中。结果是严格的,类型安全的和快速的代码。后期绑定意味着涉及某种运行时解释。这导致灵活性(可能不安全),但会降低性能。

    [这两种方法在技术层面上是不同的(编译与解释),并且程序员必须选择何时需要的,这将使同时拥有两者的好处失去作用。

    在使用(公共)语言运行时的语言中,您确实通过反射得到了一些要求。但是它的组织方式不同,仍然是类型安全的。它不是您所指的隐式绑定,而是需要程序员的一些工作和意识。

    就静态类型而言是不可能的,而动态类型则不可能:无。他们俩都图灵完成了

    静态类型的价值在于尽早发现错误。在Python中,只有在运行程序之前,并且只有在运行带有拼写错误的代码行时,才能捕获到拼写错误的名称之类的简单内容。

    class NuclearReactor(): def turn_power_off(self): ... def shut_down_cleanly(self): self.turn_power_of()


  • 1
    投票
    是否有一种语言具有编译时检查的优点(如Java),但具有使变量不受特定类型的约束(如Python)的能力?

    1
    投票
    不,你不能。这里的差异归结为早期绑定与后期绑定。早期绑定意味着预先在二进制级别匹配所有内容,并将其固定在代码中。结果是严格的,类型安全的和快速的代码。后期绑定意味着涉及某种运行时解释。这导致灵活性(可能不安全),但会降低性能。

    0
    投票
    就静态类型而言是不可能的,而动态类型则不可能:无。他们俩都图灵完成了
    © www.soinside.com 2019 - 2024. All rights reserved.