Computer >> Máy Tính >  >> Lập trình >> Ruby

Khám phá mã nguồn MRI

Nếu bạn đã sử dụng Ruby một thời gian, bạn có thể tò mò về cách hoạt động của một số thứ.

Một cách để tìm hiểu sâu về nội bộ của Ruby là đọc mã nguồn làm cho nó hoạt động. Ngay cả khi bạn không biết C, bạn vẫn có thể học được một số điều thú vị.

Mã nguồn có thể được tìm thấy trên github repo cho Ruby.

Lý tưởng nhất là bạn muốn sử dụng một công cụ như Codequery cho phép bạn dễ dàng tìm thấy tên lớp và phương thức.

Khám phá các lớp cốt lõi

Hầu hết việc khám phá của bạn sẽ diễn ra trong thư mục gốc. Đó là nơi bạn sẽ tìm thấy mã nguồn cho tất cả các lớp cốt lõi như Object trong object.c hoặc Array trong array.c .

Hãy xem qua hash.c .

Nếu cuộn hết xuống dòng 4468, bạn sẽ thấy một số tên quen thuộc.

Hãy bắt đầu với điều này :

 rb_cHash =rb_define_class ("Băm", rb_cObject); 

Trong dòng này, Hash lớp đang được định nghĩa bởi rb_define_class hàm số. Đối số thứ hai (rb_cObject ) là lớp cha của lớp này.

Nếu bạn muốn tìm hiểu quá trình xác định một lớp hoạt động như thế nào, bạn hãy tìm kiếm rb_define_class .

Khám phá mã nguồn MRI

Phần đầu tiên từ rb_define_class kiểm tra xem lớp đã được xác định chưa.

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

Bên trong if đó khối, Ruby thực hiện một số kiểm tra sự tỉnh táo, chẳng hạn như đảm bảo rằng chúng tôi đang làm việc với một lớp đã được xác định.

Nếu lớp không được định nghĩa thì nó sẽ được định nghĩa như thế này:

 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 cho tất cả các phương pháp này, nhưng tôi nghĩ chúng khá dễ hiểu.

Trong st_add_direct , phần ‘st’ có nghĩa là ‘bảng biểu tượng’, và đây chỉ là một bảng băm. rb_const_set hàm đặt một hằng số trên Object lớp học, điều này sẽ làm cho lớp học có sẵn ở mọi nơi.

rb_class_inherited gọi inherited phương thức của lớp cha, bạn có thể tìm tài liệu cho phương thức này tại đây.

Phần tiếp theo của mã bao gồm các định nghĩa phương pháp. MRI sử dụng rb_define_method để làm điều đó.

Đây là một 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_de (rb_cHash, "length"? , rb_hash_empty_p, 0); 

Các đối số diễn ra như thế này :

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

rb_define_singleton_method hàm được sử dụng để định nghĩa một phương thức lớp.

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

Phần thân của rb_define_singleton_method chỉ là một dòng mã:

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

Nếu bạn muốn tiếp tục khám phá, một tệp tốt để xem là object.c .

Khám phá Thư viện Chuẩn

Được rồi, vậy là đủ C cho ngày hôm nay!

Làm thế nào về việc đọc một số mã Ruby?

Thư viện chuẩn Ruby được viết bằng Ruby và bạn có thể tìm thấy nó trong /lib thư mục.

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

Một tập hợp tương tự như một mảng, nhưng với thuộc tính đặc biệt là tất cả các phần tử là duy nhất. Nói cách khác, một tập hợp không chứa bản sao.

Nó hoạt động như thế nào? Có bất kỳ thuật toán ưa thích nào đằng sau điều này không?

Nếu chúng ta xem qua set.rb bạn sẽ nhanh chóng phát hiện ra rằng điều này được hỗ trợ bởi một Hash đối tượng.

 # Thêm đối tượng đã cho vào tập hợp và trả về chính nó. Sử dụng + merge + để # thêm nhiều phần tử cùng lúc .def add (o) @hash [o] =true selfendalias < 

Vì vậy, nếu bạn thêm một phần tử trùng lặp, không cần phải kiểm tra xem nó đã tồn tại hay chưa, nó sẽ chỉ ghi đè phần tử cũ.

Khám phá Rubinius

Một cách khác để khám phá mã nguồn của Ruby là xem xét các triển khai thay thế như Rubinius.

Mã rubinius được tổ chức theo một cách khác với MRI, vì vậy, để làm được điều này, tôi muốn sử dụng Github và tính năng 'tìm tệp'.

Khám phá mã nguồn MRI

Nếu bạn muốn tìm hiểu thêm về Enumerable sau đó bạn chỉ cần nhập 'enumerable' và bạn sẽ thấy tất cả các tệp liên quan.

Kết luận

Như bạn đã thấy, bạn có thể học cách Ruby thực hiện mọi thứ mà không cần nỗ lực nhiều. Hãy tiếp tục và tự khám phá và cho mọi người biết những gì bạn đã khám phá!

Nếu bạn thích bài đăng này, đừng quên tham gia bản tin của tôi, chỉ cần gửi email của bạn vào biểu mẫu bên dưới và bạn sẽ nhận được cập nhật miễn phí và nội dung độc quyền.