2010-06-16 14 views
13

Tôi thực sự xin lỗi nếu điều này nghe có vẻ ngu ngốc. Tôi vừa đọc xong K & R và tôi đã làm một số bài tập. Mùa hè này, cho dự án của tôi, tôi đang nghĩ đến việc triển khai lại một tiện ích Linux để mở rộng sự hiểu biết của tôi về C hơn nữa vì vậy tôi đã tải về mã nguồn của GNU tar và sed vì cả hai đều có vẻ thú vị. Tuy nhiên, tôi đang gặp khó khăn khi hiểu nơi bắt đầu, nơi triển khai chính, nơi tất cả các macro lạ đến từ, v.v.Làm cách nào để tìm hiểu về mã nguồn GNU?

Tôi có rất nhiều thời gian nên đó không thực sự là vấn đề. Tôi có nên làm quen với GNU toolchain (ví dụ: make, binutils, ..) trước tiên để hiểu các chương trình? Hoặc có lẽ tôi nên bắt đầu với một cái gì đó nhỏ hơn một chút (nếu có một điều như vậy)?

Tôi có ít kinh nghiệm với Java, C++ và python nếu có vấn đề.

Cảm ơn!

Trả lời

4

GNU Hello có lẽ là chương trình GNU nhỏ nhất, đơn giản nhất và dễ hiểu.

+2

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

+2

@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

+1

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) –

1

Tôi biết đôi khi đó là một mớ hỗn độn để điều hướng thông qua mã C, đặc biệt nếu bạn không quen với nó. Tôi khuyên bạn nên sử dụng tool để giúp bạn duyệt qua các chức năng, ký hiệu, macro, v.v. Sau đó, tìm hàm main().

Bạn cần phải tự làm quen với các công cụ, tất nhiên, nhưng bạn không cần phải trở thành chuyên gia.

+0

+1 Tôi rất vui mừng khi điều hướng nguồn có bản phát hành mới. Tôi đã sử dụng nó vào năm 2006 và nó trông giống như một dự án không hoạt động. Dù sao, đó là một công cụ rất tốt. – INS

7

Sự cố với các chương trình như tarsed là gấp đôi (đây chỉ là ý kiến ​​của tôi, tất nhiên!). Trước hết, cả hai đều thực sự là . Điều đó có nghĩa là họ đã có nhiều người duy trì chúng trong những năm qua, với các phong cách mã hóa khác nhau và các tính cách khác nhau. Đối với các tiện ích GNU, nó thường khá tốt, vì chúng thường thực thi một kiểu mã hóa phù hợp hợp lý, nhưng nó vẫn là một vấn đề. Vấn đề khác là chúng không thể tin được xách tay. Thông thường, "tính di động" được xem là một điều tốt, nhưng khi được đưa đến thái cực, nó có nghĩa là codebase của bạn kết thúc với rất nhiều hacks và thủ thuật để giải quyết các lỗi và các trường hợp góc trong các phần cứng và hệ thống cụ thể. Và đối với các chương trình được chuyển đổi rộng rãi như tarsed, điều đó có nghĩa là có trường hợp góc và phần cứng/trình biên dịch/hệ điều hành tối thiểu cần tính đến.

Nếu bạn muốn học C, thì tôi sẽ nói nơi tốt nhất để bắt đầu không phải là cố gắng học mã mà người khác đã viết. Thay vào đó, hãy thử tự mình viết. Nếu bạn thực sự muốn bắt đầu với một codebase hiện tại, hãy chọn một mã đang được duy trì tích cực, nơi bạn có thể thấy những thay đổi mà những người khác đang thực hiện khi họ làm cho chúng, theo dõi trong các cuộc thảo luận trên danh sách gửi thư và cứ thế.

Với các chương trình cũng như thành lập như tarsed, bạn sẽ thấy kết quả của các cuộc thảo luận điều đó sẽ xảy ra, nhưng bạn không thể nhìn thấy những quyết định thiết kế phần mềm và những thay đổi đang được thực hiện trong thời gian thực. Điều đó chỉ có thể xảy ra với phần mềm được duy trì tích cực.

