开放原始码的回收与再利用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
许多开放原始码的项目是盘根错节 有时编译的错误是来自于缺少某个函式或类别,而 如果要加入这个函式,必须引入一大堆东西 必须考虑适度的斩断和该函式的关联性 Ex,GList.c/GList.h相依于GLib其他部份 寻找替代品的两个途径 自己撰写 再找现成的开放原始码 运用替代品的方式 修整界面,保持作用,符合目的
了解程序架构,拆解出自己所需的部份
由上而下了解程序架构 先找到一段应用libavformat的范例 av_register_all(); // Open video file if(av_open_input_file(&pFormatCtx, (char *) fileName, NULL, 0, NULL) !=0 ) return false; // Retrieve stream information if(av_find_stream_info(pFormatCtx)<0) return false; // Couldn't find stream information // Dump information about file onto standard error dump_format(pFormatCtx, 0, (char *) fileName, false);
前后Google时代的程序员的差异(2/3)
程序代码的来源不同 前Google时代的程序员:一手打造 后Google时代的程序员:除了自行撰写必要的程序 代码外,更善用网络上随手可得的程序代码,加以 裁切,添加,整合 重视的技能取向不同 前Google时代的程序员:撰写品质佳,易于重复运 用的程序代码
程序代码的重新打造vs.回收再生
对一名工匠而言,倘若要制作一张椅子,他可以 找到原始的木材,重头开始制作椅子 倘若有二手回收的家具,他也可以 找到一张适用的木头茶几 重新修整这张茶几 添加新的材料 成为一张具有新面貌的椅子 学问在那? 如何找到好的资源 施以最小幅度的心力,达成相同的目的
程序代码回收与再利用的方法
展开追踪原始码
善用grep工具(Win32上可用Windows Grep) 逐一检查dump_format()前的各个函式 void av_register_all(void) { static int inited = 0; if (inited != 0) return; inited = 1; avcodec_init(); avcodec_register_all(); mpegps_init(); mpegts_init(); ... /*一堆 xxxx_init() */
前后Google时代的程序员的差异(1/3)
学习的方式不同 前Google时代的程序员:透过书籍或文章 后Google时代的程序员:除了书籍或文章外,更从 开放原始码中学习 解决问题或麻烦的方式不同 前Google时代的程序员:尝试,摸索,询问前辈, 在在线社群或论坛BBS发问 后Google时代的程序员:除了前Google时代的方法 之外,更重视透过搜索引擎寻找问题的原因,解法, 甚至现成的程序代码
看看AVInputFormat定义于何处
利用grep找出在avformat.h typedef struct AVInputFormat {
const char *name; const char *long_name; int priv_data_size; int (*read_probe)(AVProbeData *); int (*read_header)(struct AVFormatContext *, AVFormatParameters *ap); int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); int (*read_close)(struct AVFormatContext *); int (*read_seek)(struct AVFormatContext *, int stream_index, int64_t timestamp, int flags); int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit); int flags; const char *extensions; int value; int (*read_play)(struct AVFormatContext *); int (*read_pause)(struct AVFormatContext *); struct AVInputFormat *next; } AVInputFormat;
续追av_register_input_format()
void av_register_input_format(AVInputFormat *format) { AVInputFormat **p; p = &first_iformat; while (*p != NULL) p = &(*p)->next; *p = format; format->next = NULL; }
暂时忽略非第一个里程碑的内容
蒙上眼睛假装看不见 有许多编译错误是第一个里程碑后才会需要的 适时的将它们批注掉,以求通过编译检查是一个很 好的手段 被批注掉的部份,在通过第一个里程碑后,解决其编 译错误的方案,也会在处理第一个里程碑的过程中产 生 此时再取消对它们的批注,就可以套用这些解决方 案
适度的斩断关联性,寻找适当的替代品
判断AVInputFormat各字段的作用
用非面向对象的方式来实作面向对象的多型 有很多一看就知道是探测格式时不会需要的 我们应该要特别注意read_probe及extension两字段
订定不同的阶段,从最小的里程碑开始
我们试着订出三个阶段 探测mpegps格式 探测mpegts格式 探测其他格式 试着编译,一定会发生很多问题 结构之间的环环相扣:为了AVInputFormat中的 read_header,我们得括入AVFormatContext和 AVFormatParameters 后来我们会因为更了解而发现这个函式指标根本不需 要 但此刻的我们只好先把它们先加入 在utils.c中的众多函式同样的也被清的只剩下: av_register_input_format(),match_ext(), av_probe_input_format()
采DFS展开-深度优先搜寻
接下来往mpegps_init()展开,利用grep找出它在mpeg.c中 int mpegps_init(void) { #ifdef CONFIG_MUXERS av_register_output_format(&mpeg1system_mux); av_register_output_format(&mpeg1vcd_mux); av_register_output_format(&mpeg2vob_mux); av_register_output_format(&mpeg2svcd_mux); av_register_output_format(&mpeg2dvd_mux); #endif //CONFIG_MUXERS av_register_input_format(&mpegps_demux); return 0; }
做细部拆解,先求能编译,再求正确执行
在开放原始码的回收与再利用活动中,最难的是就是让拆解下来 的原始码成功的编译 拆解出来的部份往往相依于未被拆解的原项目组成 headerfile中的定义或宏 原项目中的其他函式 为了成功的编译,你需要再回到基础项目中,把所需的部份拆解 出来 此即所谓细部拆解 细部拆解并不会直接把整个原始码档案移至回收项目中,仅移动 在基础项目中所需的部份 在这个阶段,会反复的看到许许多多的编译错误 逐一解决各个编译上的错误 需要的耐心耐心加耐心
在网络上搜寻可用的原始码,并选择最适合的 了解程序架构,拆解出自己所需的部份 订定不同的阶段,从最小的里程碑开始 做细部拆解,先求能编译,再求正确执行 暂时忽略非第一个里程碑的内容 适度的斩断关联性,寻找适当的替代品 整理接口,去除不必要的元素 做好心理建设,面对混乱 跨出成功的第一步
在网络上搜寻可用的原始码,并选择最适合的
选择执行平台相符或相似者 相似时仍需花费移植心力 选择程序语言相符者 Java和C#之间互换较为容易 选择版权宣告合适者 选择范围接近者 选择使用者众者 选择相依性低的 尽量不要选择依赖链接库多的专案
了解程序架构,拆解出自己所需的部份
即使已经尽量的选择范围接近自己所需的项目,但多 出的部份仍需适当的拆解 拆解前要先了解程序架构 阅读能取得的文件 程序代码的追踪 如果不了解程序架构 不知在此架构下的拆解的方式 不知那些可以拆那些不能拆 不知那些可以先不拆等日后再拆
整理接口,去除不必要的元素
被回收的程序代码本身的目标往往和你运用的目标不 尽相同 其函式或类别的接口长相就会和你所需的不同 接口中的元素会较我们所需的为多 因为拆解的关系,有许多编译错误会来自于未含入接 口中额外多出的元素 去除一些不必要的元素,并且重新整理这些界面的长 相 得到第一个可以编译的版本
Musica:一个大量运用回收开放原始码的项目
Musica:一个从公开音频(例如数字广播或网络广播) 做自动截断歌曲的软件 Winamp的iPodsync模块 ffmpeg MPlayer LAME
Reuse vs. Recycleቤተ መጻሕፍቲ ባይዱ
Code Reuse 不需要碰触到原始码就可以达到运用的目的 需要源代码设计完善够弹性够周延,或程序运气够 好,遇到刚好满足目的的程序代码 Code Recyce 程序代码来自世界各地,其目的或范围往往不尽人 意 需要施以回收再加工的作业 ,才能够进一步加以利 用
做好心理建设,面对混乱
就算张开眼睛也仍然看不见 别人的程序代码习惯风格和你必然不同 不要浪费时间在重新整理上 请先做好心理建设,让自己能够面对自己觉得混乱的 程序代码,视眼前之混乱如无物 有空闲时间,再套用refactoring的技巧,逐步的改善回 收程序的结构
跨出成功的第一步
成功的达成第一个里程碑后,便逐一的依照同样的方 式加入 后续的里程碑达成的速度会愈来愈快
订定不同的阶段,从最小的里程碑开始
在原始码层次的拆解告一个段落后,程序代码通常连 编译都无法编译 必须制定几个不同阶段的目标,并且从最小的里程碑 开始出发 达到第一个里程碑具有十分重要的象征性意义 代表着你能够正确的编译而且执行(即使功能不太 正确或功能尚不完备) 但只要能够达到第一个里程碑,之后的问题几乎都 能轻易迎刃而解
开放原始码的回收与再利用
Qing qing@cs.nthu.edu.tw (Email/MSN) 2008/10/13
Google时代的程序撰写 时代的程序撰写
Google时代的来临也加快了程序员的各种面向速度的 提升 学习速度 错误排除的速度 Google是找到问题答案的最佳途径,你会遇到的 问题,别人多半也会 IM软件的流行也使得同侪网络变成好的解题方 式 开发的速度 开放原始码质与量俱皆大增 透过搜索引擎极易取得所需的程序代码
后Google时代的程序员需要的新技能
建立好的整合架构 善于搜寻所面临问题的解决方案,并从中快速吸取新 知 善于搜寻既有的程序代码 善于追踪了解文件不足的程序代码 善于拆解,修缮既有的程序代码,以符合自己的目的
人们都拿开放原始码项目做什么?
使用开放原始码项目产出的软件 大多数人 从开放原始码项目中学习 reuse开放原始码项目中的程序代码 recycle开放原始码项目中的程序代码 recycle
Case Study:视讯档案的格式探测 视讯档案的格式探测
需求:检查给定的视讯档案是否属于特定的数种格式 限制:C/C++,在Win32上执行,编译后大小必须在 100KB以内
在网络上搜寻可用的原始码,并选择最适合的
ffmpeg有许多人使用,而且程序语言是C,在Win32平 台上编译不致于有太多问题 ffmpeg的libavformat有提供此类的功能
相关文档
最新文档