Crystal 分享一门新语言 Crystal,Ruby 的语法,C 的速度

sallon88 · 发布于 2016年8月04日 · 最后由 scriptfans 回复于 2016年8月10日 · 3593 次阅读
5549

特性

Have a syntax similar to Ruby (but compatibility with it is not a goal) Be statically type-checked, but without having to specify the type of variables or method arguments. Be able to call C code by writing bindings to it in Crystal. Have compile-time evaluation and generation of code, to avoid boilerplate code. Compile to efficient native code.

HN讨论:https://news.ycombinator.com/item?id=12223395 官网:https://crystal-lang.org/

共收到 40 条回复
3
lgn21st · #1 · 2016年8月05日

已经创建了 Crystal 节点。

4755
martin91 · #2 · 2016年8月05日

瞄了一眼语法,好亲切

96
nong · #3 · 2016年8月05日

有Rails类似框架吗?

96
nil · #4 · 2016年8月05日

kemalcr.com

类似 sinatra

4755
martin91 · #5 · 2016年8月05日

#3楼 @nong 语言本身还是试用阶段,框架估计没那么快

4384
defmacro · #6 · 2016年8月05日

分享一个 Ruby 圈转到 Crystal 的人的观点:https://twitter.com/soveran/status/736596798500941825,为方便懒的翻墙的人,我在这里也直接引用一下:

Ruby has an imperative desire to expand, maybe inspired by Rails. My wish is for Crystal to never surrender to that culture.

在经历 Rails 这么有争议性的东西之后,很多社区都在避免再造一个跟 Rails 一样庞大复杂的框架,包括 Phoenix 也一样,在尝试避免 Rails 的很多问题。所以我们将来可能会有一个比 Kemal 更具有可维护性的框架,但是估计这个也会跟 Rails 有很大区别的。

27
numbcoder · #7 · 2016年8月05日

Crystal 的并发模型还没定吧?

2973
small_fish__ · #8 · 2016年8月05日 1 个赞

#7楼 @numbcoder 定了的 https://crystal-lang.org/api/0.18.7/Fiber.html

研究过一点 crystal,其实只是基本语法一致, API 还是有很多不同

bundle=> https://github.com/crystal-lang/shards sidekiq => https://github.com/mperham/sidekiq.cr sinatra => https://github.com/sdogruyol/kemal

and more https://github.com/veelenga/awesome-crystal

开发习惯很相似,性能确实不错, us 级别

4384
defmacro · #9 · 2016年8月05日

#7楼 @numbcoder 这个要看你怎么定义了,现在已经比去年这个时候成熟很多了:https://crystal-lang.org/docs/guides/concurrency.html

但是目前来看最大的阻碍是 GC,内嵌的 GC 还是很原始,不过这个也是看怎么取舍了,毕竟当年 Rails 4分钟重启一次 也就这么过来了。

96
Lucipher · #10 · 2016年8月05日

能否直接运行rails?

1
Rei · #11 · 2016年8月05日 1 个赞

https://crystal-lang.org/2016/07/15/fibonacci-benchmark.html

这篇可以看出,Ruby 性能足够好,有时性能是通过算法提升的。Crystal 一不小心会写出错误或性能低下的代码。

775
nouse · #12 · 2016年8月05日

Crystal 这篇benchmark写的也确实挺弱的,直接弄个大一点的迭代让Ruby爆栈就赢了。

4384
defmacro · #13 · 2016年8月05日 4 个赞

这个观点简直让我无从吐槽:Crystal 的作者自己写了篇文章,说你们别老用 Fib 来做 benchmark 了,这太 2 了, 这样会给 Crystal 招黑,结果这反成支持 Ruby 的人证明 Ruby 不慢的理由了。问题 Benchmark 还有很多啊,有没有兴趣一个一个来攻击证明 Ruby 怎么提升性能。

况且我之前吐槽的时候就给出了一个观点:这年头 Ruby 本身语言级的优化远远没有达到让大家觉得 Ruby 慢的程度,Ruby 的慢更多是因为 ecosystem 的结果,很多 library 的写法让 Matz 没法大改 Ruby,所以现在情况越来越棘手,刚刚有同学发了篇文章也是讲这件事的:https://ruby-china.org/topics/30740。遗憾的是之前的讨论被人看作我是伸手党,哎满是无奈

