Under consideration for publication in J. Functional Programming 1 Acute High-level program
your manuscript is under consideration

your manuscript is under
consideration
"Your manuscript is under consideration" 是一个在学术、出版等领域常用的短语,表示你提交的稿件正在被审查或考虑的过程中。
这通常是在你向期刊、出版商或其他机构提交研究论文、文章或其他书面作品后收到的回复。
当你收到这样的通知时,意味着你的稿件已经被接收并且正在进行评估。
评估过程可能包括编辑的初步审查、同行评审(由该领域的专家对你的稿件进行评估)或其他相关的审查程序。
这是为了确保出版物的质量、准确性和学术价值。
在稿件被考虑期间,你通常会被要求等待一段时间,以便编辑和评审人员完成审查工作。
这个过程的时间长度可能因不同的机构和出版物而有所不同,一般需要几周到几个月的时间。
在等待期间,你可以继续进行其他的研究工作或准备其他的稿件。
如果你有任何疑问或需要进一步的信息,你可以与相关的编辑或出版机构联系,了解更多关于稿件的审查进度。
最终,编辑或评审人员会根据他们的评估结果做出决定,并通知你稿件的命运。
这可能是接受、要求修改、拒绝或其他可能的结果。
无论是什么结果,他们通常会提供详细的反馈和建议,帮助你改进你的作品。
总的来说,"Your manuscript is under consideration" 是一个常见的回复,表示你的稿件正在被评估和审查的过程中,你需要耐心等待结果。
这是学术和出版领域中的正常程序,旨在确保出版物的质量和学术标准。
under review 后又变成under considration

under review 后又变成under considration 题目:从“under review”到“under consideration”:科学研究的演进过程引言:在科学研究的世界中,研究成果的正式发布之前,经历了一个漫长的评审过程。
在这个过程中,研究论文经常会从“under review”(审稿中)的状态转变为“under consideration”(考虑中)的状态。
本文将一步一步回答这个过程,探讨评审过程的重要性,以及科学研究的激动人心的进展。
第一部分:审稿的过程和目的(500字)1.1 审稿的定义与意义审稿是指将学术论文提交给同行专家,由他们按照学术规范对其进行评估和评论的过程。
它是对学术研究进行验证和保证质量的一种方式。
审稿的目的是增强研究的可靠性、准确性和可重复性,确保其满足学术界的要求,并发布具有学术价值的成果。
1.2 审稿流程1.2.1 提交论文研究人员首先将其论文提交给期刊或会议的编辑部门,通常通过在线投稿系统完成。
1.2.2 编辑发起审稿编辑在收到论文后,将其分配给相关领域的同行专家,以便进行评估。
1.2.3 同行评审同行专家仔细阅读论文,并提出他们对论文内容、方法、结果和结论的评估和建议。
1.2.4 评审意见审稿人撰写评审意见,指出论文的优点和不足之处,并提出改进的建议。
1.2.5 编辑决策编辑根据审稿人的意见,决定是接受论文还是要求作者进行修改后重新提交,或者拒绝该稿件。
第二部分:从“under review”到“under consideration”的转变(700字)2.1 “under review”状态在论文提交审核后,编辑部门将其转为“under review”状态。
这意味着论文正在等待分配给审稿人进行详细评估。
此时,论文进入评审过程的第一阶段。
2.2 同行评审的评估过程审稿人对论文进行详细评估,包括对论文的原创性、方法学论证、结果和结论的科学性进行分析。
期刊投稿状态以及回复信件模板

1.第一次投稿Cover letter:主要任务是介绍文章主要创新以及声明没有一稿多投Dear Editors:We would like to submit the enclosed manuscript entitled “Paper Title”, which we wish to be considered for publication in “Journal Name”. No conflict of interest exits in the submission of this manuscript, and manuscript is approved by all authors for publication. I would like to declare on behalf of my co-authors that the work described was original research that has not been published previously, and not under consideration for publication elsewhere, in whole or in part. All the authors listed have approved the manuscript that is enclosed.In this work, we evaluated ……(简要介绍一下论文的创新性). I hope this paper is suitable for “Journal Name”.The following is a list of possible reviewers for your consideration:1) Name A E-mail: ××××@××××2) Name B E-mail: ××××@××××We deeply appreciate your consideration of our manuscript, and we look forward to receiving comments from the reviewers. If you have any queries, please don’t hesitate to contact me at the address below.Thank you and best regards.Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××二、催稿信:询问稿件处理到声明步骤Dear Prof. ×××:Sorry for disturbing you. I am not sure if it is the right time to contact you to inquire about the status of my submitted manuscript titled “Paper Title”. (ID: 文章稿号), although the status of “With Editor”has been lasting for more than two months, since submitted to journal three months ago. I am just wondering that my manuscript has been sent to reviewers or not?I would be greatly appreciated if you could spend some of your time check the status for us. I am very pleased to hear from you on the reviewer’s comments.Thank you very much for your consideration.Best regards!Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××三、修改稿Cover letterDear Dr/ Prof..(写上负责你文章编辑的姓名,显得尊重,因为第一次的投稿不知道具体负责的编辑,只能用通用的Editors):On behalf of my co-authors, we thank you very much for giving us an opportunity to revise our manuscript, we appreciate editor and reviewers very much for their positive and constructive comments and suggestions on our manuscript entitled “Paper Title”. (I D: 文章稿号).We have studied reviewer’s comments carefully and have made revision which marked in red inthe paper. We have tried our best to revise our manuscript according to the comments. Attached please find the revised version, which we would like to submit for your kind consideration.We would like to express our great appreciation to you and reviewers for comments on our paper. Looking forward to hearing from you.Thank you and best regards.Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××四、修改稿回答审稿人的意见(最重要的部分)List of ResponsesDear Editors and Reviewers:Thank you for your letter and for the reviewers’comments concerning our manuscript entitled “Paper Title”(ID: 文章稿号). Those comments are all valuable and very helpful for revising and improving our paper, as well as the important guiding significance to our researches. We have studied comments carefully and have made correction which we hope meet with approval. Revised portion are marked in red in the paper. The main corrections in the paper and the responds to the reviewer’s comments are as flowing:Responds to the reviewer’s comments:Reviewer #1:1. Response to comment: (……简要列出意见……)Response: ××××××2. Response to comment: (……简要列出意见……)Response: ××××××。
SCI投稿Cover Letter模板

SCI投稿Cover Letter模板初次投稿SCI的科研小白而言,真的需要一份Cover Letter的模板,能尽快的上手。
许多期刊都会要求作者上传手稿的时候附上Cover Letter,主要是写给该期刊的总编辑看到,需要简明扼要的介绍手稿的研究内容与期刊的方向是否一致,有什么新的研究,创新点在哪里,也需要添加期刊要求的声明和披露,最后是投稿人的姓名及联系信息。
下面是简短的一个模板,根据实际需要进行修改。
Dear Prof. Editor(最好是加上编辑的名字,以表示尊重):We would like to submit the enclosed manuscript entitled “文章的标题”, which we wish to be considered for publication in “期刊名称”. No conflict of interest exits in the submission of this manuscript, and manuscript is approved by all authors for publication. I would like to declare on behalf of my co-authors that the work described was original research that has not been published previously, and not under consideration for publication elsewhere, in whole or in part. All the authors listed have approved the manuscript that is enclosed.This manuscript describes original work and is not under consideration by any other journal.简明扼要的描述实验的主要结果和重要结论,我们相信这项研究的结果将对“期刊名称”的读者特别感兴趣。
under consideration 和under review

