作者s25g5d4 (function(){})()
看板C_and_CPP
标题Re: [问题] api是什麽?
时间Sat Jun 10 19:55:50 2017
在这个版谈 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/cn.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