Как можно понять исходный код GNU? - PullRequest
15 голосов
/ 16 июня 2010

Мне очень жаль, если это звучит немного глупо. Я только что закончил читать K & R и работал над некоторыми упражнениями. Этим летом для моего проекта я думаю о повторной реализации утилиты linux для дальнейшего расширения моего понимания C, поэтому я загрузил исходные тексты для GNU tar и sed, поскольку они оба кажутся интересными. Однако у меня возникают проблемы с пониманием того, где это начинается, где находится основная реализация, откуда взялись все странные макросы и т. Д.

У меня много времени, так что это не проблема. Должен ли я сначала ознакомиться с набором инструментов GNU (т.е. make, binutils, ..), чтобы понять программы? Или, может быть, я должен начать с чего-то немного меньшего (если есть такая вещь)?

У меня немного опыта работы с Java, C ++ и python, если это имеет значение.

Спасибо!

Ответы [ 8 ]

14 голосов
/ 16 июня 2010

Программы GNU большие и сложные. Размер GNU Hello World показывает, что даже для самого простого проекта GNU требуется много кода и конфигурации вокруг него.

Автоинструменты трудны для понимания новичку, но вам не нужно понимать их, чтобы прочитать код. Даже если вы измените код, большую часть времени вы можете просто запустить make для компиляции ваших изменений.

Чтобы читать код, вам нужен хороший редактор (VIM, Emacs) или IDE (Eclipse) и некоторые инструменты для навигации по источнику. Проект tar содержит каталог src, с которого можно начать. Программа всегда запускается с основной функцией, так что

grep main *.c

или используйте вашу IDE для поиска этой функции. Это в tar.c. Теперь пропустите все вещи инициализации, до

/* Main command execution.  */

Там вы видите переключатель для подкоманд. Если вы передаете -x, он делает это, если вы передаете -c, он делает это и т. Д. Это структура ветвления для этих команд. Если вы хотите узнать, что это за макрос, запустите

grep EXTRACT_SUBCOMMAND *.h

там вы можете видеть, что они перечислены в common.h.

Ниже EXTRACT_SUBCOMMAND вы видите что-то смешное:

read_and (extract_archive);

Определение read_and () (снова получено с помощью grep):

read_and (void (*do_something) (void))

Единственный параметр - это указатель на функцию , такой как обратный вызов, поэтому read_and предположительно что-то прочитает и затем вызовет функцию extract_archive. Снова, grep на это, и вы увидите это:

  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 ();

Обратите внимание, что настоящая работа происходит при вызове fun. fun снова указатель на функцию, который устанавливается в prepare_to_extract. fun может указывать на extract_file, что делает фактическое написание.

Надеюсь, я много рассказал вам об этом и показал, как я перемещаюсь по исходному коду. Не стесняйтесь обращаться ко мне, если у вас есть вопросы.

7 голосов
/ 16 июня 2010

Проблема с такими программами, как tar и sed, имеет две стороны (это, конечно, мое мнение!).Прежде всего, они оба действительно старые .Это означает, что за эти годы их поддерживали несколько человек, с разными стилями кодирования и разными личностями.Для утилит GNU это обычно довольно хорошо, потому что они обычно обеспечивают достаточно согласованный стиль кодирования, но это все еще проблема.Другая проблема в том, что они невероятно портативные .Обычно «переносимость» воспринимается как хорошая вещь, но когда она доведена до крайности, это означает, что ваша кодовая база полна мелких взломов и уловок для обхода неясных ошибок и угловых случаев в конкретных частях оборудования и систем.А для программ, которые широко портированы как tar и sed, это означает, что есть много угловых случаев и непонятных аппаратных средств / компиляторов / ОС, которые необходимо учитывать.

Если вы хотитечтобы изучить C, я бы сказал, что лучшее место для начала - не пытаться изучать код, написанный другими.Скорее попробуйте написать код самостоятельно.Если вы действительно хотите начать с существующей кодовой базы, выберите ту, которая активно поддерживается, где вы можете увидеть изменения, которые другие люди вносят , когда они делают их , следуйте инструкциям в списках рассылки и т. Д.

С хорошо известными программами, такими как tar и sed, вы видите результат обсуждений, которые могли бы произойти, но вы не видите, как разрабатывается программное обеспечениерешения и изменения делаются в режиме реального времени.Это может произойти только с активно поддерживаемым программным обеспечением.

Это, конечно, мое мнение, и вы можете взять его с крошкой соли, если хотите:)

5 голосов
/ 16 июня 2010

Почему бы не скачать исходный код coreutils (http://ftp.gnu.org/gnu/coreutils/)) и взглянуть на такие инструменты, как yes? Менее 100 строк кода C и полностью функциональный, полезный и действительно базовый фрагмент программного обеспечения GNU.

4 голосов
/ 16 июня 2010

GNU Hello , вероятно, самая маленькая и простая программа GNU, и ее легко понять.

1 голос
/ 16 июня 2010

Узнайте, как использовать grep , если вы еще этого не знаете, и используйте его для поиска функции main и всего, что вас интересует.Вы также можете использовать инструменты просмотра кода, такие как ctags или cscope , которые также могут интегрироваться с vim и emacs или использовать IDE, если вам это нравится больше.

1 голос
/ 16 июня 2010

Я знаю, что иногда бывает неудобно перемещаться по коду C, особенно если вы с ним не знакомы.Я предлагаю вам использовать инструмент , который поможет вам просмотреть функции, символы, макросы и т. Д. Затем найдите функцию main ().Конечно, но вам не нужно становиться экспертом.

0 голосов
/ 03 сентября 2013

Осмысление некоторого кода, который использует много макросов, служебных функций и т. Д., Может быть трудным. Чтобы лучше просмотреть код случайного программного обеспечения на C или C ++, я предлагаю такой подход, который я обычно использую:

  1. Установите инструменты разработки Qt и Qt Creator

  2. Загрузите источники, которые вы хотите проверить, и настройте их для компиляции (обычно просто ./configure для GNU).

  3. Запустите qmake -project в корне исходного каталога, чтобы сгенерировать файл Qt .pro для Qt Creator.

  4. Откройте файл .pro в Qt Creator (не используйте теневую сборку при запросе).

  5. Чтобы быть в безопасности, в представлении Qt Creator Projects удалите шаги сборки по умолчанию. Файл .pro предназначен только для навигации внутри Qt Creator.

  6. Необязательно: настройте пользовательские этапы сборки и запуска, если вы хотите собирать и запускать / отлаживать в Qt Creator. Не требуется только для навигации.

  7. Используйте Qt Creator для просмотра кода. Обратите особое внимание на локатор (сочетание клавиш kb Ctrl + K) для поиска материала по имени, а также «следовать символу под курсором» (сочетание клавиш kb F2) и «найти использование» (сочетание клавиш kb Ctrl-Shift-U).

0 голосов
/ 16 июня 2010

Я предлагаю использовать ctags или cscope для просмотра. Вы можете использовать их с vim / emacs . Они широко используются в мире открытого кода.

Они должны быть в хранилище всех основных дистрибутивов Linux.

...