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

上传人:豆**** 文档编号:77620309 上传时间:2023-03-15 格式:PPT 页数:33 大小:98.50KB
返回 下载 相关 举报
开放原始码的回收与再利用.ppt_第1页
第1页 / 共33页
开放原始码的回收与再利用.ppt_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《开放原始码的回收与再利用.ppt》由会员分享,可在线阅读,更多相关《开放原始码的回收与再利用.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、开放原始码的回收与再利用 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望GoogleGoogle時代的程式撰寫時代的程式撰寫時代的程式撰寫時代的程式撰寫 qGoogle時代的來臨也加快了程式員的各種面向速度的提昇學習速度錯誤排除的速度lGoogle是找到問題答案的最佳途徑,你會遇到的問題,別人多半也會lIM軟體的流行也使得同儕網絡變成好的解題方式開發的速度l開放原始碼質與量俱皆大增l透過搜尋引擎極易取得所需的程式碼前後前後GoogleGoogle時代的程式員的差異

2、時代的程式員的差異(1/3)(1/3)q學習的方式不同前Google時代的程式員:透過書籍或文章後Google時代的程式員:除了書籍或文章外,更從開放原始碼中學習q解決問題或麻煩的方式不同前Google時代的程式員:嘗試、摸索,詢問前輩,在線上社群或論壇BBS發問後Google時代的程式員:除了前Google時代的方法之外,更重視透過搜尋引擎尋找問題的原因、解法,甚至現成的程式碼前後前後GoogleGoogle時代的程式員的差異時代的程式員的差異(2/3)(2/3)q程式碼的來源不同前Google時代的程式員:一手打造後Google時代的程式員:除了自行撰寫必要的程式碼外,更善用網路上隨手可得

3、的程式碼,加以裁切、添加、整合q重視的技能取向不同前Google時代的程式員:撰寫品質佳、易於重覆運用的程式碼後後GoogleGoogle時代的程式員需要的新技能時代的程式員需要的新技能q建立好的整合架構q善於搜尋所面臨問題的解決方案,並從中快速吸取新知q善於搜尋既有的程式碼q善於追蹤了解文件不足的程式碼q善於拆解、修繕既有的程式碼,以符合自己的目的人們都拿開放原始碼專案做什麼?人們都拿開放原始碼專案做什麼?q使用開放原始碼專案產出的軟體大多數人q從開放原始碼專案中學習qreuse開放原始碼專案中的程式碼qrecycle開放原始碼專案中的程式碼MusicaMusica:一個大量運用回收開放原始

4、碼的專案:一個大量運用回收開放原始碼的專案qMusica:一個從公開音訊(例如數位廣播或網路廣播)做自動截斷歌曲的軟體Winamp的iPodsync模組ffmpegMPlayerLAMEReuse vs.RecycleReuse vs.RecycleqCodeReuse不需要碰觸到原始碼就可以達到運用的目的需要原始程式碼設計完善夠彈性夠周延,或程式運氣夠好,遇到剛好滿足目的的程式碼qCodeRecyce程式碼來自世界各地,其目的或範圍往往不盡人意需要施以回收再加工的作業,才能夠進一步加以利用程式碼的重新打造程式碼的重新打造 vs.vs.回收再生回收再生q對一名工匠而言,倘若要製作一張椅子,他可

5、以找到原始的木材,重頭開始製作椅子q倘若有二手回收的家具,他也可以找到一張適用的木頭茶几重新修整這張茶几添加新的材料成為一張具有新面貌的椅子q學問在那?如何找到好的資源施以最小幅度的心力,達成相同的目的程式碼回收與再利用的方法程式碼回收與再利用的方法q在網路上搜尋可用的原始碼,並選擇最適合的q了解程式架構,拆解出自己所需的部份q訂定不同的階段,從最小的里程碑開始q做細部拆解,先求能編譯,再求正確執行q暫時忽略非第一個里程碑的內容q適度的斬斷關聯性,尋找適當的替代品q整理介面,去除不必要的元素q做好心理建設,面對混亂q跨出成功的第一步在網路上搜尋可用的原始碼,並選擇最適合的在網路上搜尋可用的原始

