Jump to Navigation

Document

Programming articles and books.

实现Qt的go语言绑定的两种方式

# 实现Qt的go语言绑定的两种方式

Qt是一个成熟优秀的C++ GUI开发库,

###

第一种方式

自动生成完整的cgo代码的方式。

基本原理,
使用一工具扫描使用了qt的go源代码,根据调用特征,生成完整的cgo封装代码。
生成的代码放在项目的目录树中,编译整个项目即可。

这种方式比较直接,编译出来的程序使用cgo的C包直接调用qt类和方法。
这中间完全没有动态处理过程,编译出来的最终程序效率还会比较好。
一个坏处生成的代码量还是比较大的,生成的代码也比较复杂,好在一个项目中可能用到的qt类和方法数量有限,应该可行。
另一个是由于注入了cgo,需要执行C++编译过程,速度比较慢,有点与go追求的极速编译冲突了。

###

第二种方式

使用JIT在类虚拟机ruby-jit-qt后端上即时执行方式。

基本原理,
使用一工具扫描使用了qt的go源代码,根据调用特征,生成调用JIT后端的cgo封装代码。
生成的代码放在项目的目录树中,编译整个项目即可。

Category:

Qt库的ruby语言绑定的探索与实现过程笔记

# Qt库的ruby语言绑定的探索与实现过程笔记

一直一来我经常使用Qt做一些简单的linux桌面工具软件,也算是对Qt库比较熟悉了。
而真正开始搞Qt库的ruby语言的绑定,出于当时觉得ruby是个比较有意思的编程语言,并开始接触学习ruby语言。
虽然在ruby最热门的时期作为web快速开发框架面世的,实现上我认为ruby也是一种非常不错的系统脚本语言。

在不断深入的学习ruby语言的过程中,越来越希望所有的开发工作都使用ruby语言实现,
并且这不只是希望,也尽可能的使用ruby完成一些开发工作。

不过,在这时,遇到一个需要更复杂的项目,希望能为这项目开发GUI界面功能。
经过一番网上搜索,也发现其实已经有qt的ruby语言绑定相关库了,
像kde项目中的rubyqt,还有qtbindings这个gem包,这两个包也比较成熟稳定了。
在试用的过程中了解到这两个包其实是同源的,并且都只支持Qt4版本。

Category:

Qt5的ruby语言绑定实现系列: Clang AST 树遍历优化

目前要实现查找AST树中匹配方法或者函数symbol符号名字的Decl,通过遍历AST树方式实现。
但是,现在这个方式耗时很多,占用整个过程的50%时间,希望能在这个点上优化掉接近一半的时间。

以下就这个功能特点,分析整理可能的优化机制。

虽然所有是在整个AST树中,但实际不需要在整个树的根开始查找,而是从树的一个节点开始。
遍历过程,可能要加入新的新的结点。

实现上,可以看作一个森林数据结构,初始状态时,森林只有一个根节点。
执行过程中,遍历遇到另个函数声明,如果在这次调用中需要,则需要把这个节点加入到森林中,作为森林的一个新的根节点。

根据以上分析,实现执行会有回溯过程,并且回溯时的节点也变化了。
可以暂时把这种方式叫做回溯遍历方法。

考虑到这个过程,只需要关注inline的方法或者函数,可以不断进行深度遍历,
在整个遍历路径上遇符合条件的节点,回调执行相应的处理函数。
如果遍历方式没有问题的话,应该能够一次遍历完成所有的处理工作。
暂时把这种方式叫做单次扩展遍历方法。

分析完功能需求和可能的方式,接下来分析clang提供的遍历相关功能。

cgo封装C库总结

简介

cgo是go语言提供的一种与C语言相互调用的方式。

cgo能够让开发者直接在.go源代码文件中嵌入C代码。

在嵌入的C代码比较长的时候,还允许在分离.c文件中编写C代码。

cgo的基本处理机制是,根据特定格式的cgo指令,解析出C源代码和编译参数,

调用gcc编译并把结构合并到最终二进制程序中。

带来的问题,编译速度慢了很多。 两种模型,

cgo用法:

声明使用cgo

在.go文件中,插入这么几行,表示开启cgo功能:

/*

*/

import "C"

其实这并不是一个简单的开关,而是特定的语法序列标识,当go解析器遇到该语法序列时,

自动进入cgo模式,处理与cgo有关的功能。

注意,这个注释确实是注释,并没有写错。在这个注释段能够添加C源代码。

一般把这个块叫做“C语言嵌入注释块”。

还有一个需要注意的是在注释结尾处,要紧跟着import "C"语句,否则这块注释会被当作注释忽略了。

配置服务设计

背景

现在,一个完整的系统一般从设计上都是松耦合的,可能包含不同的子系统,并且子系统都可能是定制化开发的。像定制化开发的redis、beanstalkd这类服务,用于实现更好高可用等目标。还有可能开发的各种独立的队列worker程序。

虽然这些程序上有调度维护和管理,但其相关配置一般如果没有统一的方式,容易造成配置数据的混乱,出现多份配置的问题,配置不一致的问题,配置更新的非原子化,维护成本高等问题。

目标

配置服务用途比较多,有php层次的,有定制服务层次的,或者有完全自主开发的服务层次的。有些是一次读取,有些则需要运行时多次读取。需要对这些不同需求综合考虑,实现以下目标:

1、服务化的

2、可靠的

3、高效的

4、可扩展的

5、可维护的

6、易用的

7、一致性的

基于以上场景,根据需求,引入一种配置服务etcd模块,并在此模块为基础上,构建统一的配置服务系统,将在根本上改善有关配置数据的诸多问题。

Category:

我的Arch Linux aur包仓库

由于一些aur包需要多台机器使用,每台机器都安装很不方便,
借助Git @ OSC建立了一个简单的aurcare仓库,方便一些aur包的使用。
感谢Git @ OSC 的开放免费存储服务。
当然这样也还有不方便的地方,就是这个仓库允许的单文件最大50M,有些大的包无法放在上面。

仓库使用,在/etc/pacman.conf中添加这么一行即可。

[aurcare]
Server = https://git.oschina.net/kitech/aurcare/raw/master/

Category:

另一种Qt的Ruby语言绑定方式

PHP中的函数式编程特性分析

一、引言
在写此文时,想起之前看过的一句话,如果要学习一门新的语言,那么就学习一门能够改变你的思维方式的语言。
本着这句对我触动比较大的一句话,一直在关注着LISP/Scheme这类直接产生函数式编程方式的语言。
在这中间看过一些相关的资料,试着编写过一些代码,却一直停留在学习试验阶段,很难写出像样的可用程序来。

在最近几年中,又是一个计算机界推出新语言高潮。比较新的有Closure,Go等。
并且一些比较老的语言像C++,Python,Perl,发展变化的步伐也变大了。
在C++11中,也添加了匿名函数的支持。nodejs的javascript语言,更是标榜着“披着C语言外衣的LISP”。
从这些变化除了让程序更高效,功能更丰富全面外,也提供了大量使用函数式思维解决程序复杂度不断上升的问题的特性。

如何在lxc容器中使用tun/tap设备

tun/tap需要用到/dev/net/tun设备文件,

默认情况下lxc不会创建/dev/net/tun设备文件。

Category:

函数式思维系列

页面

订阅 RSS - Document


Main menu 2

by Dr. Radut