lobsters before:
<details>
```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (61.1% of total 10,568,718):
Kernel#is_a?: 1,030,925 ( 9.8%)
String#<<: 851,954 ( 8.1%)
Hash#[]=: 742,942 ( 7.0%)
Regexp#match?: 399,898 ( 3.8%)
Hash#key?: 349,146 ( 3.3%)
String#start_with?: 334,963 ( 3.2%)
Kernel#respond_to?: 316,528 ( 3.0%)
ObjectSpace::WeakKeyMap#[]: 238,978 ( 2.3%)
TrueClass#===: 235,771 ( 2.2%)
FalseClass#===: 231,144 ( 2.2%)
Array#include?: 211,386 ( 2.0%)
Hash#fetch: 204,702 ( 1.9%)
Kernel#block_given?: 181,796 ( 1.7%)
Kernel#dup: 179,341 ( 1.7%)
BasicObject#!=: 175,997 ( 1.7%)
String.new: 166,696 ( 1.6%)
Kernel#kind_of?: 165,600 ( 1.6%)
String#==: 157,746 ( 1.5%)
Process.clock_gettime: 144,992 ( 1.4%)
Array#any?: 138,310 ( 1.3%)
Top-20 not annotated C methods (62.1% of total 10,723,613):
Kernel#is_a?: 1,212,816 (11.3%)
String#<<: 851,954 ( 7.9%)
Hash#[]=: 743,121 ( 6.9%)
Regexp#match?: 399,898 ( 3.7%)
Hash#key?: 349,146 ( 3.3%)
String#start_with?: 334,963 ( 3.1%)
Kernel#respond_to?: 316,528 ( 3.0%)
ObjectSpace::WeakKeyMap#[]: 238,978 ( 2.2%)
TrueClass#===: 235,771 ( 2.2%)
FalseClass#===: 231,144 ( 2.2%)
Array#include?: 211,386 ( 2.0%)
Hash#fetch: 204,702 ( 1.9%)
Kernel#block_given?: 191,665 ( 1.8%)
Kernel#dup: 179,348 ( 1.7%)
BasicObject#!=: 176,181 ( 1.6%)
String.new: 166,696 ( 1.6%)
Kernel#kind_of?: 165,634 ( 1.5%)
String#==: 163,678 ( 1.5%)
Process.clock_gettime: 144,992 ( 1.4%)
Array#any?: 138,310 ( 1.3%)
Top-2 not optimized method types for send (100.0% of total 72,324):
cfunc: 48,057 (66.4%)
iseq: 24,267 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,523,699):
iseq: 2,271,952 (50.2%)
bmethod: 985,636 (21.8%)
optimized: 949,704 (21.0%)
alias: 310,747 ( 6.9%)
null: 5,106 ( 0.1%)
cfunc: 554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,293,340):
invokesuper: 2,373,561 (55.3%)
invokeblock: 811,934 (18.9%)
sendforward: 505,452 (11.8%)
opt_eq: 451,756 (10.5%)
opt_plus: 74,406 ( 1.7%)
opt_minus: 36,228 ( 0.8%)
opt_send_without_block: 21,792 ( 0.5%)
opt_neq: 7,231 ( 0.2%)
opt_mult: 6,752 ( 0.2%)
opt_or: 3,753 ( 0.1%)
opt_lt: 348 ( 0.0%)
opt_ge: 91 ( 0.0%)
opt_gt: 36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,481,476):
send_without_block_polymorphic: 9,722,801 (38.2%)
send_no_profiles: 5,894,799 (23.1%)
send_without_block_not_optimized_method_type: 4,523,699 (17.8%)
not_optimized_instruction: 4,293,340 (16.8%)
send_without_block_no_profiles: 948,985 ( 3.7%)
send_not_optimized_method_type: 72,324 ( 0.3%)
send_without_block_cfunc_array_variadic: 15,134 ( 0.1%)
obj_to_string_not_string: 9,765 ( 0.0%)
send_without_block_direct_too_many_args: 629 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 690,957):
expandarray: 328,491 (47.5%)
checkkeyword: 190,694 (27.6%)
getclassvariable: 59,907 ( 8.7%)
invokesuperforward: 49,503 ( 7.2%)
getblockparam: 49,119 ( 7.1%)
opt_duparray_send: 11,978 ( 1.7%)
getconstant: 952 ( 0.1%)
checkmatch: 290 ( 0.0%)
once: 23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,718,841):
register_spill_on_alloc: 3,418,472 (91.9%)
register_spill_on_ccall: 182,023 ( 4.9%)
exception_handler: 118,346 ( 3.2%)
Top-17 side exit reasons (100.0% of total 10,861,013):
compile_error: 3,718,841 (34.2%)
guard_type_failure: 2,638,940 (24.3%)
guard_shape_failure: 1,917,541 (17.7%)
unhandled_yarv_insn: 690,957 ( 6.4%)
block_param_proxy_not_iseq_or_ifunc: 535,789 ( 4.9%)
unhandled_kwarg: 455,351 ( 4.2%)
unknown_newarray_send: 314,786 ( 2.9%)
patchpoint_stable_constant_names: 235,507 ( 2.2%)
unhandled_splat: 122,071 ( 1.1%)
patchpoint_no_singleton_class: 109,668 ( 1.0%)
unhandled_hir_insn: 76,397 ( 0.7%)
patchpoint_method_redefined: 21,598 ( 0.2%)
block_param_proxy_modified: 19,193 ( 0.2%)
patchpoint_no_ep_escape: 3,765 ( 0.0%)
obj_to_string_fallback: 568 ( 0.0%)
guard_type_not_failure: 22 ( 0.0%)
interrupt: 19 ( 0.0%)
send_count: 68,205,150
dynamic_send_count: 25,481,476 (37.4%)
optimized_send_count: 42,723,674 (62.6%)
iseq_optimized_send_count: 18,588,101 (27.3%)
inline_cfunc_optimized_send_count: 13,566,855 (19.9%)
non_variadic_cfunc_optimized_send_count: 7,904,518 (11.6%)
variadic_cfunc_optimized_send_count: 2,664,200 ( 3.9%)
dynamic_getivar_count: 7,366,650
dynamic_setivar_count: 7,245,122
compiled_iseq_count: 4,796
failed_iseq_count: 447
compile_time: 778ms
profile_time: 9ms
gc_time: 11ms
invalidation_time: 77ms
vm_write_pc_count: 63,636,742
vm_write_sp_count: 62,292,946
vm_write_locals_count: 62,292,946
vm_write_stack_count: 62,292,946
vm_write_to_parent_iseq_local_count: 292,458
vm_read_from_parent_iseq_local_count: 6,600,017
code_region_bytes: 22,970,368
side_exit_count: 10,861,013
total_insn_count: 517,633,620
vm_insn_count: 162,995,567
zjit_insn_count: 354,638,053
ratio_in_zjit: 68.5%
```
</details>
lobsters after:
<details>
```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (61.1% of total 10,239,008):
Kernel#is_a?: 1,030,914 (10.1%)
String#<<: 851,954 ( 8.3%)
Hash#[]=: 742,942 ( 7.3%)
Regexp#match?: 376,144 ( 3.7%)
Hash#key?: 349,147 ( 3.4%)
String#start_with?: 334,963 ( 3.3%)
ObjectSpace::WeakKeyMap#[]: 238,978 ( 2.3%)
TrueClass#===: 235,771 ( 2.3%)
FalseClass#===: 231,144 ( 2.3%)
Array#include?: 211,386 ( 2.1%)
Hash#fetch: 204,702 ( 2.0%)
Kernel#block_given?: 181,797 ( 1.8%)
Kernel#dup: 179,341 ( 1.8%)
BasicObject#!=: 175,997 ( 1.7%)
String.new: 166,696 ( 1.6%)
Kernel#kind_of?: 165,600 ( 1.6%)
String#==: 157,751 ( 1.5%)
Process.clock_gettime: 144,992 ( 1.4%)
Array#any?: 138,311 ( 1.4%)
Set#include?: 134,362 ( 1.3%)
Top-20 not annotated C methods (62.2% of total 10,372,753):
Kernel#is_a?: 1,212,805 (11.7%)
String#<<: 851,954 ( 8.2%)
Hash#[]=: 743,121 ( 7.2%)
Regexp#match?: 376,144 ( 3.6%)
Hash#key?: 349,147 ( 3.4%)
String#start_with?: 334,963 ( 3.2%)
ObjectSpace::WeakKeyMap#[]: 238,978 ( 2.3%)
TrueClass#===: 235,771 ( 2.3%)
FalseClass#===: 231,144 ( 2.2%)
Array#include?: 211,386 ( 2.0%)
Hash#fetch: 204,702 ( 2.0%)
Kernel#block_given?: 191,666 ( 1.8%)
Kernel#dup: 179,348 ( 1.7%)
BasicObject#!=: 176,181 ( 1.7%)
String.new: 166,696 ( 1.6%)
Kernel#kind_of?: 165,634 ( 1.6%)
String#==: 163,683 ( 1.6%)
Process.clock_gettime: 144,992 ( 1.4%)
Array#any?: 138,311 ( 1.3%)
Integer#<=>: 135,056 ( 1.3%)
Top-2 not optimized method types for send (100.0% of total 72,324):
cfunc: 48,057 (66.4%)
iseq: 24,267 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,523,699):
iseq: 2,271,952 (50.2%)
bmethod: 985,636 (21.8%)
optimized: 949,704 (21.0%)
alias: 310,747 ( 6.9%)
null: 5,106 ( 0.1%)
cfunc: 554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,293,339):
invokesuper: 2,373,561 (55.3%)
invokeblock: 811,933 (18.9%)
sendforward: 505,452 (11.8%)
opt_eq: 451,756 (10.5%)
opt_plus: 74,406 ( 1.7%)
opt_minus: 36,228 ( 0.8%)
opt_send_without_block: 21,792 ( 0.5%)
opt_neq: 7,231 ( 0.2%)
opt_mult: 6,752 ( 0.2%)
opt_or: 3,753 ( 0.1%)
opt_lt: 348 ( 0.0%)
opt_ge: 91 ( 0.0%)
opt_gt: 36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,457,719):
send_without_block_polymorphic: 9,699,046 (38.1%)
send_no_profiles: 5,894,798 (23.2%)
send_without_block_not_optimized_method_type: 4,523,699 (17.8%)
not_optimized_instruction: 4,293,339 (16.9%)
send_without_block_no_profiles: 948,985 ( 3.7%)
send_not_optimized_method_type: 72,324 ( 0.3%)
send_without_block_cfunc_array_variadic: 15,134 ( 0.1%)
obj_to_string_not_string: 9,765 ( 0.0%)
send_without_block_direct_too_many_args: 629 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 690,957):
expandarray: 328,491 (47.5%)
checkkeyword: 190,694 (27.6%)
getclassvariable: 59,907 ( 8.7%)
invokesuperforward: 49,503 ( 7.2%)
getblockparam: 49,119 ( 7.1%)
opt_duparray_send: 11,978 ( 1.7%)
getconstant: 952 ( 0.1%)
checkmatch: 290 ( 0.0%)
once: 23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,706,981):
register_spill_on_alloc: 3,406,595 (91.9%)
register_spill_on_ccall: 182,023 ( 4.9%)
exception_handler: 118,363 ( 3.2%)
Top-17 side exit reasons (100.0% of total 10,837,266):
compile_error: 3,706,981 (34.2%)
guard_type_failure: 2,638,921 (24.4%)
guard_shape_failure: 1,917,552 (17.7%)
unhandled_yarv_insn: 690,957 ( 6.4%)
block_param_proxy_not_iseq_or_ifunc: 535,789 ( 4.9%)
unhandled_kwarg: 455,351 ( 4.2%)
unknown_newarray_send: 314,786 ( 2.9%)
patchpoint_stable_constant_names: 223,630 ( 2.1%)
unhandled_splat: 122,071 ( 1.1%)
patchpoint_no_singleton_class: 109,668 ( 1.0%)
unhandled_hir_insn: 76,397 ( 0.7%)
patchpoint_method_redefined: 21,598 ( 0.2%)
block_param_proxy_modified: 19,193 ( 0.2%)
patchpoint_no_ep_escape: 3,765 ( 0.0%)
obj_to_string_fallback: 568 ( 0.0%)
guard_type_not_failure: 22 ( 0.0%)
interrupt: 17 ( 0.0%)
send_count: 68,157,710
dynamic_send_count: 25,457,719 (37.4%)
optimized_send_count: 42,699,991 (62.6%)
iseq_optimized_send_count: 18,588,067 (27.3%)
inline_cfunc_optimized_send_count: 13,872,916 (20.4%)
non_variadic_cfunc_optimized_send_count: 7,904,566 (11.6%)
variadic_cfunc_optimized_send_count: 2,334,442 ( 3.4%)
dynamic_getivar_count: 7,342,896
dynamic_setivar_count: 7,245,126
compiled_iseq_count: 4,796
failed_iseq_count: 447
compile_time: 791ms
profile_time: 9ms
gc_time: 9ms
invalidation_time: 68ms
vm_write_pc_count: 63,283,243
vm_write_sp_count: 61,939,447
vm_write_locals_count: 61,939,447
vm_write_stack_count: 61,939,447
vm_write_to_parent_iseq_local_count: 292,458
vm_read_from_parent_iseq_local_count: 6,576,263
code_region_bytes: 22,872,064
side_exit_count: 10,837,266
total_insn_count: 517,075,555
vm_insn_count: 162,674,783
zjit_insn_count: 354,400,772
ratio_in_zjit: 68.5%
```
</details>
---------
Co-authored-by: Max Bernstein <ruby@bernsteinbear.com>
What is Ruby?
Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and serialized files, or manage system tasks. It is simple, straightforward, and extensible.
Features of Ruby
- Simple Syntax
- Normal Object-oriented Features (e.g. class, method calls)
- Advanced Object-oriented Features (e.g. mix-in, singleton-method)
- Operator Overloading
- Exception Handling
- Iterators and Closures
- Garbage Collection
- Dynamic Loading of Object Files (on some architectures)
- Highly Portable (works on many Unix-like/POSIX compatible platforms as well as Windows, macOS, etc.) cf. https://docs.ruby-lang.org/en/master/maintainers_md.html#label-Platform+Maintainers
How to get Ruby
For a complete list of ways to install Ruby, including using third-party tools like rvm, see:
https://www.ruby-lang.org/en/downloads/
You can download release packages and the snapshot of the repository. If you want to download whole versions of Ruby, please visit https://www.ruby-lang.org/en/downloads/releases/.
Download with Git
The mirror of the Ruby source tree can be checked out with the following command:
$ git clone https://github.com/ruby/ruby.git
There are some other branches under development. Try the following command to see the list of branches:
$ git ls-remote https://github.com/ruby/ruby.git
You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source) if you are a committer.
How to build
See Building Ruby
Ruby home page
Documentation
Mailing list
There is a mailing list to discuss Ruby. To subscribe to this list, please send the following phrase:
join
in the mail subject (not body) to the address ruby-talk-request@ml.ruby-lang.org.
Copying
See the file COPYING.
Feedback
Questions about the Ruby language can be asked on the Ruby-Talk mailing list or on websites like https://stackoverflow.com.
Bugs should be reported at https://bugs.ruby-lang.org. Read "Reporting Issues" for more information.
Contributing
See "Contributing to Ruby", which includes setup and build instructions.
The Author
Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.