应用网站如何做,手机版网站有必要吗,南昌盗网站少优化公司,搜索引擎调词平台多少钱文章目录 1.简介2.初识仓颉语言3.基本概念3.1标识符3.2程序结构3.3变量3.4表达式3.4.1if 表达式3.4.2while语句3.4.3do-while表达式3.4.4 for-in 表达式3.4.5 where条件3.4.6 break和continue 3.5 函数 1.简介
随着万物互联以及智能时代的到来#xff0c;软件的形态将发生巨大… 文章目录 1.简介2.初识仓颉语言3.基本概念3.1标识符3.2程序结构3.3变量3.4表达式3.4.1if 表达式3.4.2while语句3.4.3do-while表达式3.4.4 for-in 表达式3.4.5 where条件3.4.6 break和continue 3.5 函数 1.简介
随着万物互联以及智能时代的到来软件的形态将发生巨大的变化。一方面移动应用和移动互联网领域仍然强力驱动人机交互、设备协同、智能化、安全性等方向的创新另一方面人工智能也同样驱动软件朝智能化、端边云协同等方向演进。新技术、新场景下应用软件的开发对编程语言提出了新的诉求和挑战。 仓颉编程语言作为一款面向全场景应用开发的现代编程语言通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的IDE工具链支持为开发者打造友好开发体验和卓越程序性能。其具体特性表现为 高效编程面向应用开发我们希望语言能够易学易用降低开发者入门门槛和开发过程中的心智负担支持各种常见的开发范式和编程模式让开发者简洁高效地表达各种业务逻辑。仓颉是一门多范式编程语言支持函数式、命令式和面向对象等多种范式包括值类型、类和接口、泛型、代数数据类型、模式匹配、以及高阶函数等特性。此外仓颉还支持类型推断能够降低开发者类型标注的负担通过一系列简明高效的语法能够减少冗余书写、提升开发效率语言内置的各种语法糖和宏macro的能力支持开发者基于仓颉快速开发领域专用语言DSL构建领域抽象。 安全可靠作为现代编程语言仓颉追求编码即安全通过静态类型系统和自动内存管理确保程序的类型安全和null safety等内存安全同时仓颉还提供各种运行时检查包括数组下标越界检查、类型转换检查、数值计算溢出检查、以及字符串编码合法性检查等能够及时发现程序运行中的错误此外还通过代码扫描工具、混淆工具以及消毒器进一步提供跨语言互操作安全和代码资产保护等支持。 轻松并发并发和异步编程能够有效提高处理器利用率并在交互式应用中确保程序的响应速度是应用开发中必不可少的能力。仓颉语言实现了轻量化用户态线程和并发对象库让高效并发变得轻松。 仓颉语言采用用户态线程模型每个仓颉线程都是极其轻量级的执行实体拥有独立的执行上下文但共享内存。对开发者来说用户态线程的使用和传统的系统线程的使用方式保持一致没有带来额外负担而从运行态视角看线程的管理由运行时完成不依赖操作系统的线程管理因此线程的创建、调度和销毁等操作更加高效且资源占用比系统线程更少。为了避免数据竞争仓颉语言提供了并发对象库并发对象的方法是线程安全的因此在多线程中调用这些方法和串行编程没有区别应用逻辑的开发者无需额外关心并发管理。对于一些核心库仓颉还提供了无锁或者细粒度锁的算法实现能够进一步减少线程的阻塞提升并发度。 卓越性能仓颉编译器及运行时从全栈对编译进行优化包括编译器前端基于CHIRCangjie HighLevel IR高层编译优化比如语义感知的循环优化、语义感知的后端协同优化等基于后端的编译优化比如SLP向量化、Intrinsic优化、InlineCache、过程间指针优化、Barrier优化等基于运行时的优化比如轻量锁、分布式标记、并发Tracing优化等一系列的优化让仓颉充分发挥处理器能力为应用提供卓越的性能支持。另外仓颉语言对运行时进行原生的轻量化设计通过对运行时模块化分层设计定义仓颉公共对象模型和运行时公共基础组件基于公共对象模型实现运行时的内存管理、回栈、异常处理、跨语言调用等基础能力大幅减少多个能力间的冗余对象设计精简运行时体积。同时通过包的按需加载技术减少仓颉应用启动的冗余包内存开销因此对于资源敏感设备占用资源更少支持更友好。
除此之外仓颉还支持面向应用开发的一系列工具链包括语言服务高亮、联想、调试跨语言调试、线程级可视化调试、静态检查、性能分析、包管理、文档生成、Mock工具、测试框架、覆盖率工具、Fuzz工具以及智能辅助编程工具进一步提升软件开发体验以及效率。
2.初识仓颉语言
仓颉编程语言是一种面向全场景应用开发的通用编程语言可以兼顾开发效率和运行性能并提供良好的编程体验主要具有如下特点
语法简明高效仓颉编程语言提供了一系列简明高效的语法旨在减少冗余书写、提升开发效率例如插值字符串、主构造函数、Flow 表达式、match、if-let、while-let 和重导出等语法让开发者可以用较少编码表达相关逻辑。多范式编程仓颉编程语言支持函数式、命令式和面向对象等多范式编程融合了高阶函数、代数数据类型、模式匹配、泛型等函数式语言的先进特性还有封装、接口、继承、子类型多态等支持模块化开发的面向对象语言特性以及值类型、全局函数等简洁高效的命令式语言特性。开发者可以根据开发偏好或应用场景选用不同的编程范式。类型安全仓颉编程语言是静态强类型语言通过编译时类型检查尽早识别程序错误降低运行时风险也便于代码维护。同时仓颉编译器提供了强大的类型推断能力可以减少类型标注工作提高开发效率。内存安全仓颉编程语言支持自动内存管理并在运行时进行数组下标越界检查、溢出检查等确保运行时内存安全。高效并发仓颉编程语言提供了用户态轻量化线程原生协程以及简单易用的并发编程机制保证并发场景的高效开发和运行。兼容语言生态仓颉编程语言支持和 C 等主流编程语言的互操作并采用便捷的声明式编程范式可实现对其他语言库的高效复用和生态兼容。领域易扩展仓颉编程语言提供了基于词法宏的元编程能力支持在编译时变换代码此外还提供了尾随 lambda、属性、操作符重载、部分关键字可省略等特性开发者可由此深度定制程序的语法和语义有利于内嵌式领域专用语言Embedded Domain Specific LanguagesEDSL的构建。助力 UI 开发UI 开发是构建端侧应用的重要环节基于仓颉编程语言的元编程和尾随 lambda 等特性可以搭建声明式 UI 开发框架提升 UI 开发效率和体验。内置库功能丰富仓颉编程语言提供了功能丰富的内置库涉及数据结构、常用算法、数学计算、正则匹配、系统交互、文件操作、网络通信、数据库访问、日志打印、解压缩、编解码、加解密和序列化等功能。
3.基本概念
3.1标识符
在仓颉编程语言中开发者可以给一些程序元素命名这些名字也被称为“标识符”标识符分为普通标识符和原始标识符两类它们分别遵从不同的命名规则。 普通标识符不能和仓颉关键字相同可以取自以下两类字符序列
由英文字母开头后接零至多个英文字母、数字或下划线“_”。由一至多个下划线“_”开头后接一个英文字母最后可接零至多个英文字母、数字或下划线。
例如
//以下每行字符串都是合法的普通标识符
abc
_abc
abc_
a1b2c3
a_b_c
a1_b2_c3//以下每行字符串都是不合法的普通标识符
abc // 使用了非法字符 “”
_123 // 起始下划线 “_” 后不能接数字
3abc // 数字不能出现在头部
while // 不能使用仓颉关键字原始标识符是在普通标识符或仓颉关键字的外面加上一对反引号主要用于将仓颉关键字作为标识符的场景。
//以下每行字符串都是合法的原始标识符
abc
_abc
a1b2c3
if
while//以下每行字符串由于反引号内的部分是不合法的普通标识符所以它们整体也是不合法的原始标识符
abc
_123
3abc3.2程序结构
通常我们都会在扩展名为 .cj 的文本文件中编写仓颉程序这些程序和文件也被称为源代码和源文件在程序开发的最后阶段这些源代码将被编译为特定格式的二进制文件。 在仓颉程序的顶层作用域中可以定义一系列的变量、函数和自定义类型如 struct、class、enum 和 interface 等其中的变量和函数分别被称为全局变量和全局函数。如果要将仓颉程序编译为可执行文件您需要在顶层作用域中定义一个 main 函数作为程序入口它可以有 Array 类型的参数也可以没有参数它的返回值类型可以是整数类型或 Unit 类型。 例如在以下程序中我们在顶层作用域定义了全局变量 a 和全局函数 b还有自定义类型 C、D 和 E以及作为程序入口的 main 函数。
// example.cj
let a 2023
func b() {}
struct C {}
class D {}
enum E { F | G }main() {println(a)
}在非顶层作用域中不能定义上述自定义类型但可以定义变量和函数称之为局部变量和局部函数。特别地对于定义在自定义类型中的变量和函数称之为成员变量和成员函数。
// example.cj
func a() {let b 2023func c() {println(b)}c()
}class A {let b 2024public func c() {println(b)}
}main() {a()A().c()
}3.3变量
在仓颉编程语言中一个变量由对应的变量名、数据值和若干属性构成开发者通过变量名访问变量对应的数据但访问操作需要遵从相关属性的约束如数据类型、可变性和可见性等。 变量定义的具体形式为 修饰符 变量名: 变量类型 初始值 其中修饰符用于设置变量的各类属性可以有一个或多个常用的修饰符包括
可变性修饰符let 与 var分别对应不可变和可变属性可变性决定了变量被初始化后其值还能否改变仓颉变量也由此分为不可变变量和可变变量两类。可见性修饰符private 与 public 等影响全局变量和成员变量的可引用范围详见后续章节的相关介绍。静态性修饰符static影响成员变量的存储和引用方式详见后续章节的相关介绍。
在定义仓颉变量时可变性修饰符是必要的在此基础上还可以根据需要添加其他修饰符。 变量名应是一个合法的仓颉标识符。 变量类型指定了变量所持有数据的类型。当初始值具有明确类型时可以省略变量类型标注此时编译器可以自动推断出变量类型。 初始值是一个仓颉表达式用于初始化变量如果标注了变量类型需要保证初始值类型和变量类型一致。在定义全局变量或静态成员变量时必须指定初始值。在定义局部变量或实例成员变量时可以省略初始值但需要标注变量类型同时要在此变量被引用前完成初始化否则编译会报错。
例如下列程序定义了两个 Int64 类型的不可变变量 a 和可变变量 b随后修改了变量 b 的值并调用 println 函数打印 a 与 b 的值。
main() {let a: Int64 20var b: Int64 12b 23println(${a}${b})
}3.4表达式
在一些传统编程语言中一个表达式由一个或多个操作数operand通过零个或多个操作符operator组合而成表达式总是隐含着一个计算过程因此每个表达式都会有一个计算结果对于只有操作数而没有操作符的表达式其计算结果就是操作数自身对于包含操作符的表达式计算结果是对操作数执行操作符定义的计算而得到的值。在这种定义下的表达式也被称为算术运算表达式。
在仓颉编程语言中我们简化并延伸了表达式的传统定义——凡是可求值的语言元素都是表达式。因此仓颉不仅有传统的算术运算表达式还有条件表达式、循环表达式和 try 表达式等它们都可以被求值并作为值去使用如作为变量定义的初值和函数实参等。此外因为仓颉是强类型的编程语言所以仓颉表达式不仅可求值还有确定的类型。
仓颉编程语言的各种表达式将在后续章节中逐一介绍本节介绍最常用的条件表达式、循环表达式以及部分控制转移表达式break、continue。
我们知道任何一段程序的执行流程只会涉及三种基本结构——顺序结构、分支结构和循环结构。实际上分支结构和循环结构是由某些指令控制当前顺序执行流产生跳转而得到的它们让程序能够表达更复杂的逻辑在仓颉中这种用来控制执行流的语言元素就是条件表达式和循环表达式。
在仓颉编程语言中条件表达式分为 if 表达式和 if-let 表达式两种它们的值与类型需要根据使用场景来确定。循环表达式有四种for-in 表达式、while 表达式、do-while 表达式和 while-let 表达式它们的类型都是 Unit、值为 ()。其中 if-let 表达式和 while-let 表达式都与模式匹配相关请参见if-let 表达式和while-let 表达式章节本节只介绍以上提及的其他几种表达式。
在仓颉程序中由一对大括号“{}”包围起来的一组表达式被称为“代码块”它将作为程序的一个顺序执行流其中的表达式将按编码顺序依次执行。如果代码块中有至少一个表达式我们规定此代码块的值与类型等于其中最后一个表达式的值与类型如果代码块中没有表达式规定这种空代码块的类型为 Unit、值为 ()。
3.4.1if 表达式
if 表达式的基本形式为
if (条件) {分支 1
} else {分支 2
}其中“条件”是布尔类型表达式“分支 1”和“分支 2”是两个代码块。if 表达式将按如下规则执行
计算“条件”表达式如果值为 true 则转到第 2 步值为 false 则转到第 3 步。执行“分支 1”转到第 4 步。执行“分支 2”转到第 4 步。继续执行 if 表达式后面的代码。 在一些场景中我们可能只关注条件成立时该做些什么所以 else 和对应的代码块是允许省略的。 如下程序演示了 if 表达式的基本用法
import std.random.*
main() {let number: Int8 Random().nextInt8()println(number)if (number % 2 0) {println(偶数)} else {println(奇数)}
}3.4.2while语句
while 表达式的基本形式为
while (条件) {循环体
}其中“条件”是布尔类型表达式“循环体”是一个代码块。while 表达式将按如下规则执行
计算“条件”表达式如果值为 true 则转第 2 步值为 false 转第 3 步。执行“循环体”转第 1 步。结束循环继续执行 while 表达式后面的代码。
例如以下程序使用 while 表达式基于二分法近似计算数字 2 的平方根
main() {var root 0.0var min 1.0var max 2.0var error 1.0let tolerance 0.1 ** 10while (error ** 2 tolerance) {root (min max) / 2.0error root ** 2 - 2.0if (error 0.0) {max root} else {min root}}println(2 的平方根约等于${root})
}3.4.3do-while表达式
do-while 表达式的基本形式为
do {循环体
} while (条件)其中“条件”是布尔类型表达式“循环体”是一个代码块。do-while 表达式将按如下规则执行
执行“循环体”转第 2 步。计算“条件”表达式如果值为 true 则转第 1 步值为 false 转第 3 步。结束循环继续执行 do-while 表达式后面的代码。
例如以下程序使用 do-while 表达式基于蒙特卡洛算法近似计算圆周率的值
import std.random.*main() {let random Random()var totalPoints 0var hitPoints 0do {// 在 ((0, 0), (1, 1)) 这个正方形中随机取点let x random.nextFloat64()let y random.nextFloat64()// 判断是否落在正方形内接圆里if ((x - 0.5) ** 2 (y - 0.5) ** 2 0.25) {hitPoints}totalPoints} while (totalPoints 1000000)let pi 4.0 * Float64(hitPoints) / Float64(totalPoints)println(圆周率近似值为${pi})
}3.4.4 for-in 表达式
for-in 表达式可以遍历那些扩展了迭代器接口 Iterable 的类型实例。for-in 表达式的基本形式为
for (迭代变量 in 序列) {循环体
}其中“循环体”是一个代码块。“迭代变量”是单个标识符或由多个标识符构成的元组用于绑定每轮遍历中由迭代器指向的数据可以作为“循环体”中的局部变量使用。“序列”是一个表达式它只会被计算一次遍历是针对此表达式的值进行的其类型必须扩展了迭代器接口 Iterable。for-in 表达式将按如下规则执行
计算“序列”表达式将其值作为遍历对象并初始化遍历对象的迭代器。更新迭代器如果迭代器终止转第 4 步否则转第 3 步。将当前迭代器指向的数据与“迭代变量”绑定并执行“循环体”转第 2 步。结束循环继续执行 for-in 表达式后面的代码。
例如以下程序使用 for-in 表达式遍历中国地支字符构成的数组 noumenonArray输出农历 2024 年各月的干支纪法
main() {let metaArray [r甲, r乙, r丙, r丁, r戊,r己, r庚, r辛, r壬, r癸]let noumenonArray [r寅, r卯, r辰, r巳, r午, r未,r申, r酉, r戌, r亥, r子, r丑]let year 2024// 年份对应的天干索引let metaOfYear ((year % 10) 10 - 4) % 10// 此年首月对应的天干索引var index (2 * metaOfYear 3) % 10 - 1println(农历 2024 年各月干支)for (noumenon in noumenonArray) {print(${metaArray[index]}${noumenon} )index (index 1) % 10}
}3.4.5 where条件
在部分循环遍历场景中对于特定取值的迭代变量我们可能需要直接跳过、进入下一轮循环虽然可以使用 if 表达式和 continue 表达式在循环体中实现这一逻辑但仓颉为此提供了更便捷的表达方式——可以在所遍历的“序列”之后用 where 关键字引导一个布尔表达式这样在每次将进入循环体执行前会先计算此表达式如果值为 true 则执行循环体反之直接进入下一轮循环。例如
main() {for (i in 0..8 where i % 2 1) { // i 为奇数才会执行循环体println(i)}
}3.4.6 break和continue
在循环结构的程序中有时我们需要根据特定条件提前结束循环或跳过本轮循环为此仓颉引入了 break 与 continue 表达式它们可以出现在循环表达式的循环体中break 用于终止当前循环表达式的执行、转去执行循环表达式之后的代码continue 用于提前结束本轮循环、进入下一轮循环。break 与 continue 表达式的类型都是 Nothing。
例如以下程序使用 for-in 表达式和 break 表达式在给定的整数数组中找到第一个能被 5 整除的数字
main() {let numbers [12, 18, 25, 36, 49, 55]for (number in numbers) {if (number % 5 0) {println(number)break}}
}以下程序使用 for-in 表达式和 continue 表达式将给定整数数组中的奇数打印出来
main() {let numbers [12, 18, 25, 36, 49, 55]for (number in numbers) {if (number % 2 0) {continue}println(number)}
}3.5 函数
仓颉使用关键字 func 来表示函数定义的开始func 之后依次是函数名、参数列表、可选的函数返回值类型、函数体。其中函数名可以是任意的合法标识符参数列表定义在一对圆括号内多个参数间使用逗号分隔参数列表和函数返回值类型如果存在之间使用冒号分隔函数体定义在一对花括号内。 函数定义举例
func add(a: Int64, b: Int64): Int64 {return a b
}上例中定义了一个名为 add 的函数其参数列表由两个 Int64 类型的参数 a 和 b 组成函数返回值类型为 Int64函数体中将 a 和 b 相加并返回。 文章转载自: http://www.morning.kmcby.cn.gov.cn.kmcby.cn http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn http://www.morning.lztrt.cn.gov.cn.lztrt.cn http://www.morning.rglp.cn.gov.cn.rglp.cn http://www.morning.mplld.cn.gov.cn.mplld.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.wjwfj.cn.gov.cn.wjwfj.cn http://www.morning.nbhft.cn.gov.cn.nbhft.cn http://www.morning.pinngee.com.gov.cn.pinngee.com http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.jopebe.cn.gov.cn.jopebe.cn http://www.morning.xldpm.cn.gov.cn.xldpm.cn http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn http://www.morning.cftkz.cn.gov.cn.cftkz.cn http://www.morning.bnjnp.cn.gov.cn.bnjnp.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.phlwj.cn.gov.cn.phlwj.cn http://www.morning.fchkc.cn.gov.cn.fchkc.cn http://www.morning.xrwtk.cn.gov.cn.xrwtk.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.pdgqf.cn.gov.cn.pdgqf.cn http://www.morning.nrll.cn.gov.cn.nrll.cn http://www.morning.klzt.cn.gov.cn.klzt.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.wlsrd.cn.gov.cn.wlsrd.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn http://www.morning.nrzbq.cn.gov.cn.nrzbq.cn http://www.morning.ynbyk.cn.gov.cn.ynbyk.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.lfgql.cn.gov.cn.lfgql.cn http://www.morning.mqwnp.cn.gov.cn.mqwnp.cn http://www.morning.pkpqh.cn.gov.cn.pkpqh.cn http://www.morning.nspbj.cn.gov.cn.nspbj.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.jgnjl.cn.gov.cn.jgnjl.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn http://www.morning.slysg.cn.gov.cn.slysg.cn http://www.morning.tkflb.cn.gov.cn.tkflb.cn http://www.morning.mspqw.cn.gov.cn.mspqw.cn http://www.morning.pypbz.cn.gov.cn.pypbz.cn http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn http://www.morning.kgphd.cn.gov.cn.kgphd.cn http://www.morning.wklyk.cn.gov.cn.wklyk.cn http://www.morning.rgrz.cn.gov.cn.rgrz.cn http://www.morning.bpkqd.cn.gov.cn.bpkqd.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.gnjkn.cn.gov.cn.gnjkn.cn http://www.morning.ffhlh.cn.gov.cn.ffhlh.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn http://www.morning.beiyishengxin.cn.gov.cn.beiyishengxin.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.lcjw.cn.gov.cn.lcjw.cn http://www.morning.gjxr.cn.gov.cn.gjxr.cn http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn http://www.morning.qbtkg.cn.gov.cn.qbtkg.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.kgjyy.cn.gov.cn.kgjyy.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.fmry.cn.gov.cn.fmry.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn http://www.morning.wqpr.cn.gov.cn.wqpr.cn http://www.morning.tqsgt.cn.gov.cn.tqsgt.cn http://www.morning.tmjhy.cn.gov.cn.tmjhy.cn http://www.morning.nnykz.cn.gov.cn.nnykz.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.pluimers.cn.gov.cn.pluimers.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.bplqh.cn.gov.cn.bplqh.cn http://www.morning.ptslx.cn.gov.cn.ptslx.cn http://www.morning.ljqd.cn.gov.cn.ljqd.cn http://www.morning.yfzld.cn.gov.cn.yfzld.cn http://www.morning.kybjr.cn.gov.cn.kybjr.cn http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn