问题标签 [compile-time]
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.
oop - 没有类型转换的语言
我的问题几乎就是标题所说的:是否有可能拥有一种不允许显式类型转换的编程语言?
为了澄清我的意思,假设我们正在使用一些类似 C# 的语言,有一个父Base
类和一个子Derived
类。显然,这样的代码是安全的:
由于向上继承层次结构是安全的,但是
不能保证安全,因为下去是不安全的。
但是,不管安全性如何,这种向下转换在许多语言(如 Java 或 C#)中都是有效的 - 代码将编译,如果类型不正确,它将在运行时失败。所以从技术上讲,代码仍然是安全的,但是通过运行时检查而不是编译时检查(顺便说一句,我不喜欢运行时检查)。
我个人会发现完整的编译时类型安全非常重要,至少从理论角度来看,最多从可靠代码的角度来看。编译时类型安全的一个结果是不再需要强制转换(我认为这很好,因为无论如何它们都很丑)。任何类似强制转换的行为都可以通过隐式转换运算符或构造函数来实现。
所以我想知道,目前是否有任何 OO 语言在编译时提供如此严格的类型安全,以至于强制转换已过时?即,他们不允许任何不安全的转换操作?或者有什么原因这不起作用?
感谢您的任何意见。
编辑
如果我可以举例说明,这就是我如此讨厌沮丧的主要原因。
假设我有以下内容(大致基于 C# 的集合):
现在假设有人决定编写如下代码:
请注意最后一行的演员表是如何必要的。但它有效吗?一般不会。List<T>.Filter
当然,实现将返回另一个是有道理的List<T>
,但这不是保证(它可以是 的任何子类型IEnumerable<T>
)。即使它在某个时间点运行,以后的版本也可能会改变这一点,暴露出代码的脆弱性。
几乎所有我认为需要向下转换的情况都可以归结为像这个例子这样的东西——一个方法具有某个类或接口的返回类型,但是由于我们知道一些实现细节,我们有信心向下转换结果。但这是反 OOP 的,因为 OOP 实际上鼓励从实现细节中抽象出来。那么我们为什么要这样做,即使是纯粹的 OOP 语言呢?
c++ - 编译时的 C++ 类型 ID
我想在编译时根据其派生类型为类生成哈希。今天我像这样生成它:
但这会生成(非常不必要的)运行时初始化代码( hash(..) 函数基于 std::type_info::name() 进行简单的哈希)
想法?
serialization - c++0x 中是否可以“无重复序列化”?
c++ 中代码生成的一大用途是支持消息序列化。通常,您希望支持在同一步骤中指定消息内容和布局,并为该消息类型生成代码,这些代码可以为您提供能够序列化到通信流/从通信流序列化的对象。在过去,这通常会导致代码如下所示:
使用这种设计的问题在于违反了良好架构的重要规则:您不应该两次指定设计的意图。意图重复,就像重复代码和其他常见的开发重复一样,会为代码中的一个地方与另一个地方产生分歧留下空间,从而导致错误。
在上面,重复的是成员列表。潜在的错误包括将成员添加到类但忘记将其添加到序列化列表中,将成员序列化两次(可能是由于不使用与成员声明相同的顺序,或者可能是由于类似成员的拼写错误等原因) ,或序列化不是成员的东西(这可能会产生编译器错误,除非名称查找在与匹配查找规则的对象不同的范围内找到某些东西)。这种错误与我们不再尝试将每个堆分配与删除(而不是使用智能指针)或使用关闭(使用 RAII ctor//dtor 机制)匹配打开文件的原因相同——我们不
因此,通常这是代码生成可以处理的事情之一。您可以创建一个文件 MyMessage.cg 以一步指定布局和成员
这将通过代码生成实用程序运行并生成代码。
我想知道是否有可能在没有外部代码生成的情况下在 c++0x 中执行此操作。是否有任何新的语言机制可以将一个类指定为可序列化一次,并且其成员的名称和布局用于在序列化期间布局消息?
需要明确的是,我知道即使在 c++0x 之前的语言中,也有一些使用 boost 元组和融合的技巧可以接近这种行为。但是,这些用法基于对元组的索引而不是按成员名称访问,对于更改布局都很脆弱,因为代码中访问消息的其他位置也需要重新排序。为了不必在使用消息的代码中的位置复制布局规范,必须进行某种按成员名称访问。
另外,我知道将其提升到一个新的水平并要求指定何时不应该对某些成员进行序列化可能会很好。其他提供内置序列化的语言通常会提供某种属性来执行此操作,因此 int myNonSerialisedNumber_ [[noserialise]]; 可能看起来很自然。但是,我个人认为在所有内容都未序列化的情况下拥有可序列化对象是一种糟糕的设计,因为消息的生命周期是在往返于通信层的传输中,与其他数据生命周期分开。此外,您可以拥有一个对象,该对象具有纯可序列化的成员,因此该语言尚未提供此类功能。
这可能吗?还是标准委员会遗漏了这种内省能力?我不需要它看起来像上面的代码生成文件 - 任何简单的布局和成员的编译时规范在一个步骤中的简单方法都可以解决这个常见问题。
android - Android-在编译时存储大文件
在这个精美的过于复杂的框架中,人们究竟是如何完成如此简单的事情的?
是的,我已经阅读了有关 Android 数据存储的文档,大约 54.5 次。但是我找不到文档描述如何在编译时将文件放在外部存储上的任何地方。
这就是我想要做的:我想在我的应用程序中包含几个(大)(10-20mb)音频文件。当然,我不希望这些存储在内部存储中,因为它们太大了。所以将它们放在 res/raw 中不是一种选择(因为,如果我理解正确的话,res/raw 中的东西将被放置在手机的内部存储中,对吗?)
该文档仅声明“如果要在编译时存储静态文件,请使用 res/raw”。现在,如果 Android 足够聪明,可以将这些文件完全单独放在外部存储上,那么我永远都很棒。但不知何故,我对此表示怀疑。感谢所有帮助:)(对不起,如果我有一种态度,我只是在这么简单的事情上花了太多时间)
再次感谢 :)
更新:我最终从应用程序下载文件,而不是在安装时包含它们。谢谢你们的帮助!
我在尝试通过 url 下载时遇到问题,花了很多时间试图让它工作,最后问题是因为我没有在 android manifest 文件中声明正确的权限!所以对于任何想要在他们的应用程序中下载东西的人,不要忘记在 android 清单中设置权限,这里是我需要的权限:
将这些放在标签的开头
python - 与 Python 相比,scala 的慢编译是否是在网站项目中使用它的一个因素?
在我的网站项目中,现在使用 python 或 scala 存在冲突。反对 scala 的一个论点是它的编译时间很慢,而 Python 甚至不编译。根据这个问题给出的答案, 为什么 IntelliJ IDEA 编译 Scala 这么慢?
所以我的问题是关于一个网站,更重要的是要考虑什么。一种语言的编译时间慢或一种语言的执行速度慢。scala的慢编译时间是一个影响因素吗?Scala 的 AFAIK 编译代码将比解释的 python 代码运行得更快。
注意 - 语言无法扩展但架构和代码可以扩展是正确的,但使用运行速度快的语言不会有任何坏处。
scala - 上课在编译时?
在 Java 中,您可以编写:
我正在玩 Scala 并想要更多:我想在编译时获得一个方法(及其泛型类型),如下所示:
甚至:
有没有办法在 Scala 中做这样的事情?
visual-studio-2010 - 在编译时将引用路径从 GAC 更改为文件夹
我有一个依赖于一些 3rd 方库的项目。这些程序集在 GAC 中注册。到目前为止,一切工作正常。但是在构建服务器上构建项目时,第 3 方程序集不在 GAC 中,而是在一个额外的文件夹(称为external)中,该文件夹也在构建服务器使用的 SVN 存储库中。
由于 MSBuild 找不到这些程序集,构建将失败。有没有办法告诉构建服务器上的 MSBuild 使用此文件夹中的程序集而不是 GAC?
reflection - 如何在编译时在 D 中枚举结构或类中的名称和类型?
如何在编译时枚举结构或类中的名称和类型?
即执行以下操作:
谢谢,
克里斯。
c++ - C++ 类型特征概述
有没有人列出标准<type_traits>
(GCC-4.6.1)和Boost自己的所有类型特征的列表<boost/type_traits.hpp>
?
c# - WAP 中的 ProfileCommon 在运行时工作但不在编译时工作
我有一个 Web 应用程序项目并在 web.config 中实现了配置文件属性。当我发现我无法访问该ProfileCommon
对象时,我用谷歌搜索并找到了一些解决方法:
- 如何从会员提供者获取用户/个人资料列表?
- 如何分配配置文件值?
- “名称 ProfileCommon 在当前上下文中不存在”
- http://forums.asp.net/t/1487719.aspx/1?profile+common+non+existant+in+ASP+NET+4+0+
- http://weblogs.asp.net/jgalloway/archive/2008/01/19/writing-a-custom-asp-net-profile-class.aspx
等等。但是没有人说我ProfileCommon
在运行时有一个对象。这是我的例子:
此行编译良好且工作正常,但我有硬编码的属性名称:
但是这一行没有编译并给出错误:找不到类型或命名空间名称“ProfileCommon”(您是否缺少 using 指令或程序集引用?)):
但是在运行时,我尝试在 Visual Studio Watch 窗口中执行该行并且它起作用了!它事件显示了没有演员表的ProfileBase.Create(userCurrent.UserName)
as类型。ProfileCommon
Intellisense 不起作用,但可以检查对象,我看到它定义了两个配置文件属性。
如果这是除自定义类之外的唯一方法,我不介意使用硬编码的配置文件属性名称ProfileCommon
,但我想解释一下为什么ProfileCommon
该类在运行时可用而不是编译时可用?