技术层面看《易语言》与《易飞扬》
技术层面看<易语言>与<易飞扬>:
易已经推出已经很多年了 +之最近 易飞扬的推出.因此不免评价一番,作为第一个稍微看的顺延的中文语言:
我曾经在有些言论中提到过易编译器很 '垃圾'.因此有不少人对我很不满意,但是依然固执己见,并对此进行一个简单的分析,为什么我会得出这个结论.
我们首先还是就易语言先进行一个分析: 首先我们选取官方的一个例子:
拥有自己的编译器
易语言拥有自己独立的高质量编译器,源程序被直接编译为目的机器的CPU指令,不存在任何速度瓶颈和安全隐患。
编译器是编程语言中最核心最关键的部分,易语言的编译器不仅效率高,而且可以编译出与操作系统平台无关的可执行代码。
然后我们对这个例子稍加改动:
.版本 2
.子程序 __启动窗口_创建完毕
Test1 ()
Test2 ()
.子程序 Test1
.局部变量 累加变量, 整数型
.局部变量 时间, 整数型
时间 = 取启动时间 ()
累加变量 = 0
.计次循环首 (100000000, )
累加变量 = 累加变量 + 1
.计次循环尾 ()
时间 = 取启动时间 () - 时间
输出调试文本 (“Test1 Time Spend ” + 到文本 (时间) + “ MS”)
.子程序 Test2
.局部变量 累加变量, 整数型
.局部变量 时间, 整数型
时间 = 取启动时间 ()
累加变量 = 0
.计次循环首 (100000000, )
累加变量 = 累加变量 + 2 - 1
.计次循环尾 ()
时间 = 取启动时间 () - 时间
输出调试文本 (“Test1 Time Spend ” + 到文本 (时间) + “ MS”)
注意Test1 与 Test 2的区别
我仅仅将+1 换成了 + 2 - 1.大家可以试图先猜测一下所花费的时间.
开始运行被调试易程序
* Test1 Time Spend 219 MS
* Test1 Time Spend 2386 MS
被调试易程序运行完毕
结果是不是另你吃了一惊?差了整整10倍。这里我都不去和C++ C语言甚至Delphi,C# 甚至VB这些比了。结果大家都知道。又是一个10倍的差距。
如果算一般的解释语言的话:如果差两倍还想得通。我们还是来看看汇编码:
Test1子程序的汇编码:
004032E9 55 push ebp
004032EA 8BEC mov ebp,esp
004032EC 81EC 24000000 sub esp,24
004032F2 C745 FC 00000000 mov dword ptr ss:[ebp-4],0
004032F9 C745 F8 00000000 mov dword ptr ss:[ebp-8],0
00403300 68 00000000 push 0
00403305 BB 08030000 mov ebx,308
0040330A E8 5A010000 call E与EF.00403469
0040330F 83C4 04 add esp,4
00403312 8945 FC mov dword ptr ss:[ebp-4],eax
00403315 C745 F8 00000000 mov dword ptr ss:[ebp-8],0
0040331C 33C9 xor ecx,ecx
0040331E 41 inc ecx
0040331F 51 push ecx
00403320 81F9 00E1F505 cmp ecx,5F5E100
00403326 0F8F 06000000 jg E与EF.00403332
0040332C FF45 F8 inc dword ptr ss:[ebp-8]
0040332F 59 pop ecx
00403330 ^ EB EC jmp short E与EF.0040331E
00403332 83C4 04 add esp,4
00403335 68 00000000 push 0
0040333A BB 08030000 mov ebx,308
0040333F E8 25010000 call E与EF.00403469
00403344 83C4 04 add esp,4
00403347 8945 EC mov dword ptr ss:[ebp-14],eax
0040334A DB45 EC fild dword ptr ss:[ebp-14]
0040334D DD5D EC fstp qword ptr ss:[ebp-14]
00403350 DD45 EC fld qword ptr ss:[ebp-14]
00403353 DB45 FC fild dword ptr ss:[ebp-4]
00403356 DD5D E4 fstp qword ptr ss:[ebp-1C]
00403359 DC65 E4 fsub qword ptr ss:[ebp-1C]
0040335C DD5D DC fstp qword ptr ss:[ebp-24]
0040335F DD45 DC fld qword ptr ss:[ebp-24]
00403362 E8 5BFFFFFF call E与EF.004032C2
00403367 8945 FC mov dword ptr ss:[ebp-4],eax
0040336A 8BE5 mov esp,ebp
0040336C 5D pop ebp
0040336D C3 retn
Test2子程序的汇编码:
0040336E 55 push ebp
0040336F 8BEC mov ebp,esp
00403371 81EC 24000000 sub esp,24
00403377 C745 FC 00000000 mov dword ptr ss:[ebp-4],0
0040337E C745 F8 00000000 mov dword ptr ss:[ebp-8],0
00403385 68 00000000 push 0
0040338A BB 08030000 mov ebx,308
0040338F E8 D5000000 call E与EF.00403469
00403394 83C4 04 add esp,4
00403397 8945 FC mov dword ptr ss:[ebp-4],eax
0040339A C745 F8 00000000 mov dword ptr ss:[ebp-8],0
004033A1 33C9 xor ecx,ecx
004033A3 41 inc ecx
004033A4 51 push ecx
004033A5 81F9 00E1F505 cmp ecx,5F5E100
004033AB 0F8F 2C000000 jg E与EF.004033DD
004033B1 DB45 F8 fild dword ptr ss:[ebp-8]
004033B4 DD5D F0 fstp qword ptr ss:[ebp-10]
004033B7 DD45 F0 fld qword ptr ss:[ebp-10]
004033BA DC05 04314000 fadd qword ptr ds:[403104]
004033C0 DD5D E8 fstp qword ptr ss:[ebp-18]
004033C3 DD45 E8 fld qword ptr ss:[ebp-18]
004033C6 DC25 0C314000 fsub qword ptr ds:[40310C]
004033CC DD5D E0 fstp qword ptr ss:[ebp-20]
004033CF DD45 E0 fld qword ptr ss:[ebp-20]
004033D2 E8 EBFEFFFF call E与EF.004032C2
004033D7 8945 F8 mov dword ptr ss:[ebp-8],eax
004033DA 59 pop ecx
004033DB ^ EB C6 jmp short E与EF.004033A3
004033DD 83C4 04 add esp,4
004033E0 68 00000000 push 0
004033E5 BB 08030000 mov ebx,308
004033EA E8 7A000000 call E与EF.00403469
004033EF 83C4 04 add esp,4
004033F2 8945 EC mov dword ptr ss:[ebp-14],eax
004033F5 DB45 EC fild dword ptr ss:[ebp-14]
004033F8 DD5D EC fstp qword ptr ss:[ebp-14]
004033FB DD45 EC fld qword ptr ss:[ebp-14]
004033FE DB45 FC fild dword ptr ss:[ebp-4]
00403401 DD5D E4 fstp qword ptr ss:[ebp-1C]
00403404 DC65 E4 fsub qword ptr ss:[ebp-1C]
00403407 DD5D DC fstp qword ptr ss:[ebp-24]
0040340A DD45 DC fld qword ptr ss:[ebp-24]
0040340D E8 B0FEFFFF call E与EF.004032C2
00403412 8945 FC mov dword ptr ss:[ebp-4],eax
00403415 8BE5 mov esp,ebp
00403417 5D pop ebp
00403418 C3 retn
其中两个循环我已经用红色部分标注出来了
明眼人一看就知道后者很显然是调用的浮点指令来实现计算的。自然速度相差10倍也不为过。
我以前也只听到过用整数运算模拟浮点的(搞嵌入式的应该知道多数CPU 包括80386之前是根本不带浮点指令的)。而看到这里另你很好笑:用浮点模拟整数。况且类型定义的时候已经说明了是整数。这个语言也不是一门弱类型语言。实在是不可理解。而且看
004033F2 8945 EC mov dword ptr ss:[ebp-14],eax
004033F5 DB45 EC fild dword ptr ss:[ebp-14]
004033F8 DD5D EC fstp qword ptr ss:[ebp-14]
004033FB DD45 EC fld qword ptr ss:[ebp-14]
004033FE DB45 FC fild dword ptr ss:[ebp-4]
00403401 DD5D E4 fstp qword ptr ss:[ebp-1C]
00403404 DC65 E4 fsub qword ptr ss:[ebp-1C]
00403407 DD5D DC fstp qword ptr ss:[ebp-24]
0040340A DD45 DC fld qword ptr ss:[ebp-24]
很显然时间 = 取启动时间 () - 时间 这条指令转换尽然也是采用的浮点。
当然很明显 调用格式: 〈整数型〉 取启动时间 () - 系统核心支持库->系统处理 这个系统库也是返回的整数。根本不存在类型无法判断等问题。
我这里都先不说编译器中的表达式优化。以及循环中多用寄存器的问题。
很明显
004033BA DC05 04314000 fadd qword ptr ds:[403104]
004033C0 DD5D E8 fstp qword ptr ss:[ebp-18]
004033C3 DD45 E8 fld qword ptr ss:[ebp-18]
004033C6 DC25 0C314000 fsub qword ptr ds:[40310C]
这里把 + 2 - 1一五一十的给写上去了。我不相信哪个语言会无法计算这个表达式。包括许多脚本语言在内
我曾经就这个问题问过易语言公司:当然我问的时候大概已经过去2年了吧。当然给我的回答是:
这样实现更简便,并且以后用户有需要可以考虑增加(大概是这样,不是原文,记错了不要怪我 2年多的事情了)。
当然很明显由于E中根本没有异常处理,当然对于溢出,除0等等问题 的确让CPU的浮点指令帮你处理简便很多。
但事隔两年多我依然没有看到有任何改动,以上的代码均为最新的易语言生成的。
当然易公司的解释也很合理:想想也是,只要速度不是满到无法跑的地步当然可以 想想5年前CPU可能才200 兆赫兹而现在 10 倍都有余,自然程序指令慢上10倍也没有什么。但更为具体的是:很明显E的程序基本上绝大部分代码都是C++具体点就是其MFC库。而且由于这个原因因此E的界面库界面库仅可以采用MFC 4.2也就是VC6.0来写。很显然其他语言和后续MFC版本都不再考虑的行列。这个问题我举一个例子就行了:
调用格式: 〈整数型〉 位与 (整数型 位运算数值一,整数型 位运算数值二,... ) - 系统核心支持库->位运算
英文名称:band
如两个数值有某共同比特位为1,则返回值的对应位也为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
参数<1>的名称为“位运算数值一”,类型为“整数型(int)”。
参数<2>的名称为“位运算数值二”,类型为“整数型(int)”。
操作系统需求: Windows、Linux
调用格式: 〈整数型〉 位或 (整数型 位运算数值一,整数型 位运算数值二,... ) - 系统核心支持库->位运算
英文名称:bor
如两个数值中有一个数值的某一比特位不为零,则返回值的对应位就为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
参数<1>的名称为“位运算数值一”,类型为“整数型(int)”。
参数<2>的名称为“位运算数值二”,类型为“整数型(int)”。
操作系统需求: Windows、Linux
这个系列的命令均是
从系统核心支持库->位运算 看得出来这很明显是调用的核心支持库。当然我们下面还是来验证一下:
位异或 (305419896, 2271560481)
当然这里的两个整数分别对应0x12345678,0x87654321
004032B3 68 01030080 push 80000301
004032B8 6A 00 push 0
004032BA 68 21436587 push 87654321
004032BF 68 01030080 push 80000301
004032C4 6A 00 push 0
004032C6 68 78563412 push 12345678
004032CB 68 02000000 push 2
004032D0 BB CC000000 mov ebx,0CC
004032D5 E8 B9010000 call E与EF.00403493
->
00403493 - FF25 2F324000 jmp dword ptr ds:[40322F] ; krnln.10029AD4
->
10029AD4 /. 55 push ebp
10029AD5 |. 8BEC mov ebp,esp
10029AD7 |. A1 58A91310 mov eax,dword ptr ds:[1013A958]
10029ADC |. 0318 add ebx,dword ptr ds:[eax]
10029ADE |. 8D4424 0C lea eax,dword ptr ss:[esp+C]
10029AE2 |. 83EC 0C sub esp,0C
10029AE5 |. 50 push eax
10029AE6 |. FF7424 18 push dword ptr ss:[esp+18]
10029AEA |. 33C0 xor eax,eax
10029AEC |. 894424 08 mov dword ptr ss:[esp+8],eax
10029AF0 |. 894424 0C mov dword ptr ss:[esp+C],eax
10029AF4 |. 894424 10 mov dword ptr ss:[esp+10],eax
10029AF8 |. 8D5424 08 lea edx,dword ptr ss:[esp+8]
10029AFC |. 52 push edx
10029AFD |. FF13 call dword ptr ds:[ebx]
10029AFF |. 8B4424 0C mov eax,dword ptr ss:[esp+C]
10029B03 |. 8B5424 10 mov edx,dword ptr ss:[esp+10]
10029B07 |. 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
10029B0B |. 8BE5 mov esp,ebp
10029B0D |. 5D pop ebp
10029B0E /. C3 retn
->
10060CE0 . 8B4424 0C mov eax,dword ptr ss:[esp+C]
10060CE4 . 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
10060CE8 . 8B5424 04 mov edx,dword ptr ss:[esp+4]
10060CEC . 50 push eax
10060CED . 51 push ecx
10060CEE . 52 push edx
10060CEF . 6A 02 push 2
10060CF1 . E8 FAFEFFFF call krnln.10060BF0
10060CF6 . 83C4 10 add esp,10
10060CF9 . C3 retn
10060BF0 /$ 8B5424 10 mov edx,dword ptr ss:[esp+10]
10060BF4 |. 8B4424 0C mov eax,dword ptr ss:[esp+C]
10060BF8 |. 83F8 01 cmp eax,1
10060BFB |. 8B0A mov ecx,dword ptr ds:[edx]
10060BFD |. 7E 2F jle short krnln.10060C2E
10060BFF |. 56 push esi
10060C00 |. 8B7424 08 mov esi,dword ptr ss:[esp+8]
10060C04 |. 57 push edi
10060C05 |. 8D78 FF lea edi,dword ptr ds:[eax-1]
10060C08 |> 8BC6 /mov eax,esi
10060C0A |. 83C2 0C |add edx,0C
10060C0D |. 83E8 00 |sub eax,0 ; Switch (cases 0..2)
10060C10 |. 74 0E |je short krnln.10060C20
10060C12 |. 48 |dec eax
10060C13 |. 74 07 |je short krnln.10060C1C
10060C15 |. 48 |dec eax
10060C16 |. 75 0A |jnz short krnln.10060C22
10060C18 |. 330A |xor ecx,dword ptr ds:[edx] ; Case 2 of switch 10060C0D
10060C1A |. EB 06 |jmp short krnln.10060C22
10060C1C |> 0B0A |or ecx,dword ptr ds:[edx] ; Case 1 of switch 10060C0D
10060C1E |. EB 02 |jmp short krnln.10060C22
10060C20 |> 230A |and ecx,dword ptr ds:[edx] ; Case 0 of switch 10060C0D
10060C22 |> 4F |dec edi ; Default case of switch 10060C0D
10060C23 |.^ 75 E3 /jnz short krnln.10060C08
10060C25 |. 8B4424 10 mov eax,dword ptr ss:[esp+10]
10060C29 |. 5F pop edi
10060C2A |. 5E pop esi
10060C2B |. 8908 mov dword ptr ds:[eax],ecx
10060C2D |. C3 retn
10060C2E |> 8B5424 08 mov edx,dword ptr ss:[esp+8]
10060C32 |. 890A mov dword ptr ds:[edx],ecx
10060C34 /. C3 retn
很明显的看得出来调用的支持库函数 当然这个支持库函数是VC6.0生成的。
我就在想一个问题了:XOR这个汇编指令里面有什么需要跨平台的地方需要调用外部库吗?
或者这个指令CPU没有需要模拟吗?估计CPU里面就算没有乘法指令也不会没有XOR吧。
这样做很简单啊,不管怎么这条指令只需要的实现只需要在VC中写上100行代码即可表示,何必去花时间来搞编译器呢?反正只需要PUSH PUSH 然后CALL/JMP到库中就完事。
难怪有人天天嚷嚷说易程序老是误报,这还不简单,你发行的EXE中至少70% ++都是采用的VC++ 编写的相同。让杀毒软件自己去区分这30%实在是难为人家了。
更不要说易的IDE 是VC++开发的 也不要说所有的界面库 几乎所有的库都和VC++脱不了干系。让我怀疑易是否在推销VC ++
最后再举一个例子:
看跳转指令的生成:
除了计次循环首 这个固定的结构外
004033AB 0F8F 2C000000 jg E与EF.004033DD
全是Jxx + Long Jmp的形式。明眼人都知道这里2C 明显在 + 127 范围内
当然任何JMP Long Jmp都可以表示(Kernel MODE除外)Jmp Short要加一个判断,多麻烦啦。
不要跟我说这只是编译器的BUG。这个问题我 2 年前就跟易公司提过。只要不是程序出现了 非法操作,估计也没有人管你。
之初说的要跨平台,但是我也不知道界面库采用MFC如何跨?当然只写写命令行调用几个Shell当打包后的脚本语言后也还不错。
当然还有IDE 与Vista的兼容性问题,我也难得说了。反正用的人就知道。Vista由于Aero的原因,控件的矩形区域是不同的,细节决定成败。Vista已经发布马上就一年了。再不兼容我看怎么都说不过去。
还有很多很多地方 我这些也就一一叙述了。但是我想说的是现在马上就是08年 。编译技术的今天和 70时代的时候早已不可比。但代码质量甚至不及当初。实在是难以理解。
其实如果不是因为最近天天吵汉语编程的问题 我也难得提,反正我看WT的 5000万不知道花来干什么来着。
最近花心思来写它的EF。我也就事论事的说吧。
编译器质量相对于E语言是有些提高,具体我也没有去仔细研究。但是我继续陈述事实:
我知道现在很多人都喜欢C++,EF也不例外,从编译器 到 GC 到各种库 依然才用得C++ ,只是方式换了 ,代码可以在GCC编译通过,甚至用了开源的跨平台库。
其实编译器用C++这个没有什么。这个可以理解(当然C 语言编译器也是C语言的)。就算底层GC必须采用到Native 语言也罢了。
但是令人不可理解的是 居然类库依然是大规模普及C++。
当然因为这个原因我还是先装上EF,写段代码来说明问题:
for(;;)
{
int a;
string b="11";
a=b.到整数();
}
汇编码为:
0040410E C745 F8 FB414000 mov dword ptr ss:[ebp-8],临时工程.004041FB
00404115 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
00404118 51 push ecx
00404119 68 05424000 push 临时工程.00404205
0040411E E8 8DFFC00F call 系统.100140B0
00404123 83C4 08 add esp,8
00404126 FF75 F8 push dword ptr ss:[ebp-8]
00404129 A1 48020410 mov eax,dword ptr ds:[10040248]
0040412E FF90 D0020000 call dword ptr ds:[eax+2D0]
00404134 83C4 04 add esp,4
00404137 8945 FC mov dword ptr ss:[ebp-4],eax
0040413A FF75 F8 push dword ptr ss:[ebp-8]
0040413D E8 BEFFC00F call 系统.10014100
00404142 83C4 04 add esp,4
00404145 ^ EB C7 jmp short 临时工程.0040410E
大家可以明显地看得出来依然是调用的系统库。
而很明显系统库是C++ 编写的。
汇编代码如下:
10020A50 /$ 8B5424 04 mov edx,dword ptr ss:[esp+4]
10020A54 |. 85D2 test edx,edx
10020A56 |. 75 03 jnz short 系统.10020A5B
10020A58 |. 33C0 xor eax,eax
10020A5A |. C3 retn
10020A5B |> 66:833A 20 cmp word ptr ds:[edx],20
10020A5F |. 75 09 jnz short 系统.10020A6A
10020A61 |> 83C2 02 /add edx,2
10020A64 |. 66:833A 20 |cmp word ptr ds:[edx],20
10020A68 |.^ 74 F7 /je short 系统.10020A61
10020A6A |> 33C9 xor ecx,ecx
10020A6C |. 56 push esi
10020A6D |. 66:8B0A mov cx,word ptr ds:[edx]
10020A70 |. 83C2 02 add edx,2
10020A73 |. 83F9 2D cmp ecx,2D
10020A76 |. 8BF1 mov esi,ecx
10020A78 |. 74 05 je short 系统.10020A7F
10020A7A |. 83F9 2B cmp ecx,2B
10020A7D |. 75 08 jnz short 系统.10020A87
10020A7F |> 33C9 xor ecx,ecx
10020A81 |. 66:8B0A mov cx,word ptr ds:[edx]
10020A84 |. 83C2 02 add edx,2
10020A87 |> 33C0 xor eax,eax
10020A89 |. 83F9 30 cmp ecx,30
10020A8C |. 72 1A jb short 系统.10020AA8
10020A8E |> 83F9 39 /cmp ecx,39
10020A91 |. 77 15 |ja short 系统.10020AA8
10020A93 |. 8D0480 |lea eax,dword ptr ds:[eax+eax*4]
10020A96 |. 83C2 02 |add edx,2
10020A99 |. 8D4441 D0 |lea eax,dword ptr ds:[ecx+eax*2-30]
10020A9D |. 33C9 |xor ecx,ecx
10020A9F |. 66:8B4A FE |mov cx,word ptr ds:[edx-2]
10020AA3 |. 83F9 30 |cmp ecx,30
10020AA6 |.^ 73 E6 /jnb short 系统.10020A8E
10020AA8 |> 83FE 2D cmp esi,2D
10020AAB |. 5E pop esi
10020AAC |. 75 02 jnz short 系统.10020AB0
10020AAE |. F7D8 neg eax
10020AB0 /> C3 retn
以上仅举一个例子,包括各类数组操作,等等都是调用C++实现
大家都知道跨平台的首要条件就是越是少调用Native 库。如此这番调用如何实现跨平台呢?
况且这种算法又不是有对系统底层的依赖。实在是难以理解。
调用本地库的原因 要嘛是因为对速度有很高的要求 比如C中strlen strcat实现是用汇编语言。
要嘛 就是有平台依赖性。反正我就想不通是哪一点了
至少C++的这个函数是C++实现的
Delphi的也是包括Java的JDK
甚至C# 的NET 也是。有兴趣自己翻阅代码就知道了。
无法理解EF的这种行为。恐怕只有一种解释,C语言的拿来就用多方便,Ctrl + C AND Ctrl + V即可完成库,
何必要去改呢。
或者说这些必须要调用C语言甚至更底层,地汇编语言 因为EF编译器生成的代码会严重影响效率。
我个人觉得 就算这些库你采用纯ASM甚至机器码。都要好的多,但作为一门语言这样做就很不应该,我知道又有人要说人家Lua Python 这些呢?但是我想说的是EF是编译型本地语言,不是解释语言。运行方式都不同。当然你硬要说这是创新,也没有假。反正就是给大家展示C++多么多么的强大由他诞生了好多好多语言。
个人认为如果EF要给各位看官合理的交待至少这种起码的东西还是要具备的。
不要除了采用开源项目 Ctrl +X 以外就没有其他招了,我们熟知的EF IDE是EF开发的。但是就连官方也是无法解决
for(;;)
{
代码缩进问题 也就说 {} 缩进后 { 始终会露出来
原因官方自己都说了 由于这个开源项目作者的习惯问题 所以基于这个项目的所有IDE 都是这种风格。隐含的核心很明显就是IDE的核心 依然不是EF。而是C++(猜测,反正不可能是汇编)。
我并不是否认这种做法,但是我觉得作为一个大型商业作品 ,面向的也是 16 亿中国人,这种做法实在是有些不可理解。因为我还没有看到NetBeans或者说Visual Studio 去采用哪个开源作品。
另外我想补充一下我对EF的看法。既然EF的语法和Java,C++这些很类似了,库用法也差不多。也是面向对象化的,且IDE也是这种风格了 而不是老版易特有的填表式风格。那么我就在想:
既然如此用户何必非要来选择EF这个库也少 资料也少,要说跨平台也远不及Java ,C++呢?想必习惯上述两门语法和编程习惯的用户,那几个英文词汇应该不是什么阻力。这只是个人观点,当然易公司既然花了这么大的人力物力肯定有他的原因。姑且理解为填补Java 和 C++之间的空白。既有Java的方面避免C++的困难,但是又可以生成C++的本地代码
当然了 EF的编译质量来说还是基本令人满意的。
不过客观来说 我还是对这个变化有些吃惊(包括寄存器分支预测这些现代编译器技术),会不会又是某个开源作品的功劳呢?就如IDE和界面库一样呢?[界面的一些贴图和Visual Studio实在是太相似了,感觉完全是在用C# 个人感觉而已]
当然仅仅是猜测(毕竟开源作品都是 C Based语言的,会不会和EF的语法结构也有关系呢?),如果真是易公司自主法的话还是令人高兴的。再次声明:纯属猜测,我也知道E有很多FANS。也喜欢注册些用户来当马甲用,我希望你们省省。我不是在搞人身攻击,请你们也自重。
总上,我只能够简单的表示这些易语言和EF 语言的特色为 ‘中国特色’。比如易语言以前不是一直在跟国家取得支持嘛?x63计划?
希望EF不要这样,你有了用户群 自然就有人支持你。希望不要过多地心思花在这上面,同时也希望E公司不要只对C++库充满了兴趣。哪怕是把库改为EF的代码,也总比你把人家的代码编译为DLL供EF调用好点;我看目前EF对支持库开发的C++说明和帮助就甚至比语言本身的帮助自己类库的介绍详细的多。好像是在鼓励别人用C++而不是用EF。
当然了除了否定以外,我觉得我还是比较看好EF的。
本着希望越来越好的心理,虽然我几乎没有说什么表扬的话,但是并不代表就没有值得赞赏的,应该说值得赞赏的地方还是很多的,但重复的言词我也就省省了.
因此不管怎么说也祝顺。
技术层面看《易语言》与《易飞扬》相关推荐
- “易写易库(EXEK)”项目启动,用易语言开发易语言支持库
"易写易库"(EXEK,E Xie E Ku)项目已经启动,用易语言开发易语言支持库.我(liigo)准备用一个月左右的业余时间,完成本项目的一期工程. 用易语言开发易语言支持库, ...
- [易语言][转载]易语言支持库内的DES算法分析
介绍 易语言支持库里有个这样的命令: 〈字节集〉 加密数据 (字节集 字节集数据,文本型 密码文本,[整数型 加密算法]) - 数据操作支持库一->数据加解密 其中加密算法可以选DES以及RC4 ...
- c开发 易语言支持库,易写易库-用易语言开发易语言支持库.pdf
易写易库-用易语言开发易语言支持库 易写易库(EXEK)用户手册 版本:0.2 作者:liigo,/liigo 时间:2008.10 概述 EXEK EXEK "易写易库(EEXXEEKK) ...
- c 传入易语言字节,易语言字节集参数传递详解
易语言多线程之字节集参数传递 传递文本可以直接传递文本的指针,但是字节集却不能这样,看下面直接传递字节集指针的代码: .版本 2 .支持库 spec .支持库 EThread .程序集 窗口程序集1 ...
- c 与易语言程序间通信,易语言与三菱PLC通信-FX系列
PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域.实现PC机与PLC通信的目的是为了向用户提供诸如工艺流程图显示.动态数据画面显示.报表显示.窗口技术等多种功能,为PLC提供良好的人机界面. ...
- 511遇见易语言学习易语言常量
简单的说,就是在程序运行时,其值不能被改变的量.是计算机将数据储存到内存中的一种方式,不变是相对于变量而言,没有绝对的不变. 一.了解常量 常量是一种标识符,它的值在运行期间恒定不变.常量是一个固定的 ...
- 易语言snmp_易语言教程
易语言是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言.易语言降低了广大电脑用户编程的门槛,尤其是根本不懂英文或者英文了解很少的用户,可以通过使用本语言极其快速地进入Window ...
- c调用易语言串口,易语言串口API源码
易语言串口API源码系统结构:ReadCommPure,BuildCommDCB,CreateFilea,关闭句柄a,SetCommState,ReadFileA,GetCommState,Write ...
- 字符串固定长度 易语言_易语言字符串操作源码
易语言字符串操作源码 系统结构:字符串_取长度,字符串_取中间,字符串_取左边,字符串_取右边,字符串_替换,到宽字符,到多字节,取文本数据地址,取字节集数据地址,MultiByteToWideCha ...
最新文章
- python框架flask系列(2),Python的Web框架之Flask(2)
- python 读取大文件_Python读取大文件
- cordova指定版本_Cordova 基本命令 以及如何添加,删除插件
- mysql主从配置 简书_Mysql主从配置,实现读写分离-Go语言中文社区
- Java内置数据类型
- WCF中如何用nettcp协议进行通讯
- [机器学习-Sklearn]函数sklearn.feature_extraction.DictVectorizer理解与总结
- 活在贫困线之下的开源软件项目——开源的可持续性斗争
- linux简单命令3---帮助命令
- MyBatis的懒加载(延迟加载)
- 根据共享文件夹的权限进行自动映射网络驱动器
- iOS开发经验总结(上)
- 最长公共子序列(输出公共序列)
- 软件测试HW3 主路径覆盖测试
- Mybatis Configuration.xml中properties属性定义
- 小甲鱼c语言_C语言可以不用,但是不能不会!
- 如何生成PSSM矩阵
- 联想G480 i3 2348M扩展内存
- 帆软软件FineReport考试题库FCRA题库
- 微商史上最全软文标题写作套路(收藏版)