C_and_CPP 板


LINE

在這個版談 Java 會不會被桶? 總之,在開始探討 API 前,我們先來閱讀這篇文章: API 是否應被視為「著作」? 對於 Java 的使用,Oracle 與 Google 打了好幾年的官司,兩者有 侵權法律糾紛,遲遲未解,其中,API 是否有版權成了關鍵 文 / 王建興 http://www.ithome.com.tw/voice/97361 -- 看完上文後,應該對 API 有一個模糊的概念了。 接下來我要開始談 Google vs Oracle (Sun) 的 Java API 之爭。 Google 早期在發展 Android 時,直接選用了 Java 做為開發語言, 這是眾所皆知的事情,但問題是 Java (或其他語言) 不可能脫離 Standard Library 開發。例如在 C 語言中,初學者想印出 "Hello, World" 字串,通常都是呼叫 printf() 或 puts() 函數,兩者皆 定義於 C Standard Library 中。這兩個函數於不同系統中由不同 runtime library 提供,在 Linux 中最常見的便是 glibc 了,但 其實還有 uClibc, musl 等選擇。BSD (Unix) 系統多使用 libc。 所以 printf, puts 這類函數在不同作業系統上可能根本是不同的 兩個函數。那麼如果不透過 C Standard Library 印出字元要怎麼 做呢?首先你要知道其實你寫的程式根本沒有對螢幕的存取權。唯 一印出字元的方法是告訴你的作業系統你要印出這個字元,在多數 系統中是透過 software interrupt 轉移給 kernel 去做事的。聽 不懂沒關係,反正這一段的重點是在「library 是可以被替換的」 這件事上。 C Standard Library 實際上是 C 語言的一部份,定義在 ISO 文 件裡,所以你可以說 API 是寫在語言定義裡的,但函式的實作卻 不是。而 Java 的情況是,Sun 開發的 Java Platform Standard Edition (J2SE) 提供了絕大多數 Java 開發者會用到的功能,例 如 System.out.printf()。實作 J2SE API 的函式庫稱為 Java Class Library。與 C 一樣的情況,你可以選擇 Oracle (Sun) 開 發的 JDK (包含了 JVM 與 JCL),或是改用其他函式庫,例如 GNU Classpath, Apache Harmony 與 OpenJDK。其中 Google 的 Android 使用了客製化的 Apache Harmony (後來改用 OpenJDK)。 那為什麼 Oracle 要控告 Google 侵犯它的 J2SE API 著作權呢? 因為 Google 只取了 J2SE API 的一部份,不是全部,導致 J2SE 程式實際上不相容 Android。所以 Google 實際上是將 J2SE 的 API 再製並修改,扼殺了 J2SE 在 Android 平台上使用的可能性。 其實 Sun 有一個專門為行動裝置設計的 Java 版本,叫做 J2ME, 例如早期 Nokia 與 SonyErisson 的手機遊戲及應用皆是 J2ME, 但不管 J2SE 還是 J2ME 都不能跑在 Android上。要正確地形容 Android 與 Java 的關係,應該是「Android SDK 採用 Java 做為 其開發語言」。所以 Android SDK 中包含了一套從 J2SE 抄來的 API 供 Android 開發者參考,也因此雖然 Android 程式開發時使 用 JDK (Java SE Development Kit),但真正在 Android 裝置上 跑的是 Dalvik 虛擬機與一個客製化的 Apache Harmony 函式庫( 後來被 Android Runtime 與 OpenJDK 取代)。 所以 API 是由函式庫作者提供給你「如何使用我的函式庫」的參 考,或是像程式語言的 standard library 一樣,由一個組織統一 定義 API,提供函式庫作者參考開發,也給程式開發者參考。所以 如果你寫了一個函式庫,並把 API 公開,即使你享有該函式庫著 作權,你卻不能阻止 Google 把你的 API 抄去作成另一個東西。(笑) 最後,API 已經不僅僅是指函式庫定義了,只要是系統中兩個不同 部分(可以是同一個或不同軟體)溝通的參考通通都叫 API。例如 一個 client-server 架構的系統,client 去呼叫 server 上預存 的程式,這個過程我們稱為 remote procedure call,而如何建立 RPC (例如執行哪個程式,給予甚麼參數) 也是一種 API。現在最流 型的 client-server 架構當屬 HTTP,也就是 web,例如 RESTful API, JSON API 等等名詞一大堆,或是甚麼 Common Object Request Broker Architecture,Java Remote Method Invocation,通通都 定義了一套 API 讓不同語言寫成的各種應用程式透過相容的 API 交換資料。上面提到的 C Standard Library、J2SE 甚至也可以用 不是 C 或 Java 的語言開發(不過這牽扯到 ABI 就是了)。本質 上 library 與你的程式也是不同的軟體,就算你今天寫一個軟體是 自己寫爽的,沒打算給別人用,你在開發過程中也可以自己定義一 套 API,讓你在各個不同部分呼叫對方時有一個參考可以看。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.198.141
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1497095755.A.CBF.html
1F:推 Qbsuran: write(1, "明明就可以", 5*2); 06/10 20:24
2F:推 wtchen: 光講Java會被捅, 不過本文跟C有關就沒關係 06/10 20:50
3F:推 james732: 我個人覺得google是有點吃Java的豆腐XD 06/11 00:30
4F:推 sunev: 這官司後來怎麼了? 06/11 02:04
5F:→ Chikei: 法官_1:J2SE API太基本,不應受保護->上訴->法官_2:J2SE 06/11 02:51
6F:→ Chikei: API應受保護 (J2SE API是否受保護在此結案)-> Google改用 06/11 02:52
7F:→ Chikei: fair use作為論述來防禦案件本身,目前勝訴,但oracle可以 06/11 02:54
8F:→ Chikei: 上訴 06/11 02:54
9F:→ s25g5d4: 一樓那是 POSIX API, 也是另一個通用 API, 提供 Unix 及 06/11 06:44
10F:→ s25g5d4: Unix-like 系統一個統一的系統調用 API 06/11 06:44
11F:→ s25g5d4: 一樣也是不同作業系統可能有不同實作,如正統 Unix BSD 06/11 06:46
12F:→ s25g5d4: 及 常見的 Linux 06/11 06:46
13F:→ s25g5d4: 最後也是要透過 software interrupt 轉給 kernel 處理 06/11 06:47
14F:推 woo0422: 感謝你的解釋,有好多關鍵字沒看過。理解起來感覺像是.h 06/12 02:50
15F:→ woo0422: 是api, source code是library 06/12 02:50
16F:→ woo0422: 另外寫這麼久程式 現在才知道原來c語言也是api. 我一直 06/12 02:52
17F:→ woo0422: 以為他是組語定義出來的……… 06/12 02:52
18F:→ s25g5d4: 嚴格說起來, .h 是給 compiler 看的,我自己比較傾向 06/12 03:59
19F:→ s25g5d4: 把整份 reference 稱為 API 啦... 06/12 03:59
20F:→ s25g5d4: 當然如果 .h 檔寫的跟 reference 一樣完整的話也是可以 06/12 03:59
21F:→ s25g5d4: 例如說這個函數在幹嘛、要放甚麼參數、參數有甚麼限制、 06/12 04:00
22F:→ s25g5d4: return value 有甚麼意義、會丟出甚麼 exception、有 06/12 04:00
23F:→ s25g5d4: 沒有 thread-safe 等等,這些都屬於 API 的一部份 06/12 04:00
24F:→ MOONRAKER: C語言怎麼會是API 又怎麼是組語定義出來的 06/12 14:10
25F:→ MOONRAKER: 天阿怎麼看這麼多篇還會得到這種結論 obfuscation大師 06/12 14:10
26F:→ MOONRAKER: 這麼多嗎 真是太厲害啦 06/12 14:11
27F:推 CoNsTaR: 其實如果用 metalanguage 的角度來看,object language 06/12 19:45
28F:→ CoNsTaR: 的確是 API 啊 06/12 19:45
29F:→ CoNsTaR: 不過 C/C++ 沒有真正的 metalanguage 就是了 06/12 19:45
30F:推 woo0422: sorry. 我在了解一下 謝謝你們 06/13 00:39
31F:推 Lordaeron: 好文! 06/13 17:22







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP