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

sallon88 · 2016年08月04日 · 最后由 swordrong 回复于 2018年10月17日 · 14083 次阅读

特性

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/

已经创建了 Crystal 节点。

瞄了一眼语法,好亲切

有 Rails 类似框架吗?

kemalcr.com

类似 sinatra

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

分享一个 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 有很大区别的。

Crystal 的并发模型还没定吧?

#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 级别

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

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

能否直接运行 rails?

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

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

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

这个观点简直让我无从吐槽: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,那个人气简直惨不忍睹

#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 应用的瓶颈,例如,什么语言能解决全球部署情况下的延迟问题?

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

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

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

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

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

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

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

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

什麼時候用 Crystal 寫個 Ruby VM。

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

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

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

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

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

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

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

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

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

刚刚看了一下。做了一些测试。发现垃圾回收这块跟 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 了。

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

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

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

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

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

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

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

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

有仁兄能做个 PyCall 吗?使用 Crystal 调用 Python 包,一下解决很多问题。Julia,Ruby 都是这样做的。

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