最后我建议有兴趣的同学想换 Elixir,Crystal 的就直接换,不要再在这里争论这些无聊的事了,本来就不会有好的结果。换个角度讲我们还是需要赞扬 RubyChina 这个社区的,至少管理员们还会帮忙建别的节点包容讨论,而不是直接当成异教徒烧死,不信的去隔壁看看 RustChina,那个人气简直惨不忍睹

1
Rei · #14 · 2016年8月05日

#13楼 @defmacro 原话:

First, Ruby is just awesome. It strives to give you correct results, and it does so with a reasonable performance. Chapeau!

在我印象中,Ruby 就是主流动态语言中最慢的,更不用说跟新语言比。但是语言性能通常不是 Web 应用的瓶颈,例如,什么语言能解决全球部署情况下的延迟问题?

2
huacnlee · #15 · 2016年8月05日 2 个赞

#14楼 @Rei 其实很多人想要的快,是为了能节省资源,单个页面的 Response Time 降低了,已直接意味着同样配置机器的处理能力提高。

Ruby 或 Rails 这类,虽然我们写好了,是可以做到单个页面的 Response Time 在 100ms 以内,甚至更低,但需要配合很多的手段,原因还是 Ruby 在某些方面不够快。但如果能更低(几乎只有 IO 部分的开销),实际上是更好的。

此外还有一些需要复杂运算,CPU 密集的场景。

1
Rei · #17 · 2016年8月05日

#16楼 @defmacro 在开源社区,只有你把东西做出来,并且坚持一段时间,才会有人在乎你的想法。换个角度,你会关注论坛上每一个“我想”的点子么?

4384
defmacro · #18 · 2016年8月05日 1 个赞

#17楼 @Rei 我只能呵呵,观点不一样没啥必要解释了。到现在你还是在回避我的核心观点,算了散了吧

90
jiyinyiyong · #19 · 2016年8月05日

#13楼 @defmacro RustChina 什么情况, 求围观

96
chenjau · #20 · 2016年8月05日 3 个赞

断断续续玩了好一阵子, 感觉 crystal 对我很有吸引力. 几点粗略感观:

  1. ruby 语法的简洁美观.
  2. crystal 本身是用 crystal 写的. 相比于 c, 研究源码更方便, 视角更高层. 对语言本身的开发和迭代更容易(待考).
  3. 静态类型, 但却不必指定类型, 大多数情况下会自我推断. union type (..|..), 比如不是整数就是字符串.
  4. 没有因为静态牺牲掉灵活性. macros 可以元编程.
  5. 可编译, 对于源码保护应该会很好. 部署会更方便.
  6. 并发, 确定在 roadmap 中. 看代码好像是有相关模块, 但在 roadmap 中没有显示已完成.
  7. 标准库整合了 spec, json, oauth, websocket 等功能.
  8. 性能, 快到离谱. fast as c 不算虚言. 8.* 对于 ruby 程序员来说, 天然都掌握了大半 crystal 语法.

总结下, 这是一个语法优美, 性能强大, 面对对象的语言, 很多人特别是 js 方向的程序员, 可能认为函数式编程是未来, 不过我觉得面对对象对于解决软件复杂度问题还是大杀器. crystal 大多数情况下, 可以按动态语言的编程习惯, 来写出静态语言程序. 且 crystal 在静态类型的前提下, 没有牺牲掉灵活性. stdlib 对于流行技术做了内置, 可能是人称之为 modern stdlib 的原因? 并发被当做重点特性来对待, 处于 语言的 roadmap 中. 就网络程序的发展来看, 有后台 api 化, 重前端的趋势, 对于这类app, 后端的 framework 会追求轻量, 并发, 高速, 我觉得 crystal 还是很有发展潜力的. crystal 高速, 省内存, 高级语言的特点, 我觉得会比 ruby 适合于更多的领域. 只不过 crystal 正处于发展中, 有待时日吧.

9965
itomato · #21 · 2016年8月05日

最近的几个版本更新, 每次都有小小的惊喜. 这次已经好几周没更新了. 估计下一个版本会有较大的惊喜.

4559
liuzelei · #22 · 2016年8月05日 3 个赞

下一个像crystal的语言名字我都想好了,叫diamond

7929
ksec · #23 · 2016年8月06日

什麼時候用 Crystal 寫個 Ruby VM。

