特性
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/
分享一个 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 有很大区别的。
#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 分钟重启一次 也就这么过来了。
https://crystal-lang.org/2016/07/15/fibonacci-benchmark.html
这篇可以看出,Ruby 性能足够好,有时性能是通过算法提升的。Crystal 一不小心会写出错误或性能低下的代码。
这个观点简直让我无从吐槽: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,那个人气简直惨不忍睹
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 我是个话痨,有时候会在非核心观点上浪费好多文字,结果导致核心观点一点也不突出。
我跟你的观点正好相反:我觉得对于 Ruby 本身来说,其实并不算慢,或者说至少没有慢到现在所有得到的吐槽。如果用一些合理的设计,比如 h2o 或者 nginx 这种潜入 mruby 用 fiber 来做,是完全可以做到其他很多语言包括 Elixir,包括 Crystal 一个数量级上的性能的。
我曾经今年年初花了很长时间调研能否基于 h2o 与 mruby 来做一个框架,就是针对这个问题来解决。但是我跟人聊遇到的一个核心观点都是"这不是 Rails 我不用"。包括这个帖子里在我们讨论 Crystal 的时候都有人无聊的来问能不能跑 Rails。我这里的核心观点是:我对 Rails 本身没有歧视,我只是觉得对 Rails 的推广已经到了影响到 Ruby 圈内其他生态发展的程度了。包括现在 Rack 也是由 Rails 核心团队维护,在第一次发布 2.0 计划的时候,有考虑过改动核心来支持 Web Sockets,但是之后到现在也就不了了之了。这也就是为什么我之前发另一篇帖子的主要动机,我个人觉得现在的舆论风向是不包容其他解决方案的,这个是件不正确的事。
另外我个人觉得提到 Web Sockets 时就把 ActionCable 抛出来,或是压根就质疑对方有没有这个需求是不正确的方式。作为一个好多人口中的 safe bet,对于一个用处越来越多的场景只有一个半 hack 的解决方案,我个人是不认为这是对的。
所以这才是我想说的话,能解决这个的话,JRuby,mruby 甚至 CRuby 可以说都不慢,就像你说的语言不是瓶颈,我只是跟你对于瓶颈到底在哪里的观点不一致,你觉得不在 Ruby 的任何部分里,我觉得在 Ruby 的好多库里
断断续续玩了好一阵子,感觉 crystal 对我很有吸引力。几点粗略感观:
总结下, 这是一个语法优美,性能强大,面对对象的语言,很多人特别是 js 方向的程序员,可能认为函数式编程是未来,不过我觉得面对对象对于解决软件复杂度问题还是大杀器。crystal 大多数情况下,可以按动态语言的编程习惯,来写出静态语言程序。且 crystal 在静态类型的前提下,没有牺牲掉灵活性。stdlib 对于流行技术做了内置,可能是人称之为 modern stdlib 的原因?并发被当做重点特性来对待,处于 语言的 roadmap 中。 就网络程序的发展来看,有后台 api 化,重前端的趋势,对于这类 app, 后端的 framework 会追求轻量,并发,高速,我觉得 crystal 还是很有发展潜力的. crystal 高速,省内存,高级语言的特点,我觉得会比 ruby 适合于更多的领域。只不过 crystal 正处于发展中,有待时日吧。
什麼時候用 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
刚刚看了一下。做了一些测试。发现垃圾回收这块跟 java 似的。偶尔会卡一下。很明显的卡顿。不知道是不是姿势不对。代码如下:
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
siege -c 1000 -t 200 http://localhost:8080
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 了。
#31 楼 @jarorwar 它的 GC 的确还比较原始,不过这个延时不一定是 GC 造成的,也有可能是 IO 事件没处理好 #35 楼 @scriptfans 取而代之有一套宏编程的奇技淫巧... 不过运行时反射应该是比 Ruby 差不少