Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Deep Dive Vào Mã Nguồn MRI Ruby

Nếu dùng Ruby một thời gian, bạn có thể tò mò cách một số thứ hoạt động bên dưới.

Cách đào sâu vào nội tại Ruby là đọc mã nguồn làm cho nó chạy. Dù không biết C, vẫn có thể hiểu điều thú vị.

Mã nguồn trên github repo của Ruby.

Lý tưởng dùng công cụ như Codequery giúp dễ dàng tìm tên lớp và phương thức.

Khám Phá Lớp Cốt Lõi

Phần lớn khám phá xảy ra ở thư mục gốc. Nơi chứa mã nguồn cho tất cả lớp cốt lõi như Object trong object.c hoặc Array trong array.c.

Hãy xem hash.c.

Cuộn xuống dòng 4468 sẽ thấy tên quen thuộc.

Bắt đầu với này:

rb_cHash = rb_define_class("Hash", rb_cObject);

Dòng này, lớp Hash được định nghĩa bởi hàm rb_define_class. Tham số thứ hai (rb_cObject) là superclass cho lớp này.

Muốn học quy trình định nghĩa lớp hoạt động như thế nào, tìm rb_define_class.

Deep Dive Vào Mã Nguồn MRI Ruby

Phần đầu từ rb_define_class kiểm tra lớp đã được định nghĩa chưa.

if (rb_const_defined(rb_cObject, id)) {
  // ...
}

Bên trong block if, Ruby làm vài kiểm tra an toàn, như đảm bảo làm việc với lớp đã định nghĩa.

Nếu lớp chưa định nghĩa thì được định nghĩa như sau:

klass = rb_define_class_id(id, super);
st_add_direct(rb_class_tbl, id, klass);
rb_name_class(klass, id);
rb_const_set(rb_cObject, id, klass);
rb_class_inherited(super, klass);
return klass;

Bạn có thể đọc định nghĩa tất cả phương thức này, nhưng mình nghĩ chúng tự giải thích.

Trong st_add_direct, phần 'st' nghĩa là 'symbol table', chỉ là bảng băm. Hàm rb_const_set set hằng số trên lớp Object, làm lớp khả dụng mọi nơi.

Và rb_class_inherited gọi phương thức inherited của superclass, tài liệu ở đây.

Phần tiếp theo của code gồm định nghĩa phương thức. MRI dùng rb_define_method.

Ví dụ:

rb_define_method(rb_cHash,"index", rb_hash_index, 1);
rb_define_method(rb_cHash,"size", rb_hash_size, 0);
rb_define_method(rb_cHash,"length", rb_hash_size, 0);
rb_define_method(rb_cHash,"empty?", rb_hash_empty_p, 0);

Tham số như sau:

  • Tham số đầu: lớp phương thức được định nghĩa trên đó
  • Tham số hai: tên phương thức, tham số ba: hàm C thực thi phương thức này
  • Tham số cuối: số lượng đối số phương thức Ruby yêu cầu (giá trị âm nghĩa là đối số tùy chọn)

Hàm rb_define_singleton_method dùng định nghĩa phương thức lớp.

rb_define_singleton_method(rb_cHash, "[]", rb_hash_s_create, -1);

Thân hàm rb_define_singleton_method chỉ một dòng:

rb_define_method(singleton_class_of(obj), name, func, argc);

Muốn tiếp tục khám phá, tệp tốt để xem là object.c.

Khám Phá Thư Viện Chuẩn

Đủ C cho hôm nay!

Đọc code Ruby thì sao?

Thư viện chuẩn Ruby viết bằng Ruby, tìm thấy dưới thư mục /lib.

Thư viện chuẩn chứa OpenStruct, mã hóa Base64 và cấu trúc dữ liệu Set.

Set tương tự mảng, nhưng với đặc tính đặc biệt: tất cả phần tử duy nhất. Nói cách khác, set không chứa bản sao.

Cơ chế hoạt động ra sao? Có thuật toán phức tạp không?

Xem set.rb nhanh chóng phát hiện nó backed bởi đối tượng Hash.

# Adds the given object to the set and returns self. Use +merge+ to
# add many elements at once.
def add(o)
  @hash[o] = true
  self
end
alias << add

Vì thế nếu thêm phần tử trùng lặp, không cần kiểm tra đã tồn tại, chỉ ghi đè cái cũ.

Khám Phá Rubinius

Cách khác khám phá mã nguồn Ruby là xem triển khai thay thế như Rubinius.

Code Rubinius tổ chức khác MRI, nên dùng Github và tính năng 'find file'.

Deep Dive Vào Mã Nguồn MRI Ruby

Muốn học thêm về Enumerable thì gõ 'enumerable' sẽ thấy tất cả tệp liên quan.

Kết Luận

Như bạn thấy, có thể học Ruby làm việc bên dưới mà không tốn nhiều công sức. Hãy tự khám phá và cho mọi người biết bạn phát hiện gì!

Nếu thích bài viết đừng quên tham gia bản tin, chỉ cần thả email vào form dưới để nhận cập nhật miễn phí & nội dung độc quyền.