-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCH语言.txt
3226 lines (2310 loc) · 38.6 KB
/
CH语言.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
本文件为设计草案:
20200713开始
完全自定义语法--?
可写作一行,可省略分号
自动和手动GC
可返回多个类型
String,Int a(){
}
if(){
}else{
}
for(i,1,10){
}
for i 1 10{
}
for(i=range(1,10)){
}
i from 10 to 100{
}
var a=1;
语法解析片段:Syntax Parse Fragment
//variable 指单词word 关键字 不一定是变量
#spd variable{//Syntax Parse Define
}
#spf(){//每一条语句进入时执行
}
#spf "var"+variable+"="+expression (){
}
#spf variable+"from"+expression+"to"+expression+block (){
}
#spf "for"+"("+expression+","+expression+","+expression+")"+block (){
}
编译器要写的:
#spf
#define
#ifdef
#else
#endif
#spf作用域
每个文件可以使用不同spf
变量作用域选择
可以使用nodejs,那么使用js语法进行解释即可
var spf=SPF({
const:"",
})
非固定语法编程语言
///////////////////////
现有语法
if()代码行
if(){//代码块 多行代码
}
if(){
}else
if(){
}else{
}
//需要提供的功能 不是else就结束语句
for(i=0;i<10;i++){//语法较为复杂 使用简单的替代
}
while(i<10){
i++;
}
while{//死循环 可用break跳出
}
switch(1){
case 2:
default://标签? 不是 有区别
}
单词匹配解析方式
复杂语法不实现
spf支持编译成二进制
语法解析器 exe 将代码转为伪代码 如java的字节码
编译器 将字节码转目标文件
参考java字节码方式
spf编译为二进制
解析器使用spf对代码进行语法解析
生成字节码 字节码只有一个文件 代码可以有很多文件
使用编译器将字节码转成对应平台的二进制可执行文件
spf转二进制后必须程序可读性强,解析速度快
单词解析引擎
a.a=1;
字节型 8位 为了拓展可以用两字节
using spf;
js:
a+1
a=a+1
spf a//使用a这个spf
a to leave
我 去 学习
所有函数都是指针
面向对象
class{
+
}
var a=1
a+2
//函数指针给b
b=int(){
a=b
}
import 1.ch //导入文件
import 2.ch //引用文件
class main{
int,string +a(...){//类型必须要实现
=4,"g"
}
int,int a()=1,2
a()=nop
int[] a;//未开辟空间
}
表:
1.ch
全部传引用
or
1字节的传值
多字节传引用
NULL空指针?
堆栈
常量
变量
常量区
常量区长度
magic
常量表
3abc2ch5caoho6abcdef
0x03abc0x02
0x3abc0x0323
0111 1111
7个字节
1111 1111
abcd efg
1111
0xff 255个长度字节
0xff 0x12*255 组成的就是数据的长度
0x1 1 a
1个长度数组 长度为1字节 a
0x3 1 01 a*257
0xff ff*255
数组长度一个字节就行
长度范围:1152921504606846975
0xf f*15
边长数据存储法:
a
0x1 f a*15
仅存储常量数据
变量名方法名等
json的二进制表示法:
json存在内存里
json:结束符0
值类型 1 字符串 2数值 3数组 4二进制 5子引用(数值字符串数组、引用、字符串实体等均可) 6子json实体
------------------------
chon标识符
1 版本号
0x6 值类型 json实体
0x1 0x22 实体大小
0x1 2 ab 键
0x1 值类型 普通字符串
0x1 2 ac 值
0x1 2 ab 键
0x6 值类型 json实体开始
0x1 0x45 值大小
0x1 2 ch 键
0x2 值类型 数值
0x1 2 0x0101 值 数值257
0x1 3 arr 键
0x3 值类型 数组
0x1 表示数量的字节个数
0x2 2个元素
0x1 值类型 字符串
0x1 5 abcde 数组第一个值
0x2 值类型 数值
0x1 2 0x0101 值 数值257
0x0 json结束符
0x0 json结束符 至此解析完毕
底层语言和高级语言
高级语言和底层语言无缝感
面向内存编程
a,b=b,a 交换
a+10=1 a地址+10进行赋值
a,2 sin x
hot修饰函数 代表热函数 热方法 hot method 调用频繁的函数即热函数 运行时更快
dword c;
void a(){
c=0
}
void main(){
a()
a()
}
普通:
call a
call a
ret 0
a:
mov c,0
ret 0
热函数:
mov c,0
mov c,0
ret 0
数据段:
常量、常量字符串存储的地方
代码段:
编译器将字节码转对应机器的机器码
中间码或中间结构
a="123";
a=1+1+"1"+0;//210 字符串常量引用类型
//操作符重载
面向数据编程:
数据流:
a->b->c
题:a+b
"io.ch" import//导入标准输入输出io
ch use//使用命名空间
a,b number//定义ab变量 类型为number
a,b in//输入ab
a+b out//输出a+b
(a nunber in+b nunber in) out
//程序结束
使用
{
byte:auto(){
},
print:auto(){
}
}=io
全局对象 global
防止污染 必须指定global才可访问,应用程序内任意地方均能访问global
this 指向最近的对象
a object
{
b:(){
this//指向a
}
}=a use
a use
b//指向a.b
this 指向a
//////////////////////
常量表:
长度 "字符串内容"
in in;//第一个in是变量名 第二个是方法名
number number;//第一个number是变量名 第二个是类型名
1 (3 fn) fn
//
a unsigned byte;//定义无符号字节a
1 2 3 4 fn
==
1,2,3,4 fn
1,2 fn,3 fn fn
((1,2 fn),3 fn)fn
byte{
} type;
global{
//在global下的作用域
this临时指向global
}
作用域嵌套 永远找最近的
//所有类型名 首字母
int int;
变量名
命名空间名
方法名
类型名/结构名
标签名
变量名
a byte
a input+2 output
auto 类型名
auto in ...{
for k,v in args {
}else{//没有循环一次,则
}
}
保留字:for else if auto byte word dword qword unsigned true false null object point
point 是 未确定长度的指针 object是有具体类型的确定长度的指针
类型开头的均为函数定义如:
auto ...{
}=abc
for开头均为循环定义如:
for a in 1,10 range{
}
for key,value in 1,2,3{
key,value print
key,value print
key,value print
}
if开头的均为判断如:
if true{
"ok" print//will running
}else{
"no" print
}
关键字可以作为函数使用
1.5 int=a //取整 a=1
19,5 new int=a//赋值前必须要确定类型
//分词 整理 常量提取 归类
var 3 int=a
var 4 double=b
//3 int=a,4 double=b
class a{
s
}
namespace global{
void.{
}=main
}
---
var 0 byte=a;
var b;
var{
0 byte=a
0 byte=b
}
{
a:1 byte,
b:2 byte,
} var
---
//import os
//use os
//global os
"os" import use global=os
var a
var 3 byte=b
"hello world"=a
1 print
-------
var (123)=a;
var,if等开头是大语句
表达式为小语句
123+3*3,(12+44) sin abs 为小语句
1,3=a,7=b 赋值语句
if(){
}
----------------
方法定义
byte word dword qword
//dsl
{
Object1 a=new Object1
fun{
//me 指a
me.
parent.
top.
}=load
Object1.load=load
a.load()
}
////
--
true?1 msgbox:2 msgbox
true?1:2 msgbox
true?"ok" msgbox
//top scope顶级作用域
a{
//top.a作用域
}
b{
//top.b作用域
b{
//top.b.b作用域
parent//top.b作用域
top//top作用域
me//top.b.b当前作用域
}
}
//设计时应该注意预防全局变量污染 变量 方法 类 类型 作用域名等
tool{
fun a int,b int{
var result
a+b=result
if result==0{
=void
}else{
=a+b
}
}=add
fun{
}=load
fun{
}=unload
}
class tool2 + tool{//和上面的区别 没有class不允许实例化 + 代表extends继承
var add//默认只有当前作用域和子作用域能够访问
var +add2//public任何作用域都能够访问
var -add3//private只能当前作用域访问
}
top==me print//true
parent==me//true
tool==me.tool//true
10,20 tool.add==30//true
tool.add==tool add
if result==0{
=void
}else{
=a+b
}
相等于
=result==0?void:a+b
或
result==0?=void:=a+b
或
result==0?=void
=a+b
或result==0&&=void
=a+b
=result==0,void,a+b iif
错误示例:
result==0,=void,=a+b iif
=1,2,3
=1,2 add,3
=1,(2 add),3
a+++ ++a
解构:
var fun{
1,2,3=
}=test
var a,b,c
a,b,c=test
--a=1 b=2 c=3
[1,2,3]+4 print
[1,2,3,4]
1.5 int int=b=c
1.5 tool.a
[b,a]=[a,b]
------20200927新特性
支持重载运算符
重载返回
重载返回例子:
class tool{
fun x int,y int{
fun{
a+b=
}=
}=add
}
var tool
var a
tool.add(1,2)=a//普通是返回 int//返回状态,需要值时才计算
print(a)
自动
自动例子:
1+2 auto print
print需要字符串
auto函数 自动检查并转换字符串
var a
2=a
//a只能为int 类型不可变
{
use parent;//使用父级作用域
unuse parent;
}
匿名函数:
fun{
1+2=
} print//<fun>
fun a<T>{
if "__str" in a{
.a["__str"]=
}else{
"" throw
}
}=print
try{
throw //关键字
}catch e RunTimeException{
}catch e<T>{
}finally{
}
宏定义
接口:
interface table{//实名接口 非匿名
var __get fun
var __set fun
var __str fun
var key string
var value string
var hasKey fun key string//单参数可省略括号
var get fun(key string,value string)//多参数必须有括号
}
class KeyTable+table{//实名类 继承接口
}
汇编器:
asm{
add EAX,EBX
mov EAX,[y]
}
编译时状态
-------尝试 类型使用asm进行处理,而不是程序写死
compiler{
interface int{
}
interface string{
}
}
class string+compiler.string{
var enterPoint pointer
var length int
operator+ string1,string2{//重载+
}
operator= str byte[]{//赋值重载
str=enterPoint
this=
}
}
class int+compiler.int{
var value dword
fun v dword{
value=
}
operator + a int,b int{
asm{
mov eax,a
add eax,b
push eax
}
}
operator - a int,b int{
asm{
mov eax,a
sub eax,b
push eax
}
}
}
var a=new String("")
fun String.a{
this.length=
}
class String{
}
typedef int 4{
operator + a,b{
asm{
}
}
}
typedef float 4{
operator + a int,b{
var c
a float=c
c+b=
}
operator + a,b{
asm{
}
}
}
/*
class double+compiler.qword{
operator + a,b{
asm{
mov eax,a
add eax,b
push eax
}
}
operator - a,b{
asm{
mov eax,a
sub eax,b
push eax
}
}
}
*/
var s string
""=s
----
type bool,boolean{
}
1=compiler.flag.error
//win32编译器
(123)=a
123+456
----
var byte{
a,b,c,d
}//全部定义为byte类型
var{
a byte,
b byte,
c byte,
d byte
}//可换行
-------
var a[][] = new int[10][10]
var a dword[]
------寄存器EAX、EBX、ECX、EDX
//https://www.cnblogs.com/qq78292959/archive/2012/07/20/2600865.html
内置类型
byte word dword fun object
object win32为32位 win64为64位 object只是存地址
----泛型 20200929
class test<T>{
}
locals 编译器内置函数实现
获取最近一个作用域的变量 作为一个{} 如:
{
var a=1
var b=2
.locals print//{a:1,b:2}
}//是不是可以作为反射的基础
------20201007
var a
a=1+2 //右边全部赋值到左边
1+2=>a//左边全部赋值到右边
a+=1//a=a+1
1+=>a//a+1=>a
a=.locals
.locals=>a
a+++=>a
autoto:自动转类型
var s="hello world"//byte[]类型
var s String="hello world"//String类型
class String{
var str byte[]
var length dword
func __load{
}
func __load str byte[]{
self.str=str
}
autoto a char[]{
a new self=>
}
func size{
=size
}
}
-----20201008
import AllocConsole from "KERNEL32.DLL:AllocConsole"
import AllocConsole from "KERNEL32.DLL"
var AllocConsole=api "KERNEL32.DLL:AllocConsole"//变量 间接取值
val AllocConsole=api "KERNEL32.DLL:AllocConsole"//常量 直接写入立即数
----20201012
编译后所有作用域初使变量都在一起
函数使用内存复制?或动态分配内存然后代码进行设置
最终的文件是分段的,而且需要地址修复
作用域分开编译 最终合在一起
class global{
class a{//作用域
fun b{
var c=10
}
}
class b{
}
}
目标:
实现自举,并使用自举的编译器实现一个web服务器框架
/*
class a{
var b=100
var c=200
}
a.b=1000
d=new a
if a==100 && b==20{
}
for(var i=0;i<10;i++){
}
while xxx{
}
var a fun
fun b int,c int{
}=>a
10,20 sum,30 sum
//1+2,(10,40 sum) sum
sum(sum(1,20),40)
a,b top.sum=>c,b sum
data=new data
data a b c d=>f
class n{
var a[][]=new int[10][20]{
{2,2},{22,22}
}
int a[]={10,20,30}
var a[]=[10,20,30,40]
}
import os
"hello world!" os.print
*/