Đó chỉ là quan điểm của tôi tất nhiên, và bạn có thể mang nó theo một hạt muối nếu bạn thích :)

+0

Tôi đồng ý rằng cách tốt nhất để học C là lập trình. Tuy nhiên, một khi bạn đã nắm vững cú pháp và sắc thái của ngôn ngữ, nó luôn giúp bạn đọc kỹ mã viết, điều này sẽ cung cấp cho bạn ý tưởng về các cách mới thực tế có thể áp dụng cấu trúc cú pháp/dữ liệu của ngôn ngữ. – itisravi

+0

@itisravi: Tôi vẫn tin rằng tốt hơn là bạn nên biết rằng bằng cách theo dõi sự phát triển khi nó xảy ra, hơn là sau khi thực tế. Ví dụ, nếu bạn thấy một đoạn mã và bạn tự hỏi "tại sao họ lại làm như vậy, tại sao họ không làm điều này (cách khác)?" Nếu bạn có thể gửi một tin nhắn đến một danh sách gửi thư và * hỏi * thì bạn sẽ học nhiều hơn nếu bạn chấp nhận bất cứ điều gì đã được viết. –

1

Tìm hiểu làm thế nào để sử dụng grep nếu bạn không biết nó đã và sử dụng nó để tìm kiếm cho hàm chính và mọi thứ khác mà bạn quan tâm. Bạn cũng có thể muốn sử dụng các công cụ duyệt mã như ctags hoặc cscope cũng có thể tích hợp với vim và emacs hoặc sử dụng IDE nếu bạn thích điều đó tốt hơn.

12

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.

+0

+1 để biết ví dụ chi tiết. BTW, đây cũng là một ví dụ về những điều đơn giản có thể được làm phức tạp như thế nào. Vì một số lý do, một số người nghĩ rằng đó là niềm vui: - / – PauliL

5

Tại sao không tải xuống nguồn lõi (http://ftp.gnu.org/gnu/coreutils/) và xem các công cụ như yes? Ít hơn 100 dòng mã C và một phần mềm GNU đầy đủ chức năng, hữu ích và thực sự cơ bản.

0

Tôi khuyên bạn nên sử dụng ctags hoặc cscope để duyệt. Bạn có thể sử dụng chúng với vim/emacs. Chúng được sử dụng rộng rãi trong thế giới nguồn mở.

Chúng phải nằm trong kho lưu trữ của mọi bản phân phối Linux chính.

0

Hiểu được một số mã sử dụng nhiều macro, chức năng tiện ích, v.v ... có thể khó. Để duyệt tốt hơn mã của một C ngẫu nhiên hoặC++ phần mềm C, tôi đề nghị phương pháp này, đó là những gì tôi thường sử dụng:

  1. Cài đặt các công cụ phát triển Qt và Qt Creator

  2. Tải về các nguồn mà bạn muốn kiểm tra và thiết lập chúng để biên soạn (thường chỉ là ./configure cho các công cụ GNU).

  3. Chạy qmake -project trong thư mục gốc của thư mục nguồn, để tạo tệp Qt .pro cho Qt Creator.

  4. Mở tệp .pro trong Qt Creator (không sử dụng tính năng tạo bóng khi được yêu cầu).

  5. Để an toàn, trong chế độ xem Qt Creator Projects, hãy xóa các bước xây dựng mặc định. Tệp .pro chỉ dành cho điều hướng bên trong Trình tạo Qt.

  6. Tùy chọn: thiết lập các bước tạo và chạy tùy chỉnh, nếu bạn muốn xây dựng và chạy/gỡ lỗi trong Trình tạo Qt. Không cần thiết cho điều hướng.

  7. Sử dụng Trình tạo Qt để duyệt mã. Lưu ý đặc biệt là định vị (kb phím tắt Ctrl + K) để tìm nội dung theo tên và "theo biểu tượng dưới con trỏ" (phím tắt kb F2) và "tìm tập quán" (kb phím tắt Ctrl-Shift-U).