通过类构造所有代码并编译为类(如Java)的优缺点


13

编辑:与Java不同,我的语言允许多重继承。

我已经开始设计和开发自己的编程语言,用于教育,娱乐和可能有用的目的。

首先,我决定将其基于Java。

这意味着所有代码都将以类的形式编写,并且代码会编译为类,这些类由VM加载。

但是,我排除了诸如接口和抽象类之类的功能,因为我发现不需要它们。他们似乎在强制范式,我希望我的语言不要这样做。但我想将这些类保留为编译单元,因为实现起来似乎很方便,熟悉,而且我只是喜欢这个想法。

然后,我注意到我基本上只剩下一个模块系统,在该系统中,类可以用作“命名空间”,使用static指令提供常量和函数,或用作需要实例化的对象的模板(类的“实际”目的)其他语言)。

现在我不禁要问:将类用作编译单元有什么好处和坏处?

另外,对于我的设计的任何一般性评论也将不胜感激。可以在以下网站找到有关我的语言的丰富信息:http : //www.yannbane.com/2012/12/kava.html


1
如果这些类还包含可消除类中所有标识符歧义的名称空间,则您将拥有一个完全独立的编译单元。只要可以通过编译或引用程序集中的已编译类满足对其他类的所有依赖关系,则可以成功编译该类。这种原子性应该具有明显的优势。
罗伯特·哈维

旁注:如果删除抽象类和接口,则迫使人们使用继承进行子类型化和多态。那势必会产生可怕的代码。另外,除非添加多个继承(并处理相关问题),否则它的限制是难以置信的。

1
@delnan:实际上,您仍然可以使用组合来构建功能。
罗伯特·哈维

2
@RobertHarvey我假设您在谈论的是缺乏多重继承的限制。是的,可以用足够的构图来模仿它,但是我几乎认为它不能接受。例如,通常会实现两个接口的对象必须在不同的基类的子类中实现两次(并且尽管两种实现都可以委托给一个公共类,但这仍然是一堆额外的代码,您不能轻易转向将一个实例转换为另一个实例)。

@delnan:使用继承进行子类型化和多态性有什么问题?那就是继承的目的……
Mason Wheeler

Answers:


6

将类作为编译单元有什么好处?

它可以减少语言的复杂性。无需使用不同的构造,所有内容均相同。在某些设计中(虽然看起来不是您所希望的),您将从中受益,因为它们没有静态变量以及它们容易遇到的设计问题(初始化顺序问题,并发限制,泛型/类型类的笨拙)。它还带来了模块概念的一些好处,例如用于沙箱或并行化的隔离模块实例;以及依赖项适合某个接口的模块类型,可以实例化并插入整个实现模块的价值。

就是说,这个概念往往有更多的问题。实际上,你不能把一切都一样,因为“顶级”类需要就像有一个默认的构造函数(或者你遇到了奇怪的问题旋转起来)的特殊规则。编译单元的模块化也往往变得很尴尬。当一个班级只是班级时,班级甚至如何引用其他人?如何处理这些依赖关系,以及如何确定分类的正确顺序?您如何确保重复的类引用被应用程序的不同部分重用(或者,如果这是您想要的语义,那么如何处理重复的实例)?

研究之后,我遇到了很多有关依赖项的问题,正确确定范围和初始化问题。您最终会遇到使“顶级类”变得特别的问题,以及使它们起作用的许多限制,最终使它们变成简单的名称空间。


我只打算开设一个顶级班Object。我意识到我可能需要一些特殊的行为,但是只要是一个孤立的案例,我就可以接受。我不相信我会遇到任何依赖问题。VM启动时会加载一组类,其中一些是本机实现的(System类),但它们都继承自Object。加载完所有内容后,KVM会加载指示加载的类,并计算出依赖项。但是,我很感兴趣,静电会引入哪些问题?
jcora

@yannbane- object我的意思不是,我的意思是类的行为类似于模块,而不是内部类,它们不一定在其编译单元之外公开。如果您想要任何种类的DLL样式行为,“详细了解依赖项”将变成细节中的“大黄蜂”巢;嗯 至于静态
Telastyn

通过使用静态方法/变量可以实现类似模块的行为,对吗?是否创建一个仅包含静态成员和方法的类,而不是创建可以实例化的类,是否不好?我看到了那篇文章,但是,我认为它不适用于常量静态成员或静态方法。例如,在创建一个Math类时,我没有发现任何错误,该类实际上是具有静态方法和称为的恒定静态双成员的模块Pi
jcora 2012年

@yannbane-不,不是真的。模块是模块,因为它们是可实例化的。否则,您只有C ++样式的名称空间。一旦将顶级类限制为C ++样式名称空间,它们就不再是真正的类了。
Telastyn

嗯,我还是可以的,我真的看不到用类创建模块的问题。是的,模块确实充当命名空间,尤其是Python模块。
jcora

4

除了回答这个问题之外,我将上一层并建议研究MIT OpenCourseWare,尤其是6.035(计算机语言工程)。这将解释整个问题,从而使您不会被诱惑再次提出这样的问题。

计算机语言工程

唯一的先决条件是Java。

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

课程说明

本课程分析与高级编程语言的实现相关的问题。涵盖的主题包括:编译器的基本概念,功能和结构,理论与实践的交互以及构建软件时使用的工具。该课程包括一个有关编译器设计和实现的多人项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.