Các chương trình GNU lớn và phức tạp. Kích thước của GNU Hello World cho thấy rằng ngay cả dự án GNU đơn giản cũng cần rất nhiều mã và cấu hình xung quanh nó.
Các autotools rất khó hiểu đối với người mới bắt đầu, nhưng bạn không cần phải hiểu chúng để đọc mã. Ngay cả khi bạn sửa đổi mã, hầu hết thời gian bạn chỉ có thể chạy thực hiện để biên dịch các thay đổi của mình.
Để đọc mã, bạn cần một trình soạn thảo tốt (VIM, Emacs) hoặc IDE (Eclipse) và một số công cụ để điều hướng qua nguồn. Dự án tar chứa một thư mục src, đó là một nơi tốt để bắt đầu. Chương trình luôn bắt đầu bằng chức năng chính, do đó, hãy
grep main *.c
hoặc sử dụng IDE để tìm kiếm chức năng này. Nó ở dạng tar.c. Bây giờ, hãy bỏ qua tất cả nội dung khởi tạo, cho đến
/* Main command execution. */
Ở đó, bạn sẽ thấy một công tắc cho các tiểu ban. Nếu bạn vượt qua -x nó làm điều này, nếu bạn vượt qua -c nó làm điều đó, vv Đây là cấu trúc phân nhánh cho các lệnh đó. Nếu bạn muốn biết những macro này là gì, hãy chạy
grep EXTRACT_SUBCOMMAND *.h
ở đó bạn có thể thấy chúng được liệt kê chung.h.
Dưới EXTRACT_SUBCOMMAND bạn nhìn thấy một cái gì đó buồn cười:
read_and (extract_archive);
Định nghĩa của read_and() (một lần nữa thu được với grep):
read_and (void (*do_something) (void))
Tham số duy nhất là một con trỏ chức năng như một callback , do đó read_and sẽ được đọc một cái gì đó và sau đó gọi hàm extract_archive
. Một lần nữa, grep trên đó và bạn sẽ thấy điều này:
if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
{
if (fun && (*fun) (current_stat_info.file_name, typeflag)
&& backup_option)
undo_last_backup();
}
else
skip_member();
Lưu ý rằng công việc thực sự xảy ra khi gọi fun
. fun
lại là con trỏ hàm, được đặt trong tệp chuẩn_để_extract. fun
có thể trỏ đến extract_file
, văn bản thực tế.
Tôi hy vọng tôi đã hướng dẫn bạn rất nhiều điều này và chỉ cho bạn cách tôi điều hướng thông qua mã nguồn. Vui lòng liên hệ với tôi nếu bạn có câu hỏi liên quan.
Phải có một trò đùa ẩn trong thực tế là phiên bản mới nhất của GNU Hello (2.4.90) là bản tải xuống 566 KB, dưới dạng bản lưu trữ tar.gz. Đó chỉ là ... đáng sợ. – unwind
@unwind GNU Hello không chỉ là chương trình "Hello World": nó in "Hello World" bằng nhiều ngôn ngữ, làm cho cà phê và cho bạn mượn tiền khi bạn cần. – ereOn
GNU Hello là bộ xương hiển thị mức sử dụng cơ bản của các Autotools, cách phân tích các tùy chọn dòng lệnh và cách hỗ trợ quốc tế hóa. Phần lớn tải xuống có thể là các tệp tin nhắn như [this] (http://cvs.savannah.gnu.org/viewvc/hello/po/it.po?root=hello&view=markup) –