Как каждый идет о понимании исходного кода GNU?

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

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

Я имею немного опыта с Java, C++ и Python, если это имеет значение.

Спасибо!

15
задан Max Dwayne 16 June 2010 в 06:18
поделиться

7 ответов

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

5
ответ дан 1 December 2019 в 01:53
поделиться

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

4
ответ дан 1 December 2019 в 01:53
поделиться

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

Вам, конечно, необходимо ознакомиться с инструментами, но вам не нужно становиться экспертом.

1
ответ дан 1 December 2019 в 01:53
поделиться

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

1
ответ дан 1 December 2019 в 01:53
поделиться

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

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

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

Это, конечно, только мое мнение, и вы можете отнестись к нему с недоверием, если хотите:)

7
ответ дан 1 December 2019 в 01:53
поделиться

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

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

0
ответ дан 1 December 2019 в 01:53
поделиться

Программы 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 , который выполняет фактическую запись.

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

14
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: