為什麼提到OS X優勢和Windows劣勢的時候都要大說特說Unix血統?

NT內核就不如unix么!!

兄弟問題 為什麼提到OS X優勢和Windows劣勢的時候都要大說特說Terminal? - 編程


講血統不血統的倒是很沒意思。

要說血統的話,Linux 的「Unix 血統」其實並不純正,OS X 雖然有所謂「純正 Unix 血統」,但我還是覺得 Linux 用起來比 OS X 爽。

主要是有對 POSIX 的支持,方便很多開源軟體移植過來。

其實以前 Windows 也是支持 POSIX 的,那套東西叫 Interix,或者 Windows Services for UNIX (SFU),但後來被 M$ 給拋棄了。但光從 NT Kernel 可以跑 Win32、POSIX、OS/2 三套子系統這一點來看,就可以看出 NT 內核是非常牛逼的。

至於那些開源工具為什麼不支持 Windows 或者不把 Windows 支持放在重要位置考慮,只是因為開源界向來不鳥 M$ 而已。已有的開源生態圈已經形成,他們不願意改代碼來支持 Win32 API,而不是 Win32 API 實現不了那些功能。

至於 GUI 和命令行,只能說各有各的長處。

如果 M$ 能一直發展並不放棄 SFU,或者開放 NT native API 讓人可以開發出一個 POSIX 子系統,那估計我也不會有太多興趣去折騰 Linux 和 OS X。


一般小白之間互相爭辯非常好玩

但是我覺得一般這麼爭辯的人,估計是寫不好一個正經的 Windows 批處理的,Bash 什麼的就更不用說了。

Terminal 是個優勢,因為它可以使用幾乎所有 Unix, 類 Unix 下的終端命令工具,這一點是毋庸置疑的。當你再裝上 Brew MacPorts Fink 等包管理工具後會更強大。但是大部分時候,大多數用戶還是用 GUI 的不是么?

另外,OS X 的 Terminal 有一點很多人都沒有注意,那就是裡面的太多命令都是遠古時期的版本,比如 10.10 時代的 nasm 還是 0.94 版本的,這足以讓 Linux 用戶笑掉大牙。

所以脫離需求說 Terminal 沒有意義,反駁他們也異常簡單。既然他們說 Terminal 比 Windows 強大,你就跟他比比搭建個 64bit UEFI 工具鏈環境唄?Windows 和 Linux 下簡單的要死,OS X 就呵呵好了,以至於我都深刻懷疑 Mac 的 boot.efi 根本都不是 OS X 下編譯的。對付這種小白我有上千種方法花樣虐他們。

至於內核?為啥從終端又討論到內核呢?NT 內核也特么有 Unix 血統好嘛?一句話不就秒殺了么?


這確實不是一個很好的習慣,我來補充一下,即使對待系統底層的一些工具的時候,Apple 的態度和 Unix 也有些巨大的區別。僅舉兩例。

一,配置文件。Unix/Linux 下的配置文件都是比較普通的純文本文件,優點就是人類編輯起來還不錯:

