[爆卦]api文件是什麼是什麼?優點缺點精華區懶人包

為什麼這篇api文件是什麼鄉民發文收入到精華區:因為在api文件是什麼這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者s25g5d4 (function(){})()看板C_and_CPP標題Re: [問題] ap...


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

你可能也想看看

搜尋相關網站