under consideration 和under review
「Under consideration」和「under review」都表示某事物正在被考虑或者审议。
然而,它们的用法和含义略有不同。
「Under consideration」表示某事物正在被考虑,通常用于指代被讨论或评估的问题、建议或提案。
它意味着该事物正处于很活跃的状态,但尚未作出决定或得到最终批准。
当某个问题仍在讨论中或正在等待决策者的确认时,可以说该问题仍然「under consideration」。
例如:
- The proposal is currently under consideration by the board of directors.
(该提案目前正在董事会考虑中。
)
「Under review」更倾向于指某事物正在被审查或审核,通常用于指代文件、申请、报表或其他相关文件的审查过程。
这意味着相关方正在仔细检查、分析和评估所提交的材料,通常是为了确定其合规性、准确性或可行性。
一般会有专门的人员或部门负责审查,以便做出决定或建议。
例如:
- Your job application is currently under review.
(您的工作申请目前正在审核中。
)
总结来说,两者区别在于「under consideration」指的是讨论或
评估问题或提案,而「under review」则指的是文件或材料的评估和审核。
under review之后under consideration

under review之后under consideration(原创版)目录1.文本背景及目的2."Under Review"的含义3."Under Consideration"的含义4.两者的区别与联系5.总结正文本文旨在解释在学术界和商业环境中经常出现的两个术语:"Under Review"和"Under Consideration",并探讨它们之间的区别和联系。
"Under Review"通常用于描述一篇论文、研究报告或出版物在经过同行评审或编辑评估过程中的状态。
在这个阶段,作者可能已经提交了最终稿,并正在等待专家的反馈和建议。
这个过程可能需要一些时间,因为评审人员需要仔细阅读和评估作品的质量、原创性和贡献。
一旦评审结束,作者将收到关于修改或改进的建议,以便最终确定作品是否被接受或发表。
"Under Consideration"则用于描述一个想法、建议或申请正在被认真评估或考虑的过程中。
这个阶段可能发生在公司或组织内部,也可能发生在学术或出版领域。
在这个阶段,决策者需要对提议的内容进行深入研究和分析,以确定其潜在的影响和价值。
这个过程可能涉及与相关方面的讨论和协商,以确保最终的决策是公正和平衡的。
尽管"Under Review"和"Under Consideration"在某些情况下可能表达相似的含义,但它们在使用场景和侧重点上有所不同。
"Under Review"强调的是作品在经过专业评审过程中的状态,而"Under Consideration"则强调的是决策者在权衡和评估建议或申请时的状态。
尽管如此,两者都表明了一个过程正在进行中,并且结果尚未确定。
总之,了解"Under Review"和"Under Consideration"这两个术语的含义和用法对于在学术界和商业环境中进行有效沟通至关重要。
Under consideration for publication in Formal Aspects of Computing Concurrency and Refineme

Under consideration for publication in Formal Aspects of ComputingConcurrency and Refinement in the Unified Modeling LanguageJim Davies and Charles CrichtonOxford University Computing Laboratory,Wolfson Building,Parks Road,Oxford,UKAbstract.This paper defines a formal semantics for a subset of the Unified Modeling Language(UML). It shows how suitable combinations of class,object,state,and sequence diagrams can be associated with patterns of interaction,expressed in the event notation of Communicating Sequential Processes(CSP). The diagram semantics is then extended to give a meaning to complete models—suitable combinations of diagrams—and thus a concurrency semantics for object models written in UML.This model semantics is in turn used to define a theory of refinement,based upon existing notions of data and process refinement. Keywords:Unified Modeling Language;Object-oriented Design;Object Modelling;Concurrency;Refine-ment;Communicating Sequential Processes.1.IntroductionThe evolution of the Unified Modeling Language(UML)[OMG01]is of tremendous significance for the field of software engineering.The definition of a single framework in which to place the sketches,diagrams, pictures,and formulae that shape and communicate our understanding of complex designs is a welcome development,and the widespread acceptance of this framework makes it an ideal vehicle for the application of formal,mathematical techniques.In this paper,we show how object models described using the diagram notations of UML can be au-tomatically translated into a formal language of interaction:Hoare’s Communicating Sequential Processes (CSP)[Hoa85].The behavioural properties of these designs—the order in which messages may be sent, the possible consequences of concurrent execution of certain operations,whether a particular scenario is possible—can then be calculated and explored.We show also how the existing refinement orderings defined upon processes can be applied to the be-havioural refinement of object-oriented designs.The question of whether one design is a suitable refactoring of another can be reduced to a question of behavioural refinement:that is,a question of whether every behaviour of one design is allowed for in the description of the other.The resulting theory of refinement for object models is supported by existing refinement-checking technology[FSE].Our translation requires more than just a semantics for the individual diagram notations:it requires a Correspondence and offprint requests to:Jim Davies,Oxford University Computing Laboratory,Wolfson Building,Parks Road, Oxford,OX13QD,UK.e-mail:Jim.Davies@2J.Davies and C.Crichton behavioural semantics for the models that are produced when these notations are used in combination.We will express both diagram and model semantics in terms of CSP events and processes.As our aims include facilitating automatic analysis,we will employ the machine-readable dialect of CSP[Ros97],which can be used as input to animation and refinement-checking tools.The paper begins with a review of the various diagram notations that we have chosen to support: class diagrams,object diagrams,state(or statechart)diagrams,and sequence diagrams.This is followed, in Section3,by an explanation of how these diagrams can be given a behavioural semantics in terms of machine-readable CSP.In Section4,we show how the diagram semantics can be extended to give a meaning to complete object models,in terms of the sequences of actions that may be performed,and the sets of actions that may be blocked.We show how—by associating state diagrams with operations—we can create models that are adequate for the description of the concurrent execution of multiple operations upon the same object.This model semantics can be used to define theories of refinement for object models written in UML. In Section5,we show how different notions of process and data refinement can be put to practical use in the analysis and development of object models written in UML.The paper ends with a discussion of the prospects for automated analysis,and a review of related work.2.Object modellingA model in UML is a collection of diagrams,illustrating different aspects of a design,together with related properties or requirements.Each of these diagrams conveys some information about the architecture,at-tributes,and behaviour of the system being modelled.As we might expect,the UML documentation asserts that“Every complex system is best approached through a small set of nearly independent views of a model. No single view is sufficient.”[OMG01,Section1.2.2]We might expect,too,that two different models—two different combinations of diagrams—could be used as descriptions of the same system.To demonstrate the use of the different diagram notations,we will consider a model of a simple com-munication protocol,whose only dynamic property of interest(at our chosen level of abstraction)isflow control:the transmitter waits for an acknowledgement that a message has been output by the receiver before accepting another for transmission.In each case,our interpretation of the diagram notation will be just one or many possible interpretations: other semantics may be defined with different purposes in mind.Indeed,even the formal translations that we produce could be completed in different ways.The processes that we use to represent the implicit mechanisms for event communication and operation invocation are just one way of resolving the semantic variation points in the UML specification[OMG01].2.1.Class diagramsA class diagram identifies the entities in the system,and describes the potential relationships between them.It provides structure to a behavioural semantics—giving the signatures of objects—and places constraints upon reachable configurations,but does not directly describe the behaviour of any component.Such a diagram comprises a number of class boxes,and a number of lines—representing associations—between them.Each class box may have up to three partitions below the name box,listing attributes,operations,and signals,respectively.Some associations may be implemented as attributes:in this case,the value of the attribute is a reference to another object(or a collection of objects).An association line can show the navigability of the relationship(using arrowheads),its multiplicity,and the names used in reference.The operations of a class may be described as synchronous or asynchronous,and may be subject to different degrees of concurrency control:the concurrency attribute of an operation explains whether that operation may be invoked concurrently with other operations on the same object.The class diagram may describe also the signature of each operation:the argument and result types.A typical implementation for an UML operation is a method or function call in the target programming language.Signals are an abstract,asynchronous means of communication.Although signals may be implemented in the same way as operations,they are more likely to correspond to sequences of calls,perhaps involving the use of a package or library that has not been modelled.The class diagram may list the names of the signals that can be received by each class.Concurrency and Refinement in the UML3Fig.1.A class diagram for the simple protocolFig.2.An object diagram for the simple protocolA class diagram may include also information about inheritance:which classes are defined as extensions of others.This may have a bearing upon the behavioural semantics,in that there may be a choice of (implementations of)operations that could be invoked in response to a particular call.The structure of our semantics allows for the subsequent addition of a selection mechanism,but the automatic determination of such a mechanism from information in the class diagram is left as a subject for separate,future study.The class diagram for our simple protocol is given in Figure1;it identifies the two main protocol components—a transmitter and a receiver—as well as two abstract,interface entities—a user and a lis-tener.The association between the transmitter and the receiver tells us that each is capable of referring to the other.The transmitter will use the name rec for the receiver object that it knows about;the receiver will use the name trans for the transmitter object.The associations are all1to1:a user object will refer to a single transmitter object,a transmitter will refer to a single receiver,and a receiver will refer to a single listener.In this model,the listener is unable to refer to the receiver:the association between these two classes is navigable only in the other direction.All communication in this model is described in terms of signals:the user may send an in signal to the transmitter,which may send a message signal to the receiver,which may send an out signal to the listener. The receiver may send an ack signal to the transmitter,which may send a ready signal to the user.The class diagram tells us which events may be sent;the state diagram will tell us how the arrival of one event may trigger actions,such as the sending of another event.2.2.Object diagramsObject diagrams are class diagrams in which only instances—or objects—are present.Such a diagram can be used to describe a particular state of the system,or to characterise a region of the state space—each object may be annotated with a constraint upon attribute values.In a behavioural semantics,an object diagram can be used to describe an initial configuration.In the object diagram of Figure2,the association instance(or link)between transmitter and receiver is stereotyped as reliable,to indicate that signals are reliably transmitted between the objects.In UML,the fact that two objects are linked in an object diagram does not mean that communication between them is necessarily reliable,whether in terms of signal transmission or operation invocation.4J.Davies and C.CrichtonFig.3.State diagrams for the transmitter and receiver classes2.3.State diagramsA state diagram describes the behaviour of an object or operation in terms of the performance of actions in response to the arrival of events.We will consider two kinds of events:call events and signal events.The occurrence of a call event corresponds to the beginning on an execution of an operation upon the current object;the occurrence of a signal event corresponds to the successful arrival of a signal.The possible effects of an event are described by labelled transitions between states in the state diagram.Each transition may be labelled with a trigger event,a guard,and a sequence of actions.If an event occurs,and there is a corresponding transition starting from the current state,then the guard is evaluated.Should the guard prove to be true,based on the values of the object attributes,and any attributes associated with the event itself,then the sequence of actions will be performed:the future behaviour of the object is then described by the target state of the transition.Should the guard prove to be false,then the event will be discarded,and the object will remain in the current(source)state.Some of the transitions in a diagram may have no trigger events:these are called completion transitions, and arefired as soon as the source state is entered(and any entry actions have been completed).An important feature of the state diagram language is the run-to-completion property:following the occurrence of an event, no further events will be accepted until every action triggered by that event,including those associated with any subsequently-enabled completion transitions,has been performed.The state diagram notation contains many other features:notably,entry and exit actions,change events, prioritised and timed transitions,and composite states.The semantics of diagrams using entry and exit actions is easily derived from the semantics of equivalent diagrams in which these actions are prepended and appended to the relevant transitions.The other features require extensions to the semantics presented here: suitable extensions are discussed in Section7.Figure3presents two state diagrams:one for the transmitter class,and another for the receiver.A transmitter object can be in one of two states:it is ready for a new message from its client,or it is waiting for an acknowledgement from the receiver.The arrival of a new message m is represented by an occurrence of the event in(m);this has the effect of sending a signal message(m)to the receiver rec.There is no blocking of signal events:unless it is still completing a sequence of actions triggered earlier, an object will accept any signal.However,if there are no transitions labelled with that signal,and if it is not explicitly deferred by the current state,then the signal will be immediately discarded.In Figure3,if an in event arrives while the transmitter is in the Waiting state,then it will be discarded;similarly,if an ack arrives when the transmitter is in the Ready state,then it will be discarded.Concurrency and Refinement in the UML5Fig.4.A sequence diagram2.4.Sequence diagramsA sequence diagram describes a scenario in terms of messages sent between various objects.The messages are presented as horizontal lines labelled with the name of an event or operation.The objects are boxes with a vertical,broken line descending from them;the objects may be anonymous,or they may be named according to the attributes and associations presented in the class diagram for the current model.The vertical,broken lines—called lifelines—are used to impose a temporal order upon the messages presented.Where two message lines begin(or end)at the same lifeline,the message whose line is nearer the top of the diagram must be sent(or received)before the other.Moving down a lifeline corresponds to the passage of time.A sequence diagram may represent the creation(or destruction)of one of the objects involved by explicitly starting(or ending)a lifeline within the diagram.In the sequence diagram of Figure4,all of the objects have been created before the scenario,and none are destroyed during it.This diagram illustrates a desirable behaviour of our simple protocol,in which a single message m is passed from the User to the Listener via the two objects of our protocol.The features presented here form only a small subset of those available within the sequence and interaction diagram languages of UML.Our use of the notation here is purely as an indication of what could be achieved.2.5.Operation diagramsThe UML documentation admits the possibility of multiple,concurrent calls of operations upon a single object.Each operation has a concurrency attribute,which may take one of three values:•sequential:concurrent calls on the same object should be avoided;•guarded:concurrent calls are permitted,but the operations will be executed sequentially;each new execution will be blocked until the previous execution has completed;•concurrent:concurrent calls are permitted,and the operations may be executed concurrently;the cor-responding sequences of transitions and actions may be interleaved.This information—which would normally be presented in the class diagram—can be carried forward from the model to an implementation,using features such as the synchronized mechanism in Java.If we attempt to include information about the progress of multiple executions of different operations within a single‘object’state diagram,the result is likely to be unreadable.The possibility of concurrent execution multiplies the number of states that may be of interest;any operation may be associated with a state space of its own,describing its progress through the various actions and conditions that its performance may entail.The effect of an action may depend upon the value of temporary variables or objects—the local state of the current execution—as well as the value of object attributes.6J.Davies and C.CrichtonFig.5.Printer class diagramFig.6.Printer state diagramEven the behaviour of a class with a single operation could become difficult to describe if this operation had more than two points at which it reads from,or writes to,the attributes of the object.Such an approach would require also a relaxation of the run-to-completion assumption for state diagrams:if a single diagram is to describe the effect of concurrent execution,then the underlying state machine must be able to accept a second call event before the action sequence corresponding to thefirst has been completed.The only practical solution is to use a different state diagram for each compound operation:that is,for each operation that has more than one point of interaction with the shared state;the effect of any other, atomic operation can still be represented as a single transition,triggered by a call event,on the main state diagram.We will use the term operation diagram for a state diagram that has been used to describe the behaviour of an operation.As an example of this approach,consider how we might describe the behaviour of objects of the Printer class shown in Figure5.Objects of this class have a single,integer-valued data attribute called alarm,and two operations print and service;neither operation expects an argument or a return value.There are also several signals:start,stop,open,and close.The object state diagram for the printer class is shown in Figure6.This diagram does not include call events for either operation,but instead shows how the state space of the printer object can be partitioned into two regions:Idle and Printing.The difference between the two regions lies in the effect of the open event:if the current state of the printer is in Printing,then this event leads to a state in which all events will be ignored,and both operations will be blocked;this last effect is achieved by setting the single attribute alarm to a non-zero value.Each operation is described by a separate operation(state)diagram:both are shown in Figure7.The labelling of the initial transitions is a(suggested)notational short-cut,indicating that the execution should be blocked if this condition is not true.The same result can be produced by adding an additional state, immediately following the initial one,with a guarded choice of completion transitions.In this example,the two operations do not make assignments directly,but instead act upon the shared state by sending signals. Apart from fulfilling the original need for a model that can describe concurrent execution,this approach hasConcurrency and Refinement in the UML7Fig.7.Printer operation state diagramsthe additional advantage of separating two concerns:the definition of(an abstraction of)the state,and the description of the operations.We should emphasise that it is impossible to describe the effects of concurrent execution,or the invocation of an operation upon the current object,without adopting this operation diagram approach(as a corollary, we might observe that it is thus impossible to describe recursive operations in a single UML state diagram). The only alternative would be to relax the run-to-completion assumption,which would render the state diagram notation all-but-unusable.The language of operation diagrams is a sublanguage of that of state diagrams:an operation diagram cannot accept call events,except for the initial,implicit call event that creates an instance.The state diagram that describes the chosen abstraction of the attribute state may have call events,but only for operations that are atomic at the current level of abstraction.3.Diagram semanticsTo construct a formal semantics for a UML diagram,we require a mapping from the graphical constructs to some mathematical domain:this mapping is a formal equivalent of the existing informal semantics for the diagram language—an explanation of what each construct means.There are many ways in which we might define this mapping,depending upon the purpose to which the resulting semantics will be put.As is the case with programming languages,a likely purpose for a formal semantics is to predict and reason about patterns of behaviour.Architectural and static properties are relatively easy to deduce;it is behaviour—and in particular,concurrent behaviour—that is harder to comprehend.For that reason,we will concentrate upon the construction of a formal semantics that is adequate for the analysis of behaviour:one that tells us how the system as described may evolve,in terms of interactions visible at its interface.In this section,we explain how individual diagrams may be mapped to processes; in the following section,we will see how to combine these processes to obtain the semantics of a complete model.Our presentation here is exemplary:an explicit semantic function would need to map documents that define UML models to documents that define CSP representations.In this paper,we describe this function in terms of its effect upon simple UML models.Its implementation,which requires mechanisms for namespaces, dynamic binding,and polymorphic channels in CSP,is a challenge in itself.3.1.Process notationIn the language of CSP,processes are defined in terms of the occurrence and availability of abstract events: atomic,synchronous,communications.In the machine-readable dialect,events are introduced as elements of channels.For example,the declarationchannel c:A.B8J.Davies and C.Crichton introduces a set of compound events,each of the form c.a.b,where a is drawn from the set A and b is drawn from the set B.Following such a declaration,we may use the expression{|c|}to refer to all of the events whose names start with the prefix c.The prefix process a->P is ready to perform the event a;if this event is performed,the future behaviour of this process is described by term P.The symbol[]denotes an external choice of(sets of)behaviours:a menu of possible interactions.The external choice symbol may be used in both binary and indexed forms. For example,the process[]i:I@a(i)->P(i)represents an external choice over all of the processes a(i)->P(i):the resulting process is ready to engage in any event of the form a(i),for i in I,and then behave as the process P(i).The input choice expression c?x->P(x)represents an external choice in which every alternative begins with an event from the channel set{|c|}.The corresponding output expression c!v->P is no choice at all:any variables appearing in the value expression v must already have been declared.(The process language is declarative,in that any variable takes a value at the point of declaration,and retains that value for the remainder of its scope).We will often use a combination of?and!to abbreviate a complex,indexed external choice over a set of compound events,in which some components are already determined.The expression c?x!d?y!e->Pdenotes an external choice in which the values of x and y—the symbols preceded by a question mark—are drawn from the set of all possible values for that component of the channel,and the values of d and e are fixed.We might expect the future behaviour P to be parameterised by x and y.The internal choice symbol|˜|denotes an internal choice of(sets of)behaviours.A process described as P|˜|Q will behave as P or as Q.The choice is not exclusive,in that both alternatives may be made available.We use this notation to represent a choice made within the current component,or—at least—on the far side of this interface.For example,the(indexed)internal choice|˜|i:I@P(i)represents a component whose behaviour may be any of P(i).(In the machine-readable dialect,the indexing set I must befinite).The interrupt operator/\has the effect of adding an external choice to every event menu present in the expansion of itsfirst argument.For example,(a->b->P)/\Q=a->b->(P/\Q)[]Q[]QWe will use this operator P whenever we have a complex pattern of behaviour that may be interrupted—permanently—by the beginning of another pattern Q.Processes are usually composed using a binary parallel operator,which specifies the set of events to be shared between its two arguments:the set of events that can occur only if performed simultaneously by both processes.The expression P[|A|]Q denotes the parallel combination of two processes,P and Q,sharing every event in the set A.If the shared set is empty,we write|||,rather than[|{}|].Either form of parallel combination may be used in prefix,indexed form;as in the case of internal choice,the indexing set must befinite.In CSP,sharing does not entail concealment:shared events remain visible,and may be subsequently shared with other components.The hiding operator is used to conceal,or internalise,sets of events:the expression P\A denotes a process that behaves exactly as P,except that events from the set A are no longer visible:they may not be shared with,and do not require the cooperation of,other processes.As processes are defined entirely in terms of their(remaining)external events,use of the hiding operator may mean that the resulting process is undefined,or divergent.This situation is quite different from that of the(fully-defined) process STOP,which can perform no events,and is used to represent the end of a pattern of behaviour.Concurrency and Refinement in the UML9 The let...within...construct allows for the scoping of process names;definitions made between let and within apply only for the term immediately following within.There are Bool and Int datatypes, for Boolean and integer values,respectively.Other types may be introduced using datatype definitions;for example,the definitiondatatype BinaryTree=empty|node.Int.BinaryTree.BinaryTreedefines a type of binary trees with integer values at the nodes.This is only the briefest of introductions to the process language:a more comprehensive introduction can be found in[Hoa85]or[Ros97].3.2.Actions and eventsOur behavioural semantics will be defined as a translation from object models to processes.We must begin, however,with an explanation of how the actions and events of our object models are to be translated into abstract(CSP)events.With the exception of local actions,actions and events will be represented as a compound abstract events,in which two of the components are used to identify the source and target of the abstract communication.If the communication represents the semantics of an operation call,then it may produce one of three results:if the operation in question may be invoked concurrently,and thus has its own operation(state) diagram,then a new state machine will be created to process the event;if the operation may not be invoked concurrently,and does not have its own diagram,then the event will be processed by the state machine representing the object;if the operation is a constructor(a create operation),then it will be processed by the class,and a new state machine will be created,representing a new object.Each state machine will be represented as a separate process.The source and target of each abstract communication will be processes representing state machines: objects,operation executions,or classes.3.2.1.ActionsA call action corresponds to a call of an operation.The start of the action can be represented as a compound event of the formcallAction.from.to.operation.argumentswhere from is the reference of the source process,to is the reference of the target,operation is the name of the operation,and arguments are the call parameters.A return action corresponds to the completion of an operation,from the point of view of the called operation(and its associated object).It can be represented as a compound event of the form returnAction.from.to.operation.valuewhere to is the reference of the original caller object,from is the reference of the original target,and value is the returned value.A send action corresponds to the sending of a signal,and will be represented as a compound event of the formsendAction.from.to.signal.argumentswhere from is the reference of the caller object,to is the reference of the target,signal is the name of the operation,and arguments are the call parameters.A create action corresponds to the creation of a new object.In our semantics,this action will be repre-sented as a pair of compound events:the eventcallAction.from.to.create.argumentsrepresents the beginning of the action,and a corresponding returnEvent its completion.The value associated with this second event will be the reference of the new object created.A destroy action corresponds to the destruction of an object;this is an asynchronous operation,and may be represented as a single event of the form。
修改稿cover,letter模板

