作者sunneo (艾斯寇德)
站内Programming
标题[讨论] 弱关键字的程式语言
时间Sat Apr 18 13:23:44 2015
#原本发在PLT,不知道这个适合哪里,但跟PLT的理论关联性不那麽深,所以
#我把他放在这讨论
最近跟人讨论我想到一件事:
在组合语言层级,从C的编译器产生的binary file不会看到的函式名称,
那八成是_do, _while, _if ... 等关键字/保留字
有这些关键字,我初略想到他们的用途是在token->grammar这过程可以在找到token时
将parser的状态进入到某个关键字的子状态。
假使今天有user用组合语言实现一套api,用static linking library发布,
刚好函式进入点是这些关键字甚至是型别名称,因为是static linking library
恰好无法利用dlopen以函式指标来当进入点。
这很可能发生在任何两个程式语言相互运作的时候
所以我想到
0) 当一个函式真的是关键字命名的,有没有法子去叫用,像搜寻data/symbol table的解
1) 这个状态有没有那麽必要一定要用这关键字驱动?
2) 有没有一个compiler/程式语言支援这种关键字强度的?
让关键字本身对於解析器的强度是弱强度,当一个关键字在一个scope被赋予其他意义
例如他被变成物件/变数/函式,他当下就不是原先关键字的意义。
要不要弄一个语法强度比关键字/保留字高的compiler ?
ex:
有人设计了一个函式,是
int if(int val1, int val2);
如果user include拥有这份宣告的档案,或定义了这个符号,那麽目前他在这个档案
看到的if就有两个意义:
if ( Boolean-Expression )
int if(int val1, int val2);
这时编译器如果看到使用者的式子为 if( a, b ) 他仍不应该立刻进入函式呼叫的意义,
如果他在同一个表示中看到else,而且else没有被复写为其他意义。
则以下这个if(a,b) 其实是 if(Boolean-Expression)。
if( a, b ){ } else { }
而内容值为 common-expression-list,就是evaluate a後, evaluate b并把b作为
expression-value,当成Boolean-expression
如果他看到的是 if ( a, b ); 因为可以找到复写的意义 int if(int,int),那麽
这个if指的函式呼叫。
如果不幸使用者定义了else是一个variable,以下式子仍是if(Boolean-Expression)
if( a, b ){ } else ;
因为 else; 这个式子的运算结果没用,else; 没有把else拿来read/write/addrOf
if( a, b ){ } else{ }
因为 else { } 在else为变数的时候不合法
但以下就会成为if function
if ( a, b ){ ... }
因为 if ( a, b )目前强度比 if(Boolean-expression) 高
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.1.247
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1429334629.A.A43.html
※ 编辑: sunneo (220.132.1.247), 04/18/2015 13:24:56
1F:→ sunneo: 啊啊,一直在按esc, :q! 220.132.1.247 04/18 13:26
2F:→ MOONRAKER: VI上瘾 :D 218.161.46.90 04/18 13:49
3F:→ MOONRAKER: Sorry, vi上瘾,大写太外行了 218.161.46.90 04/18 13:49
4F:→ MOONRAKER: 只想到interpreter的例子,php可以用 218.161.46.90 04/18 14:02
5F:→ MOONRAKER: 某些关键字(不是全部)当变数,例如 218.161.46.90 04/18 14:03
6F:→ MOONRAKER: $if,如果在$if里面放一个已知函数名 218.161.46.90 04/18 14:03
7F:→ MOONRAKER: 还可以这样呼叫函数,例如$if(3)这样 218.161.46.90 04/18 14:04
8F:→ MOONRAKER: 不过跟你的设想应该差满多的 218.161.46.90 04/18 14:05
9F:→ suhorng: (我觉得不会不适合 PLT~ 不过都好XD) 140.112.16.135 04/18 16:34
10F:→ MOONRAKER: 最近刚好要写php extension,如果说对 218.161.46.90 04/18 22:55
11F:→ MOONRAKER: 方语言的obj档里面有一个symbol,刚好 218.161.46.90 04/18 22:56
12F:→ MOONRAKER: 就是if,那可不可以… 218.161.46.90 04/18 22:56
13F:→ MOONRAKER: 不行,刚想到,php这种关键字把戏只能 218.161.46.90 04/18 22:56
14F:→ MOONRAKER: 拿来当变数,函数名字的检查严格很多 218.161.46.90 04/18 22:57
15F:→ sunneo: 我想这种关验字限制要放宽到像overloading 220.132.1.247 04/19 10:23
16F:→ sunneo: 如if当函式, 参数不合签名就当原本的if 220.132.1.247 04/19 10:33
※ 编辑: sunneo (220.132.1.247), 04/20/2015 03:04:05
※ 编辑: sunneo (220.132.1.247), 04/20/2015 03:06:30
17F:推 suhorng: 原来是这个意思? 感觉跟 linking, bin 都 220.137.36.81 04/20 12:42
18F:→ suhorng: 没什麽关联, 纯粹是 parsing 的问题? 220.137.36.81 04/20 12:42
19F:→ sunneo: hmmm ... if这符号也是该存在obj档里面 140.127.114.38 04/20 18:55
20F:→ sunneo: 还是parser要放宽才能把他当symbol 140.127.114.38 04/20 18:59
21F:→ MOONRAKER: 转换成parsing table之後 控制关键字 218.161.46.90 04/21 03:46
22F:→ MOONRAKER: 的确应该都消失了 218.161.46.90 04/21 03:46
23F:→ sunneo: 所以现况有查自己symbol table的解吗 =_= 220.132.1.247 04/21 13:25
24F:→ sunneo: 程式不幸link到使用关键字的obj/lib 220.132.1.247 04/21 13:27
25F:→ sunneo: 若有api可以enumerate symbol应该也可以解 220.132.1.247 04/21 13:28
26F:→ sunneo: 用dlopen,file填NULL,前提是rdynamic 220.132.1.247 04/21 13:32