CN106415495B - 用于应用开发的编程系统和语言 - Google Patents
用于应用开发的编程系统和语言 Download PDFInfo
- Publication number
- CN106415495B CN106415495B CN201580028329.1A CN201580028329A CN106415495B CN 106415495 B CN106415495 B CN 106415495B CN 201580028329 A CN201580028329 A CN 201580028329A CN 106415495 B CN106415495 B CN 106415495B
- Authority
- CN
- China
- Prior art keywords
- program instructions
- intermediate representation
- language
- compiling
- compile
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/47—Retargetable compilers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/54—Link editing before load time
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明的一个实施方案中提供了一种用于应用开发的改进的编程系统和语言,其组合了C语言和Objective‑C语言的元素,但没有因要求维持与C语言的兼容性而施加的限制。该语言提供了在某些领域中C语言兼容性的功能,以改善以该语言编写的软件的固有安全性。该新语言包括默认安全考虑,诸如边界和溢出检查。
Description
交叉引用
本申请要求2014年5月30日提交的临时申请62/005,918的权益,该申请据此全文以引用方式并入本文。
背景技术
软件开发者能够使用集成开发环境提供的构建自动化工具和编译器或解释器来创建软件产品。在将高级语言编译成机器语言时,成熟的做法是在最终将源程序转换成机器语言之前,将源程序转换成一种或多种中间形式。各种中间形式可以由编译器基础结构的各种组件来处理。例如,LLVM(以前的低级虚拟机)是一种编译器基础结构,其能够提供完整编译器系统的中间层。LLVM被设计成对以任意编程语言编写的程序进行编译时、链接时、运行时和“空闲时”优化。LLVM具有语言无关性,能够用于各种前端。
LLVM使用的一种前端是Clang,这是用于LLVM的C语言前端。一般地,C语言是一种通用编程语言,与UNIX操作系统密切关联。然而,已经发现C语言被用于软件开发的几乎所有方面。Clang可以被用作以Objective-C编写的软件的前端编译器。Objective-C是C编程语言的超集并提供了面向对象的能力和动态运行时。Objective-C继承了C的语法、原始类型和流控制语句,并添加了用于定义类和方法的语法。Objective-C还添加了用于对象图管理和对象文字的语言级支持,同时提供了动态类型和绑定,将很多责任一直延迟到运行时。
Objective-C是C的“严格超集”。非面向对象的操作的语法,包括原始变量、预处理、表达式、函数声明和函数调用与C相同,而用于面向对象的特征的语法是从Smalltalk面向对象语言派生的消息传递的实施。因此,可以利用Objective-C编译器编译任何C程序,并在Objective-C类之内自由地包括C代码。
Objective-C的C兼容性提供了优点和缺点。C语言就高级编程语言来讲是相对“低级”的语言,利用与底层计算机系统类似的对象执行操作,诸如字符、数字和地址。然而,C是弱类型的语言,固有地涉及不安全的存储器操作。这样的特征在历史上向以C语言编写的应用提供了性能优势,但可能需要应用开发者足够细心,以防范意外的安全漏洞。
发明内容
在一个实施方案中,提供了一种改进的用于应用开发的编程系统,其包括新的编程语言。在一个实施方案中,该编程系统包括具有编译器基础结构的集成开发环境,该编译器基础结构允许以新语言编写的软件与以其他语言编写的现有软件混合。可以利用以新语言编写的新模块替换现有的软件模块,而不损害现有应用的功能。
在一个实施方案中,一种其中存储了指令的非暂态计算机可读介质使包括一个或多个处理器的处理系统执行操作,包括:接收编译以第一高级语言编写的第一组程序指令的第一请求。该第一高级语言可以是基于C语言的面向对象的编程语言。操作可进一步包括接收编译与第一组程序指令相关的第二组程序指令的第二请求。第二组指令可以以第二高级语言编写,该第二高级语言包括面向对象的元素和过程元素。第二组程序指令中的指令不与C编程语言严格兼容。
操作可进一步包括利用模块化编译系统编译第一组程序指令和第二组程序指令。该模块化编译系统可以包括多个前端编译器,第一组程序指令被编译成第一组程序指令的第一中间表示,并且第二组程序指令被编译成第二组程序指令的第二中间表示。
在一个实施方案中,一种系统包括耦接到存储器的一个或多个处理器以及耦接到存储器和一个或多个处理器的一个或多个非暂态存储设备。该存储设备可以包括第一高级语言下的第一组程序指令和第二高级语言下的第二组程序指令。附加地包括一个或多个存储设备上存储的应用开发系统。该应用开发系统能够被配置为利用第一组程序指令和第二组程序指令来构建应用。该应用开发系统包括具有第一前端编译器和第二前端编译器的模块化编译系统,并附加地包括链接器,该链接器用于将符号引用链接到第一组程序指令和第二组程序指令中的函数。该第一高级语言可以是基于C语言的面向对象的编程语言。第二高级语言包括面向对象的元素和过程元素,并且不与C编程语言严格兼容。
通过附图以及通过以下具体实施方式,本发明的其他特征将显而易见。以上概述不包括本发明的所有方面的详尽列表。预期本发明包括可根据以上概述的各方面以及以下具体实施方式部分中所公开的那些的所有合适组合来实践的所有系统和方法。
附图说明
在本说明书中对“一个实施方案”或“实施方案”的引用是指结合该实施方案描述的特定特征、结构或特性可以被包括在本发明的至少一个实施方案中。各种实施方案是通过举例而非限制的方式例示的。在附图的各图中,类似的附图标记表示类似元素。
图1是示出了支持新语言的模块化编译器系统的一个实施方案的框图。
图2是根据一个实施方案的数据处理系统的系统运行时环境的一个实施方案的框图。
图3是根据一个实施方案的用于将以多种语言编写的多组指令编译成一种通用语言的逻辑流程图。
图4是根据一个实施方案的用于编译包括以新语言编写的指令的混合语言应用的逻辑流程图。
图5示出了框图,示出了根据一个实施方案的示例性数据处理系统,该系统适于执行以移动或手持设备领域为目标的应用。
图6示出了框图,示出了根据一个实施方案的附加示例性数据处理系统。
具体实施方式
将参考下述细节描述用于应用开发的改进的编程系统和语言的各种实施方案和方面。该新的编程语言构建于由C和Objective-C语言提供的元素之上,而没有C兼容性施加的约束。改进的编程系统和新语言提供了在某些领域中做出改进的C语言的功能,以增强以该语言编写的软件的安全性。
例如,新语言包括默认的安全考虑,诸如当前基于C语言的编程语言中没有的界限和溢出检查。在下文中描述了众多的具体细节以提供对本发明各种实施方案的全面理解。然而,在某些实例中,众所周知或常规的细节并未被描述以便提供对本文所述的实施方案的简明论述。
语言特性的概述
该编程系统的实施方案包括集成开发环境,该集成开发环境提供了对新语言的支持,该新语言采用了安全编程模式以及超越C和Objective-C提供的那些之外的现代特征。例如,Objective-C的命名参数和动态对象模型连同新特征一起存在于新语言中,以简化应用的开发。新语言的实施方案提供了其自己的基本C和Objective-C类型的版本,包括用于整数的“Int”;用于浮点值的“Double”和“Float”;用于布尔值的“Bool”和用于文本数据的“String”。该新语言还提供了两种基本集合类型,“Array”和“Dictionary”的多个版本。可以使用变量存储并通过标识名称引用值。还有常数,其具有超越C语言中常数提供的那些的功能。在给定值明显不应在运行时改变时,该语言对常数进行扩展使用。
另外,新语言的实施方案引入了Objective-C中没有的高级类型。这些类型包括Tuples和Optionals。Tuples使得开发者能够创建并传递值的分组。Tuples将多个值分组为单个合成值。元组(tuple)之内的值可以是任何类型,并且不必彼此是相同类型。可以在定义元组时,在元组中命名各个元素。元组作为函数的返回值特别有用。在一个实施方案中,Tuples基本可以用作相关值的临时组,并可能不适于创建复杂的数据结构。
在一个实施方案中,提供了任选(optional)类型,该类型处理不存在值的情况。Optionals是表示“有一个值,等于x”或“根本没有值”的一种方式。C或Objective-C中不存在Optionals。Objective-C中最接近的类似功能是从本来会返回对象的方法返回空值,空值表示“没有有效对象”。然而,这仅对于对象有效,对结构、基本C类型或枚举值无效。对于这些类型,Objective-C方法通常返回特殊值(例如NSNotFound)来表示不存在该值。这假设该方法的调用者知道有要测试的特殊值,并记得检查以发现它。相反,Optionals允许开发者指出不存在任何类型的值,而不使用特殊常数。
新语言中的数据类型
在一个实施方案中,新语言包括多种形式的数据类型,包括合成类型和命名类型。合成类型是没有名称的类型,是在语言自身中定义的。命名类型是在其定义时可以赋予特定名称的类型。存在两种合成类型,即功能类型和元组类型。合成类型可以包含命名类型和其他合成类型。例如,元组类型(Int,(Int,Int))包含两个元素。第一个是命名类型Int,第二个是另一合成类型(Int,Int)。
与合成类型相反,命名类型是经由标准库以模块化方式定义的。命名类型包括类、结构、枚举和协议,包括由开发者在使用编程系统和语言的应用开发期间定义的那些。除了用户定义的命名类型之外,新语言标准库还定义常用的数据类型,包括表示数组、字典、任选值的那些,以及表示数字、字符和字符串的类型,在其他语言中,这些会是基本或原始类型。因为基本类型是命名类型,所以可以扩展其行为以适合使用类型扩展的开发者的需求。
类型安全和类型推断
新语言允许开发者对软件指令能够一起工作的值的类型进行说明。如果软件的部分期望是String,则类型安全防止指令错误地传递Int(例如整数)。这使得以新语言编写软件的开发者能够在开发过程中尽早捕获并修复错误。
额外的类型安全特征是编译时类型检查,这可以用于在利用不同类型的值工作时协助开发者避免编程错误。值未被隐式转换成另一种类型。如果开发者希望将第一类型的值转换成具有第二类型的值,开发者必须要显式定义期望类型的实例。
另外,为某种语言组件应用的类型检查使得用于新语言的编译器能够为其他语言组件执行编译时类型推断。例如,编译器能够基于初始化时使用的值来推断要分配到某些组件的类型,诸如常数和变量。编译器然后能够推断要在编译时分配到常数或变量的类型。
字符串和字符
新语言的字符串和字符类型提供了利用软件指令之内的文本工作的快速且符合Unicode的方式。用于字符串创建和操控的语法是轻型且可读的,与C字符串的语法类似。字符串级联简单到利用“+”运算符将两个字符串相加,通过在常数或变量之间选择来管理字符串的易变性,就像新语言中的任何其他值那样。
另外,可以使用字符串内插基于分配到其他变量的运行时值动态生成字符串。例如,如果源代码的一段要将整数值3定义到名为“a”的变量,将整数值5定义到名为“b”的变量,可以将字符串“mathResult”定义为“\(a)times\(b)is\(a*b)”。分配的结果是,mathResult将被分配内插字符串值“3times 5is 15”。这个特征使得开发者能够基于超过在运行时可以评估的多个因素来容易地定义复杂字符串。
类型转换
新语言被设计成鼓励开发者对特定指令集被设计成在其上操作的类型进行说明。可以根据项目的数据类型执行操作。为了访问作为所分配类之外的数据类型的项目,利用显式类型转换来访问数据项。新语言中的类型检查和类型转换是利用“is”和“as”运算符实施的。开发者可以使用“is”运算符检查项目是否是特定类型。如果该实例是该子类类型,则类型检查运算符返回真,如果不是,则返回假。开发者可以使用“as”运算符将项目转换成不同类型。类型转换不会修改项目的实例或改变项目的值。相反,项目作为其转换成的类型的实例而被访问。
集合类型
新语言提供了两种集合类型,被称为数组和字典,用于存储值的集合。数组存储同一类型值的排序列表。字典存储同一类型值的未排序集合,这些值可以通过唯一的标识符(也称为关键字)被引用和查找。
在一个实施方案中,数组和字典始终明确它们能够存储的值和关键字的类型。这意味着,软件开发者不会错误地向数组或字典中插入错误类型的值。这还意味着,软件开发者可以信任从数组或字典检索的值的类型。使用已显式定义类型的集合被设计成使得软件能够对数据类型做出说明并使得开发者能够在软件开发周期中的早期捕获类型失配。在一个实施方案中,新语言包括集合类型的自动边界检查,以防止访问集合边界外部的存储器。
下标
类、结构和枚举可以定义下标,它们可以是用于访问集合、列表或序列的成员元素的快捷方式。软件可以使用下标通过索引来设置和检索值,无需用于设置和检索的独立方法。例如,开发者可以编写软件,该软件访问Array实例中作为someArray[index]的元素,并访问Dictionary实例中作为someDictionary[key]的元素。
开发者可以为单一类型定义多个下标,基于传递到下标的索引值的类型来选择适当的下标过载以使用。下标不限于单个维度,可以定义具有多个输入参数的下标以适应定制类型的需求。
函数
函数是执行特定任务的代码的自备式片段。新语言的统一函数语法足够灵活,以表达从没有参数名的简单C式函数到具有针对每个参数的本地和外部参数名的复杂Objective-C式方法的任何函数。参数可以提供默认值以简化函数调用,并可以作为输入输出参数被传递,这样一旦函数完成其执行就修改传递的变量。
新语言中的每个函数都具有由函数的参数类型和返回类型构成的类型。开发者可以像新语言中任何其他类型那样使用这种类型,这使得将函数作为参数传递给其他函数以及从函数返回函数很容易。函数也可以在其他函数之内编写,以在嵌套函数范围之内封装有用的功能。在将函数分配给变量时,可以基于被分配函数的类型推断接收分配的变量类型。
闭包
闭包是能够在软件中被到处传递并使用的功能的自备式块。新语言中的闭包类似于C和Objective-C中的块和其他编程语言中的匿名函数(lambda)。闭包可以从定义它们的语境捕获并向任何常数和变量存储引用。这被称为在那些常数和变量上闭合,因此名为“闭包”。
如函数部分中介绍的,全局和嵌套函数实际是闭包的特殊情况。闭包采取三种形式之一,全局函数、嵌套函数和闭包表达式。全局函数是具有名称的闭包,并且不捕获任何值。嵌套函数是具有名称的闭包,并且能够从其闭合函数捕获值。闭包表达式是以轻型语法编写的无名称闭包,能够从其周围语境捕获值。新语言的闭包表达式具有整洁清楚的样式,优化在于鼓励常见场景中简短无混乱的语法。这些优化包括从语境推断参数和返回值类型、来自单表达式闭包的隐式返回、缩略自变量名称和跟踪闭包语法。
类和结构
类和结构是通用灵活的构造,其变成了程序代码的构造块。开发者定义属性和方法以利用与用于常数、变量和函数的相同语法向类和结构添加功能。
与其他编程语言不同的是,新语言不需要为定制类和结构创建独立的界面和实施文件。在新语言中,类或结构是在单个文件中定义的,通往该类或结构的外部接口可以自动供其他代码使用。
类的实例传统上被称为对象。然而,新语言类和结构在功能上比其他语言更接近,本章节的大部分描述可以应用于类或结构类型的任一种的实例的功能。因此,使用更一般的数据实例。
枚举
枚举定义类似种类的多个相关值,并被启用以在软件之内以类型安全的方式利用那些值工作。尽管C语言中的枚举向一组整数值分配相关名称,但新语言中的枚举更灵活,不必为枚举的每个成员提供值。如果为每个枚举成员提供值(称为“原始”值),该值可以是字符串、字符或任何整数或浮点类型的值。
或者,枚举成员可以通过与其他语言中的并集或变体类似的方式指定要与每个不同成员值一起存储的任何类型的关联值。开发者可以定义相关成员的公共集合作为一个枚举的部分,其每个都与适当类型的不同值相关联。
新语言中的枚举在其自己的权限中是第一类类型的。它们采用很多传统上仅由类支持的特征,诸如计算的属性,以提供关于枚举当前值的额外信息,以及提供与枚举代表的值相关的功能的实例方法。枚举还可以定义初始化程序以提供初始成员值;可以被扩展以将其功能扩展到其初始实施之外;并可以符合协议以提供标准功能。
嵌套类型
新语言使得开发者能够定义嵌套类型以支持所支持定义之内的枚举、类和结构。由于可以创建枚举以支持特定类或结构的功能,所以能够方便地定义实用性类和结构,纯粹用于更复杂类型的语境之内。为了在另一种类型之内嵌套类型,开发者可以在其支持的类型的外部大括号之内编写类型定义,以向编译器指出,该嵌套类型是嵌套类型要被嵌套其中的特定于类型的。可以使用开发者需要的那样多的嵌套层级。
扩展
扩展向现有类、结构或枚举类型添加新的功能。这包括能够扩展开发者不能访问其初始源代码的类型,这被称为追溯建模。扩展类似于Objective-C中的类别。然而,与Objective-C中的类别不同的是,新语言的扩展没有名称。
新语言中的扩展可以添加计算的属性和计算的静态属性,定义实例方法和类型方法,提供新初始化程序,定义下标,定义和使用新的嵌套类型,并使现有类型符合协议。
协议
协议定义适合某一特定任务或功能部分的方法、属性和其他要求的蓝图。在一个实施方案中,协议不提供要求的实施,但描述实施的构成。协议然后被类、结构或枚举采用,以提供那些要求的实际实施。满足协议要求的任何类型都被说成符合该协议。在一个实施方案中,协议可以要求符合的类型具有特定的实例属性、实例方法、类型方法、运算符和下标。
属性
属性将值与特定的类、结构或枚举相关联。存储的属性存储常数和变量值作为实例的部分,而计算的属性计算(而不是存储)值。类别、结构和枚举提供计算的属性。仅有类别和结构提供存储的属性。
存储和计算的属性通常与特定类型的实例相关联。然而,属性还可以与类型本身相关联。这样的属性被称为类型属性。
此外,开发者可以定义属性观察程序,以监测属性值的变化,这可以对应于伴随定制动作。可以将属性观察程序添加到由软件开发者定义的存储属性,还可以添加到子类从其超类继承的属性。
方法
方法是与特定类型相关联的函数。类、结构和枚举可以全部定义实例方法,这些实例方法封装特定的任务和功能,以利用给定类型的实例工作。类、结构和枚举还可以定义类型方法,该类型方法与类型本身相关联。类型方法类似于Objective-C中的类方法。
在新语言中,结构和枚举可以定义方法,这是相对于C和Objective-C语言的主要区别,在C和Objective-C中仅有类能够定义方法。在新语言中,开发者能够选择是否定义类、结构或枚举,并且仍然具有在开发者创建的类型上定义方法的灵活性。
继承
一个类可以从另一个类继承方法、属性和其他特性。在一个类从另一个类继承时,继承类被称为子类,其继承所自的类称为其超类。继承是新语言中将类与其他类型区分开的基本行为。
新语言中的类可以调用并访问属于其超类的方法、属性和下标,并能够提供其自己的那些方法、属性和下标的超驰版本,以细化或修改其行为。新语言通过检查超驰定义是否具有匹配的超类定义来帮助确保超驰是正确的。
类还可以向被继承的属性添加属性观察程序,以便在属性的值改变时得到通知。属性观察程序可以被添加到任何属性,无论该属性一开始被定义为存储的属性还是计算的属性。
初始化/解初始化
初始化是准备类、结构或枚举的实例以供使用的过程。这个过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备好使用之前需要的任何其他设置或初始化。
开发者通过定义初始化程序来实施这种初始化过程,这是能够被调用以创建特定类型的新实例的专门方法。与Objective-C不同的是,新语言中的初始化程序不返回值。初始化程序的基本作用是确保类型的新实例在第一次被使用之前被正确初始化。类类型的实例还可以实施解初始化程序,该程序恰好在对该类的实例解除分配之前执行任何定制清理。在对类实例解除分配之前即刻调用解初始化程序。利用解初始化关键词编写解初始化程序,类似于如何利用初始化关键词编写初始化程序。解初始化程序仅在类类型上可用。
自动引用计数
新语言使用自动引用计数(ARC)以跟踪并管理应用的存储器使用。在大多数情况下,这意味着存储器管理在新语言中“直接工作”,开发者不需要显式执行存储器管理。在不再需要类实例时,ARC自动释放那些实例使用的存储器。每次创建新的类实例时,ARC都分配存储器块以存储关于该实例的信息。这种存储器保存关于实例类型的信息,连同与该实例相关联的任何存储属性的值。在不再需要实例时,ARC释放该实例使用的存储器,使得存储器能够用于其他目的。这确保了在不再需要类实例时,它们不占用存储器中的空间。
然而,如果ARC要对仍在使用的实例解除分配,它不再可能访问该实例的属性,或者调用该实例的方法,可能会导致应用崩溃。为了确保在仍然需要该实例时它们不消失,ARC跟踪当前有多少属性、常数和变量正在引用每个类实例。只要仍然存在至少一个对该实例的活动引用,ARC将不解除实例的分配。为了使这成为可能,只要开发者向属性、常数或变量分配类实例,该属性、常数或变量就对该实例做出强引用。该引用被称为“强”引用是因为其保持对该实例的牢固持有,只要强引用保持,就不允许其被解除分配。
控制流
新语言提供了类似C的语言的所有熟悉的控制流构造。这些包括for和while循环,以将任务执行多次,if和switch语句以基于特定条件执行不同的代码分支,以及诸如break和continue的语句以将执行流转移到软件中的另一个点。除了C语言中见到的传统for条件递增(for-condition-increment)循环之外,新语言添加了for-in循环,使得容易在数组、字典、范围、字符串和其他序列上迭代。
新语言的switch语句也比其在C语言中的对应语句更强大。在新语言中,switch语句case不会“滑过”到下一个case,避免了因为缺失break语句导致的常见C语言错误。case能够匹配很多不同类型的模式,包括范围匹配、元组和转换到特定类型。switch case中的匹配值可以绑定到临时常数或变量,以用于case的主体之内,复杂匹配条件可以针对每种情况利用where从句表达。
使用任选值的控制流
任选链是查询和调用当前可能为空值的任选值上的属性、方法和下标的方式。任选值包含值或包含空值,以表示该值缺失。应用于类型的“?”表示该类型可以具有值,或者该值可以任选地为空(例如不包含值)。可以利用任选值执行控制流,使得如果任选值包含值,则属性、方法或下标调用成功;如果任选值为空,则属性、方法或下标调用返回空值。可以将多个查询链接到一起,如果链中的任何环节为空,整个链适度地失败。
泛型
泛型代码使得开发者能够编写灵活、可重复使用的函数和类型,其可以利用任何类型工作,受到定义的要求约束。开发者可以编写避免重复的代码并以清晰简洁的方式表达其意图。泛型是新语言最强大的特征之一,新语言的标准库的大部分都是利用泛型代码构建的。例如,新语言的Array和Dictionary类型是泛型集合。开发者可以创建保持Int值的数组或保持String值的数组,或实际为针对能够在新语言中创建的任何其他类型的数组。类似地,开发者可以创建字典以存储任何指定类型的值,对该类型可以是什么没有限制。
运算符
运算符是用于检查、更改或组合值的特殊符号或短语。新语言支持大部分标准C运算符,并改进了几项能力以解决在软件开发期间出现的常见问题。例如,赋值运算符(=)不返回值,以防止其在期望是等号运算符(==)时被错误地使用。算术运算符(例如+、-、*、/、%等)检测并且不允许值溢出,以避免在利用变得大于或小于存储它们的类型的允许值范围的数字工作时出现不期望的结果。另外,余数(%)计算可以在浮点数字上执行。而且,新语言提供了两种范围运算符,半闭合(例如a..b)和闭合(例如a...b)范围运算符,在C语言中没有它们。范围运算符可以被用作用于表达值范围的快捷方式。新语言的实施方案允许创建定制运算符,并可以针对定制数据类型定义标准运算符的行为。
除了基本运算符之外,新语言的实施方案提供了几种执行更复杂值操控的高级运算符。高级运算符包括逐位和位移位运算符。和C不同的是,新语言中的算术运算符不会默认溢出。溢出行为被捕获并报告为错误。为了选择启用溢出行为,新语言提供第二组默认溢出的算术运算符,诸如溢出加法运算符(&+)。在一个实施方案中,溢出运算符开始于和号(&)。另外,新语言使得能够定义定制运算符并为定制数据类型实施标准运算符。
访问控制
新语言中包括的一种安全机制是基于源文件和模块的访问控制。可以使用访问控制限制对软件的部分中提供的功能的访问。开发者能够向各个类型(类、结构和枚举)以及属性、方法、初始化程序和属于那些类型的下标分配特定访问级别。协议可以被限于特定语境,如全局常数、变量和函数能够做的那样。另外,在不同场景中提供了默认访问级别,使得开发者能够利用某一级别的默认保护而无需软件中的任何显式访问控制定义。
在一个实施方案中,新语言中实施的访问控制模型基于模块和源文件概念。模块是代码分发的单个单元,诸如作为单个实体构建并传输且可以由另一个模块导入的框架或应用。每个构建目标(例如应用、框架等)可以被作为独立模块对待。另选地,源文件是模块之内的单个源代码文件。
在一个实施方案中,提供了三种不同的访问级别:公共的、内部的和私有的。访问级别是相对于定义实体的源文件,还相对于源文件要集成到其中的模块而言的。公共访问使得实体能够被用于来自其定义模块的任何源文件之内,还用于来自导入定义模块的另一模块的源文件中。例如,通往框架的公开暴露的接口将被声明为公共的。内部访问使得实体能够被用于来自其定义模块的任何源文件之内,但不用于该模块外部的任何源文件中。通常,框架的内部结构被定义为内部。私有访问将实体的使用限制到该实体的定义源文件。在其他源文件中,即使在同一模块之内,定义的逻辑实体,将不能访问私有实体。因此,新语言中的实体不能以具有更受限访问级别的实体来定义。例如,公共变量不能被定义为具有内部或私有类型,因为该类型可能不能在使用公共变量的每处地方可用。函数不能具有比其参数类型和返回类型更高的访问级别,因为该函数可以在其构成类型不可为周围代码所用的情况中被使用。
利用编程系统构建混合语言应用
在一个实施方案中,新语言被设计成提供与用于Objective-C的现有软件开发环境和框架的无缝兼容性。开发者可以在新语言中使用Objective-C代码(范围从系统框架到定制代码),开发者可以在Objective-C中使用新语言,即使新语言不与C语言严格兼容。这使得新语言是一种容易且强大的工具,以集成到围绕现有应用框架设计的应用开发工作流中。可以用于新语言的示例性Objective-C框架是用于OSX和iOS操作系统的Cocoa和Cocoa触摸框架,所有都来自加利福尼亚州Cupertino的Apple Inc.。本文描述的编程系统的示例性组件是也来自Apple Inc.的Xcode集成开发环境。本文描述的新语言的示例性实施方案是也来自Apple Inc.的Swift编程语言。然而,这些示例并非要进行限制。
在一个实施方案中,可以访问Objective-C代码以利用集成开发环境(例如Xcode)创建基于新语言(例如Swift)的应用。可以直接向新语言中导入可以作为模块被访问的Objective-C框架(或C库)。新语言可以与Objective-C中的现有框架互操作,这样允许以新语言编写的类用于Objective-C,以利用现有的开发框架,并与以新语言编写的新代码一起操作。
在一个实施方案中,可以开发混合语言应用,其包含现有的基于Objective-C的软件以及以新语言编写的软件。软件模块可以传达和交换信息。兼容性通过使得现有模块能够被以新语言编写的新模块替代而减小从现有软件迁移到以新语言编写的新软件的难度,而不会影响应用的功能。具体地讲,可以利用新语言实施应用功能的一部分,而应用的其他部分继续以例如Objective-C编写。
在一个实施方案中,可以开发混合语言框架,其包括与以现有的兼容C的语言编写的模块一起的以新语言编写的模块。可以从以兼容C的语言以及以新语言开发的模块两者开发的客户端软件访问混合语言框架的模块。在交叉导入以不同语言编写的模块时,该编程系统能够自动生成头文件,这些文件并入了充分的桥接信息以跨不同语言编写的模块揭示功能。在一个实施方案中,自动生成桥接报头文件,其包括利用以不同语言编写的模块执行链接时符号解析所需的必要信息。混合语言开发由本文描述的编程系统使用的模块化编译器系统部分实现了。
示例性编译器系统
在一个实施方案中,可以在集成开发环境内利用模块化编译器系统,诸如LLVM编译器基础结构实现的系统,执行新语言的编译。在一个实施方案中,可以使用诸如Clang前端编译器的前端编译器。
图1是示出了支持新语言的模块化编译器系统100的一个实施方案的框图。在一个实施方案中,该模块化编译器系统100包括多个前端编译器,该多个前端编译器包括支持新语言的第一前端编译器102,以及支持C语言(例如C、Objective-C)的第二前端编译器104。多个前端编译器中的每个都能够将以特定高级语言编写的源代码转换成常见中间表示,诸如LLVM中间表示。链接器105能够在前端编译器编译的代码模块之间链接函数和对象引用,之后中间语言优化器106能够对中间表示执行跨语言优化。在一个实施方案中,中间语言优化器106基于一个或多个请求的编译时优化,对多个前端编译器输出的所得中间表示执行一个或多个附加的链接时优化。(例如跨模块的死代码去除等)。于是,可以在公共点处对以多种高级源代码语言编写的多个软件模块进行优化,并然后进行交叉优化,即使模块均以不同的高级语言编写也是如此。
中间表示可以存储于基于文本的中间语言中或被转换成位码表示。中间表示然后可以由一个或多个后端编译器转换成特定于特定处理器架构的机器语言格式。例如,用于第一架构(例如兼容x86的指令集架构)的后端编译器107可以用于编译机器代码以在支持第一架构的处理器上执行,而用于第二架构(例如兼容ARM的指令集架构)的后端编译器108可以用于编译机器代码以在支持第二架构的处理器上执行。
在一个实施方案中,优化的中间表示可以以二进制格式存储在数据处理器系统的非易失性存储器120中供稍晚使用。在运行时引用以中间语言定义的函数时,尚未被转换成架构特有的机器代码的任何函数可以被即时编译器130编译成用于受编译系统支持的架构(例如第一架构137或第二架构138中的任一个或多个)的机器代码。
如需关于LLVM编译器基础结构的更多信息,参见伊利诺斯州Urbana-Champaign校区的Lattner的Macroscopic Data Structure Analysis And Optimization(2005年)。
示例性系统运行时环境
图2是根据一个实施方案的数据处理系统的系统运行时环境200的一个实施方案的框图。该数据处理系统包含处理系统210,处理系统210包括一个或多个处理器,每个处理器均可以具有一个或多个处理器内核。该处理系统210可以指示运行于系统存储器220中的操作系统222加载通过本文所述的该编程系统的实施方案和用于应用开发的语言开发的应用。
在一个实施方案中,操作系统222具有应用启动框架232,其启动数据处理系统的非易失性存储器215中存储的应用。在一个实施方案中,操作系统222包括具有加载/链接优化器228的加载器/链接器227,以执行附加的链接时和加载时优化,同时向进程存储器空间240中加载应用的组件。示例链接时优化是,如果该函数未被任何其他函数调用(例如链接器未将任何符号解析成该函数),则绕过对程序函数的加载。如果该函数在稍晚时间变得相关,加载器/链接器227可以加载存储器中的函数。在一个实施方案中,一些模块可以作为位码被存储于非易失性存储器215上,并推迟最终转换成机器代码,直到应用的其他组件需要该模块。然后可以由即时编译器(例如如图1中所示的即时编译器130)编译位码并加载到进程存储器空间240中。
进程存储器空间240包括应用的运行时组件,该组件包括栈段242、堆段246和代码段248。在一个实施方案中,该运行时环境包括虚拟存储器系统,该系统允许将非易失性存储器215中的地址空间映射到系统存储器220中。具体地讲,可以经由从非易失性存储器215进行的虚拟存储器映射加载应用的代码段248。一旦加载之后,处理系统210就能够执行代码段248中的已编译指令。
在一个实施方案中,进程存储器空间240包括来自系统存储器220的其他区域的一个或多个存储器映射244,包括分配到其他应用或进程的存储器空间。例如,可以在通过编程系统的实施方案和用于应用开发的语言构建的应用的进程存储器空间中,将系统提供的共享库250加载到存储器中并映射到存储器映射244中。
用于构建应用的示例性逻辑
在下面的图3和图4中所描绘的过程可由包括硬件(例如电路、专用逻辑等)、软件(如非暂态机器可读存储介质上的指令)或硬件和软件的组合的处理逻辑来执行。虽然下文按照某些顺序操作来描述该过程,但应当理解,所描述的某些操作可以不同的顺序执行。此外,某些操作也可并行执行而非按顺序执行。
图3是根据一个实施方案的用于将以多种语言编写的多组指令编译成一种通用语言的逻辑的流程图。在一个实施方案中,应用可以包括使用多种编程语言开发的多个模块。如方框302所示,编译用于此类应用的指令可以包括接收编译以第一高级语言编写的第一组程序指令的第一请求。编译还可以包括接收编译以第二高级语言编写的第二组指令的第二请求,如方框304处所示。在一个实施方案中,第一高级语言是基于C语言的高级面向对象的语言,诸如Objective-C编程语言。第二语言可以是不与C语言严格兼容的高级编程语言,诸如本文所述新语言的变体。在一个实施方案中,第二语言是Swift高级编程语言。
如方框306所示,可以利用包括模块化编译系统的集成开发环境将第一组程序指令和第二组程序指令编译成中间语言或中间表示。例如,集成Xcode可以使用模块化编译系统,诸如LLVM,以将第一组程序指令和第二组程序指令编译成中间语言,或中间表示,诸如LLVM中间表示,但也可以使用其他集成开发环境编译器和中间表示。
图4是根据一个实施方案的用于编译包括以新语言编写的指令的混合语言应用的逻辑的流程图。在一个实施方案中,如方框402所示,编译操作包括由数据处理系统接收编译第一组程序指令以运行于目标处理器上的请求。目标处理器可以是用于编译器的主机数据处理系统。在一个实施方案中,该请求是跨编译器请求,其中目标处理器与主处理器或数据处理系统的处理器不同。响应于该请求,如方框404处所示,该系统可以利用前端编译器将第一组程序指令编译成第一中间表示。在一个实施方案中,前端编译器是特定于C语言的,诸如C语言、C++或Objective-C。在一个实施方案中,前端编译器是严格与C编程语言兼容的特定于语言的,诸如ANSI C或Objective-C。在一个实施方案中,前端编译器包括对非基于C的语言的支持。
如方框406所示,操作附加地包括接收编译第二组程序指令以运行于目标处理器上的第二请求。第二组程序指令可以与第一组程序指令相关。例如,第一组程序指令可以是应用的Objective-C模块,而第二组程序指令可以是用于以新编程语言编写的应用的新模块。在一个实施方案中,第二语言不与C编程语言严格兼容,从而与C语言严格兼容的编译器将不编译以第二语言编写的指令。在一个实施方案中,第二语言包括面向对象的元素、过程元素并默认执行边界和溢出检查。
在一个实施方案中,如方框408所示,操作附加地包括响应于第二请求编译第二组程序指令。在一个实施方案中,利用特定于新编程语言的语言特有的前端编译器编译第二组程序指令。在一个实施方案中,利用包括对新语言以及其他语言支持的前端编译器编译第二组程序指令,其他语言诸如是基于C编程语言的语言。可以将第二组程序指令编译成第二组程序指令的第二中间表示。
在一个实施方案中,如方框410所示,可以执行额外的操作,包括利用链接器链接第一中间表示和第二中间表示。在一个实施方案中,链接器和前端编译器是模块化LLVM编译器基础结构的组件。如方框412所示,一个实施方案可以利用特定于目标处理器的后端编译器编译第一中间表示和第二中间表示,以允许迅速让程序重新将不同类型的处理器和数据处理系统作为目标。
图5示出了框图,示出了根据一个实施方案的示例性数据处理系统,该系统适于执行以移动或手持设备领域为目标的应用。数据处理系统500可以是适于在手持式或移动设备中使用的芯片集成电路上的系统。可以使用未示出的一个或多个总线或接口互连各个组件,如现有技术中所知那样。利用图示数据处理系统500构造的电子设备可以包括比图示更多的或更少的组件。
该系统可以包括处理系统505,其具有存储器510和一个或多个微处理器,用于存储数据和程序供处理系统505执行。包括音频I/O子系统520,其可以包括用于回放音乐的麦克风和扬声器。音频I/O子系统520还可以通过扬声器和麦克风提供电话功能。
可以包括显示控制器和显示设备530以为用户提供图形用户界面,可以有无线收发器570用以经由一种或多种无线技术诸如Wi-Fi、红外、蓝牙,或无线蜂窝技术的一种或多种变体来发射和接收数据。系统500可以包含处于向前和向后配置中的一个或多个相机设备540,但每个均仅有前向相机或后向相机的类似配置的系统可以是很多最优配置之一。数据处理系统500还包括一种或多种输入设备550,使得用户能够向系统提供输入。输入设备可以包括小键盘或键盘,它们是单独的或与显示设备530上覆盖的触摸或多点触摸面板结合。可以利用本文所述的工厂生成的校准数据来实时调节显示设备和触摸面板。数据处理系统500还可以包括用于提供位置认知服务的设备,诸如全球定位系统(GPS)设备560或其等同物。
图6示出了框图,其示出了根据一个实施方案的另一示例性数据处理系统,该系统适用于工作站、移动工作站或服务器之内。数据处理系统600包括用于将系统的各种组件互连的一条或多条总线609。包含一个或多个处理器内核的一个或多个处理器603被耦接到一条或多条总线609。存储器605可为易失性顺序DRAM、非易失性RAM,或者可为闪存存储器或其他类型的半导体存储器。存储器605使用本领域已知的技术耦接至一条或多条总线609。
数据处理系统600还可以包括用于数据存储的非易失性存储器607,其可以是硬盘驱动器、闪速存储器、光存储器、在全部电力从系统移除之后保持数据的其他类型的存储器系统。非易失性存储器607和存储器605均使用已知的接口及连接技术来耦接至所述一条或多条总线609。显示控制器622耦接到所述一条或多条总线609以接收将要在显示设备623上显示的显示数据。显示设备623可包括用于提供触摸屏的集成式触摸输入。数据处理系统600还可包括一个或多个I/O控制器615以提供用于一个或多个I/O设备的接口,此类I/O设备包括触摸屏、触摸板、操纵杆、一个或多个鼠标输入和其他输入设备(包括本领域已知的那些)。I/O控制器还可以提供用于一个或多个输出设备(例如扬声器)的接口。输入/输出设备617可通过一个或多个I/O控制器615耦接。另外,一个或多个网络接口625还可以耦接到一条或多条总线以向一个或多个网络提供接入。
虽然图6示出了非易失性存储器607和存储器605直接地而不是通过网络接口耦接至一条或多条总线,但应当理解,数据处理系统可以利用远离系统的非易失性存储器,诸如通过诸如调制解调器或以太网接口或无线接口(诸如无线Wi-Fi收发器或无线蜂窝电话收发器或此类收发器的组合)的网络接口耦接至数据处理系统的网络存储设备。如本领域中所公知的,该一条或多条总线609可包括用于在各条总线之间互连的一个或多个桥接器或控制器或适配器。在一个实施方案中,I/O控制器615包括用于控制USB外围设备的USB适配器,并且可控制以太网端口或无线收发器或无线收发器的组合。
本文所描述的技术和方法可在数据处理系统中响应于其处理器执行指令序列而实施,该指令序列包含在诸如存储器605或非易失性存储器607或此类存储器的组合的易失性非暂态存储器中。然而,本技术并不局限于硬件电路和软件的任何特定组合,或局限于用于指令的任何特定来源,该指令由与用于执行本文所述一个或多个操作的装置相关联的处理系统执行。在各种实施方案中,可以结合硬连线电路使用存储于机器可读存储介质上的软件指令,诸如配置为从非暂态机器可读存储介质执行指令的专用处理逻辑或通用处理逻辑。非暂态机器可读(例如计算机可读)存储介质包括任何类型的机器可读存储介质,包括软盘、闪存存储器设备、光盘、CD-ROM和磁光盘、只读存储器(ROM)、随机存取存储器(RAM)、可擦除可编程ROM(EPROM)、电可擦可编程ROM(EEPROM)、磁卡或光卡,或适于存储电子指令的任何类型的介质,这与专门设计或指定用于承载暂态传播信号的介质相反。
在前述的说明书中,参照其特定的实施方案描述了本发明的各种实施方案。但显而易见的是,在不脱离本发明的更广泛的实质和范围的情况下,可对这些实施方案进行各种修改和变更。因此,说明书和附图应被视为是例示性的而非限制性的。
Claims (34)
1.一种机器实现的方法,包括:
接收编译以第一高级语言编码的第一组程序指令的第一请求,所述第一高级语言是基于C语言的面向对象的编程语言;
接收编译与所述第一组程序指令相关的第二组程序指令的第二请求,所述第二组程序指令是以包括面向对象的元素和过程元素的第二高级语言编码的,其中第二高级语言不与所述C语言严格兼容并且第二高级语言没有C兼容性施加的约束;
使用包括多个前端编译器的模块化编译系统来编译所述第一组程序指令和所述第二组程序指令,所述第一组程序指令被编译成所述第一组程序指令的第一中间表示,并且所述第二组程序指令被编译成所述第二组程序指令的第二中间表示;
链接所述第一中间表示和所述第二中间表示;以及
使用特定于目标处理器的后端编译器来编译所述第一中间表示和所述第二中间表示。
2.根据权利要求1所述的方法,还包括用于执行附加操作的指令,所述附加操作包括:
响应于所述第一请求,使用支持所述第一高级语言的第一前端编译器来编译所述第一组程序指令;以及
响应于所述第二请求,使用支持所述第二高级语言的第二前端编译器来编译所述第二组程序指令。
3.根据权利要求1所述的方法,其中所述第一中间表示或所述第二中间表示是LLVM中间表示。
4.根据权利要求1所述的方法,还包括用于执行附加操作的指令,所述附加操作包括在编译时优化期间优化所述第一中间表示和所述第二中间表示。
5.根据权利要求1所述的方法,还包括用于执行附加操作的指令,所述附加操作包括在链接时优化期间优化所述第一中间表示和所述第二中间表示。
6.根据权利要求5所述的方法,还包括用于执行操作的指令,所述操作包括响应于在编译期间优化所述程序指令的请求来优化所述第一中间表示和所述第二中间表示。
7.根据权利要求1所述的方法,其中编译所述第二组程序指令包括默认执行编译时数据类型溢出检查。
8.根据权利要求1所述的方法,其中编译所述第二组程序指令包括默认执行编译时数据结构边界检查。
9.根据权利要求1所述的方法,其中编译所述第二组程序指令包括结合一个或多个类型推断操作来执行一个或多个编译时类型安全操作。
10.一种数据处理系统,包括:
用于接收编译以第一高级语言编码的第一组程序指令的第一请求的装置,所述第一高级语言是基于C语言的面向对象的编程语言;
用于接收编译与所述第一组程序指令相关的第二组程序指令的第二请求的装置,所述第二组程序指令是以包括面向对象的元素和过程元素的第二高级语言编码的,其中第二高级语言不与所述C语言严格兼容并且第二高级语言没有C兼容性施加的约束;
用于使用包括多个前端编译器的模块化编译系统来编译所述第一组程序指令和所述第二组程序指令的装置,所述第一组程序指令被编译成所述第一组程序指令的第一中间表示,并且所述第二组程序指令被编译成所述第二组程序指令的第二中间表示;
用于链接所述第一中间表示和所述第二中间表示的装置;以及
用于使用特定于目标处理器的后端编译器来编译所述第一中间表示和所述第二中间表示的装置。
11.根据权利要求10所述的系统,还包括:
用于响应于所述第一请求而使用支持所述第一高级语言的第一前端编译器来编译所述第一组程序指令的装置;和
用于响应于所述第二请求而使用支持所述第二高级语言的第二前端编译器来编译所述第二组程序指令的装置。
12.根据权利要求10所述的系统,其中所述第一中间表示或所述第二中间表示是LLVM中间表示。
13.根据权利要求10所述的系统,还包括用于执行附加操作的指令,所述附加操作包括在编译时优化期间优化所述第一中间表示和所述第二中间表示。
14.根据权利要求10所述的系统,还包括用于执行附加操作的指令,所述附加操作包括在链接时优化期间优化所述第一中间表示和所述第二中间表示。
15.根据权利要求14所述的系统,还包括用于执行操作的指令,所述操作包括响应于在编译期间优化所述程序指令的请求来优化所述第一中间表示和所述第二中间表示。
16.根据权利要求10所述的系统,其中编译所述第二组程序指令包括默认执行编译时数据类型溢出检查。
17.根据权利要求10所述的系统,其中编译所述第二组程序指令包括默认执行编译时数据结构边界检查。
18.根据权利要求10所述的系统,其中编译所述第二组程序指令包括结合一个或多个类型推断操作来执行一个或多个编译时类型安全操作。
19.一种数据处理系统,包括:
一个或多个处理器,所述一个或多个处理器耦接到存储器;
一个或多个非暂态存储设备,所述一个或多个非暂态存储设备耦接到所述存储器和所述一个或多个处理器,所述存储设备包括第一高级语言的第一组程序指令和第二高级语言的第二组程序指令;
应用开发系统,所述应用开发系统存储在所述一个或多个存储设备上,所述应用开发系统用于使用所述第一组程序指令和所述第二组程序指令来构建应用,所述应用开发系统包括具有第一前端编译器和第二前端编译器的模块化编译系统,并附加地包括链接器,所述链接器用于将符号引用链接到所述第一组程序指令和所述第二组程序指令中的函数;
其中所述第一高级语言是基于C语言的面向对象的编程语言,并且所述第二高级语言包括面向对象的元素和过程元素;并且
其中所述第二组程序指令不与所述C语言严格兼容,第二高级语言没有C兼容性施加的约束,并且包括由第二高级语言提供的指出不存在任何类型的值的数据类型。
20.根据权利要求19所述的系统,其中所述第一前端编译器将所述第一组程序指令编译成第一中间表示,并且所述第二前端编译器将所述第二组程序指令编译成第二中间表示。
21.根据权利要求20所述的系统,其中所述第二前端编译器默认执行数据结构边界检查和数据类型溢出保护。
22.根据权利要求20所述的系统,还包括中间语言优化器,所述中间语言优化器用于优化所述第一中间表示和所述第二中间表示。
23.根据权利要求21所述的系统,其中所述第二组程序指令包括基于源文件的访问限制,所述基于源文件的访问限制用于防止从公共源文件内未定义的逻辑元素访问逻辑元素。
24.一种计算机实现的方法,包括:
接收编译第一组程序指令以运行于目标处理器上的第一请求;
响应于所述第一请求,使用前端编译器来编译所述第一组程序指令,其中所述前端编译器包括对第一高级语言的支持,其中所述第一高级语言是基于C语言的面向对象的编程语言,并且其中所述第一组程序指令被编译成所述第一组程序指令的第一中间表示;
接收编译第二组程序指令以运行于所述目标处理器上的第二请求,其中所述第二组程序指令与所述第一组程序指令相关,其中所述第二组程序指令是以包括面向对象的元素和过程元素的第二高级语言编码的,其中所述第二高级语言包括默认的数据类型溢出保护,并且其中所述第二组程序指令不与所述C语言严格兼容并且第二高级语言没有C兼容性施加的约束;
响应于所述第二请求,使用所述前端编译器来编译所述第二组程序指令,其中所述前端编译器包括对所述第二高级语言的支持,并且其中所述第二组程序指令被编译成所述第二组程序指令的第二中间表示;
链接所述第一中间表示和所述第二中间表示,其中链接所述第一中间表示和所述第二中间表示包括响应于优化所述程序指令的编译时请求,优化所述第一中间表示和所述第二中间表示;以及
使用特定于所述目标处理器的后端编译器来编译所述第一中间表示和所述第二中间表示。
25.根据权利要求24所述的方法,其中所述后端编译器是即时编译器。
26.根据权利要求24所述的方法,其中编译所述第二组程序指令包括默认执行编译时数据类型溢出检查和编译时数据结构边界检查。
27.根据权利要求24所述的方法,其中编译所述第二组程序指令包括内插的字符串。
28.根据权利要求24所述的方法,其中编译所述第二组程序指令包括结合一个或多个类型推断操作来执行一个或多个编译时类型安全操作。
29.一种数据处理系统,包括:
用于接收编译第一组程序指令以运行于目标处理器上的第一请求的装置;
用于响应于所述第一请求而使用前端编译器来编译所述第一组程序指令的装置,其中所述前端编译器包括对第一语言的支持,其中所述第一语言是基于C语言的面向对象的编程语言,并且其中所述第一组程序指令被编译成所述第一组程序指令的第一中间表示;
用于接收编译第二组程序指令以运行于所述目标处理器上的第二请求的装置,其中所述第二组程序指令与所述第一组程序指令相关,其中所述第二组程序指令是以包括面向对象的元素和过程元素的第二语言编码的,其中所述第二语言包括默认的数据类型溢出保护,并且其中所述第二组程序指令不与所述C语言严格兼容并且第二高级语言没有C兼容性施加的约束;
用于响应于所述第二请求而使用所述前端编译器来编译所述第二组程序指令的装置,其中所述前端编译器包括对所述第二语言的支持,并且其中所述第二组程序指令被编译成所述第二组程序指令的第二中间表示;
用于链接所述第一中间表示和所述第二中间表示的装置,其中用于链接所述第一中间表示和所述第二中间表示的装置包括用于响应于优化所述程序指令的编译时请求而优化所述第一中间表示和所述第二中间表示的装置;和
用于使用特定于所述目标处理器的后端编译器来编译所述第一中间表示和所述第二中间表示的装置。
30.根据权利要求29所述的系统,其中所述后端编译器是即时编译器。
31.根据权利要求29所述的系统,其中编译所述第二组程序指令包括默认执行编译时数据类型溢出检查和编译时数据结构边界检查。
32.根据权利要求29所述的系统,其中编译所述第二组程序指令包括内插的字符串。
33.根据权利要求29所述的系统,其中编译所述第二组程序指令包括结合一个或多个类型推断操作来执行一个或多个编译时类型安全操作。
34.一种其中存储有指令的非暂态计算机可读介质,所述指令在被处理器执行时,使所述处理器执行操作,所述操作包括:
接收编译以第一高级语言编码的第一组程序指令的第一请求,所述第一高级语言是基于C语言的面向对象的编程语言;
接收编译与所述第一组程序指令相关的第二组程序指令的第二请求,所述第二组程序指令是以包括面向对象的元素和过程元素的第二高级语言编码的,其中第二高级语言不与所述C语言严格兼容并且第二高级语言没有C兼容性施加的约束;
使用包括多个前端编译器的模块化编译系统来编译所述第一组程序指令和所述第二组程序指令,所述第一组程序指令被编译成所述第一组程序指令的第一中间表示,并且所述第二组程序指令被编译成所述第二组程序指令的第二中间表示;
链接所述第一中间表示和所述第二中间表示;以及
使用特定于目标处理器的后端编译器来编译所述第一中间表示和所述第二中间表示。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201462005918P | 2014-05-30 | 2014-05-30 | |
US62/005,918 | 2014-05-30 | ||
US14/502,697 | 2014-09-30 | ||
US14/502,697 US9329844B2 (en) | 2014-05-30 | 2014-09-30 | Programming system and language for application development |
PCT/US2015/030007 WO2015183526A1 (en) | 2014-05-30 | 2015-05-08 | Programming system and language for application development |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106415495A CN106415495A (zh) | 2017-02-15 |
CN106415495B true CN106415495B (zh) | 2020-01-10 |
Family
ID=53274815
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201580028329.1A Active CN106415495B (zh) | 2014-05-30 | 2015-05-08 | 用于应用开发的编程系统和语言 |
Country Status (3)
Country | Link |
---|---|
US (2) | US9329844B2 (zh) |
CN (1) | CN106415495B (zh) |
WO (1) | WO2015183526A1 (zh) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9588741B2 (en) | 2013-03-15 | 2017-03-07 | United Parcel Service Of America, Inc. | Methods, apparatuses and computer program products for improving productivity for building applications |
US9542558B2 (en) * | 2014-03-12 | 2017-01-10 | Apple Inc. | Secure factory data generation and restoration |
US9329844B2 (en) * | 2014-05-30 | 2016-05-03 | Apple Inc. | Programming system and language for application development |
US9830134B2 (en) * | 2015-06-15 | 2017-11-28 | Qualcomm Incorporated | Generating object code from intermediate code that includes hierarchical sub-routine information |
US9983857B2 (en) | 2015-06-16 | 2018-05-29 | Architecture Technology Corporation | Dynamic computational acceleration using a heterogeneous hardware infrastructure |
US9690894B1 (en) * | 2015-11-02 | 2017-06-27 | Altera Corporation | Safety features for high level design |
US10423397B2 (en) * | 2016-12-29 | 2019-09-24 | Grammatech, Inc. | Systems and/or methods for type inference from machine code |
CN109213424B (zh) * | 2017-06-30 | 2024-04-12 | 北京忆恒创源科技股份有限公司 | 并发io命令的无锁处理方法 |
CN107895115B (zh) * | 2017-12-04 | 2021-01-29 | 北京元心科技有限公司 | 防止栈溢出的方法、装置及终端设备 |
KR102486236B1 (ko) * | 2017-12-26 | 2023-01-09 | 삼성전자주식회사 | 무선 통신 시스템에서 네트워크 기능 가상화를 위한 장치 및 방법 |
WO2019148343A1 (zh) * | 2018-01-31 | 2019-08-08 | 拜椰特(上海)软件技术有限公司 | 一种新型计算机编程语言 |
CN110045997B (zh) * | 2019-04-15 | 2022-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 基础功能模块的对象初始化方法、装置、设备和存储介质 |
CN110109748B (zh) * | 2019-05-21 | 2020-03-17 | 星环信息科技(上海)有限公司 | 一种混合语言任务执行方法、装置及集群 |
CN111563260B (zh) * | 2020-03-27 | 2023-03-14 | 中南大学 | 一种面向安卓应用程序的Web注入代码执行漏洞检测方法及系统 |
CN117389570A (zh) * | 2021-10-14 | 2024-01-12 | 华为技术有限公司 | 语言互操作方法、装置、存储介质及程序产品 |
US11809839B2 (en) | 2022-01-18 | 2023-11-07 | Robert Lyden | Computer language and code for application development and electronic and optical communication |
CN116225576B (zh) * | 2023-05-08 | 2023-07-28 | 成都赛力斯科技有限公司 | 应用程序的数据环境切换方法、装置、电子设备及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6836883B1 (en) * | 2000-06-21 | 2004-12-28 | Microsoft Corporation | Method and system for compiling multiple languages |
CN100385399C (zh) * | 2003-06-26 | 2008-04-30 | 微软公司 | 用于多个异常处理模型的中间表示的方法和系统 |
CN103123590A (zh) * | 2011-11-18 | 2013-05-29 | 中国科学院沈阳计算技术研究所有限公司 | 指令表il程序到c语言程序的编译方法 |
Family Cites Families (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1995018409A1 (en) * | 1993-12-30 | 1995-07-06 | Brian Reynolds | Method for compiling a procedural program to an object class definition |
CA2171570C (en) * | 1995-03-29 | 1999-09-21 | Swee Boon Lim | Compiler with generic front end and dynamically loadable back ends |
US6523171B1 (en) * | 1998-12-29 | 2003-02-18 | International Business Machines Corporation | Enhanced source code translator from procedural programming language (PPL) to an object oriented programming language (OOPL) |
US8843909B2 (en) * | 2001-05-11 | 2014-09-23 | Ca, Inc. | Method and apparatus for transforming legacy software applications into modern object-oriented distributed systems |
WO2004036421A2 (en) | 2002-10-21 | 2004-04-29 | Eitan Glotman | System and method for a mixed-language compiler |
US7386838B2 (en) * | 2003-04-03 | 2008-06-10 | International Business Machines Corporation | Method and apparatus for obtaining profile data for use in optimizing computer programming code |
US7685581B2 (en) | 2003-06-27 | 2010-03-23 | Microsoft Corporation | Type system for representing and checking consistency of heterogeneous program components during the process of compilation |
US7272821B2 (en) * | 2003-08-25 | 2007-09-18 | Tech Mahindra Limited | System and method of universal programming language conversion |
JP4652680B2 (ja) * | 2003-12-22 | 2011-03-16 | パナソニック株式会社 | コンパイル方法および装置、ならびにコンパイラ |
US8595711B2 (en) | 2006-11-14 | 2013-11-26 | Red Hat, Inc. | Function-level compiler processing optimization |
US7934207B2 (en) | 2006-12-19 | 2011-04-26 | Microsoft Corporation | Data schemata in programming language contracts |
US8352926B2 (en) * | 2007-07-09 | 2013-01-08 | Megan Adams | Method and apparatus for a cross-platform translator from VB.net to java |
US8291397B2 (en) * | 2008-04-02 | 2012-10-16 | International Business Machines Corporation | Compiler optimized function variants for use when return codes are ignored |
US20090307669A1 (en) | 2008-06-06 | 2009-12-10 | Garst Jr Gerald Blaine | Memory management for closures |
US8806457B2 (en) | 2008-12-15 | 2014-08-12 | Apple Inc. | Deferred constant pool generation |
US8826253B2 (en) * | 2008-12-15 | 2014-09-02 | Apple Inc. | Delayed insertion of safepoint-related code |
US20100153912A1 (en) | 2008-12-15 | 2010-06-17 | Apple Inc. | Variable type knowledge based call specialization |
US9182962B2 (en) * | 2010-12-09 | 2015-11-10 | Todd Bradley KNEISEL | Method for translating a cobol source program into readable and maintainable program code in an object oriented second programming language |
US9329844B2 (en) * | 2014-05-30 | 2016-05-03 | Apple Inc. | Programming system and language for application development |
-
2014
- 2014-09-30 US US14/502,697 patent/US9329844B2/en active Active
-
2015
- 2015-05-08 CN CN201580028329.1A patent/CN106415495B/zh active Active
- 2015-05-08 WO PCT/US2015/030007 patent/WO2015183526A1/en active Application Filing
-
2016
- 2016-04-13 US US15/098,082 patent/US9952841B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6836883B1 (en) * | 2000-06-21 | 2004-12-28 | Microsoft Corporation | Method and system for compiling multiple languages |
CN100385399C (zh) * | 2003-06-26 | 2008-04-30 | 微软公司 | 用于多个异常处理模型的中间表示的方法和系统 |
CN103123590A (zh) * | 2011-11-18 | 2013-05-29 | 中国科学院沈阳计算技术研究所有限公司 | 指令表il程序到c语言程序的编译方法 |
Non-Patent Citations (3)
Title |
---|
"Ensuring code safety without runtime checks for real-time control systems";Sumant Kowshik 等;《Proceedings of the 2002 international conference on Compilers, architecture, and synthesis for embedded systems》;20021011;第288-297页 * |
"LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation";Chris Lattner 等;《Proceedings of the 2004 International Symposium on Code Generation and Optimization》;20040324;第1-2页第1节,第4-6页第3节,第8-9页第4.2.2节、图3 * |
"Towards optimization-safe systems: analyzing the impact of undefined behavior";Xi Wang 等;《Proceedings of the Twenty-Fourth ACM Symposium on Operating Systems Principles》;20131106;第260-275页 * |
Also Published As
Publication number | Publication date |
---|---|
WO2015183526A1 (en) | 2015-12-03 |
US9329844B2 (en) | 2016-05-03 |
US9952841B2 (en) | 2018-04-24 |
US20160299747A1 (en) | 2016-10-13 |
US20150347102A1 (en) | 2015-12-03 |
CN106415495A (zh) | 2017-02-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106415495B (zh) | 用于应用开发的编程系统和语言 | |
CN108920133B (zh) | 跨语言编程方法、装置、电子设备及存储介质 | |
Bracha et al. | Modules as objects in Newspeak | |
US9471291B2 (en) | Multi-processor code for modification for storage areas | |
US8997070B2 (en) | Extension mechanism for scripting language compiler | |
JP4662657B2 (ja) | 統一データ型システムおよび方法 | |
US8443338B2 (en) | Logical extensions to intermediate code | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
US11366684B2 (en) | Import mechanism for hardware intrinsics | |
EP1668498A2 (en) | Creating and checking runtime data types | |
US20150324194A1 (en) | Method for modeling source code having code segments that lack source location | |
US20160342400A1 (en) | Compact Type Layouts | |
CN112148283B (zh) | 一种跨平台的abi兼容c++组件框架的实现方法 | |
Harvey | A linguistic approach to concurrent, distributed, and adaptive programming across heterogeneous platforms | |
JP5108309B2 (ja) | ユーザ定義タイプの継承をサポートするためのシステムおよび方法 | |
JP2011513824A (ja) | システム表現およびハンドリング技術 | |
Erni et al. | The Hacker’s Guide to javac | |
Squyres et al. | The design and evolution of the MPI-2 C++ interface | |
Pirkelbauer et al. | Dynamic algorithm selection for runtime concepts | |
Fumero et al. | Experiences in Building a Composable and Functional API for Runtime SPIR-V Code Generation | |
Feiler et al. | AADL V3 Standard Discussions | |
Noha | Přední část LLVM pro jazyk Scheme | |
Von Ronne | A Safe and Efficient Machine-independent Code Transportation Format Based on Static Single Assignment Form and Applied to Just-in Time Compilation | |
Karácsony et al. | Configurable data structure layout for memory hierarchies | |
Shea | Work Related to Lighthouse |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |