Re: [問題] api是什麼?

看板C_and_CPP作者 (function(){})()時間8年前 (2017/06/10 11:55), 編輯推噓8(8023)
留言31則, 10人參與, 最新討論串4/6 (看更多)
在這個版談 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

06/10 20:24, , 1F
write(1, "明明就可以", 5*2);
06/10 20:24, 1F

06/10 20:50, , 2F
光講Java會被捅, 不過本文跟C有關就沒關係
06/10 20:50, 2F

06/11 00:30, , 3F
我個人覺得google是有點吃Java的豆腐XD
06/11 00:30, 3F

06/11 02:04, , 4F
這官司後來怎麼了?
06/11 02:04, 4F

06/11 02:51, , 5F
法官_1:J2SE API太基本,不應受保護->上訴->法官_2:J2SE
06/11 02:51, 5F

06/11 02:52, , 6F
API應受保護 (J2SE API是否受保護在此結案)-> Google改用
06/11 02:52, 6F

06/11 02:54, , 7F
fair use作為論述來防禦案件本身,目前勝訴,但oracle可以
06/11 02:54, 7F

06/11 02:54, , 8F
上訴
06/11 02:54, 8F

06/11 06:44, , 9F
一樓那是 POSIX API, 也是另一個通用 API, 提供 Unix 及
06/11 06:44, 9F

06/11 06:44, , 10F
Unix-like 系統一個統一的系統調用 API
06/11 06:44, 10F

06/11 06:46, , 11F
一樣也是不同作業系統可能有不同實作,如正統 Unix BSD
06/11 06:46, 11F

06/11 06:46, , 12F
及 常見的 Linux
06/11 06:46, 12F

06/11 06:47, , 13F
最後也是要透過 software interrupt 轉給 kernel 處理
06/11 06:47, 13F

06/12 02:50, , 14F
感謝你的解釋,有好多關鍵字沒看過。理解起來感覺像是.h
06/12 02:50, 14F

06/12 02:50, , 15F
是api, source code是library
06/12 02:50, 15F

06/12 02:52, , 16F
另外寫這麼久程式 現在才知道原來c語言也是api. 我一直
06/12 02:52, 16F

06/12 02:52, , 17F
以為他是組語定義出來的………
06/12 02:52, 17F

06/12 03:59, , 18F
嚴格說起來, .h 是給 compiler 看的,我自己比較傾向
06/12 03:59, 18F

06/12 03:59, , 19F
把整份 reference 稱為 API 啦...
06/12 03:59, 19F

06/12 03:59, , 20F
當然如果 .h 檔寫的跟 reference 一樣完整的話也是可以
06/12 03:59, 20F

06/12 04:00, , 21F
例如說這個函數在幹嘛、要放甚麼參數、參數有甚麼限制、
06/12 04:00, 21F

06/12 04:00, , 22F
return value 有甚麼意義、會丟出甚麼 exception、有
06/12 04:00, 22F

06/12 04:00, , 23F
沒有 thread-safe 等等,這些都屬於 API 的一部份
06/12 04:00, 23F

06/12 14:10, , 24F
C語言怎麼會是API 又怎麼是組語定義出來的
06/12 14:10, 24F

06/12 14:10, , 25F
天阿怎麼看這麼多篇還會得到這種結論 obfuscation大師
06/12 14:10, 25F

06/12 14:11, , 26F
這麼多嗎 真是太厲害啦
06/12 14:11, 26F

06/12 19:45, , 27F
其實如果用 metalanguage 的角度來看,object language
06/12 19:45, 27F

06/12 19:45, , 28F
的確是 API 啊
06/12 19:45, 28F

06/12 19:45, , 29F
不過 C/C++ 沒有真正的 metalanguage 就是了
06/12 19:45, 29F

06/13 00:39, , 30F
sorry. 我在了解一下 謝謝你們
06/13 00:39, 30F

06/13 17:22, , 31F
好文!
06/13 17:22, 31F
文章代碼(AID): #1PEzvBo_ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1PEzvBo_ (C_and_CPP)