楼主: 大多数88
979 25

[计算机科学] 语义网络基础上的通用计算 [推广有奖]

11
何人来此 在职认证  发表于 2022-4-15 10:01:03
在典型的编程环境中,programminglanguage及其计算机受到RAM(以及大多数现代操作系统中的虚拟内存)大小的限制。对于32位计算机,RAM的最大大小约为4GB。这意味着RAM中只有2个可能的地址和单词。然而,对于Neno来说,不存在这样的限制。allUUIDs的空间是Fhat RVM的地址空间(更一般地,所有URI和文字的空间都是地址空间)。Fhat不使用RAM存储数据和指令,Fhat使用RDF网络。因此,Fhat对它为处理“分配”多少内存没有任何硬约束。3.2类声明中的Neno源代码代码中的语法与其他面向对象语言非常相似。例如,假设下面用Java编程语言编写的简单类:package gov.lanl.neno.demo;import Java.lang.*;import Java.lang.*;public class Human{private String hasName;private arraylist<Human>hasfriend;public Human(String n){this.hasName=n;}public void makeFriend(Human h){if(h!=this)this.hasfriend.add(h);}public void setName(String n){this.hasName=n;}fiefeld hasName takesa String值(更详细地说是java.lang.String),而hasFriend则采用了人类的avalue。Human类有一个构造函数和一个方法。构造函数用于创建对象,是方法的一种类型。在Java中,构造函数告诉JVMT为堆(即对象“池”)上的对象分配内存,并根据构造函数主体中的语句设置对象的field值。Human的构造函数接受一个名为n的字符串,并创建一个名为Object的新的Human实例。Human构造函数将该对象的hasName field设置为n。人类的方法被称为Makefriend。此方法将变量名为h的人作为参数。如果h引用的对象不是调用此方法的人,那么调用此方法的对象已将h添加到其hasFriend中。注意,与图2中的示例不同的是,由于使用了ArrayList<Human>,Neno编程语言类似于Java。下面的源代码演示了如何在Neno中声明几乎相同的类。prefix owl:<http://www.w3.org/2002/07/owl>;prefix xsd:<http://www.w3.org/2001/xmlschema>;prefix demo:<http://Neno.lanl.gov/demo>;owl:thing demo:Human{xsd:string hasname[1];demo:Human hasfriend[0..*];!Human(xsd:string n){this.hasname=n;}makeFriend(demo:Human h){if(h!=在尼诺语中几乎是相同的,有afew结构使两种语言相互联系。首先,在Neno中,不是“导入”包,而是声明名称空间并导入本体。为了简化名称空间声明,使用了prefixes(例如,owl、xsd和demo)。所有构造函数都由类名表示!符号。类似地,尽管不是在上面的例子中,所有的析构函数都是由~符号预填的类名来表示的。请注意,alldatatype原语(例如XSD:string)来自XSD命名空间。Fhat RVM是专门为这些数据类型设计的。Nenolanguage最独特的方面可能是firefeld声明中的基数限制specifireer(例如[0.1])。因为Neno是为语义网络基板设计的,所以没有什么可以阻止相同的属性(即field)指向多个直接URI。为了要求不存在一个以上的field,使用了[0.1]符号。注意demo:humanis是owl:thing的rdfs:子classes,由owl:thing demo:human classDescription指定。

12
能者818 在职认证  发表于 2022-4-15 10:01:10
类继承由类名声明的prefirex指定。请注意,在Neno中,一个类只能有一个父类,即使OWL支持多重继承。此外,请注意,所有类属性对类或数据类型值都有一个通用限制。例如,在上面的demo:human类中,hasName属性必须有一个xsd:string值,并且所有hasFriend属性都是musthave demo:human values。Java 1.5+支持<>符号表示的Java泛型。当命名中没有歧义时,可以编写类声明而不使用前置代码。请注意,像Java和C++这样的语言确实保留了包名称空间的概念。这个约束不适用于owl:restrictions,因为Neno类利用owl:restrictions来makeexplicit属性限制。因此,排除OWL:Restriction子类,Neno对象类只能是单个类的子类。Marko a.Rodriguez-2007 13为了演示Neno源代码与其compiledOWL API之间的关系,给出了以下简单的类示例。classprefix OWL:<http://www.w3.org/2002/07/OWL>;前缀xsd:<http://www.w3.org/2001/xmlschema>;前缀demo:<http://neno.lanl.gov/demo>;OWL:thing demo:example{xsd:integer t[0.1];test(xsd:integer n){for(xsd:integer i=0;i<n;i++){this.t=this.t+1;}}}具有以下OWL RDF/XML表示:<rdf:rdfxmlns:rdf=“http://www.w3.org/1999/02/22-rdf-syntax-ns#”xmlns:rdfs=“http://www.w3.org/2000/01/rdf-schema#”xmlns:OWL=“http://www.w3.org/2002/07/OWL#”><OWL:ontology rdf:about=“http://neno.lanl.gov”/><OWL:ontology rdf:about=“http://neno.lanl.gov”/><OWL:ontology rdf:about=“http://neno.lanl.gov/demo”><OWL:imports rdf:resource=“http://neno.lanl.gov”p://neno.lanl.gov/demo#2271ea72-877c-4090-9f89-...“><rdfs:subclassof rdf:resource=”http://neno.lanl.gov#PUSHVALUE“/><rdfs:subclassof><OWL:restrication><OWL:onproperty rdf:resource=”http://neno.lanl.gov#hasvalue“/><OWL:onproperty rdf:resource=”http://neno.lanl.gov#hasvalue“llvaluesfrom></owl:restriction></rdfs:subclassof><rdfs:subclassof><owl:restriction><owl:onproperty rdf:resource=“http://neno.lanl.gov#nextinst”/><owl:allvaluesfrom><owl:class rdf:about=“http://neno.lanl.gov#nextinst”/><owl:class rdf:about=“http://neno.lanl.gov/demo#a80ba54c-5344-4df1-.../neno.lanl.gov/demo#9792cc3c-5600-4660-bc1f-...”><rdfs:subclassof rdf:resource=“http://neno.lanl.gov#localdirect”/><rdfs:subclassof><owl:restrication><owl:hasvalue rdf:datatype=“http://www.w3.org/2001/xmlschema#integer”>1</owl:hasvalue><owl:onproperty rdf:resource=“http://neno.lanl.gov#hasuri”!--PUSHVALUE指令之后的下一个指令:ADD指令--><owl:class rdf:about=“http://neno.lanl.gov/demo#a80ba54c-5344-4df1-91a0-...”><rdfs:subclassof rdf:resource=“http://neno.lanl.gov#ADD”/><rdfs:subclassof><owl:restriction><owl:onproperty rdf:resource=“http://neno.lanl.goV#hasleft“/><OWL:allvaluesfrom rdf:resource=”http://neno.lanl.gov/demo#4C715D16-B6e6-...“/></OWL:restriction></rdfs:subclassof><rdfs:subclassof><rdfs:subclassof><OWL:restriction><OWL:onproperty rdf:resource=”http://neno.lanl.gov#hasright“/><OWL:allvaluesfrom rdf:resource=”SubclassOf><rdfs:subclassOf><OWL:restriction><OWL:onproperty rdf:resource=“http://neno.lanl.gov#nextinst”/><OWL:allvaluesfrom rdf:resource=“http://neno.lanl.gov/demo#e3b8a797-849b-...”/></OWL:restriction></rdf:subclassof></OWL:class>...</rdf:rdf>从上面的Fhat OWL API子集中吸取的最重要的思想是编译器的目的是

13
kedemingshi 在职认证  发表于 2022-4-15 10:01:19
这些生成的指令类有对它们的OWL:限制,以确保这些类的实例以明确的方式相互连接(例如,OWL:对它们各自nextIntproperty的限制),并确保它们的操作数值是显式的(例如OWL:对它们各自操作数属性的限制)。这个明确的实例化是在Fhat RVM实例化API时创建的RDF三重代码。例如,在上面的Fhat OWL API片段中,任何demo:2271EA72 PushValueinstruction实例都必须有一个且仅有一个hasValue属性。thatproperty的值必须是demo:9792CC3C LocalDirect值,其hasURI属性值为“1”:/<xsd:integer>。Demo:2271EA72的实例还必须具有RDF:A80BA54C类型的nextInstproperty,其中Demo:A80BA54C是RDFS:SubclassOfAdd。这个演示的一个实例:80BA54C Add指令指示Fhat RVM将hasLeft操作数和hasRight操作数加在一起。此demo:a80ba54c Add还具有一个nextInst属性值,该值必须是demo:e3b8a797的实例。虽然没有显示,但demo:e3b8a797是一个rdfs:子类集。这样,通过strictowl:restrictions,Fhat RVM可以以明确的方式生成三重代码的cunow。本节的其余部分将讨论Neno编程语言的更突出的方面。3.2.1声明名称空间通过确保在直接组织的本体和实例中没有URI名称concicts来促进语义Web的分布式性质(Brayet al.,2006)。Java语言有一个类似的结构,称为打包。Java中的PackageSpeciformation支持组织命名空间。Neno支持预先设置名称空间。例如,demo:human解析为http://neno.lanl.gov/demo#human.3.2.2DatatypesFhat被设计为处理xsd:anysimpleType,并为其任何派生类型提供特定的支持(Biron&Malhotra,2004)。XSD命名空间包括:XSD:string、XSD:double、XSD:integer、XSD:date等。示例操作包括:“neno”XSD:string+“Fhat”XSD:string“2007-11-30”XSD:date<“2007-12-01”XSD:date“1”XSD:integer-“0”XSD:integerneno对高级数据类型操作提供低级支持,如字符串连接、数据和时间比较、日期递增等。具体允许哪些操作使用哪些数据类型将在后面描述Fhat指令集时讨论。3.2.3该变量该变量是在许多面向对象语言中用于指定beaccessed的foungield或要调用的方法。所有方法本质上都有它作为他们可以使用的变量。同样的结构也存在于Neno中,但在意义上没有变化。Marko a.Rodriguez-2007 153.2.4字段基数Neno是一种面向对象的语言,也是一种语义网络编程语言。Neno更符合RDF的概念,而不是Java和C++的概念。Neno中对象的一个主要特征是对象可以有多个实例。这意味着单个firefeld(谓词)可以有多个值(对象)。例如,在JavaHuman中,marko=new Human(“marko Rodriguez”);marko.setname(“marko Antonio Rodriguez”);将首先将变量namemarko引用的Human对象的hasName foungield设置为“marko Rodriguez”。调用marko的setName方法将“marko Rodriguez”替换为“marko Antonio Rodriguez”。因此,foungield hasName的基数为1。Java中的所有firefeld都有1的基数,并且对于特定的firefeld类通常都是quantiefilited(尽管支持分类法包含)。在Neno中,firefeld的基数可能大于1。在Neno中,当声明了ena类的fields时,基数指定器用于表示该类的一个实例允许多少个此类型的属性。

14
能者818 在职认证  发表于 2022-4-15 10:01:26
因此,在本节开头的Neno代码中,xsd:string hasName[1];声明任何人类对象必须只有一个名为hasName的field(property),而hasName field指向某个xsd:string。因此,FhatRVM向类Marko添加新的hasName属性是非法的。在添加新属性之前,必须保留原始属性。foungield restrictionsin Neno的一般语法是[#(...(#*))],其中#引用一些整数值。Neno不采用任何关于基数和“semanticallydistinct”资源的OWL语义。在挖掘属性的基数时不考虑资源之间的owl:sameas关系,因此NenoFhat编译器和Fhat RVM只确认特定类型(谓词)的显式属性数(显式三元组)。3.2.5处理字段Sneno提供以下firefeld和local变量运算符:=+、=-、=/和=。这些运算符分别称为“set加”、“set减”、“set清除”和“set”。这些运算符的定义通过演示它们的用法的示例变得显而易见。例如,从上面的类声明中,Human类有field hasFriend,对于Java示例,HasFriendfield只能通过使用ArrayList<Human>类间接地具有多个Human值。在Neno中,不需要arraylist<human>,因为firefeld的基数可以大于1。基数指定器[0..*]指出,人类可以拥有的朋友数量没有限制。为了向人类对象添加更多的朋友,使用=+运算符。如果Humaninstance具有URI URN:uuid:2db4a1d2,并且提供的Human参数具有URI URN:uuid:47878dcc,则=+操作符指示Fhat在三元存储上执行INSERT{<urn:uuid:2db4a1d2><demo:hasfriend><urn:uuid:47878dcc>。另一方面,如果使用=运算符,那么Fhat将向三存储区发出以下命令:delete{<urn:uuid:2db4a1d2><demo:hasfriend>?x.}INSERT{<urn:uuid:2db4a1d2><demo:hasfriend><urn:uuid:47878dcc>。}对于多实例文件,=是一个破坏性很强的运算符。对于[0.1]或[1]field,=的行为与任何其他面向对象语言中的行为相同。此外,对于[0.1]或[1]field,=+是不允许的,因为它会导致插入同一个预测的多个属性。为了控制从多实例field中删除field,可以使用=-和=/运算符。例如,假设在NenoMarko A.Rodriguez-200716MakeEngeme(Human h){this.hasfriends=-h;}中有以下方法声明,MakeEngeme方法将从hasFriend friends中移除变量名henti所定义的人类对象。如果h变量是对URI URN:UUID:4800E2C2的引用,那么在Fhat级别,Fhat将在三元存储区上执行以下命令:delete{<urn:UUID:2db4a1d2><demo:hasfriend><urn:UUID:4800E2c2>。}最后,假设有一个流氓人类希望根本没有朋友。为了让这支单人军队断绝关系,使用=/运算符。假设followingoverloaded方法声明用于human.makeEngree(){this.hasfriends=/;}上述语句将使Fhat在triple-store上执行以下delete命令:delete{<urn:uuid:2db4a1d2><demo:hasfriend>?human}3.2.6字段查询在许多情况下,firefeld(即属性)将有许多实例。在计算机编程术语中,fields可以被认为是数组。然而,这些“数组”不是对象,只是大于一个基数而已。在Java中,数组是对象,像Java.util.ArrayList这样的高级arrayobjects提供搜索数组的函数。在Neno中,没有支持此类行为的方法,因为fireelds不是对象。相反,Neno提供了支持查询的语言结构。

15
大多数88 在职认证  发表于 2022-4-15 10:01:34
例如,假设下面的methodboolean isFriend(人类未知){if(this.hasFriend=?unknown){return true;}else{return false;}}在上面的isFriend方法中,由变量名unknown引用的提供的人类参数将根据所有的hasFriend参数进行检查。同样,owl:SameAsProperty不受尊重,因此,“相同性”是由确切的URI确定的。The=?运算符是一个条件运算符,因此,总是返回“true”:/xsd:boolean或“false”:/xsd:boolean。在Fhat级别,如果这引用了UUID URN:UUID:2D386232和未知引用URN:UUID:75E05C12,那么Fhat RVM在三元存储区上执行followingquery:ask{<URN:UUID:2D386232><Demo:HasFriend><URN:UUID:75E05C12>。}类似地,想象下面的方法,boolean isFriendByName(Human unknown){if(this.hasfriend.hasname=?unknown.hasname){return true;}else{return false;}Marko操作将使Fhat在RDF networkASK上执行以下查询{<urn:uuid:2D386232><demo:hasfriend>?x.?x<demo:hasname>?y.<urn:uuid:75E05C12><demo:hasname>?y}同样,这些三存储操作中不涉及推理;仅使用“原始”三元组和URI/Literal匹配。3.2.7循环和条件Looping和conditionals与Java语言几乎相同。在Neno中,存在for、while和if/else构造。例如,For语句是For(xsd:integer i=“0”xsd:integer;i<“10”xsd:integer;i++){/*For block*/},while语句是while(xsd:integer i<“10”xsd:integer){/*while block*/},if/else语句是if(xsd:integer i<“10”xsd:integer){/*if block*/}。文字类型可以从它的上下文中推断出来,因此编译器会自动添加它。例如,由于i是一个xsd:integer,因此假定10也是。3.2.8字段循环。在许多情况下,为了搜索或操作每个资源,需要循环fireeld的所有资源。例如,假设下面的humanMethod:namelessFaces(){For(Human h:this.hasfriend){h.hasname=“...”xsd:string;}For(xsd:integer i=0;i<this.hasfriend*;i++){Human h=this.hasfriend[i];h.hasname=“.”xsd:string;}}上面的namelessFaces方法演示了两种由neno定义的firefeld循环机制。该特性类似于Java1.5语言特性。使用figurrst for循环,变量h被设置为this的单个hasFriend。第二个for循环使用从索引0到“数组”大小的索引i(this.hasfriend*)。这个上下文中的符号返回this对象的hasFriend属性的个数。在其他单词中,返回this.hasFriend foungield的基数。最后,由于foungield值不存储在向量中,而是作为一个无序集存储,所以Neno中的foungield“数组”不能保证是有序的。因此,This.HasFriend[1]在代码后面可能不是相同的值。排序依赖于三存储区的索引算法,而特定排序的稳定性依赖于三存储区中索引的频繁程度。值得注意的是,可以将高阶类(如专用的rdf:seq和rdf:list类)划分为Arrays的有序支持。Marko a.Rodriguez-2007 183.2.9类型检查typeof操作符可用于确定URI的类类型。例如,下面的语句,xsd:boolean isType=urn:uuid:2db4a1d2如果urn:uuid:2db4a1d2是rdf:type Human或rdf:type of someclass是rdfs:subclassof Human将返回true。此外,xsd:boolean isType=urn:uuid:2db4a1d2typeof rdfs:resourceAlways返回true。

16
可人4 在职认证  发表于 2022-4-15 10:01:41
因此,RDFS包含语义得到了尊重,因此NENO尊重现代面向对象语言使用的子类语义。同样的类型?运算符返回资源的类型。例如,xsd:anyuri type=urn:uuid:2db4a1d2 typeof?返回http://neno.lanl.gov/demo#human.3.2.10反向字段引用在面向对象语言中,“点”运算符用于访问对象的方法或Field。例如,在This.HasName中,“点”的左边是object,“点”的右边是foungield。运算符的右手边是否是一个fireeld或method,编译器可以从它的上下文中推断出来。如果解析为uriurn:uuid:2db4a1d2,那么下面的Neno codeHuman h[0..*]=this.hasfriend;将指示Fhat执行以下查询:select?hwhere{<urn:uuid:2db4a1d2><demo:hasfriend>?h.}根据前面的查询,绑定到?h的所有内容都将设置为variableh。上面的查询是“定位此对象的所有人类hasFriends”。然而,Nenoo提供了另一个在其他面向对象语言中没有的概念,称为“dot dot”操作符。“dot dot”运算符支持所谓的反向引用(以及接下来讨论的反向方法调用)。在某些类的某些方法中假设以下行,Human h[0..*]=this...HasFriend;上面的语句说,“定位所有将此对象作为其HasFriend的人。”在Fhat级别,Fhat对三元存储区执行以下查询:select?hwhere{?h<demo:hasFriend><urn:uuid:2db4a1d2>。}此外,如果语句isHuman h[0.3]=this...HasFriend;Fhat将执行:select?hwhere{?h<demo:hasFriend><urn:uuid:2db4a1d2>。}LIMIT 3Marko A.Rodriguez-2007 193.2.11反向方法调用Neno支持反向方法调用。Inversemethod调用将调用满足特定需求的所有方法。例如,this..hasfriend.makeEnfire(this);将确保所有以this为友的对象不再与this为友。3.2.12变量作用域Neno中的变量作用域与Java等效。例如,inxsd:integer a=“11”xsd:integer;if(a<“10”xsd:integer){xsd:integer b=“2”xsd:integer;}else{xsd:integer c=“3”xsd:integer;}if语句的true和false块可以读取变量a,但是true块不能读取false块中的c,false块不能读取true块中的b。方法通信的唯一方式是通过参数传递、返回值和对象操作。3.2.13构造函数和析构函数构造函数和析构函数在面向对象的语言中分别用于创建和破坏对象。Neno中构造函数的概念类似于Java和C++。析构函数的概念在Java中不存在,但在C++中存在。在Neno中,为程序员提供执行对象销毁的显式方式是非常重要的。同样,与Java不同,Neno的目的是在持久语义网络基底上使用。因此,当Fhat停止执行或aFhat不再访问某个对象时,该对象不应自动移除。简而言之,Fhat不提供自动垃圾收集(Louden,2003)。程序员的职责是从RDF网络中明确地删除所有不需要的对象。为了创建新对象,使用新操作器调用类的构造函数。例如,Human marko=new Human(“marko”xsd:string);将在RDF网络中生成一个子网络,该子网络相当于图4。urn:uuid:3d409136urn:uuid:196b1bb4demo:Human“marko”^^xsd:stringurn:uuid:2f32541chasnamerdf:typeurn:uuid:4188fde2 AncehasMethodhasMethodName“Makefriend”^^XSD:StringhasMethodName“Human”^^XSD:StringFigure 4:Fhat实例维护对对象的变量引用。

17
何人来此 在职认证  发表于 2022-4-15 10:01:48
Rodriguez-200720FHAT创建RDF子网络的算法将在下一节讨论。现在,请理解在Fhat实例的变量环境中存在一个名为marko的变量,它指向新创建的人类实例(例如hmarko、rdf:type、Humani),析构函数将指示Fhat销毁一个对象。析构函数在eclass声明中指定。例如,假设下面的demo指定:Human:thing Human{string hasname[1];Human hasfriend[0..*];!Human(string n){this.hasname=n;}~Human(){this.hasname=/this.hasfriend=/this.hasfriend=/}}在上面的类声明中!Human(string n)是构造函数,~Human()是adestructor。使用delete运算符调用析构函数。例如,delete marko;调用marko的~human()析构函数。一个类最多只能有一个析构函数,并且析构函数不接受参数。~human()析构函数移除对对象名称的引用,移除对对象朋友的所有引用,并移除对该对象的所有hasFriend引用。因此,如果人工对象具有URI URN:UUID:55B2A3B0,则Fhat将在三元存储区上执行以下命令:删除{<URN:UUID:55B2A3B0><demo:HasName>?name.}删除{<URN:UUID:55B2A3B0><demo:HasFriend>?Human.}删除{?Human<demo:HasFriend><URN:UUID:55B2A3B0.}在幕后,Fhat还将删除URN:UUID:55B2A3B0的所有方法引用、URN:UUID:55B2A3B0的内部变量引用以及相关的rdf:type关系对象到本体层。当一个对象被正确销毁时,只从RDF网络中移除它的sinstance。对象的类指定仍然存在于本体层中。3.2.14一般查询在许多实例中,Fhat不会引用特定的对象。同样,预期的环境是对象在RDF网络中持久存在的环境。因此,在执行代码时,需要定位特定对象的URI以进行处理。为了让程序员更容易做到这一点,一个查询运算符被定义为“网络查询”运算符,并用符号<?表示。例如,xsd:string x=“Marko Antonio Rodriguez”xsd:string;xsd:string query=“select?x WHERE{?x<demo:hasname><”+x+“>}LIMIT 1”xsd:string;human h[0..1]<?查询;将在RDF网络中查询至多一个名为“Marko Antonio Rodriguez”的人。但是,对于demonstratestring连接和变量使用,使用了三种方法。Marko a.Rodriguez-2007 213.3在NenoIn Neno中启动一个程序,没有静态方法。因此,在Java中不存在类似publicstatic void main(string[]args)方法的东西。相反,为Fhat提供了一个classURI和一个不接受参数的类的方法。类由Fhat自动调用实例化,并调用指定的无参数方法。例如,ifFhat被指向以下测试类和main方法,然后main方法创建一个人,更改其名称,然后退出。当main退出时,Fhat halts.OWL:thing demo:test{main(){demo:Human h=new Human(“marko Rodriguez”);h.setname(“marko Antonio Rodriguez”);}}3.4典型使用案例本节描述开发人员通常如何使用Neno/Fhat环境。下面的terminal命令确保NenoFhat编译器将Neno sourcecode转换为Fhat OWL API,将Fhat OWL API加载到triple-store,实例化aFhat RVM,并使用main方法将RVM指向demo:test类。请注意,出于显示目的,第三个命令被分成四行。

18
mingdashike22 在职认证  发表于 2022-4-15 10:01:54
不要假设第三条语句的三行末尾有换行字符。>nenofhat human.neno-o ntriple-t http://www.triplestore.net/sparql>nenofhat test.neno-o xml-t http://www.triplestore.net/sparql>fhat-vmc http://neno.lanl.gov/neno#fhat-c http://neno.lanl.gov/neno/demo#test-cm main-t http://www.triplestore.net/sparqlfegrst terminal命令将human.neno源代码编译成以n-triplestore格式表示的fhat human.ntriple三元组包含由“-t”URL指向的三元组存储区。第二个terminal命令编译thetest.neno源代码,并用RDF/XML生成一个名为test.xml的Fhat OWL API,然后将该RDF/xml加载到三元存储中。nenofhat编译器可以生成任何流行的RDF语法。虽然在大多数情况下,选择了一个或另一个,但两个不同的erent语法被显示出来,以演示编译器的可能性。最后启动aFhat处理器。虚拟机进程(fhat)是用一个pointerto来调用的,它是所需机器体系结构的本体模型。机器体系结构被实例化。实例化的Fhat然后实例化一个测试对象并调用它的MainMethod。实例化的测试主要方法是可执行的RDF三码,在某些情况下,三码存储中可能已经存在一个Fhat RVM状态。在这种情况下,可以调用以下命令将Fhat RVM进程指向存储的RVMSATE。在下面的示例中,假设URN:UUID:60AB17C2是RDF:Type fhat。>FHAT-VMI URN:UUID:60AB17C2-T http://www.triplestore.net/sparql,fhat处理由其编程指向的当前指令。以下列表概述了nenofhat编译器的故障,o-O:输出类型(NTRUTLE n3 xml)o-T:三存储接口和fhat RVM进程,o-VMI:virtual machine instance URIo-VMC:virtual machine class URIo-C:start class URIo-CM:start class无参数方法o-T:triple-store Interface.Marko a.Rodriguez-2007 224 fhat虚拟机体系结构是专门为基于RDF的语义网络语言设计的RVM。fhat是计算机的半硬实现。表5给出了虚拟机实现的各个级别的解释。软、半硬和硬实现的概念在这里得到了发展,因此,不是公共词汇的一部分。在JVM中,所有的“硬件”组件都用软件表示,机器的状态不保存在当前运行时环境之外。对于VHSICHardware Description Language(VHDL)机器,硬件组件是在逻辑门(AND、OR、XOR、NOT等)级别上建模的(Coelho&Stanculescu,1988)。硬件组件是用RDF(状态)建模的,而组件的执行是用软件(过程)建模的。实现类型需求示例软硬件方法Java虚拟机,r-Fhatsemi-hard高级组件Fhathard低级组件VHDL designsTable 5:VM实现类型、它们的需求和一个示例。Fhat需要半硬实现的原因有很多,这些原因将在讨论FHATArchitecture的各种组件的章节中阐述。然而,在本节介绍半硬实现的同时,将讨论一种称为reduced Fhat(r-Fhat)的软结构。简而言之,r-Fhat比Fhat虚拟机更快,但不支持运行时的机器可移植性和机器级的重连接。换句话说,r-Fhat不支持那些需要机器状态的RDF表示的函数,可以编写任何高级语言来利用Fhat体系结构。虽然LILENENO和Fhat是协同开发的,因此在它们彼此的需求上紧密相连,但任何编译为Fhat RDF三重代码的语言都可以使用FHATRVM。

19
能者818 在职认证  发表于 2022-4-15 10:02:01
在讨论Fhat指令集之前,本节将讨论Fhat RVM。此机器体系结构以OWL表示,并与RDF网络的本体层中的其他资源共存。haltfhatinstruction programlocationframehasframe[0..*][0..1]returntopreturnstackinstructionrdf:firegrstrdf:rest[0.1][0.1]blocktop[0..*]frameVariablerdf:lihasvaluerdf:resourceoperandtoperandstackrdf:rest[0.1][0.1]rvm[0..*]Dreusexsd:Boolean[1][0.1]BlockStackBlockRDF:figurrstrDF:REST[0.1][0.1][0.1]图5:Fhat虚拟机的本体模型。Fhat RVM有8个主要组件。为了便于参考,下面列举了这些问题。以下小节将更详细地讨论每个组件。Marko A.Rodriguez-2007 231。FHAT:解释指令并使用其各种组件处理这些指令的CPU。停止:当false时暂停Fhat处理,当true时允许处理。MethodReuse:确定是否在对象实例中重用方法三重代码。程序位置:指向正在执行的当前指令(即PC机)的指针。5。BlockStack:一个rdf:列表,可以按下和弹出以进入和退出Blocks。OperandStack:一个rdf:列表,可以为算术计算推入和弹出。框架:用于存储局部变量的方法唯一环境。ReturnStack:一个RDF:list,它提供了对calleda方法的指令和该方法的框架的引用。虽然所有这些组件都用RDF表示,但只有Fhat有一个外部软件组件。Fhat的软件实现在图3.4.0.1中称为“虚拟机械过程”FhatFhat是Fhat RVM的主要组成部分。Fhat是整个Fhat体系结构中最复杂的组件。Fhat组件的高级Neno伪代码thing Fhat{execute(){while(!this.halt&&this.programlocation!=null){Instruction i=this.programlocation if(i typeof Block){...}else if(i typeof if){...}else if(i typeof if){...}else if(i typeof Expression){...}else if(i typeof Set){...}..../*update programlocation*/}}以上伪代码应该用虚拟机进程的语言例如,假设一个名为FHAT1的Neno实现的Fhatinstance。在这种情况下,另一个名为Fhat2的Fhat正在处理FHAT1.Fhat2可以在另一个名为Fhat3的Fhat上运行,或者接地到将代码转换为本机语言的其他语言中。这是可能的,因为Neno/Fhatis图灵完成,因此,可以运行自己的模拟。当运行自身的模拟时,就会创建一个完整的RDF虚拟机。在该仿真环境中,Fhat RVM的状态和过程都用RDF表示。Fhat的当前版本支持xsd:anysimpleType的大多数常见用法,其中一些用法总结如下:oxsd:boolean:Not,equalsoxsd:integer,xsd:float,xsd:double:Arithmetic,compareoxsd:string:Add,compareoxsd:date,xsd:datetime:Add,Subtract,compare.当使用术语Fhat时,它指的是整个虚拟机,当使用电传键入的术语Fhat时,它指的是由URI Fhat定义的虚拟机进程。Marko A.Rodriguez-2007 244.0.2 halta在任何时候,都可以通过将Fhat的halt属性设置为truexsd:boolean来强制Fhat可以设计一个Neno程序来运行amaster Fhat,该Fhat引用其所有从Fhat的halt属性。通过设置halt属性,Fhat主程序可以控制哪个Fhat从程序可以处理任何一次。

20
能者818 在职认证  发表于 2022-4-15 10:02:07
在本质上,主Fhat充当一个操作系统。4.0.3 methodReuse当methodReuse设置为true:/xsd:boolean时,Fhat将用每个方法的唯一指令实例化新的对象。当methodReuse设置为false:/xsd:boolean时,Fhat将在di-erent对象的相同方法中重用方法三重代码。这将在§5.2.4.0.4 programLocation中更详细地讨论。programLocation是指向FHAT正在执行的当前指令的指针。FHATA一次执行一条指令,因此,编程必须始终指向一条指令。Fhat的“while”循环只是将编程位置从一条指令移动到下一条指令。在每个指令中,Fhat解释指令是什么(byits rdf:type“opcode”)并适当地使用它的各种组件。当存在nomore指令时(即不再存在programLocation属性时),fhathalts.4.0.5 blockStackblockStack对于变量设置很重要。当一个新变量在一个代码中创建时,有必要将该变量与该块相关联。当执行的线程退出该块时,在该块中创建的所有变量都被解除引用(即解除定位)。4.0.6 OperandStackOperandStack是一个支持任何RDFS:Resource的后进先出堆栈。OperandStack用于本地计算,如x=1+(2*3)。例如,当x=1+(2*3)由Fhat执行时,Fhat将Will1。将值1推送到OperandStack2上。将值2推送到operandstack3上。将值3推送到operandstack4上。pop 2和3o都包含OperandStack,将这两个操作数相乘,并在operandstack5上推入theValue6。在OperandStack6中同时弹出1和6,添加这两个操作数,并将值7推送到OperandStack6上。将当前帧FrameVariable x设置为popped o the operandstack7的值。当编译为Fhat三重代码时,Neno语句x=1+(2*3)实际上是多条指令。NenoFhat编译器会将语句转换为图6所示的三重代码。表示诸如OperandStack ComponentinRDF这样的组件非常重要,而不仅仅是在主机CPU的内存中。假设一个Fhat实例isto移动到另一个物理机器,或者偶然丢失了它的进程“后端”。如果是这两种情况中的任何一种,那么机器的状态总是保存在RDF中,因此只需“冻结”以等待另一个虚拟机进程继续执行。如果操作堆栈在软件中表示,因此在RAM中表示,那么当软件停止时,操作堆栈将丢失,机器的状态将与其编程位置不一致。在RDF状态下,virtualmachine进程的RAM表示形式对机器一致性的影响可以忽略不计。Marko a.Rodriguez-2007 25Seturn:UUID:361604bChassymbol“x”^^XSD:StringNextInst“1”^^XSD:IntegerPushurn:UUID:3CFF4D2eHasValue“2”^^XSD:IntegerPushurn:UUID:403D632ChasValue“3”528enextinstnextinst图6:语句x=1+(2*3)的三代码表示形式。4.0.7 FrameFhat是一个基于帧的处理器。这意味着每个被调用的方法都为其变量(即FrameVariables)提供了一个框架或本地环境。由于变量是如何在面向对象语言中重新处理的,并且由于Neno不支持全局变量,每个方法只能通过参数(即方法参数)传递、返回值传递或对象操作来相互通信。当方法A调用方法B时,方法A传递的参数根据方法描述中的变量名存储在方法B的框架中。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-1-27 22:47