问题标签 [static-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 在多大程度上是一种静态类型语言?
我曾经认为这个问题的答案是“ 100% ”,但最近有人指出了一个值得三思的例子。考虑一个声明为具有自动存储持续时间的对象的 C 数组:
这里的类型foo
很明显int[42]
。相反,考虑这种情况:
这里的类型foo
是int*
,但是如何知道在编译时由表达式创建的对象的类型呢?new
(强调是为了强调我不是在谈论表达式返回的指针new
,而是谈论由表达式创建的数组对象new
)。
这是 C++11 标准的第 5.3.4/1 段对new
表达式结果的规定:
[...] 由new-expression创建的实体具有动态存储持续时间 (3.7.4)。[注意:此类实体的生命周期不一定限于创建它的范围。—尾注] 如果实体是非数组对象,则new 表达式返回指向所创建对象的指针。如果它是一个数组,则new 表达式 返回一个指向数组初始元素的指针。
我曾经认为在 C++ 中,所有对象的类型都是在编译时确定的,但上面的例子似乎反驳了这种看法。此外,根据第 1.8/1 段:
[...] 对象的属性是在创建对象时确定的。一个对象可以有一个名称(第 3 条)。对象具有影响其生命周期 (3.8) 的存储持续时间 (3.7)。一个对象有一个类型(3.9)。[...]
所以我的问题是:
- 最后引用的段落中的“属性”是什么意思?显然,一个对象的名称不能算作“在创建对象时”确定的东西——除非“创建”在这里的意思与我想的不同;
- 是否还有其他类型仅在运行时确定的对象示例?
- 说 C++ 是一种静态类型的语言在多大程度上是正确的?或者更确切地说,在这方面对 C++ 进行分类的最恰当方法是什么?
如果有人可以至少详细说明上述几点,那就太好了。
编辑:
该标准似乎清楚地表明该new
表达式确实创建了一个数组对象,而不仅仅是一些人指出的以数组形式排列的几个对象。根据第 5.3.4/5 段(由Xeo提供):
当分配的对象是一个数组(即使用noptr-new-declarator语法或new-type-id或 type-id表示数组类型)时,new-expression 产生一个指向初始元素的指针(如果任何)的数组。[注意:两者都
new int
具有new int[10]
类型int*
,并且类型new int[i][10]
是int (*)[10]
--end note] noptr-new-declarator中的属性说明符序列属于关联的数组类型。
compiler-construction - 解析外部模块中的函数类型
假设我们有一种虚构的静态类型编程语言——我们称之为SL。每个 SL 文件对应一个模块- SL 将相关功能逻辑分组到命名空间中。
对当前模块中的函数的调用很容易检查:编译器通过发现所有声明的函数并存储它们的签名。我们稍后可以通过将参数类型与签名中形式参数的类型进行比较来验证任何此类调用。
但是,处理对其他模块中的函数的调用似乎更复杂一些。特别是,假设编译器可以定位到与导入模块名称对应的源代码/目标代码,它是如何提取类型信息的呢?可以:
- 扫描解析导入模块的源代码,直到找到函数声明?
- 从目标文件中读取某种元数据?
- 对符号名中的函数返回类型和参数类型进行编码,并在编译时读取符号表?
- 在其他地方查找元数据?
我很好奇 Haskell、D 和 Go 等现代语言的编译器采用什么方法。
编辑:我知道 C 和 C++ 使用头文件解决了这个问题。我对这种方法不感兴趣。理想情况下,我正在寻找一个根本不涉及任何解析的解决方案。
clojure - How to implement a type system with clojure core.logic
I read in the interview with Rich Hickey that he would be interested in "using logic systems in place of a type system for Clojure". I also bumped into this statement in a SO answer, https://stackoverflow.com/a/6324228/380587 I can't see how logic and type system are related.
c# - 从方法接收匿名类型,在编译时知道它的成员
我知道有很多关于 C# 匿名类型的问题,但没有一个回答我。我也知道您可以返回匿名类型,或者将方法的结果分配给一个dynamic
对象,或者按照 Jon Skeet 的这篇文章所述将其强制转换,但在这两种情况下,您都需要知道哪些是匿名对象的成员,那么为什么难道我们不能有一种名为的关键字anonymous
,它允许我们做这样的事情:
然后像这样使用它:
但是有静态类型?我的意思是,为什么编译器不能静态知道哪些是匿名对象F
方法返回的成员,所以给我智能感知?
language-design - 泛型类型、编译器和动态语言
在公开招标中有以下声明:
“在面向对象编程中使用泛型类型有助于在编译时进行类型检查。”
这是真的还是假的?我认为这是错误的,因为类型检查编译器没有改进,这与面向对象无关,而是与语言类型(弱类型或强类型)有关。有人请帮我解释为什么这个说法是错误的。
strong-typing - STRONG打字和STATIC打字的区别
我知道静态类型和动态类型之间的区别,我也知道强类型和弱类型之间的区别,但是有人问我一个关于强类型和静态类型之间区别的问题!
但据我所知,强类型和静态类型从一开始就谈论不同的主题!所以我不知道如何回答这个问题,有人知道他们的意思吗?
scala - scala中可克隆特征的正确类型规范
问题不是关于AnyRef.clone()
,而是关于具有相似语义的案例。
我想为可能创建自身副本的类定义一个接口:
路径依赖this.type
不起作用,因为this.type
类Test
类型和扩展Test
. 然后后代应该覆盖克隆方法以匹配它自己的类型。
我应该如何定义 Cloneable 特征的类型要求?
我查看了 scala 集合并在这里找到了提示:定义TestLike
trait,处理类型限制,以及Test
体现相应 trait 的类。
如果可能的话,我想避免不必要的笨拙
按照建议尝试自我重复模式:
失败并出现错误:
重复模板中的另一个问题:过早完成
问题SubStore
在于类型系统忽略clone()
了类中不存在的方法,SubStore
尽管SubStore
是Cloneable
via 的后代Store
。但是带有类型参数的Store
finalizeCloneable
接口Store
及其所有后代都缺乏适当的clone()
方法限制
compiler-construction - Lisp 如何既是动态的又是编译的?
好的,首先要解决这个问题:我已阅读以下答案:
但我真的不明白它的答案。
在像 Python 这样的语言中,表达式:
无法真正编译,至于“编译器”,不可能知道 a 和 b 的类型(因为类型仅在运行时才知道),因此无法知道如何添加它们。
这就是没有类型声明就无法编译像 Python 这样的语言的原因,对吗?通过声明,编译器知道例如 a 和 b 是整数,因此知道如何添加它们,并将其转换为本机代码。
那么如何:
工作?
编译被定义为本地提前编译。
编辑
实际上,这个问题更多是关于是否可以编译没有类型声明的动态语言,如果可以,如何编译?
编辑 2
经过大量研究(即狂热的维基百科浏览),我想我了解以下内容:
- 动态类型语言是在运行时检查类型的语言
- 静态类型语言是在编译程序时检查类型的语言
- 类型声明允许编译器使代码更高效,因为它可以使用更多本机“函数”而不是一直进行 API 调用(这就是为什么您可以向 Cython 代码添加类型声明以加速它,但没有到,因为它仍然可以只调用 C 代码中的 Python 库)
- Lisp 中没有数据类型;因此没有要检查的类型(类型是数据本身)
- Obj-C 既有静态声明也有动态声明;前者在编译时进行类型检查,后者在运行时进行
如果我在上述任何一点上错了,请纠正我。
python - Python 中可选静态类型的现状?
我玩 Typscript 已经有一段时间了,我得说,结合 nodejs 比当前的 CPython 实现更快以满足我的 Web 开发需求的事实,我更倾向于用它做更多的事情。
事实上,我已经用它制作了几个基本的应用程序,甚至是桌面应用程序。我喜欢 Typescript 的地方在于它具有可选的静态类型。这通常使编码变得更容易,更不用说智能感知在您想要快速编码并运行原型时非常棒。我在开发过程中也遇到了更少的错误。
但问题就在这里,我已经使用 Python 一年了,我喜欢这种语言,而且我更习惯于它的语法。然而,我越来越多地看到可选的静态类型对于 Python 来说是一个很棒的加分项。所以,我做了一些研究,我首先尝试了解静态类型现在的情况。就像其他人一样,我使用搜索引擎来查找。
以下是我阅读过的一些信息来源:
如果您看一下这里的实现(摘自上面的链接):
现在,这看起来与 Typescript 中的实现非常相似。但是,如果您查看日期,它会一直追溯到2004。
然后,我又看了一张 BDFL,Guido 制作的幻灯片:
再一次,你看到了同样的言论。但是,我无法找到有关此的任何新信息。
我还查看了@this SO answer on enforcing static types。
那么,我想问一下,在Python中添加可选静态类型是什么情况或状态?或者我们是否需要为 Python 3 发明类似 Typescript 的东西?
我相信可选的静态类型很重要,因为在我自己非常有限的经验中,我已经看到像 Typescript 和 C# 这样的东西更好地工作,因为在制作复杂的类或制作大型项目时,我已经看到静态类型已经走了很长时间帮助我更快且无错误地编写代码的方法。我确信我没有这里的大多数开发人员那么好,但这是我的看法。这就是为什么我觉得这个问题很重要。我的意思是,如果您可以使用 Python 提供的优美语法选择像 C# 这样的语言,那么 Python 可能势不可挡(耶!)。
我对此进行了一些研究,但没有得到任何实质性的东西,所以我希望 SO 的一些出色而明智的成员能够阐明这个问题。
java - 仅使空值选择加入
让我们假设我讨厌 null。让我们假设像@Nullable 那样选择退出对我来说还远远不够。假设我希望它选择加入;如果一个对象没有使用@Nullable 显式注释,则不允许使用空值。
例子:
另一个例子:
我该怎么办?我会写一些javac插件吗?也许是预编译器通行证?也许有一个框架可以做到这一点?或者我可以修改javac的源代码?
谢谢!