Edit: 終於有人關注 Crystal 了, 一年之前開過關於 Crystal ( https://ruby-china.org/topics/25633 ) 也沒有回應........

11277
karloku · #24 · 2016年8月06日

#8楼 @small_fish__ 有类似 ruby rack 或者 python wsgi 这样的 interface 吗? 在 awesome-crystal 的收集里似乎没看到

377
rainchen · #25 · 2016年8月07日

The compiler is written in Crystal 每当看到这种能自举的编程语言就有种“通透”的感觉,上次是看到有印象的是coffeescript The CoffeeScript compiler is itself written in CoffeeScript,非常有意思

2880
luikore · #26 · 2016年8月08日 1 个赞

是不错的语言啊, 目测用 kemal 比 ngx_mruby 或者 h2o mruby 更靠谱, 至少有 redis / pg / websocket 的完整支持

一年前答了一发现在都没填完坑... https://www.zhihu.com/question/33311554

2973
small_fish__ · #27 · 2016年8月08日

#24楼 @karloku 没有,或许并不太需要

2211
villins · #28 · 2016年8月08日

只用  Crystal 玩过一个小 demo,确实快,就是工具链这块跟不上。

20859
adamshen · #29 · 2016年8月08日

看来ruby的进化方向有两个,一个是通过优化虚拟机或者干脆干掉这一层来提升性能,另外一个是在语言内部实现异步编程。

7929
ksec · #30 · 2016年8月09日

#26楼 @luikore 上年問的時候還以為你沒時間玩了, 原來在知乎回答了。。。。

5610
jarorwar · #31 · 2016年8月09日

刚刚看了一下。做了一些测试。发现垃圾回收这块跟java似的。偶尔会卡一下。很明显的卡顿。不知道是不是姿势不对。代码如下:

Code

require "http/server"

count = 0
server = HTTP::Server.new(8080) do |context|
  context.response.content_type = "text/plain"
    context.response.print "Hello world! The time is #{Time.now}"
    count += 1
    puts count
end

puts "Listening on http://0.0.0.0:8080"
server.listen

Test Command:

siege -c 1000 -t 200 http://localhost:8080

Result:

Lifting the server siege...
Transactions:              85434 hits
Availability:              99.82 %
Elapsed time:             199.72 secs
Data transferred:           4.07 MB
Response time:              0.14 secs
Transaction rate:         427.77 trans/sec
Throughput:             0.02 MB/sec
Concurrency:               61.36
Successful transactions:       85434
Failed transactions:             151
Longest transaction:           14.81
Shortest transaction:           0.00

你看到那个最长的 !就是pause造成的。感觉是gc在工作的时候给pause了。

5610
jarorwar · #32 · 2016年8月09日

#2楼 @martin91 就用ruby的语法去写吧

96
moon2l · #33 · 2016年8月09日

已经土坑rust了,不过可以试试Crystal

5610
jarorwar · #34 · 2016年8月09日

#33楼 @moon2l Rust听上去挺美。学上去挺费劲。crystal 用ruby的语法就能写。吸引力还是很大的

96
scriptfans · #35 · 2016年8月09日

Crystal的静态类型决定了很多Ruby的元编程奇技淫巧无法实现,而且两者语法太过类似,没有新鲜感,不如直接上Elixir了。

2880
luikore · #36 · 2016年8月10日

#31楼 @jarorwar 它的 GC 的确还比较原始, 不过这个延时不一定是 GC 造成的, 也有可能是 IO 事件没处理好 #35楼 @scriptfans 取而代之有一套宏编程的奇技淫巧... 不过运行时反射应该是比 Ruby 差不少

7733
yukihiro_matz · #37 · 2016年8月10日

#35楼 @scriptfans 新鲜感!

5610
jarorwar · #38 · 2016年8月10日

#36楼 @luikore 感谢解惑。总之看上去棒棒哒。几乎不用学习新语法,可以直接上手(虽然我已经把语法撸了一半了)。感觉真是不错啊。

5610
jarorwar · #39 · 2016年8月10日 1 个赞

#37楼 @yukihiro_matz 据说你捐了500刀?:.P LOL

96
scriptfans · #40 · 2016年8月10日

#37楼 @yukihiro_matz 赶紧滚回去开发mruby吧,等着用呢😜

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册