Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 其他编程语言中类似OSGi的模块化_Java_Osgi - Fatal编程技术网

Java 其他编程语言中类似OSGi的模块化

Java 其他编程语言中类似OSGi的模块化,java,osgi,Java,Osgi,Java中OSGi框架提供的严格的模块化概念是否可以在任何其他编程语言中使用 我觉得C++中的代码 /Cord>类有点类似,但是它看起来是一个更为松散的控件。我不确定friend概念是否可以应用于名称空间级别 在其他语言中,我不知道,如果有人能在这里提供一些见解,我将不胜感激。有很多语言都有模块系统。立即浮现在脑海中的三个系统是标准ML的模块系统、Racket的单元系统和Newspeak的模块系统 一些人认为这三个系统比OSGi或类似系统更强大或设计更好(或两者兼而有之) 我特别喜欢Newspe

Java中OSGi框架提供的严格的模块化概念是否可以在任何其他编程语言中使用

<>我觉得C++中的代码<朋友> /Cord>类有点类似,但是它看起来是一个更为松散的控件。我不确定
friend
概念是否可以应用于
名称空间
级别


在其他语言中,我不知道,如果有人能在这里提供一些见解,我将不胜感激。

有很多语言都有模块系统。立即浮现在脑海中的三个系统是标准ML的模块系统、Racket的单元系统和Newspeak的模块系统

一些人认为这三个系统比OSGi或类似系统更强大或设计更好(或两者兼而有之)

我特别喜欢Newspeak模块系统,因为它非常简单。事实上,Newspeak甚至没有真正的模块系统,它只是证明如果你认真对待面向对象,类会自动变成模块定义,对象会自动变成模块

这与其他模块系统(如标准ML、Racket或OSGi)形成了鲜明的对比,后者通常非常复杂。以下是BitC编程语言设计师乔纳森·夏皮罗(Jonathan Shapiro)关于设计模块系统的一段有趣的话:

ML模块系统只有David MacQueen才能完全理解,而且只能在每周交替使用。Scheme模块系统需要Matt Flatt和Matthias Felleisen(以及语言标准的六个修订版)的共同才华才能实现

当被问及为什么哈斯克尔只有这样一个基本的模块系统时,哈斯克尔的设计师之一西蒙·佩顿·琼斯(Simon Peyton Jones)说,他们觉得自己不够聪明,无法设计出真正的模块系统。让它沉入。。。哈斯克尔的设计师们。不聪明

Newspeak的设计非常出色:在面向对象中,一切都是消息发送(在Java语言中是(非静态)方法调用,在C++语言中是虚拟函数调用)。不幸的是,在大多数面向对象语言中,这是不正确的。您有变量、字段、常量、非虚函数、静态方法、类字典、包字典等等。访问其中任何一个都不是通过消息发送,而是通过其他方式

在新闻语中并非如此:在新闻语中,一切都是信息发送。甚至类的超类也是消息发送。(例如:如果我在Newspeak中编写
class Foo extensed Bar
,那么
Bar
并不是对类本身的引用,它只是调用一个名为
Bar
的方法,然后该方法将返回一个类。顺便说一句,这意味着您可以在子类中重写超类,这非常令人兴奋。)

这意味着顶级类不能有超类:因为超类是message send,所以您将它发送到哪里?在顶级类中,只能调用在类本身中定义的方法:不能从封闭范围调用方法,因为在顶级类中没有封闭范围。您不能调用从超类继承的方法,因为为了声明超类,您需要调用一个方法,但是您只能调用在类内部定义的方法

现在,这不是很有用,所以类有类初始值设定项,它允许您将对象(类就是对象)注入到类中。这是向类中注入依赖项的唯一方法,因此类初始值设定项作为模块依赖项规范发挥作用

另一方面,如果做某事的唯一方法是通过消息发送,那么类的内部自动是私有的,它的功能只能通过调用公共方法来实现。因此,公共方法作为模块接口规范发挥作用

其他一些很酷的功能也会自然而然地从中消失。许多其他模块系统没有的特性:由于模块实际上只是一个类,因此可以有多个模块实例,只需像对任何其他类一样多次调用构造函数。在许多其他模块系统中,模块都是单例的

而且,您可以将参数传递给构造函数,从而为您提供参数化模块,这通常仅由非常高级的模块系统支持(如果有的话)