开发语言
基础类型 类型声明(Type Declaration) 操作符 控制(Control Flow)
对象模型(Object Model)
内存模型(Memory Model) 并发模型(Concurrency Model) 异常模型(Exception Model)
语言互操作 模块化支持
编程方式:函数式、指令式、反射式、结构化和面向对象
语言实现:将引入什么样的编程思想,追求什么样的编程风格
仓颉也选择了这种居中的定位,被设计为了具备自动内存管理功能、静态类型、面向应用开发的语言
居于动态脚本语言和系统编程语言之间
仓颉借鉴 web 端和移动端的技术发展,希望通过领域特定语言 DSL 能力来构建类似 AI 领域的声明式范式
@agent @prompt
带GC的路线
关键字和操作符
库 编译器
编译器源码--操作系统等 编译是将程序从某种编程语言(如 C/C++)的源代码(文本形式)转换为机器代码的过程
仓颉编程语言
在语言特性方面,
1.数据类型:
静态类型语言:类型检查和类型自动推断
仓颉使用结构体作为值类型、类作为引用类型,泛型
函数是一等公民 代数数据类型和模式匹配
2.控制结构上:
Flow 表达式、match、if-let、while-let 和重导出等语法
仓颉添加了扩展机制,类似Rust的impl关键字,提供了比继承更灵活的面向对象的组合方式。
3.编程方式:
仓颉支持面向对象、函数式、命令式等多种编程范式的融合
仓颉实现了基于底层支持的函数式特性;使用代数数据类型解决了Java的空指针问题;
仓颉还提供了高阶与现代的语言特性,包括元编程能力,使用宏操作词法单元,适合内嵌式领域专用语言(eDSL)的构建;
4.语言底层设计与实现方面,
仓颉提供基于垃圾回收的内存管理机制,同时支持两种运行模式:基于虚拟机的运行以及编译为可执行文件。
隐藏了指针细节,同时提供了易懂好用的值与引用的概念。
编译器根据变量或表达式的上下文信息自动推测出类型
提供了用户态轻量化线程(原生协程),以及简单易用的并发编程机制 M:N 线程模型
编译器前端基于 CHIR(Cangjie HighLevel IR)高层编译优化
5.在AI开发中
此外 还具有自动微分特性,可有效减少 AI 开发中数学运算相关的编码,适合AI开发的场景。
6.上下游配合:
动静态检查、自动内存管理、以及工具链
支持和 C、ArkTS/JS、Java 、Python 等编程语言的互操作
内置库,涉及数据结构、常用算法、数学计算、正则匹配、系统交互、文件操作、网络通信
运行仓颉编译器的依赖
链接工具、C 语言开发工具、C++ 开发工具、GCC 编译器、以及 OpenSSL 3
binutils libc-dev libc++-dev libgcc-7-dev
binutils glibc-devel gcc-c++
说明:GNU binutils 是一个二进制工具集
系统库(libc)
GNU Binutils是一个二进制工具集。主要包括以下组件:
ld - GNU 链接器
as - GNU 汇编器
addr2line - 把程序地址转换为文件名和行号
ar - 创建、修改和提取归档文件
c++filt - 过滤 C++ 符号
dlltool - 为构建和使用 DLL 创建文件
gold - 新颖快速的 ELF 链接器,仍在 Beta 测试阶段
gprof - 显示分析信息
nlmconv - 转换对象代码到 NLM
nm - 从目标文件列出符号
objcopy - 复制和转换目标文件
objdump - 从目标文件显示信息
ranlib - 生成归档文件内容的索引
readelf - 从 ELF 格式目标文件显示信息
size - 列出目标或归档文件的段大小
strings - 列出文件中可打印字符串
strip - 丢弃符号
windmc - 兼容 Windows 消息的编译器
windres - Windows 资源文件编译器
库文件: libiberty.a, libbfd.[a,so] 和 libopcodes.[a,so]
可执行文件格式
它们都是 COFF(Common File Format)格式的变种
Windows 下的 PE(Portable Executable)
Linux 下的 ELF(Executable Linkable Format)
Executable and Linking Format
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)
源文件--目标文件--可执行文件
-- 共享目标文件
--核心转储文件(Core Dump File)Linux 下的 core dump
文件结构上来讲,目标文件已经是二进制文件,它与可执行文件的组织形式非常类似
type ###:内部命令,外部命令和别名
whereis ls
file /bin/ls
ldd /bin/ls ##ldd 命令了解 ls 命令所依赖的系统库
readelf -h /bin/ls
DYN (Shared object file)
交叉编译工具链是一个由编译器、链接器和解释器组成的综合开发环境,主要由binutils、gcc和glibc三个部分组成,安装在宿主机host上
API-ABI-EABI
API--代码层级的--Programming
API(Application Programming Interface,应用程序接口)
提供相应功能的同时隐藏实现细节,让其使用者可以按照较为统一和稳定的方式来使用系统能力
ABI--二进制文件层级的-Binary--机器指令层面的具体格式
abi 应用二进制接口(Application Binary Interface , ABI)
eabi 嵌入式应用二进制接口(Embedded Application BinaryInterface , EABI)
ABI 将程序与操作系统、硬件平台之间紧密协作需要遵守的特定规则暴露了出来
兼容性--移植性
EABI的目的是使不同的编译器编译出来的二进制文件可以互相使用(interoperability)
应用程序的各个组件 应用程序与库 应用程序与操作系统
本地编译--交叉编译 busybox
C
运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT
glibc即GNU C Library,是GNU旗下的C标准库
C标准库有静态和动态两个/lib/libc.so.6 , /usr/lib/libc.a
libc 是 linux 下的 ANSI C 函数库
仓颉编译器
Cangjie SDK 版本
cjc 仓颉编译器:cjc 时仓颉编译器会自动进行前端、后端的编译以及链接工作
cjc-frontend 仓颉前端编译器
编译器:编译目标的 CPU 类型时,编译器在生成二进制时会尝试使用该 CPU 类型特有的扩展指令集
cjc 默认会将给定源代码文件编译成可执行文件,并将可执行文件命名为 main
仓颉运行时库
运行时的优化
CJPM(Cangjie Package Manager)包管理工具
cjpm init
cjpm.toml 文件,并且新建 src 源码文件夹,在 src 下生成默认的 main.cj 文件
cjpm build 用来构建当前仓颉项目,执行该命令前会先检查依赖项,检查通过后调用 cjc 进行构建
cjdb 提供源码级调试能力
DevEco Studio
HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造,面向华为终端全场景多设备的一站式集成开发环境(IDE)
VSCode底座: IDE插件
HDC是为开发者提供HarmonyOS应用/服务的调试工具
C语言:
ANSI标准定义的C语言关键字共32个:
void char int float double short long signed unsigned
struct union enum typedef sizeof
auto static register extern const volatile
return continue break goto
if else switch case default for do while
C99新增关键字:
_Bool _Complex _Imaginary inline restrict
C11新增关键字:
_Alignas _Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local
基本数据类型 --类型修饰关键字 复杂类型关键字 存储级别关键字
流程控制关键字
C++关键字
C++98/03中的63个关键字,其中C语言的32个关键字。
C++11中有73个关键字,新增加的10个分别为:
alignas、alignof、char16_t、char32_t、constexpr、decltype、noexpect、nullptr、static_assert、thread_local
rust关键字
i8/i16/i32/i64/i128 u8/u16/u32/u64/u128 f32/f63
array bool char unit true/false
isize usize references slice str tuple
type const let
union enum trait struct
fn
impl
if continue break else for loop while in match return
mut ref static unsafe move
async await std::thread相关的库
Result类型和panic!宏 通过Result和Option等类型,提供了一种可靠地处理错误的方式
extern 使用 std::ffi库
super mod crate use where
Rust 支持闭包(closure) 泛型工作方式
仓颉关键字
Int8 Int16 Int32 Int64 Float16 Float32 Float64
Unit UInt8 UInt16 UInt32 UInt64 UIntNative
Rune IntNative Bool false true Nothing
const static let as abstract var
class enum struct interface
func main mut return
if break continue for in do else case match where while
extend override
try catch finally throw
foreign is init
public package open private protected import
prop operator
macro quote synchronized
redef spawn super this This type unsafe VArray
换行省略了分号
比较异同
Java访问修饰符:public、protected、default、private四种
仓颉访问修饰符:public、protected、internal、 private四种
仓颉class 是引用类型,struct 是值类型 class 之间可以继承,但 struct 之间不能继承
构造函数--主构造函数和普通构造函数
类的构造函数普通构造函数以关键字 init 开头,后跟参数列表和函数体
可以定义若干普通的以 init 为名字的构造函数外,class 内还可以定义(最多)一个主构造函数。主构造函数的名字和 class 类型名相同
终结器的函数名固定为 ~init
扩展成员可使用的修饰符有:static、public、protected(仅限于被扩展类型是 class 类型)、private、mut
仓颉中,没有提供 null 值,换句话说,仓颉的引用类型永远是非空的 都可以有对应的可选类型Option<T>
Java关键字
java有 48个关键字:
abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、
do、double、else、enum、extends、final、finally、float、for、if、implements、
import、int、interface、instanceof、long、native、new、package、private、protected、public、return、
short、static、strictfp、super、switch、synchronized、
this、throw、throws、transient、try、void、volatile、while
scala关键字
Scala 有 39 个关键字:
package, import, class, object, trait, extends, with, type, forSome private, protected, abstract,
sealed, final, implicit, lazy, override try, catch, finally, throw
if, else, match, case, do, while, for, return, yield def, val, var
this, super new
true, false, null
说明: Scala 中没有 break 和 continue 俩个关键字
Python关键字
and, as, assert, break, class, continue, def, del, elif, else, except, finally,
for, from, global, if, import, in, is, lambda, not, or, pass, raise, return,
try, while, with, yield
Javascript 关键字
JavaScript一共提供了26个关键字:
break, case, catch, continue, debugger, default, delete, do, else, finally, for,
function, if, in, instanceof, new, return,
switch, this, throw, try, typeof, var, void, while, with
R语言关键字
if else repeat while function for in next break
TRUE FALSE NULL Inf NaN NA NA_integer_ NA_real_ NA_complex_ NA_character_
SQL关键字
select .......from ......where ...... group by ......having ...... order by ...... limit ...... ;
SELECT INSERT UPDATE DELETE CREATE ALTER DROP TRUNCATE WHERE ORDER BY
GROUP BY HAVING JOIN LEFT JOIN、RIGHT JOIN、INNER JOIN UNION DISTINCT LIMIT OFFSET COUNT
SUM、AVG、MAX、MIN
参考
https://developer.huawei.com/consumer/cn/doc/openharmony-cangjie/keyword
编程语言学习-Rust关键字 https://zhuanlan.zhihu.com/p/394954544
编程语言学习-初始篇 https://zhuanlan.zhihu.com/p/373516919