分类 编译 下的文章

php的tcc扩展

最近学习编译器的实现,看到tcc。觉得不错,因为可以编译之后获得函数指针调用。想着能不能实现成一个PHP扩展。动态编译代码并提供给php代码调用,这样对于web可能意义并不大,但是常驻的程序却很有意义。尤其一些简单而重复或者多变的东西,做成扩展虽然可以提升,但相对来说过于麻烦并且不灵活。而这种形式就方便很多了。

花了2天时间,同时熟悉了下好久没写过的php扩展API。写了个简单原型出来了,只支持long float和char*,并且有些内存释放的地方还没处理。只是想做个原型看看效果。

调试了几小时,跑通了之后测试了下。

第一个是php 5.6.5,第二个是使用tcc扩展,加载so和编译时间算在里面了。第三个是想到刚编译了php 7的git最新版,就正好拿来对比下,用的就是php的测试代码。

 php 37014178 cost:1.3031008243561
c   37014178 cost:0.030487060546875
php 37014178 cost:0.67009902000427

调用c版本快了很多,但php7的也非常快。之前测试的并没有那么明显的优势。现在明显快了一倍。

C11标准

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。相比C99,C11有哪些变化呢——

1、 对齐处理

alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容。

2、 _Noreturn

_Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的attribute((noreturn)),后者在声明语句尾部。

3、 _Generic

_Generic支持轻量级范型编程,可以把一组具有不同类型而却有相同功能的函数抽象为一个接口。

4、 _Static_assert()

_Static_assert(),静态断言,在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式,而普通的assert()在运行时刻断言。

5、安全版本的几个函数

gets_s()取代了gets(),原因是后者这个I/O函数的实际缓冲区大小不确定,以至于发生常见的缓冲区溢出攻击,类似的函数还有其它的。

6、 fopen()新模式

fopen()增加了新的创建、打开模式“x”,在文件锁中比较常用。

7、 匿名结构体、联合体。

8、 多线程

头文件<threads.h>定义了创建和管理线程的函数,新的存储类修饰符_Thread_local限定了变量不能在多线程之间共享。

9、 _Atomic类型修饰符和头文件<stdatomic.h>。

10、改进的Unicode支持和头文件<uchar.h>。

11、quick_exit()

又一种终止程序的方式,当exit()失败时用以终止程序。

12、复数宏,浮点数宏。

13、time.h新增timespec结构体,时间单位为纳秒,原来的timeval结构体时间单位为毫秒。

Source: xundaoinfo