[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target

[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

但是缺點也很明顯,工具這麼多,不同軟體往往會使用不同的格式,不說別的,寫這麼多個 parser 和 pretty printer 多累啊。

(注,parser 在此是指將文本轉換為程序內部的數據格式的程序,而 pretty printer 則是 parser 的逆操作。對於同一份數據,可能有無數種文本表示,因為像空格這些元素是可變的,但 pretty printer 一般只給出一種或者少數幾種預定義好的格式,這也是名稱中的「pretty」的意義)

但 Apple 就不一樣了。Apple 寫的配置文件,基本上都是 Property List 格式,也就是 .plist。目前它有兩種表示,一種是 XML 表示,一種是二進位表示(為了節約空間),有一個轉換工具可以互相轉換。

&
&
&


&
&Label&
&com.cisco.anyconnect.vpnagentd&
&ProgramArguments&
&
&/opt/cisco/anyconnect/bin/vpnagentd&
&-execv_instance&
&
&KeepAlive&
& &RunAtLoad&
& &AbandonProcessGroup&
& &EnableTransactions&
&
&

&

可以看到,這寫起來很冗餘,我感覺用 JSON 寫起來都好很多:

{
"Label": "com.cisco.anyconnect.vpnagentd",
"ProgramArguments": [
"/opt/cisco/anyconnect/bin/vpnagentd",
"-execv_instance"
],
"KeepAlive": true,
"RunAtLoad": true,
"AbandonProcessGroup": true,
"EnableTranscations": false
}

這個時候就體現出了一個統一的配置文件格式的好處了,.plist 文件也是可以用 JSON 來表示的:

plutil: [command_option] [other_options] file...
The file "-" means stdin
Command options are (-lint is the default):
-help show this message and exit
-lint check the property list files for syntax errors
-convert fmt rewrite property list files in format
fmt is one of: xml1 binary1 json

Apple 還給 .plist 開發了圖形化編輯器:

(嗯,這是 Xcode)

哪種方式好呢,這就見仁見智了。但這種統一管理的風格,絕對算不上 Unix-like。

二,命令行工具的命名。可能是因為 Apple 賣出了好幾億部 iPhone 有錢吧,Apple 在命名上決不節約空間,從來不省略母音(大霧,時間順序被我加了很多特技):

對比 Unix 下很多著名的工具:

多麼言sang簡xin意bing駭kuang啊……

我個人是極度討厭 Unix 這一套的,什麼都是文本傳來傳去的,就好像 C 語言下 void* 亂飛,不愧是一家生的,連個能用的類型系統都沒有。


我覺得根本沒啥區別的幾個系統(Windows、OS X、Linux、*BSD)居然有人還能扯出「血統上的不同」,我也是無語了。它們就算是代碼血統上不同,思想血統上是一樣的


我想知道如何定義「血統」。根據OSX內核的歷史來看,它是混合多個來源的內核。「它以Mach內核為基礎,加入UNIX的BSD實作,再整合到NeXTSTEP當中。」來自wikipedia。

Mach是個獨立發展的內核,目的是取代BSD/Unix內核。得算Unix內核的競爭者而非Unix內核。而BSD的部分是加進去的。最終得到的OSX是一個在介面上(盡量)兼容POSIX/Unix,但不能互換的東西。至於Windows內核嘛,Mach的主導者Rick後來加入微軟研究院OS組,極大影響了Windows內核的發展方向。


想了解什麼是 Unix「血統」,就應該好好看看《 The Art of Unix Programming 》這本書。Unix 血統和內核沒有直接的對應關係,而是一種解決問題的方式。

Apple 這個公司還有個優點,就是絕不討好 developer。這恰恰讓 OS X 成為最秉承 Unix 精神的系統。因為你一旦討好什麼,你就著了相了。就不淡定了。就不能 do the right thing 了。(不得不承認,這兩年 Apple 在某些產品上有這種不淡定的趨勢。沒辦法,因為總要討好用戶嘛。不過僅限於此,對 developer 沒有這個趨勢。)

Sun, Microsoft 等等,都是借著吸引 developer 的思路,搞出一大堆垃圾。Apple 的思路很簡單,就是要解決問題。Eat your dog food 這句話說爛了,可是為什麼先把 food 做出來這個問題不是每家公司都能想清楚的。好多公司搞出一個狗屁 API 然後逼著自己公司的 developer 用,叫 eat your dog food。Apple 這麼些年來搞出來的技術都是自家 developer 急需的。


我更不了解他們在跟windows用戶爭的時候說自己的terminal好用, 然後跟linux爭的時候嘲笑linux用戶竟然還在用terminal...


我一直覺得人們把Unix和開源弄在一起特別可笑。當時Unix的代碼就是泄露出來的,搞到手的都是盜版,你們竟然把它稱之為開源?


天哪,技術界竟然也搞血統論了


早些時候的確是超級大的優勢。

在那個GUI並不是什麼都能做的時代,類Unix意味著更接近「真正的」(商業)計算機。這樣一來power user們在PC上也可以使用那些他們很熟悉的工具、工作流。文件系統結構、用戶模型等也是無縫銜接。

另外,在Windows 2000以前,Windows是沒有真正的多用戶許可權管理的。98下文件根本沒有真正的屬主概念。更不用說屬組了。只能用在真正的「個人」電腦。

至於現在?蘋果好像很久沒用拿這個當賣點了吧?(程序員說說反正就是自己high一下不要那麼在意嘛。而且對需要做Linux開發的程序員的確也是有好處的。)


mac os x過了unix認證,那它就是unix了,這個不用爭。當然要論血統輪不到它,solaris在旁邊呵呵呵。

強調是unix的好處不是unix本身,unix-like系統有些地方特別噁心,和windows一樣噁心。而是因為在這個世界的很多開發語言和工具眼裡,unix-like系統是一等公民,windows是二等……當然,unix-like內部,linux比其他系統更平等,debian系比其他linux更平等……

縱然如微軟這樣的企業,一己之力能搞定cpp,但也搞不定全部語言啊……


血統論在各個領域都是拿來噴人的利器


從碼農的用戶角度來說:

unix-like系統的軟體環境、配置、使用體驗和經驗都比較通用,提供的工具也非常多,有包管理軟體使用起來也很便利。

往往搜索一些工具怎麼使用,你找到的都是基於unix-like系統的使用方法。

而且現在使用Mac的程序員非常多,找osx上怎麼用的方法也很方便。

不少工具在windows上的版本都要套用cygwin、mingw這樣的unix外殼,用起來不好受。比如目錄結構在win和unix下的轉換會有問題,編碼會有問題。

舉例說idea的terminal裡面用的是windows的目錄結構,在那裡使用git命令沒法讀取到對host的設置,你必須用git-bash才可以。

osx其實在一些細節還是和linux有區別的,經驗也不是完全通用,只是linux的gui更差一些,對hidpi的支持目前還不夠好。windows的hidpi支持也不夠好。

因為90%的時間是用gui工具,所以osx對linux還是有優勢的。

不過一般用linux也沒什麼問題,如果你對apple的開發沒興趣的話。

也就是說偏向unix-like和apple的開發時,osx有環境和經驗優勢,僅限於此。

實際上windows也不是沒有優勢,windows有不少很好用的平台獨佔軟體,一些開發也必須在windows下進行。

通過虛擬機+samba+putty也可以得到一個unix環境。

選擇哪個系統看自己的需求,討論系統的優劣只是浪費時間。


用過Unix的應該都知道,這種系統天生是用來當工作站,小型機甚至大型機當操作系統的。優點很明顯,如更加嚴格的多用戶管理,許可權管理,安全性管理等。

個人電腦操作系統其實用不著這些功能,在個人電腦或者PC伺服器上強調這些並沒有什麼用處。

但是在小型機甚至中型機上,這個特性是非常有用的,它可以讓很多用戶同時使用一台伺服器而不會互相干擾。


大部分人只是想裝逼讓別人覺得自己知道的多而已


這麼說吧,對開發者來說,如果你的開發環境 Visual Studio 沒有提供現成的方案,那你就別用 windows 了,否則你就整天在 SO 上找各種 windows 疑難雜症的解決方案吧。另外大部分伺服器都是用 Linux 的,你用 windows 開發再部署過去,連路徑里斜杠方向都不一樣,其他麻煩只有更多。


因為用OS X程序員一般都和類Unix環境打交道的多。你要是開發微軟那一套,十有八九是不會用OS X的(畢竟沒有vs)。和類Unix打交道,當然類Unix的要便利了。畢竟人家的是一套東西。

所以說,幹什麼,就用什麼的工具,不會就去學。這才是程序員的基本素養

然後搞完各種技術之後,牛到想幹嘛幹嘛的技術水平才是終極目標


不了解OS X ,不過就我的經驗來說:一旦某人開始鼓吹自己的血統多麼純正高貴,那就說明他除了血統外也沒什麼可以拿出來說的了


啥血統不血統的,都是裝逼而已,哪個能又快又好的幹活,就用哪個。

人和動物最大的不同是會使用工具,而不是被工具使用。


個人端windows,服務端linux。


推薦閱讀:

如何評價王垠的文章《unix的缺陷》?
如何Linux入門?
Unix / 類 Unix shell 中有哪些很酷很冷門很少用很有用的命令?
epoll的邊沿觸發模式(ET)真的比水平觸發模式(LT)快嗎?(當然LT模式也使用非阻塞IO,重點是要求ET模式下的代碼不能造成飢餓)
既然有 UNIX 哲學,那有沒有 Windows 哲學呢?

TAG:macOS | 微軟Microsoft | 操作系統 | Unix | 操作系統內核 |