Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

Sunday, January 08, 2006

我的 Linux on Windows 體驗

Linux-like 環境下許多好用的工具被熱心的使用者移植到 Windows 上。剛開始人們先移植的是上面的程式開發環境,慢慢的其他實用的軟體也陸陸續續被移植過來。我在 Linux 下接觸了 GNU toolset 後,也在 DOS 下找來了 DJGPP ,企圖讓程式可達到 source code portable 的目的。然後又用了好一陣子的 Cygwin ,也都是用來開發 DOS-based 的程式。在試用了 MinGW with MSYS 後,覺得比 Cygwin 順手多了,就一直沿用至今。 去年才聽說的 coLinux ,更進一步讓我們可以直接在 Windows 上安裝的 Linux ,省掉了許多從前需要移植程式的場合。

十多年前剛接觸 C++ 時,是在 DOS 下開發程式的,當時費了一個暑假的時間完成的〈天線場型電腦繪圖〉程式,就是利用 Borland C++ v3.1 這套工具來開發的。所以接觸 DJGPP 後,我也找了一套叫 RHIDE 的, 除了跟 Borland C++ v3.1 的 IDE 簡直是同一個模子刻出來的外,還是 open source 的。在參考了其他 library 後,我發現可以很容易把〈天線場型電腦繪圖〉程式移植過來,移植後也可以在 re-compiling 後就讓它在 Linux 下跑。

隨著 Windows 及 GUI 的興起, DOS 及其下的 console-based 開發介面慢慢地不能滿足我的胃口,所以就改採 Dev-C++ ,用了一陣子後在 CSZone 聽到有人介紹 MinGW Developer Studio 把 Scintilla 的 code folding 功能整合進去後,也第一時間試用。後來在 Parinya Software 網站的 Resources 上發現它介紹的 Code::Blocks Studio ,一用之下,驚為天人,雖然還有很多改進的空間,但整個設計非常合我胃口。如果你有使用 make 這類 project manager 的習慣,你一定會欣賞 CodeBlocks ,不但支援 multi-project 還支援 multi-target ,且可以跟 makefile 及 shell script 整合得很好。更讓人高興的是它還是 cross platform 的。

如果你想開發或移植程式到 DOS 來,那可以試試 DJGPP 。如果你只是單純的想利用 GNU toolset 開發跨平台的程式,那 MinGW/MSYS 是不二的選擇,再搭配 Code::Blocks Studio 這套跨平台的 IDE 後,更是如虎添翼。如果你想玩玩 XWindow 或 Linux 下其他 open source 的東西,但又不想裝 Linux ,那需要的會是 Cygwin 。 coLinux 則更省事,直接把 Linux 裝在 Windows 上,省了移植的功夫,概念上類似在 Windows 裝上 VMWare ,然後再於上面灌 Linux 。很多 coLinux 的使用者也是 Cygwin 的重度使用者,兩者可以透過 XWindow System 通訊。 Cygwin 下的中文問題可以參考這篇。要在 coLinux 下跑 XWindow ,那一定要看看這篇。

在中文維基百科也有提到一段 Cygwin 的歷史:

Cygwin始於 1995 年,最初作為 Cygnus 工程師 Steve Chamberlain 的一個項目。當時 Windows NT 和 Windows 95 將 COFF 作為目標代碼,而 GNU 已經支持 x86 和 COFF ,以及 C 語言庫 newlib。這樣至少在理論上,可以將 GCC 重定向,作為 cross compiler,從而產生能在Windows上運行的可執行程序。在後來的實踐中,這很快實現了。

在這裡也有相關的討論:

Cygwin 的發展方向是盡最大可能在 Windows 上模擬 UNIX 的 POSIX ,因此採用這套系統編譯出的軟件基本上需要 cygwin 的 POSIX 模擬模塊。唯一的例外,給編譯器賦予-mno-cygwin指令同時安裝有 mingw 運行時庫則可以直接生成原生win32編譯結果直接使用。這麼做如同在 Mingw 下編譯同一個程序一樣,但是要注意如果 mingw 本身都無法編譯這個程序在cygwin 下加 -mno-cygwin 也是沒有意義。

Tags: [] [] [] [] [] []

Friday, January 07, 2005

久違了 XTinux

前陣子到 Study Area 閒逛時,發現了之前為公司弄的一些 PDA 軟體,同事把它 Screen Shot 起來,在那展示著:

第一幅圖是主畫面九宮格,為啥要設計成 3 by 3 的九宮格?只知道是客戶聯想集團的要求。

第二幅是 Email ;第三幅是 Browser 。

Tags: [] [] [] []

Tuesday, February 25, 2003

又遇 N Puzzle

針對 N Puzzle,之前以 CLIPS, C Language Integrated Production System 求解過,那是專家系統的課,所以我也很配合地,以 heuristic 的方式,寫起一條條的 production rules 。

這次研究所的 AI 課則要求分別利用 BFS (Breadth-First Search), DFS (Depth-First Search), Iterative Deepening DFS 及 A* Search 這四種方式來求解,並比較結果。

無論在 AI searh 理論方面,或是 OOA/OOD 上,這都是個有趣的練習,所以我自告奮勇要打頭陣,完成 framework, BFS, DFS, 和最後的整合及 CUI (Character-based User Interface) 等。

設計的目標有:

  1. Correctness
    最起碼要能通老師指定的兩個 case 的試驗。
  2. Clarity
    系統架構設計要清晰、簡單、易理解,以方便對軟體作追蹤、審閱、除錯、細部調整、功能刪減等。
  3. Performance
    在滿足了correctness 及clarity之後,還要考量程式的高階效率和低階效率。舉凡底層資料結構的選擇、和高層抽象表示法連結上的介面設計等,都是考量重點。
  4. Flexibility
    我們在設計時還希望對系統架構能保持一定的彈性。如,不要只針對 8-Puzzle 設計,而更進一步粹取出N-Puzzle的表達方式。

由於分析及設計階段就是採用 OOA/OOD 的方式,所以很自然地要採用支援 OO 的程式語言來實作。經討論,我們決定採用 ANSI C++ 來實作這份設計,並利用 GNU Compiler Collection 來製作可執行檔。

雖然我們只在 Windows 下的 DJGPP 搭配 rhide 的 IDE 及 Linux 下的 g++ 搭配 make 試著編譯過我們的源碼。但理論上應可以適用於任何支援「完整」ANSI C++ 語法的平台。除了 STL 外,還使用了namespace,所以古老的 C++ 編譯環境可能無法順利編出可執行檔。

※請參閱附件:

  1. The Report
  2. Its UML diagram
Tags: [] [] [] [] [] [] [] []

Tuesday, July 04, 2000

The Thread Class Library for Linux

在設計應用程式時,一些需要並行處理(concurrent processing)的功能,已經很少人使用中斷(interrupt)的方法解決,也不必再自行利用一個輪詢迴圈(Round-robin loop)來達到並行的效果──因為現在作業系統的設計,都已經支援執行緒(thread)了。一個程式可以透過許多執行緒達到並行處理的作用。

一個執行緒的產生,是在應用程式開始執行之後,而執行緒所能運用的系統資源是應用程式可用資源的子集;在應用程式結束前,執行緒就要被銷毀。因為執行緒是應用程式執行時的一個子功能,程式結束後,執行緒就沒有存在的必要。

Linux 作業系統核心提供了 clone() 這個 system call 來支援 thread 的功能。此外, Linux 的共用函式庫中,也利用了 clone() 來實作了 POSIX thread, PThread 標準的 C 語言 thread 應用程式介面。不過在現在到處充斥著物件的後 OO 時代裡,一個傳統 functional 的 C Language API 似乎顯得有些礙手。

這個類別庫(classes' library)主要目的是利用一個 C++ Thread Classes Library ,來提供一個容易使用的物件式介面(object interface),以方便日後在 Linux 系統下開發多執行緒的程式。

“一個具體的問題描述是與一千個尚未運用的抽象觀念等值的”,所以接下來,就先描述一下我們要的 Thread 是長成怎麼樣的:

一個多執行緒類別庫要考量的功能最基本的當然就是要能做好執行緒的內部管理,舉凡執行緒的識別、出生、狀態、行為和死亡等都要照料妥當。

如果執行緒之間要作通訊(communication),當然也要提供一個通訊的管道(channel);此外,還要考慮到執行緒共用資源時所可能引發的同步(synchronization)問題和避免因互相等待而產生的死鎖(dead-lock)問題。

為了方便多個執行緒的管理,還可以提供執行緒分組的功能,分成一個個的 Thread Group,以方便整組一起操作。

當然,在更完備的功能設計下,每個執行緒和執行緒群組還可以設定個別的執行優先權(priority)。並納入凍結(blocked)後的執行排班(scheduling)設計。

※完整的說明請參閱:

  1. 《Linux 系統 MultiThread 類別庫設計》
  2. 《Linux 系統 MultiThread MMS 類別庫設計》
Tags: [] [] [] [] [] []