修改稿cover,letter模板篇一:SCI 投稿全过程信件模板一览(Cover letter,催稿信等) 一、最初投稿Cover letterDear Editors:We would like to submit the enclosed manuscript entitled “Paper Title”, which we wish to be considered for publication in “Journal Name”. No conflict of inter est exits in the submission of this manuscript, and manuscript is approved by all authors for publication. I would like to declare on behalf of my co-authors that the work described was original research that has not beenpublished previously, and not under consideration for publication elsewhere, in whole or in part. All the authors listed have approved the manuscript that is enclosed.In this work, we evaluated ?? (简要介绍一下论文的创新性). I hope this paper is suitable for “Journal Name”.The following is a list of possible reviewers for your consideration:1) Name AE-mail: ××××@××××2) Name BE-mail: ××××@××××We deeply appreciate your consideration of our manuscript, and we look forward to receiving comments from the reviewers. If you have any queries, please don’t hesitate to contact me at the address below.Thank you and best regards.Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××二、催稿信Dear Prof. ×××:Sorry for disturbing you. I am not sure if it is the right time to contact you to inquire about the status of my submitted manuscript titled “Paper Title”. (ID: 文章稿号), although the status of “With Editor” has been lasting for more than two months, since submitted to journal three months ago. I am just wondering that my manuscript has been sent to reviewers or not?I would be greatly appreciated if you could spend some of your time check the status for us. I am very pleased to hearfrom you on the reviewer’s comments.Thank you very much for your consideration.Best regards!Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××三、修改稿Cover letterDear Dr/ Prof..(写上负责你文章编辑的姓名,显得尊重,因为第一次的投稿不知道具体负责的编辑,只能用通用的Editors):On behalf of my co- authors, we thank you very much for giving us an opportunity to revise our manuscript, we appreciate editor and reviewers very much for their positive and constructivecomments and suggestions on our manuscript entitled “Paper Title”. (ID: 文章稿号).We have studied reviewer’s comments carefully and have made revision which marked in red in the paper. We have tried our best to revise our manuscript according to the comments. Attached please find the revised version, whichwe would like to submit for your kind consideration.We would like to express our great appreciation to you and reviewers for comments on our paper. Looking forward to hearing from you.Thank you and best regards.Yours sincerely,××××××Corresponding author:Name: ×××E-mail: ××××@××××四、修改稿回答审稿人的意见(最重要的部分)List of ResponsesDear Editors and Reviewers:Thank you for your letter and for the reviewers’comments concerning our manuscript entitled “Paper Title” (ID: 文章稿号). Those comments are all valuable and very helpful for revising and improving our paper, as well as the important guiding significance to our researches. We have studied comments carefully and have made correction which we hope meet with approval. Revised portion are marked in red in the paper. The main corrections in the paper and the responds to the reviewer’s comments are as flowing:Responds to the reviewer’s comments:Reviewer #1:1. Response to comment: (??简要列出意见??) Response: ××××××2. Response to comment: (??简要列出意见??) Response: ××××××。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Under consideration for publication in J.Functional Programming1 Acute:High-level programming language designfor distributed computationPeter Sewell∗James J.Leifer†Keith Wansbrough∗Francesco Zappa Nardelli†Mair Allen-Williams∗Pierre Habouzit†Viktor Vafeiadis∗∗University of Cambridge†INRIA RocquencourtAbstractExisting languages provide good support for typeful programming of standalone programs.In a distributed system,however,there may be interaction between multiple instances of many distinct programs,sharing some(but not necessarily all)of their module structure,and with some instances rebuilt with new versions of certain modules as time goes on.In this paper we discuss programming-language support for such systems,focussing on their typing and naming issues.We describe an experimental language,Acute,which extends an ML core to support distributed development,deployment,and execution,allowing type-safe interaction between separately built programs.The main features are:(1)type-safe marshalling of arbitrary values;(2)type names that are generated(freshly and by hashing)to ensure that type equality tests suffice to protect the in-variants of abstract types,across the entire distributed system;(3)expression-level names generatedto ensure that name equality tests suffice for type safety of associated values,e.g.values carried on named channels;(4)controlled dynamic rebinding of marshalled values to local resources;and (5)thunkification of threads and mutexes to support computation mobility.These features are a large part of what is needed for typeful distributed programming.They area relatively lightweight extension of ML,should be efficiently implementable,and are expressive enough to enable a wide variety of distributed infrastructure layers to be written as simple library code above the byte-string network and persistent store APIs.This disentangles the language runtime from communication intricacies.This paper highlights the main design choices in Acute.It is supported by a full language definition(of typing,compilation,and operational semantics),by a prototype implementation,and by example distribution libraries.1IntroductionDistributed computation is now pervasive,with execution,software development,and de-ployment spread over large networks,long timescales,and multiple administrative do-mains.Because of this,distributed systems cannot in general be deployed or updated atom-ically.They are not necessarily composed of multiple instances of a single program version, but instead of many versions of many programs that need to interoperate,perhaps sharing some libraries but not others.Moreover,the intrinsic concurrency and nondeterminism of distributed systems,and the complexity of the underlying network layers,makes them particularly hard to understand and debug,especially without type safety.Existing pro-gramming languages,such as ML,Haskell,Java and C ,provide good support for local computation,with rich type structures and(mostly)static type-safety guarantees.When it2Sewell et al.comes to distributed computation,however,they fall short,with little support for its many system-development challenges.In this work we seek to remedy this lack,concentrating on what must be added to ML-like(typed,call-by-value,higher-order)languages to support typed distributed program-ming.We have defined and implemented a programming language,Acute,which extends an OCaml core with features for type-safe marshalling and naming in the distributed set-ting.Our extensions are lightweight changes to ML,but suffice to enable sophisticated distributed infrastructure,e.g.substantial parts of JoCaml(Conchon&Fessant,1999), Nomadic Pict(Sewell et al.,1999),and Ambient primitives(Cardelli&Gordon,1998), to be programmed as simple libraries.Acute’s support for interaction between programs goes well beyond previous work,allowing type-safe interaction between different runtime instances,different builds,and different versions of programs,whilst respecting modular structure and type abstraction boundaries in each interacting partner.In a distributed sys-tem it will often be impossible to detect all type errors statically,but it is not necessary to be completely dynamic—errors should be detected as early as possible in the development, deployment,and execution process.We show how this can be done.The main part of this paper,§2–9,is devoted to an informal presentation of the main design issues,which we introduce briefly in the remainder of this section.It uses small but executable examples to discuss these from the programmer’s point of view.Acute has a full definition(Sewell et al.,2004),covering syntax,typing,compilation,and opera-tional semantics,and a prototype implementation is also available(Sewell et al.,2005a). This closely mirrors the structure of the operational semantics;it is efficient enough to run moderate examples.The semantics and implementation are outlined in§12and§13re-spectively.The definition and implementation have both been essential to resolve the many semantic subtleties introduced by the synthesis of the various features.We demonstrate that Acute does indeed support typeful distributed programs with vari-ous examples(§11),including distributed communication infrastructure libraries,and in §14and§15we describe related and future work and conclude.Starting point The starting point for Acute is a conventional ML-like language.The Acute core language consists of normal ML types and expressions:booleans,integers, strings,tuples,lists,options,recursive functions,pattern matching,references,exceptions, and invocations of OS primitives in standard libraries.The module language includes top-level declarations of structures containing expressionfields and typefields,with both ab-stract and manifest types in signatures.Module initialisation can involve arbitrary compu-tation.We omit some other standard features to keep the language relatively small:user-defined type operators,constructors,and exceptions;substructures;and functors(we believe that addingfirst-order applicative functors would be straightforward;going beyond that would be more interesting and is addressed in recent work by Peskine(2007)).Some more sub-stantial extensions are discussed in the Conclusion.To avoid syntax debate wefix on that of OCaml.Most of the Acute grammar is shown in Appendix A,with the novel forms highlighted.Type-safe marshalling(§2,§3)Our basic addition to ML is type-safe marshalling:con-structs to marshal arbitrary values to byte-strings,with a type equality check at unmarshal-Acute:High-Level Programming Language Design for Distributed Computation3 time guaranteeing safety.We argue that this is the right level of abstraction for a general-purpose distributed language,allowing complex communication infrastructure algorithms to be coded(type-safely)as libraries,above the standard byte-string network and persist-ent store APIs,rather than built in to the language runtime.We recall the different design choices for trusted and untrusted interaction.Dynamic linking and rebinding(§4)When marshalling and unmarshalling code val-ues,e.g.to communicate ML functions between machines,it may be necessary to dy-namically rebind them to local resources at their destination.Similarly,one may need to dynamically link modules.There are many questions here:how to specify which resources should be shipped with a marshalled value and which should be dynamically rebound; what evaluation strategy to use;when rebinding takes effect;and what to rebind to.In this section our aim is to articulate the design space;for Acute we make interim choices which suffice to bring out the typing and versioning issues involved in rebinding while keeping the language simple.A running Acute program consists roughly of a sequence of module definitions(of ML structures),import s of modules with specified signatures,which may or may not be linked,and mark s which indicate where rebinding can take effect;together with running processes and a shared store.Type names(§5)Type-safe marshalling demands a run time notion of type identity that makes sense across multiple versions of differing programs.For concrete types this is conceptually straightforward—for example,one can check the equality between type int from one program instance and type int from another.For abstract types more care is necessary.Static type systems for ML modules involve non-trivial theories of type equality based on the source-code names of abstract types(e.g.M.t),but these are only meaningful within a single program.We generate globally meaningful run-time type names for abstract types in three ways:by hashing module definitions,taking their dependencies into account; or freshly at compile time;or freshly at run time.Thefirst two enable different builds or different programs to share abstract type names,by sharing their module source code or object code respectively;the last is needed for modules with effect-full initialisation.In all three cases the way in which names are generated ensures that type name equality tests suffice to protect the invariants of abstract types.Expression-level names(§6)Globally meaningful expression-level names are needed for type-safe interaction,e.g.for communication channel names or RPC handles.They can also be constructed as hashes or created fresh at compile time or run time;we show how these support several important idioms.The ways in which expression-level names are gen-erated ensure that name equality tests suffice to guarantee that any associated values(e.g. any values passed on named channels)have the right types.The polytypic support and swap operations of Shinwell,Pitts,and Gabbay’s FreshOCaml(Shinwell,2005;Shinwell et al.,2003)are included to support swizzling of local names during communication. Versions and version constraints(§7,§8)In a single-program development process one ensures the executable is built from a coherent set of versions of its modules by con-trolling static linking—often,simply by building from a single source tree.With dynamic linking and rebinding more support is required:we add versions and version constraints to4Sewell et al.module s and import s respectively.Allowing these to refer to module names givesflexib-ility over whether code consumers or producers have control.There is a subtle interplay between versions,modules,imports,and type identity,re-quiring additional structure in module s and import s.A mechanism for looking through abstraction boundaries is also needed for some version-change scenarios.Local concurrency and thunkification(§9)Local concurrency is important for dis-tributed programming.Acute provides a minimal level of support,with threads,mutexes and condition variables.Local messaging libraries can be coded up using these,though in a production implementation they might be built-in for performance.We also provide thunki-fication(loosely analogous to call/cc),allowing a collection of threads(and mutexes and condition variables)to be atomically captured as a thunk that can then be marshalled and communicated or stored;this enables various constructs for mobility and checkpointing to be coded up.Polymorphism(§10)Acute does not have standard ML-style polymorphism,as our dis-tributed infrastructure examples needfirst-class existentials(e.g.to code up polymorphic channels)andfirst-class universals(for marshalling polymorphic functions).We therefore have explicit System F style polymorphism,and for the time being the implementation does some ad-hoc partial inference.For writing typed communication libraries we need to compare names of different name types,with the‘true’branch typed under the assumption that these are the same;we add a namecase operation that combines this with existential unpacking.Examples(§11)We demonstrate that Acute does indeed support typeful distributed programs with several medium-scale examples,all written as libraries in Acute above the byte-string TCP Sockets API:a typed distributed channel library,an implementation of the Nomadic Pict(Sewell et al.,1999)primitives for communication and mobility,and an implementation of the Ambient primitives(Cardelli&Gordon,1998).These require and use most of the new features.Semantics(§12)The main parts of the Acute definition are a type system,a definition of compilation,and a small-step operational semantics.The static type system for source programs is based on an OCaml core and a second-class module system,with singleton kinds for expressing abstract and manifest typefields in modules.The definition of compilation describes how global type-level and expression-level names are constructed,including the details of hash bodies.The operational semantics for rebinding rests on our redex-time evaluation strategy (Bierman et al.,2003)for simply typedλ-calculus and here adapted to a second-class module system:to express rebinding the semantics must preserve the module structure throughout computation instead of substituting it away.The semantics also preserves abstraction boundaries throughout computation,with a generalisation of the coloured brackets of Grossman et al.(2000)to the entire Acute language(except,to date,the System F constructs).This is technically delicate(and not needed for implementations,which can erase all brackets)but provides useful clarity in a setting where abstraction boundaries may be complex,with abstract types shared between programs.Acute:High-Level Programming Language Design for Distributed Computation5 The semantics preserves also the internal structure of hashes.This too can be erased in implementations,which can implement hashes and fresh names with literal bit-strings(e.g. 128-bit MD5or160-bit SHA1hashes,and pseudo-random numbers),but is needed to state type preservation and progress properties.As we discuss later,the abstraction-preserving semantics makes these rather stronger than usual.Implementation(§13)The Acute implementation is written in FreshOCaml,as a meta-experiment in using the Fresh features for a medium-scale program(some25000lines).It is a prototype:designed to be efficient enough to run moderate examples while remaining rather close in structure to the semantics.The runtime interprets an intermediate language which is essentially the abstract syntax extended with closures.Performance is roughly 3000times slower than OCaml bytecode.The definition is too large(on the scale of the ML definition(Milner et al.,1990)rather than an idealisedλ-calculus)to make proofs of soundness properties feasible with the available resources and tools.To increase confidence in both semantics and implement-ation,therefore,our implementation is designed to optionally type-check the entire con-figuration after each reduction step.This has been extremely useful,identifying delicate issues in both the semantics and the code.Relationship to previous work Acute builds on previous work,in which we intro-duced new-bound type names for abstract types(Sewell,2001),hash-generated type names (Leifer et al.,2003a),and controlled dynamic rebinding in a lambda-calculus(Bierman et al.,2003),all in simple variants for for small calculi.Our contribution in this paper is threefold:discussion of the design space and identi-fication of features needed for high-level typed distributed programming,the synthesis of those features into a usable experimental language,and their detailed semantic design.The main new technical innovations are:•a uniform treatment of names created by hash,fresh,or compile-time fresh,both for type names and(covering the main usage scenarios)for expression names,dealing with module initialisation and dependent-record modules;•explicit versions and version constraints,with their delicate interplay with imports and type equality;•module-level dynamic linking and rebinding;•support for thunkification;and•an abstraction-preserving semantics for all the above.This paper is a revised and extended version of Sewell et al.(2005b)and Part I of Sewell et al.(2004).With respect to the latter technical report,§12outlining the semantics is entirely new,and there are various other local changes.The main changes with respect to the former paper are:•addition of§4.7on the relationship between modules and thefilesystem;•addition of§4.8on module initialisation;•addition of§4.9on marshalling references;•addition of§6.2–§6.4on naming:name ties,polytypic name operations,and the implementation of names;6Sewell et al.•extension of§7on versioning;•extension of§8.2on breaking abstractions and with!;•addition of§8.5on marshalling inside abstraction boundaries;•extension of§9on concurrency,with§9.1–9.11covering the choices for threads and thunkify in more detail,discussing several interactions between language features;•addition of§10on polymorphism and namecase;•addition of§12outlining key aspects of the semantic definition;and •addition of§13describing the implementation.2Distributed abstractions:language vs librariesA fundamental question for a distributed language is what communication support should be built in to the language runtime and what should be left to libraries.The runtime must be widely deployed,and so is not easily changed,whereas additional libraries can easily be added locally.In contrast to some previous languages(e.g.Facile(Thomsen et al.,1996), Obliq(Cardelli,1995),and JoCaml(Conchon&Fessant,1999)),we believe that a general-purpose distributed programming language should not have a built-in commitment to any particular means of interaction.The reason for this is essentially the complexity of the distributed environment:system designers must deal with partial failure,attack,and mobility—of code,of devices,and of running computations.This complexity demands a great variety of communication and persistent store abstractions,with varying performance,security,and robustness proper-ties.At one extreme there are systems with tightly coupled computation over a reliable network in a single trust domain.Here it might be appropriate to use a distributed shared memory abstraction,implemented above TCP.At another extreme,interaction may be in-trinsically asynchronous between mutually untrusting runtimes,e.g.with cryptographic certificates communicated via portable persistent storage devices(smartcards or memory sticks),between machines that have no network connection.In between,there are sys-tems that require asynchronous messaging or RMI but,depending on the networkfirewall structure,tunnel this over a variety of network protocols.To attempt to build in direct support for all the required abstractions,in a single general-purpose language,would be a never-ending task.Rather,the language should be at a level of abstraction that makes distribution and communication explicit,allowing distributed abstractions to be expressed as libraries.Acute has constructs marshal and unmarshal to convert arbitrary values to and from byte strings;they can be used above any byte-oriented persistent storage or communication APIs.This leaves the questions of(a)how these should behave,especially for values of func-tional or abstract types,and(b)what other local expressiveness is required,especially in the type system,to make it possible to code the many required distributed abstractions as libraries.The rest of the paper is devoted to these.Acute:High-Level Programming Language Design for Distributed Computation73Basic type-safe distributed interactionIn this section we establish our basic conventions and assumptions,beginning with the simplest possible examples of type-safe marshalling.Wefirst consider one program that sends the result of marshalling5on afixed channel:IO.send(marshal"StdLib"5:int)(ignore the"StdLib"for now)and another that receives it,adds3and prints the result: IO.print_int(3+(unmarshal(IO.receive())as int))Compiling the two programs and then executing them in parallel results in the second printing8.This and subsequent examples are executable Acute code.For brevity they use a simple address-less IO library,providing primitives send:string->unit and receive:unit->string.To emphasise that interaction might be via communication or via persistent store,there are two implementations of IO,one uses TCP via the Acute sockets API,with the loopback interface and afixed port;the other writes and reads strings from afile with afixed name.Below we write the parallel execution of two separately built programs vertically,separated by a dash—.For safety,a type check is obviously needed at run time in the second program,to ensure that the type of the marshalled value is compatible with the type at which it will be used. For example,the second program hereIO.send(marshal"StdLib""five":string)—IO.print_int(3+(unmarshal(IO.receive())as int))should raise an exception as it receives a string which it uses as an int.Allowing in-teraction via an untyped medium inevitably means that some dynamic errors are possible, but they should be restricted to clearly identifiable program points,and detected as early as possible.This error can be detected at unmarshal-time,rather than when the received value is used as an argument to+,so we should do that type check at unmarshal-time, but in some scenarios one may be able to exclude such errors at compile time,e.g.when communicating on a typed channel;we return to this in§6.The unmarshal dynamic check might be of two strengths.We can:(a)include with the marshalled value an explicit representation of the type at whichit was marshalled,and check at unmarshal-time that that type is equal to the type expected by the unmarshal—in the examples above,int=int and string=int respectively;or(b)additionally check that the marshalled value is a well-formed representation of some-thing of that type.In a trusted setting,where one can assume that the string was created by marshalling in a well-behaved runtime(which might be assured by network locality or by cryptographically protected interaction with trusted partners),option(a)suffices for safety.If,however,the string might have been created or modified by an attacker,then we should choose(b),to protect the integrity of the local runtime.Note,though,that this op-tion is not always available:when we consider marshalled values of an abstract type,it8Sewell et al.may not be possible to check at unmarshal-time that the intended invariants of the type are satisfied.They may have never been expressed explicitly,or be truly global properties.In this case one should marshal only values of concrete types.(One could imagine an interme-diate point,checking the representation type but ignoring the invariants,but the possibility of breaking key invariants is in general as serious as the possibility of breaking the local runtime.)In Acute we focus on the trusted case,with option(a),and the problems of distributed typing,naming,and rebinding it raises.We aim to protect against accidental programming and configuration error,not against malice.A full language should also support the untrus-ted case,perhaps with type-or proof-carrying code for marshalled functions.One goal for Acute is to make it possible to write high-level distributed infrastructure (middleware)in a high-level language.It would be a very interesting exercise to provide as much as possible of the functionality of a middleware framework such as CORBA in an Acute library.Note,though,that the main focus of Acute is rather different from that of the core of CORBA(the IDL and IIOP).CORBA provides globally defined scalar types and arrays and records thereof,along with marshalling and unmarshalling functions in many languages.Its goal is thus to transport concrete data between programs written in a hetero-genous collection of languages.Acute,by contrast,only supports communication between homogeneous runtimes(all executing code compiled by Acute),but has much more am-bitious support for the content of communicated data,including values of abstract types, fragments of executable code(modules),etc.,and less heavyweight machinery.However, we would hope that much of the higher-level functionality of CORBA(name and trader services,messaging,fault-tolerance,etc.)could be elegantly written in an Acute-like lan-guage.We do not discuss the design of the concrete wire format for marshalled values—the Acute semantics presupposes just a partial raw unmarshal function from strings to ab-stract syntax of configurations,including module definitions and store fragments;the pro-totype implementation simply uses canonical pretty-prints of abstract syntax.A production language would need an efficient and standardised internal wire format,and for some pur-poses(and for simple types)a canonical ASN.1or XML representation would be useful for interoperation.In the untrusted case XML is now widely used and good language support for(b)is clearly important.Marshalling can be done on values of any type,including polymorphic values(Acute has System F style explicit polymorphism).Elsewhere we discuss in depth the issues involved in handling implicit polymorphism,in our work on HashCaml(Billings et al.,2006). Rather than a polymorphic marshal,that can be used uniformly on values of arbit-rary types,one could provide machinery for user-defined marshalling functions,integrating marshalling with datastructure traversal.In Acute we factor the two out.4Dynamic linking and rebinding to local resources4.1References to local resourcesMarshalling closed values,such as the5and"five"above,is conceptually straightfor-ward.The design space becomes more interesting when we consider marshalling a valueAcute:High-Level Programming Language Design for Distributed Computation9 that refers to some local resources.For example,the source code of a function(it may be useful to think of a large plug-in software component)might mention identifiers for:(1)ubiquitous standard library calls,e.g.,print int;(2)application-specific library calls with location-dependent semantics,e.g.,routingfunctions;(3)application code that is not location-dependent but is known to be present at allrelevant sites;and(4)other let-bound application values.In(1–3)the function should be rebound to the local resource where and when it is unmarshalled,whereas in(4)the definitions of resources must be copied and sent along before their usages can be evaluated.There is another possibility:a local resource could be converted into a distributed ref-erence when the function is marshalled,and usages of it indirected via further network communication.In some scenarios this may be desirable,but in others it is not,where one cannot pay the performance cost for those future invocations,or cannot depend on future reliable communication(and do not want to make each invocation of the resource separ-ately subject to communication failures).Most sharply,where the function is marshalled to persistent store,and unmarshalled after the original process has terminated,distributed references are nonsensical.Following the design rationale of§2,we do not support dis-tributed references directly,aiming rather to ensure our language is expressive enough to allow libraries of‘remotable’resources to be written above our lower-level marshalling primitives.4.2What to ship and what to rebindWhich definitions fall into(2–3)(to be rebound)and(4)(to be shipped)must be specified by the programmer at the sender site;there is usually no way for an implementation to infer the correct behaviour.We adapt the mechanism proposed by Bierman et al.(2003)(from a lambda-calculus setting to an ML-style module language)to indicate which resources should be rebound and which shipped for any marshal operation.An Acute program con-sists roughly of a sequence of module definitions,interspersed with marks,followed by running processes;those module definitions,together with implicit module definitions for standard libraries,are the resources.Marks essentially name the sequence of module defin-itions preceding them.Marshal operations are each with respect to a mark;the modules below that mark are shipped and references to modules above that mark are rebound,to whatever local definitions may be present at the receiver.The mark"StdLib"used in §3is declared at the end of the standard library;this mark and library are in scope in all examples.In the following example the sender declares a module M with a yfield of type int and value6.It then marshals and sends the value fun()->M.y.This marshal is with respect to mark"StdLib",which lies above the definition of module M,so a copy of the M definition is marshalled up with the value fun()->M.y.Hence,when this function is applied to()in the receiver,the evaluation of M.y can use that copy,resulting in6. module M:sig val y:int end=struct let y=6end。