6、碼,並選擇最適合的q選擇執行平台相符或相似者相似時仍需花費移植心力q選擇程式語言相符者Java和C#之間互換較為容易q選擇版權宣告合適者q選擇範圍接近者q選擇使用者眾者q選擇相依性低的盡量不要選擇依賴程式庫多的專案了解程式架構,拆解出自己所需的部份了解程式架構,拆解出自己所需的部份 q即使已經盡量的選擇範圍接近自己所需的專案,但多出的部份仍需適當的拆解q拆解前要先了解程式架構閱讀能取得的文件程式碼的追蹤q如果不了解程式架構不知在此架構下的拆解的方式不知那些可以拆那些不能拆不知那些可以先不拆等日後再拆訂定不同的階段,從最小的里程碑開始訂定不同的階段,從最小的里程碑開始 q在原始碼層次的拆解告一個

7、段落後,程式碼通常連編譯都無法編譯q必須制定幾個不同階段的目標,並且從最小的里程碑開始出發q達到第一個里程碑具有十分重要的象徵性意義代表著你能夠正確的編譯而且執行(即使功能不太正確或功能尚不完備)但只要能夠達到第一個里程碑,之後的問題幾乎都能輕易迎刃而解做細部拆解,先求能編譯,再求正確執行做細部拆解,先求能編譯,再求正確執行 q在開放原始碼的回收與再利用活動中,最難的是就是讓拆解下來的原始碼成功的編譯q拆解出來的部份往往相依於未被拆解的原專案組成headerfile中的定義或巨集原專案中的其他函式q為了成功的編譯,你需要再回到基礎專案中,把所需的部份拆解出來此即所謂細部拆解q細部拆解並不會直接

8、把整個原始碼檔案移至回收專案中,僅移動在基礎專案中所需的部份q在這個階段,會反覆的看到許許多多的編譯錯誤逐一解決各個編譯上的錯誤需要的耐心耐心加耐心暫時忽略非第一個里程碑的內容暫時忽略非第一個里程碑的內容 q矇上眼睛假裝看不見有許多編譯錯誤是第一個里程碑後才會需要的適時的將它們註解掉,以求通過編譯檢查是一個很好的手段q被註解掉的部份,在通過第一個里程碑後,解決其編譯錯誤的方案,也會在處理第一個里程碑的過程中產生此時再取消對它們的註解,就可以套用這些解決方案適度的斬斷關聯性,尋找適當的替代品適度的斬斷關聯性,尋找適當的替代品 q許多開放原始碼的專案是盤根錯節有時編譯的錯誤是來自於缺少某個函式或類

9、別,而如果要加入這個函式,必須引入一大堆東西必須考慮適度的斬斷和該函式的關聯性Ex,GList.c/GList.h相依於GLib其他部份q尋找替代品的兩個途徑自己撰寫再找現成的開放原始碼q運用替代品的方式修整介面,保持作用,符合目的整理介面,去除不必要的元素整理介面,去除不必要的元素 q被回收的程式碼本身的目標往往和你運用的目標不盡相同其函式或類別的介面長相就會和你所需的不同介面中的元素會較我們所需的為多q因為拆解的關係,有許多編譯錯誤會來自於未含入介面中額外多出的元素q去除一些不必要的元素,並且重新整理這些介面的長相q得到第一個可以編譯的版本做好心理建設,面對混亂做好心理建設,面對混亂 q就

10、算張開眼睛也仍然看不見q別人的程式碼習慣風格和你必然不同q不要浪費時間在重新整理上q請先做好心理建設,讓自己能夠面對自己覺得混亂的程式碼,視眼前之混亂如無物q有空閒時間,再套用refactoring的技巧,逐步的改善回收程式的結構跨出成功的第一步跨出成功的第一步 q成功的達成第一個里程碑後,便逐一的依照同樣的方式加入q後續的里程碑達成的速度會愈來愈快Case StudyCase Study:視訊檔案的格式探測視訊檔案的格式探測視訊檔案的格式探測視訊檔案的格式探測 q需求:檢查給定的視訊檔案是否屬於特定的數種格式q限制:C/C+,在Win32上執行,編譯後大小必須在100KB以內在網路上搜尋可用

