如何评价 Apple 新推出的编程语言 Swift?
原文地址:http://www.zhihu.com/question/24002984
评价:如果你会Objective-C,你不需要去看它。
如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是Apple 在WWDC 向全世界推出的重磅语言我怎么能说它不重要?它降低了入门的门槛。使得大量的JS, Python, Ruby用户会使用Apple 的技术为其开发程序。它的作用,和Core Data, Interface Builder 一样,能让你快速写出一个能用的程序来。但如果你想稍做些正经事,就心有余力不足了。所以和Apple 自己的Mail 也不会去用Core Data,自己iPhoto 不会去用UICollectionView,稍复杂的App 都不会去用Interface Builder 一样,Apple 自己不会用Swift。它只是给三五个人的小团队能迅速做出能用的程序,让大公司能快速做些Prototype 而已。有人说它相当于 C#,或是相当于 Scala 对 Java 的改进,我可以告诉大家,Swift 不是这样的语言。它更像一种让人快速做原型的 toy language。
要求 Apple 发布下一代 Objective-C 语言的呼声早就有了,每年写数万字 OS X 评论的 Ars Technica 两年前就写了 Apple 应该去做一个语言,Objective-C without C 并且使用更现代的功能和更短的 API,以及对自动类型推导的支持,文章见 OS X 10.8 Mountain Lion: the Ars Technica review 。
但 Apple 显然没有认真对待这门语言。很明显的,他们根本不想把 ObjC 给替换掉。并且按 Apple 的风格,如果他们把 Swift 当 ObjC 的未来来对待,肯定会有一到两个 iOS/Mac 应用使用 Swift 改写。(比如 Apple 当年要砍 Carbon,首先做的就是把 Finder 重写了)。
从语言角度,Swift
有太多的缺点:
- 它的标准库太差,只有 Dictionary, Array 和 String
及数这几种数据结构,连个 Set 都没有。想用别的?你还是要用 ObjC 的。
-
它没有任何对异步/同步编程的支持。它没法绑定使用 GCD,因此任何正经的网络应用根本无法编写。
-
它没有任何的保护机制(private, protected),所有的 method 和 variable
都是全局可见的,这显然不能满足正经工程项目的需要。
- 只能和 ObjC 互动。如果你想正经地使用 C
或者 C++,你得写 ObjC 的 wrapper。
- 没有办法 catch Objective-C
的 exception,如果一旦出了 exception,你的 App 立马就崩了。
Chris
在设计这门语言时,可以明显地看到他的短视。这也很正常,他是一个做编译器的,不是做语言研究的。所以这门声称支持函数式编程的语言,根本不是函数式的:
- 仅有的支持在 lazy,闭包,及简单的函数语言函数(如 map, filter)。这 ObjC
中都能做
- 没有 pattern matching
-
类型推导差不多和 C++11 差不多,没有使用 hindley milner。
从上面这些特点看, Apple 对其的定位仅是给对 ObjC 头疼的开发者降低学习曲线所推出的玩具语言。前面五条中的每一条,基本都是致命的,因此 Apple 自己的项目也不会使用。做个早期 proof of concept 的 prototype 到是可以的。
我可以想象,实现上 Swift 是很简单的(LLVM 很成熟了,写个新语言越来越简单,比如只要几步就能做个小语言: 1. Kaleidoscope: Tutorial Introduction and the Lexer),当然有可能 Apple 将来会解决这些问题使得其真正实用。但现在来看,Apple 并不希望 Swift 来替代 Objective C。
下面罗列一些知乎上其他大神的评价,并给出别人给这个评价的支持票数:
【知乎用户的回答(104票)】:
马勒戈壁的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
谁都别跟我比惨!!!!!
我刚回答完这题,就看到这个鬼东西了。。。。
我做的毕业设计就是苹果这玩意的简化版
最令我感到蛋疼的是我这大半年一直在做的项目就是在iOS上用lua做这玩意的阉割版,还挺得意的。。。。
开发了大半年,全他妈泡汤了。。。
就当练手了吧。。。
回到问题,swift是对未来编程趋势的一个尝试,看得出来苹果很谨慎小心但又野心勃勃。
苹果很黑,抄别人东西从来不给钱不说,也完全不会提到别人的贡献
AutoLayout如是,这个也必然如此。。
此概念奶是苹果前员工,iPad交互设计师,CoreAnimation编程大师Bret Victor于2年前提出来的
上下文不通者,可围观此演讲
Bret Victor - Inventing on Principle http://v.youku.com/v_show/id_XMzUyOTIyNzg0.html
【Belleve的回答(32票)】:
Native 版的、要自己管理内存的 Scala-C# 复合体。
(你看我用了多长的词汇才描述清楚……)
不知道参数多态做的怎样,别学 Java 玩类型擦除……
还有,call/cc 呢?<del>不兼容经典逻辑</del>没 call/cc 或者等价物的语言都会陷入三角形代码的。
我在《程序员》说过,大众语言要从小众学特性,这回也不例外。PL 发展这么多年,该挖的语义特性都差不多了,剩下就是编译器后端的那点破事,这块找 @蓝色,@陈甫鸼。
不过对于水深火热的 ObjC 用家来说:
Playground 倒是有点技术含量,不过也是抽象解释可以实现的。
【知乎用户的回答(39票)】:
读完了官方Guide(The Swift Programming Language: About Swift)之后回来反馈一下,就是
这是一个阉割掉了很多精髓,添加了一些语法糖的C#和Scala的结合体,有一些Golang的方便特性,附带Golang和JS诸多坑人陷阱的,语法与JavaFX接近的,对非UI部分不够严肃的,除了ARC之外没有GC的一种表达能力较强但是设计能力较弱的语言……换句话说,对于大型项目而言是个坑……更适合PM和小作坊快速推出创意原型,不适合追求高质量应用开发。
以及
全公有变量作为一门要写业务逻辑的严肃的语言真的大丈夫?
有太多的类库被做成了关键字,看个人喜好吧,毕竟看上去还比较方便
看到说Closure是Reference类型的时候还觉得苹果就是比Java开窍来着,结果是个半吊子工程,是个Reference没错,但是作为一个Reference该有的尊严在哪里?表达能力一下子弱了一大截……
有Delegate是个好事情,但是你这个delegate……真的不是面向接口编程么……这样欺骗人民群众感情有意思么……
ARC里面讲居然需要Weak Reference以及ARC与Weak Reference不兼容的时候,差点儿吓哭了……对于Guide中说到要用Weak Reference的场景,这几乎是运行必Segment Fault啊……
咦,异步呢异步呢异步呢异步呢……
另外谁能告诉我这货怎么处理异常……不能异常处理的语言不是写起来会跟屎一样么……
【vczh的回答(13票)】:
@yue wang 的答案写的很好,应该看一看。
我只想说,swift做出的很多决定竟然跟我www.gaclib.net 那个随手发明来写进xml的脚本一样,譬如说$x用来代表lambda表达式啦,类型写在名字后面啦,只有let和lambda才能做类型推导啦,用一个不完整的GC语言写出来的library直接map成脚本的object model啦(基本上脚本长得那么别扭都是因为这个,我那个也一样)……
apple药丸
不过反正swift做的这么丑果粉们都不会有意见的,因为至少比更丑的oc好看(逃
【尤雨溪的回答(19票)】:
目测苹果这次会成功吸引一大批因为嫌 Obj-C 烦所以不碰 iOS 的动态语言开发者试水 iOS 开发,尤其是 web 开发者这一块。平台之间的竞争,得开发者得天下。在争夺开发者的战场上,无论是 Native vs. Web 还是 iOS vs. Android,这都是苹果的一着好棋。
【陈默扬的回答(8票)】:
所有的人都是零基础?此言差矣。编程语言发展到现在,很大一部分工作都是库作为支撑的,你做的只是搭积木的工作,再加上逻辑判断、循环、递推、迭代等一部分逻辑。最多再加上并发、多线程等等等等,但后者也已经是充分“库"话。即便是FP也差不多是回调函数的另类表达版本。
会Objective-C的肯定可以更好地掌握Swift.
但是,会编译器、知道LLVM架构或者离散数学、JS编程、库编程掌握得特别好信手拈来的人,肯定能更快拾起SWIFT。所有的这些语言的new features,早在多年前就有人提出的了,只是需要包装、整合和广告一下。
新语言基本上只会对想要入门的人有区别。
深入了解之后,区别远远没有那么大,因为不管语言怎么变化,你想要达到的运行效果、想象力、可维护性才是核心。只要你是编程大牛,那么你就是编程大牛,跟语言无关。
【王一卓的回答(11票)】:
It‘s an very expressive language。
给一些觉得“编程水平终于和大家处于同一起跑线上了”的人教点冷水。Swift这种能更加发挥coder创造力的语言,只会让初学者和高手的差距更大。A language is about expressing yourself。Swift去掉了很多的boilerplate,让人更着重于表达自己而不是fight the language(<- Java)。关键看点是如何让closure, type inference和generics一起工作。鉴于Apple一向不在乎backward compatibility(<- Java),应该可以达到C#的水平。
另外,这不就是(死掉的)JavaFX Script么:JavaFX Script
一些JavaFX Script 的code example:
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
Stage
{ title: "Hello World" width: 250 height: 80 scene: Scene { content: Text
{ font : Font { size : 24 } x: 10, y: 30 content: "Hello World"
}
}
}
import javafx.ext.swing.*;
var myFrame:SwingFrame = new SwingFrame();
var myLabel:Label = new Label();
myLabel.text = "Hello World!";
myFrame.width = 200;
myFrame.height = 50;
myFrame.visible = true;
myFrame.content = myLabel;
在NetBeans里也是类似于PlayGround的所见即所得。
当时还用JavaFX Script重写过一些Java的animation,确实比Java更简练(没有比Java还verbose的语言了)。但也是局限在UI相关的代码,逻辑多的话还是用Java写的。
【元彦的回答(3票)】:
就像这个标语中提到的 “Write the code. Change the world.”,本次最大的亮点非Swift莫属。苹果应该在两三年前就已经开始不满足与Obj-c语言本事的开发效率与工程能力,发布新的语言也是苹果对开发者的一次回馈(以苹果强势的产品地位),翻阅了下 “The Swift Programming Language” 电子书 iTunes - Books,一些感想:
0. 没有封号 ";", 点赞
1. 比其obj-c来说,整体语法风格看起来舒服了,有经验的开发者花几分钟快速翻看了下,应该就可以快速上手开发了
2. Swift中整出了一些新的关键字?subscript、protocol、extension...
3. 喜欢Optional Chaining,很实用的语法糖: foo.bar?.baz 如果bar不为nil,就调用bar.baz方法
4. 还是没有找到package或namespace的介绍,这是什么情况?
5. 以往Obj-c只在客户端运行,Swift是一次能让其跑在Server端的机会吗?
6. 下一个Swift又叫什么呢?啥是把Swift开源出来呢~
【Saviio的回答(3票)】:
这以后MacRuby就是小三了吗....永远扶不了正了。
题图上有闭包,有命名空间,多重返回,类型推导,模式匹配,操作符重载
稍期待一下swift,具体看了ref再说。Functional pattern+Object orientation 俨然一个scala lol....
另外,apple搞LLVM果然不是没道理的。
就是拿静态和动态比,还和Python比...Apple不厚道..
【题叶的回答(0票)】:
作为一个 JS 开发者感想吧, 本人 Macbook Air 用户, 一年 Backbone 应用开发经验.
入门 Go, Haskell 等等语言, CoffeeScript 死党, 对做 MVC 界面的关心远超过底层实现.
尝试看过一点 Objective-C, 但是门槛马上就被吓退了, 以及巨大的 IDE.
我长期写 CoffeeScript, 并不是不懂编程, 而是难以转换编程的思路,
语法上看, Swift 都是其他编程语言中早已出现的种种功能. 并没有 Go 那样革命性的意图.
但是语言的友好程度, 已经调试环境放出的截图让我感到门槛降低了很多.
另外语法有好的语句通常遇到问题是性能, 苹果给的数据也很不错.
所以看好.
【知乎用户的回答(5票)】:
作于语言来说Swift其实没啥好说的,no silver bullet对于新语言永远适用。
Playground在实际开发中我觉得没有预期的那么大,因为多数应用逻辑复杂且上下文相关性很强。
但是对于原型开发会非常有帮助。
【周全的回答(5票)】:
粗看了一两章 先给个映像 日后修改
相比OC便利了很多
但基本属于到处抄一点的语言
顺便吐槽本届WWDC
WWDC == We Will Definitely Copy
【知乎用户的回答(5票)】:
刚看完直播,第一眼看到这个新语言的时候真的眼前一亮!(毕竟今年发布会亮点好少。。。)
作为一个正在入门的小白,对于即时预览感觉开发起来一定很有成就感而且很更直观知道哪个更想像有入差。看得出苹果想把APP开发推广到非专业爱好者中间来,我觉得这个想法就很让人激动了,很多人拿苹果当逼格高的东西,但是苹果再做的是怎么让它更加亲民更受众,不仅是享受方便,更包括自己去开发。毕竟没有人比自己更了解自身需求,这是特别有意思的想法。
SWIFT大家都还没有拿到,相信过段时间运用在实践了,会给予更客观的评价。希望它能给我们惊喜,和大神们一起接触一门新语言,想想还有点小激动呢。
【轩辕老布的回答(3票)】:
看Playground的时候有看到var和let,有闭包,有泛型,有类型推断,Fast Iteration应该是跟Linq差不多的东西,实时编译说明此语言可能能支持运行时编译运行,所以我认为在语法和运行时上都有可能超过C#。
钻研中,等我看完了回来补充答案。
【李珠刚的回答(5票)】:
谁刚买《ios开发入门》......
【知乎用户的回答(1票)】:
可选类型让人想到了Dart;local inference,多返回值,func关键字(以及函数返回值后置式的声明语法),条件语句无括号,没有分号,没有break的switch等等让人想到了Go。里面加入了一些函数式语法特性,代数类型,模式匹配等等。
还有很多很多和c#,scala很相似的,大家很熟悉的东西,就不一一列举了。
里面没有看到什么并发,并行编程上有什么亮点,要么像erlang这样的actor模型进程isolate(dart就吸收了这个),要么就像Go那样的chanel直观简单。还有一些其他语言中存在的问题它也没有改进过来而是保留了下来,也许是觉得这样太过激进。
和oc可交互(但和c/c++不能),底层基于LLVM编译为native code。同样,和Go的初衷一样,是搞一个工具出来,提高码农的生产效率,而不是搞语言研究创新。高大上的猿们尤其是FP爱好者们依然可以鄙视这门语言。
话说作者发明一门语言都是看另一门自己经常用到的语言不爽:
Go的作者 —— 看c不爽;
Dart的作者 ——看javascript不爽;
hack的作者 ——看php不爽;
Swift的作者 ——看objective-c不爽。
下一个语言该在哪里出现? Amazon OR 三木桑。。。
【姚尚朗IceskYsl的回答(2票)】:
极客学院最新课程发布 WWDC2014 详解OSX/iOS8/Swift语言,总体而言swift的出现让好多人激动,激动完仔细一看觉得蛮坑(毕竟缺的东西还好多)~
但是和几年前Golang法发布一样,Swift的出发点是很好的,只是需要一些时间来完善~
附录:极客学院发布的Swift语言课程
原文地址:知乎
本文永久链接:http://www.cnblogs.com/ChenYilong/p/3765586.html
苹果关于Swift的官方文档:https://itunes.apple.com/cn/book/swift-programming-language/id881256329?mt=11