11、的原始碼,並選擇最適合的在網路上搜尋可用的原始碼,並選擇最適合的 qffmpeg有許多人使用,而且程式語言是C,在Win32平台上編譯不致於有太多問題qffmpeg的libavformat有提供此類的功能了解程式架構,拆解出自己所需的部份了解程式架構,拆解出自己所需的部份 q由上而下了解程式架構q先找到一段應用libavformat的範例av_register_all();/Openvideofileif(av_open_input_file(&pFormatCtx,(char*)fileName,NULL,0,NULL)!=0)returnfalse;/Retrievestreaminfor

12、mationif(av_find_stream_info(pFormatCtx)next;*p=format;format-next=NULL;看看看看AVInputFormatAVInputFormat定義於何處定義於何處q利用grep找出在avformat.hqtypedefstructAVInputFormatqconstchar*name;qconstchar*long_name;qintpriv_data_size;qint(*read_probe)(AVProbeData*);qint(*read_header)(structAVFormatContext*,qAVFormatPa

13、rameters*ap);qint(*read_packet)(structAVFormatContext*,AVPacket*pkt);qint(*read_close)(structAVFormatContext*);qint(*read_seek)(structAVFormatContext*,qintstream_index,int64_ttimestamp,intflags);qint64_t(*read_timestamp)(structAVFormatContext*s,intstream_index,qint64_t*pos,int64_tpos_limit);qintflag

14、s;qconstchar*extensions;qintvalue;qqint(*read_play)(structAVFormatContext*);qint(*read_pause)(structAVFormatContext*);qstructAVInputFormat*next;qAVInputFormat;判斷判斷AVInputFormatAVInputFormat各欄位的作用各欄位的作用q用非物件導向的方式來實作物件導向的多型q有很多一看就知道是探測格式時不會需要的q我們應該要特別注意read_probe及extension兩欄位訂定不同的階段,從最小的里程碑開始訂定不同的階段,從

15、最小的里程碑開始q我們試著訂出三個階段探測mpegps格式探測mpegts格式探測其他格式q試著編譯,一定會發生很多問題結構之間的環環相扣:為了AVInputFormat中的read_header,我們得括入AVFormatContext和AVFormatParametersq後來我們會因為更了解而發現這個函式指標根本不需要但此刻的我們只好先把它們先加入q在utils.c中的眾多函式同樣的也被清的只剩下:av_register_input_format()、match_ext()、av_probe_input_format()適度的斬斷關聯性,尋找適當的替代品適度的斬斷關聯性,尋找適當的替代品

16、 qav_probe_input_format()會用到許多utility函式av_realloc()、get_buffer()、url_open()、url_fseek()、url_fclose()q這些函式看起來就是標準C函式庫中的函式差不多。所以決定退化回標準C函式庫中函式改用malloc()來代替av_realloc()及get_buffer()的作用;改用fopen()來代替url_open();改用fseek()來代替url_fseek();改用fclose()來代指url_fclose()q要建立防火牆,不能讓相依性的火一直蔓延的燒整理介面,去除不必要的元素整理介面,去除不必要的

17、元素 q在這過程中,我們愈來愈了解整體的運作方式q所以我們發現AVInputFormat裡的結構有很多欄位是不必要的只需要保用read_probe這個函式指標即可其他的部份我們都可以拿掉更可以順手拿到一些不必要的資料結構定義l例如拿掉了read_header可以一舉拿掉AVFormatContext及AVFormatParameters的定義做好心理建設,面對混亂做好心理建設,面對混亂 q在這個過程中,我既不去修改它的命名慣例,更不會去重新排版q我把所有取出來的程式碼包在一塊,把它當做一個黑箱子來使用q有些取自標頭檔的定義也許還有精簡的可能性,但是先將它擱在一塊q此刻我們需要的只是生產力短期間內透過回收和整理取得我們想要的產物結論結論q最後支援十種格式以上的這個格式探測程式庫,大小不到40KBq幾乎沒有寫下半行程式碼,但憑藉著回收和整理的技巧,只需一晚,我們得到了一個相當實用的程式庫q原先對各視訊檔案格式完全不通的我,也能達成這個目標,而且在這個過程中對視訊檔案格式也有一定的認識q開放原始碼的各種程式片段俯拾可得q需要的是化桌子為椅子的功夫Q&AQ&AThanks

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