Skip to content

Latest commit

 

History

History
283 lines (143 loc) · 72.7 KB

GUIDE_ru.md

File metadata and controls

283 lines (143 loc) · 72.7 KB

Руководство по GitHub Code Vault

Введение

Этот архив, GitHub Code Vault, был создан программой GitHub Archive Program, задача которой - сохранить программное обеспечение с открытым исходным кодом для будущих поколений. Вы можете читать его через год, или через тысячу лет, но в любом случае мы надеемся, что его содержание и, возможно, сама концепция открытого исходного кода будут вам полезны.

Это в первую очередь архив программного обеспечения. Программное обеспечение - это серия команд, используемых для управления действиями компьютера. Компьютер - это устройство, которое может автоматически выполнять математические функции намного быстрее, чем человеческий разум, и обладает мощью, намного превосходящей нас. Наши компьютеры используются для того, чтобы помочь раскрыть секреты вселенной, соединить все человечество в вездесущей информационной сети, достаточно быстро манипулировать сигналами, чтобы передавать звуки и проецировать детализированные движущиеся изображения на электрические экраны, а также управлять чрезвычайно мощными механизмами, которые далеко превосходит как возможности, так и точность человеческого труда.

Компьютер без программного обеспечения не может сделать ничего из этого. Компьютер - это экстраординарная и удивительная вещь, но без программного обеспечения вся его мощь бесполезна. Цель этого архива - передать вам то, что мы знаем о программном обеспечении.

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

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

Проект с открытым исходным кодом - это коллективная работа самоорганизующегося сообщества, которое может исчисляться тысячами. Совокупность всех открытых программных проектов, заархивированных здесь, является работой сообщества многих миллионов. Хотя некоторые лица могут обладать особыми правами в рамках любого конкретного проекта, такими как возможность одобрения или отклонения предлагаемых изменений в последней официальной версии его исходного кода, никто никогда не владеет им. Каждый человек имеет полное право взять и использовать полную копию любого проекта с открытым исходным кодом в любое время, без каких-либо затрат или наказаний. Это известно как ответвление проекта.

Когда многие люди работают над исходным кодом в одно и то же время, сложно отслеживать и интегрировать все их изменения. Проект с открытым исходным кодом, известный как «Git», посвящен решению этой проблемы. Он объединяет полную историю всех дополнений и изменений в проекте в объект, известный как Git-репозиторий. Этот архив по сути является архивом таких хранилищ.

Этот архив был создан компанией под названием «GitHub», которая предоставляет сервис, который позволяет людям по всему миру хранить написанные ими программы, отслеживать изменения в этих программах и сотрудничать с другими для их улучшения и расширения. GitHub предоставляет свои услуги бесплатно разработчикам общедоступного программного обеспечения с открытым исходным кодом. У него десятки миллионов таких пользователей.

Ниже приведено описание того, что, по нашему мнению, вам необходимо знать и иметь, чтобы наилучшим образом использовать этот программный архив. Если вы не знаете или не понимаете кое-что из этого, не отчаивайтесь! Мы также включили руководство по выполнению этих требований. Если по какой-либо причине вы не можете выполнить их самостоятельно, тогда смогут ваши потомки.

Что нужно для использования архива

В принципе, все, что вам нужно для доступа к содержимому этого архива, это источник освещения и какая-то лупа. Тем не менее, большая часть (хотя и не все) его данных была очень плотно упакована на рулоны пленки в кодированной и сжатой форме. Чтение, декодирование и распаковка этих данных потребуют значительных вычислений. Теоретически это можно сделать без компьютеров, но это будет очень утомительно и сложно.

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

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

Что внутри

Архив настолько велик - примерно 24 триллиона байтов (поясняется ниже) - потому что он чрезвычайно инклюзивен и демократичен. Многие миллионы людей делают программное обеспечение, которое они пишут, доступным каждому. Этот архив включает в себя моментальный снимок - то есть единственную копию в один момент времени - всего общедоступного программного обеспечения, которое активно разрабатывают пользователи GitHub. Это означает, что он включает в себя десятки миллионов отдельных хранилищ. Мы надеемся, что этот широкий, демократический подход будет интересен историкам будущего.

Репозитории, включенные в этот архив, были определены исключительно по времени их последнего коммита, то есть при последнем обновлении, и по количеству звездочек. (Все пользователи GitHub могут пометить общедоступные репозитории, чтобы указать, что они представляют для них интерес или значимость.) Снимок был сделан 02.02.2020, то есть во второй день февраля, в 2020 год григорианского календаря, как мы считаем время. В него включены следующие репозитории: все репозитории с любыми коммитами в течение предыдущих 80 дней; все репозитории с хотя бы одной звездочкой с любыми коммитами в течение предыдущих 365 дней; и все репозитории, имеющие не менее 250 звезд, независимо от того, когда они последний раз обновлялись.

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

Обзор архива

Архив состоит из 201 ролика фильма: один «ролик-гид» с понятной для человека информацией и руководствами и 200 роликов архивированного программного обеспечения. Каждый барабан включает в себя 65 000 отдельных кадров. Рамки в начале каждого барабана и рамки направляющего барабана включают в себя читаемый человеком текст и изображения. Все остальные кадры фильма состоят из цифровых данных, хранящихся в визуальной форме, известной как QR-коды.

Цифровые данные означают данные, которые в конечном итоге хранятся в двоичном формате, то есть в виде нулей и единиц, поскольку сами компьютеры управляются двоично - электрическими сигналами, которые либо «включены», либо «выключены», что соответствует 1 или 0, и поэтому двоичные данные гораздо проще для компьютеров, чтобы понять, чем любой другой.

Читаемые человеком метаданные, хранящиеся в начале каждого ролика, включают в себя информацию о самом фильме, руководство по используемому QR-кодированию, программу для его декодирования и указатель. Индекс перечисляет заголовок, номер начального кадра и контрольную сумму для каждого файла, сохраненного на этом барабане.

Файл представляет собой единый связный объект данных. Контрольная сумма - это уникальное значение из расчета, известное как хеш-функция, которое выполняется по всему содержимому файла, чтобы гарантировать, что его содержимое не было повреждено или повреждено; хеш-функция, используемая в архиве, известна как SHA-1.

Каждый QR-код состоит из поля крошечных белых или черных квадратов, которые занимают почти весь кадр фильма. Мы используем QR-коды, потому что они намного более компактны и надежны, чем текст, читаемый человеком. QR-код декодирует в двоичные данные, то есть серию единиц и нулей.

Это декодирование является лишь первым шагом в превращении этих двоичных данных в значимую информацию. Это сжатые данные, что означает, что они были сжаты для экономии места, подобно тому, как можно написать «128xA» вместо того, чтобы писать букву A 128 раз. После декодирования он должен быть распакован.

Результат после распаковки называется архивным файлом: единственным файлом, содержащим все содержимое репозитория одного программного проекта. Большинство репозиториев содержат много файлов, поэтому этот архивный файл похож на книгу, которая содержит много отдельных глав, или на блок, который содержит много других блоков. Обычно выгодно, хотя и не обязательно, распаковывать архивный файл в файлы его компонентов, прежде чем получить к ним доступ.

Наконец, каждый файл компонента представляет собой собственный набор двоичных данных, то есть единиц и нулей. Можно понять данные, если вы знаете их формат. Например, в формате, известном как «UTF-8», наиболее распространенном формате в архиве, единицы и нули делятся на группы по восемь, известные как байты, байт 01000001 представляет букву A; три байта 01101001 01101110 01110100 представляют слово int; и два байта 11000011 и 10000011 представляют букву М (А с тильдовым акцентом сверху).

Этот процесс архивации данных, двоичные файлы, упакованные в архивные файлы, которые сначала сжимаются, а затем кодируются QR-кодом, очевидно сложен по сравнению с простым написанием понятного человеку текста. Процесс разархивирования, который вам нужно будет пройти - QR в сжатый бинарный файл; сжатый в несжатый; архивировать файл в несколько файлов; текстовые файлы для читабельного текста - это так же сложно. Это потому, что эта сложность позволяет нам хранить Данные, которые в противном случае были бы возможны, относительно легко читались компьютером.

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

Файлы, каталоги, репозитории и форматы данных.

Может быть полезно обсудить, как архив логически разделен. В частности, обсуждение файлов, каталогов и форматов данных может оказаться полезным.

Файл - это набор данных, сгруппированных в единое целое с одним именем: данные воспринимаются как песок, а файл как мешок, который может содержать песок и только песок. Каталог - это набор файлов: думайте о нем как о мешке, который может вместить только другие мешки. Следуя этой метафоре, каждый репозиторий состоит из внешнего каталога, известного как корневой каталог, который содержит несколько файлов и / или несколько каталогов. Каждый каталог может, в свою очередь, содержать как файлы, так и каталоги.

Эта структура предпочтительна, потому что с файлами, организованными в группы, работать намного проще, чем с одной коллекцией файлов. Идентификатор конкретного файла во внешнем каталоге состоит из имен всех входящих в него каталогов, начиная с корня, за которым следует его собственное индивидуальное имя с символом / между каждым именем. Например, файл с именем README.md в корневом каталоге будет идентифицирован как /README.md, а файл с именем /public/www/index.html будет файлом index.html в каталоге «www» внутри публичный каталог внутри корневого каталога.

Каждый репозиторий, в свою очередь, имеет два имени, разделенных разделителем, который в архиве является символом _ или подчеркивания. (Исторически это был / или косая черта, но он также используется для указания каталога, поэтому мы используем _ для ясности.) Первое имя - учетная запись GitHub, которой принадлежит этот репозиторий; второе имя отдельного хранилища. Комбинация идентификаторов репозитория и файла может использоваться для уникальной идентификации отдельного файла в архиве. Например, файл 'package.json' в каталоге 'web' в хранилище 'ykarma' в учетной записи GitHub 'rezendi' может быть однозначно идентифицирован как /web/package.json в rezendi_ykarma в архиве.

Разные виды файлов имеют разные цели. Архив GitHub состоит в основном из текстовых файлов, то есть файлов, данные которых предназначены для представления письменного языка. Большая часть программного обеспечения написана в текстовых файлах, содержащих высоко структурированный текст, известный как исходный код. Специальная программа, известная как компилятор, преобразует этот читаемый человеком исходный код в машиночитаемые инструкции, известные как скомпилированный код или машинный код.

Файлы, которые не являются текстовыми файлами, например файлы, которые представляют визуальные изображения или содержат скомпилированный код, часто называют двоичными файлами. К сожалению, это вводящий в заблуждение термин, поскольку текстовые файлы в конечном итоге также имеют значения 1 и 0. Мы будем ссылаться на файлы, которые не являются текстовыми файлами, как на нетекстовые файлы.

Есть много способов представить письменный человеческий язык, используя 1 и 0. По историческим причинам большая часть исходного кода изначально была написана так называемым латинским шрифтом. Латинский алфавит имеет 26 основных символов, которые используются для представления произносимых слов, каждое из которых имеет две формы: верхний и нижний регистр. Он также имеет 10 цифр для представления чисел. Латинский алфавит, наряду с различными другими связанными символами, используемыми для обозначения структуры и других понятий, кодируется в 1 и 0 в формате, известном как «ASCII», который может представлять 128 различных символов и по историческим причинам доминировал в большинстве программ в течение многих лет.

Тем не менее, латинский алфавит является лишь небольшим подмножеством множества способов, которыми люди выражают себя на письменном языке. Для поддержки других сценариев, в то же время позволяя всему программному обеспечению, написанному для использования ASCII, продолжать работать без изменений (концепция, известная как обратная совместимость), был представлен другой формат данных, известный как «UTF-8».

ASCII остается наиболее распространенным форматом исходного кода. Каждый ролик этого архива содержит руководство по символам ASCII. ASCII является подмножеством UTF-8, то есть все кодировки ASCII также являются кодировками UTF-8. Направляющий ролик дополнительно содержит спецификацию всех символов UTF-8. Почти все текстовые файлы в этом архиве должны быть закодированы как UTF-8.

Нетекстовые файлы включают файлы, предназначенные для представления изображений и отформатированных документов. Широко используется соглашение о том, что имена файлов заканчиваются на «.» символ, за которым следует суффикс, указывающий тип файла. Например, имя файла, которое заканчивается на .jpg, вероятно, является файлом изображения JPEG; тот, который заканчивается на .PNG, скорее всего, файл изображения Portable Network Graphic; и тот, который заканчивается .pdf файлом формата переносимого документа.

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

Как извлечь содержимое архива

Здесь мы дадим обзор того, как распаковать определенный архивированный репозиторий в его различные файлы. Опять же, этот процесс состоит из:

  1. Определение конкретного барабана и кадров, на которых архивируются данные репозитория.

  2. Декодирование из QR-кодов полей черного, белого и серого пикселей на этих кадрах в двоичный файл с последовательностью (по меньшей мере, тысяч, а часто и миллионов) единиц и нулей.

  3. Распаковка бинарного файла в более длинный, несжатый архивный файл.

  4. Распаковка архивного файла в отдельные вложенные файлы, которые в нем содержатся. Однако обратите внимание, что архивные данные, как правило, понятны, хотя и беспорядочны, даже если этот шаг пропущен.

  5. Наконец, преобразование каждого из этих подфайлов - самих последовательностей 1 и 0, которые могут варьироваться от очень коротких до очень длинных - в письменные символы, если они являются текстовыми файлами.

Идентификация конкретного барабана и кадров, на которых архивируются данные репозитория.

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

Каждый репозиторий на этом барабане является одним из этих файлов пользовательских данных. Список включает в себя уникальный идентификатор, идентификатор файла и имя для каждого из этих файлов. Например, в хранилище CPython для учетной записи Python идентификатор файла должен быть указан как 12345, а имя - как python_cpython.tar.

После списка файлов пользовательских данных приведен список местоположений цифровых данных. Этот список включает в себя идентификатор файла, начальный кадр, начальный байт, конечный кадр и конечный байт. Таким образом, используя гипотетический пример CPython, элемент в этом списке с идентификатором 12345 может иметь начальный кадр 054321, начальный байт 03210321, конечный кадр 054545 и конечный байт 12321232.

Это означает, что для получения данных CPython: перейдите к кадру 54321 этого фильма. Декодировать все кадры от начального кадра 54321 до конечного кадра 54545 в двоичные значения с помощью средств, описанных ниже. Это даст вам 225 фрагментов данных, пронумерованных от 54321 до 54545, которые начнутся с набора пустых фрагментов без данных. Откажитесь от первых 3210320 байтов в первом непустом фрагменте данных. Добавьте все «средние» фрагменты данных по порядку. Наконец, добавьте первые 12321232 байта из последнего фрагмента данных, 54545. Теперь вы собрали полный репозиторий CPython в виде одного сжатого архивного файла.

Декодирование из QR-кодов в двоичный файл

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

  1. Руководство по архивной программе GitHub (этот документ)

  2. Описательный индекс GitHub, список и краткое описание всех репозиториев на этом барабане.

  3. Описание информации о представлении

  4. Цифровое сохранение и как получить данные, обзор деталей поиска данных

  5. Описание носителя информации

  6. Технология извлечения данных

  7. Общая структура сохраняющей катушки (формат катушки)

  8. Общее описание формата кадра 4K

  9. Распаковка описания библиотеки (для QR-кодов)

  10. Распаковка исходного кода библиотеки

  11. Спецификация формата данных ASCII

  12. Спецификация языка программирования C

  13. Исходный код архивного файла TAR

  14. Исходный код PDF

  15. Спецификация формата файла XZ (для сжатия / распаковки, описана ниже)

Шестой из этих пунктов, документ «Технология извлечения данных», описывает требования и процессы использования сканера для захвата данных на одном цифровом кодированном кадре пленки и превращения его в форму, пригодную для компьютерного анализа. Восьмое из них, описание формата Generic 4K Frame, предоставляет техническую информацию, включая исходный код, необходимый компьютеру для получения такого отсканированного изображения и преобразования его в двоичные данные.

В принципе, теоретически возможно преобразовать хранилище из QR-кодированных данных в двоичные данные без использования компьютера. Однако это будет чрезвычайно сложно и, вероятно, потребует значительных усилий от хорошо организованного сообщества в течение многих недель, если не месяцев или лет. Поскольку содержимое репозиториев - это программное обеспечение, предназначенное для работы на компьютере, их использование в отсутствие компьютера в лучшем случае будет минимальным.

В случае, если наследники этого архива не имеют Компьютеры, они должны хранить архив в целости и сохранности, пока они не делают. Одна из целей удобочитаемого Дерева технологий - помочь ускорить развитие технологий и компьютеров в случае такой возможности. (Другая его цель - кодифицировать нашу технологию и ее развитие для будущих историков.)

Распаковка файла архива в отдельные вложенные файлы, которые он содержит

Двоичный файл для каждого хранилища находится в формате, известном как TAR, для Tape Archive. Файл TAR по существу состоит из группировки нескольких файлов, соединяя конец одного с началом следующего, подобно склеиванию отдельных кусочков бумаги в одну прокрутку. Файл TAR может включать в себя любое количество файлов любого размера, разделенных на любое количество каталогов и подкаталогов.

Каждому подфайлу в файле TAR предшествует 512-байтовая запись заголовка, которая действует как лента в метафоре прокрутки. Эта запись заголовка содержит информацию о файле, такую ​​как его имя и размер. Конец архива обозначен как минимум двумя последовательными 512-байтовыми блоками.

Поскольку файлы TAR, по сути, представляют собой просто наборы файлов с текстовыми записями между ними, если файл TAR содержит все текстовые файлы, его можно рассматривать как сам текстовый файл. Если он содержит смесь, он может рассматриваться как текстовый файл, который содержит смесь структурированного, осмысленного текста (составные текстовые файлы) и непонятного бреда (составные нетекстовые файлы.)

Возможно вложить файлы TAR в файлы TAR, один контейнер внутри другого, и именно так хранится большинство наших архивных данных. Для любого данного репозитория внешний файл TAR будет содержать как минимум:

  • единый несжатый файл метаданных с именем META, который включает в себя имя репозитория, имя учетной записи, описание, язык, количество звездочек и число вилок
  • сжатый (см. ниже) файл с именем COMMITS, который включает в себя журнал изменений, внесенных в хранилище с течением времени
  • файл с именем repo.tar.xz, сжатый файл TAR, который содержит фактическое содержимое репозитория

Другие метаданные, такие как вики, gh-pages, issues и pull requests, также могут быть включены в виде отдельных сжатых файлов.

Конкретные сведения о файлах TAR и программное обеспечение для их кодирования и декодирования можно найти в информации о представлении на каждом барабане архива.

Распаковка сжатых файлов в читаемые, несжатые файлы

Чтобы включить как можно больше хранилищ и как можно больше данных, большая часть данных была сжата. Сжатие означает использование небольшого количества данных для представления большего объема путем использования шаблонов и повторений в таком большом количестве. Например, вместо того, чтобы писать символ девять раз подряд, можно было бы просто написать сжатый текст 9a, если бы был уверен, что читатель поймет, что 9a означает несжатый текст aaaaaaaaa.

Эффективные алгоритмы сжатия намного сложнее, но применяется тот же принцип. Этот архив использует программу сжатия, известную как «XZ», которая, в свою очередь, использует алгоритм, известный как «LZMA». Второй файл данных на каждом барабане содержит исходный код и документацию для XZ в одном несжатом архивном файле TAR, описанном ниже. (Первый файл данных содержит Всеобщую декларацию прав человека на всех доступных письменных языках).

LZMA сочетает в себе то, что известно как алгоритм «LZ77» и «интервальное (диапазонное) кодирование». LZ77 заменяет повторяющиеся данные ссылками на предыдущие появления этих данных. Например, для чрезмерного упрощения, если 80-байтовая фраза появляется дважды, с интервалом 400 байт, во второй раз, алгоритм существенно уплотняет данные, говоря «повторить 80 байт из 400 байт назад». Диапазон кодирования по существу преобразует все сообщение в одно очень длинное число, которое, в свою очередь, может быть закодировано.

Конкретные шаги алгоритма, который должен использоваться для распаковки данных, описываются исходным кодом XZ, содержащимся во втором файле данных в каждом барабане. Хотя теоретически можно распаковать вручную, опять же, это будет чрезвычайно трудоемкий и длительный процесс. На практике потребуется рабочий компьютер.

Преобразование каждого отдельного файла в письменные символы

Человечество использовало много письменных персонажей на протяжении тысячелетий. Кодировка, используемая для представления этих символов как 1 и 0 в этом архиве, называется «UTF-8». Один символ UTF-8, то есть один записанный символ, может занимать от 1 до 4 байтов двоичных данных.

По историческим причинам, поскольку они наиболее широко использовались в то время и в том регионе, где и когда началась разработка программного обеспечения, группа символов (и концепций), известная как «ASCII», наиболее эффективно кодируется, по 1 байту на символ. Все, что не является ASCII, кодируется как 2 или более байтов на символ. Большинство текстовых файлов в этом архиве - ASCII, но значительное количество - нет. Многие другие будут в основном ASCII со случайными не-ASCII символами.

Подробные спецификации ASCII можно найти в информации о представлении на каждом барабане архива. ГПодробные спецификации UTF-8 можно найти в направляющей катушке. Первый файл данных на каждом барабане архива будет содержать текст Всеобщей декларации прав человека на всех доступных письменных языках. Это будет служить как средством перевода, так и примером ASCII и UTF-8.

Виды файлов

Существует много разных типов текстовых файлов, созданных по разным причинам. Основным видом, по которому существует этот архив, является исходный код. Исходный код - это очень плотный, чрезвычайно структурированный текст, в котором такие символы, как '{' и ';' имеют большое значение.

Ключевым моментом исходного кода является то, что он написан для чтения компиляторами. Поскольку компиляторы являются программными средствами, другой способ выразить это заключается в том, что исходный код написан для чтения компьютерами. Хороший код также написан так, что другие люди, если они имеют опыт и знания в области программного обеспечения, могут понять его; но это только правильно, если компилятор может понять это.

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

_for (int i = 0; i <5; i ++) {} _

будет преобразован компилятором в последовательность двоичных инструкций, подаваемых на компьютер, что приведет к тому, что крошечная часть компьютера, называемая регистром, установит свое значение в 0, а затем увеличит это значение до 1, 2, 3, а затем 4. (Это не предназначено в качестве примера полезного кода; это просто иллюстрация многоуровневого процесса превращения исходного кода в работающее программное обеспечение.)

Другие виды текстовых файлов, такие как JSON, XML и HTML, используются для хранения данных (в отличие от команд) для компьютеров. Они, как правило, также читаются людьми, хотя их структурированные форматы затрудняют их чтение, чем менее структурированный текст рассказывания историй, такой как этот файл.

Большинство других видов текстовых файлов предназначены для чтения людьми. Некоторые из них представляют собой простой, в основном неструктурированный текст, например, этот файл, который вы сейчас читаете. В архиве вы часто встречаетесь с типом Markdown, обозначаемым расширением .md для файла, который является своего рода промежуточной формой, предназначенной для чтения человеком в необработанном виде, а также структурированной таким образом, чтобы компьютеры могут форматировать их в более визуально привлекательные и полезные макеты. Большинство репозиториев в этом архиве имеют файл README.md Markdown, который обычно предназначен в качестве начального введения в репозиторий, в котором описывается, что это такое, почему он существует и как его использовать.

Краткий обзор наиболее распространенных форм нетекстовых файлов также может быть полезен. Скомпилированный код не является текстовым. Файлы JPG и PNG кодируют изображения в цифровом формате, а MP3 и WAV - аудио. PDF-файлы кодируют документы с точным, идеальным форматированием. И файлы ZIP и TAR, как упоминалось ранее, являются контейнерами, которые, в свою очередь, могут включать в себя еще много других файлов.

Человеческие языки и языки программирования

Человеческие языки

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

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

Не гарантируется, что наследники этого архива будут знать английский, хотя он, кажется, особенно вероятен для использования в течение неопределенного времени. Если какое-то руководство по другим языкам полезно, мы включаем более 500 доступных переводов Всеобщей декларации прав человека в виде несжатого файла UTF-8 в начале каждого ролика, а также в дерево технологий. Эта декларация представляет собой список прав и свобод каждого отдельного человека в нашу эпоху, который никогда не следует отнимать.

Языки программирования

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

Язык программирования - это набор предопределенных элементов, большинство из которых являются словами, которые могут быть структурированы, чтобы дать компьютеру команду выполнить указанное действие указанным способом. Коллекция таких инструкций называется программой или исходным кодом. Исходный код по сути является программным обеспечением в замороженном, письменном виде.

Программы обычно делятся на отдельные этапы, известные как операторы, которые, в свою очередь, группируются в коллекции. известный как функции. Вся программа может содержаться в одном файле или распространяться на тысячи.

Существуют сотни различных языков программирования, разбросанных по разным формам, подходам и философиям. Некоторые компилируются в отдельные двоичные файлы, которые затем выполняются; некоторые, известные как «интерпретируемые» языки, эффективно компилируются и запускаются сразу, без промежуточного этапа. Большинство современных языков программирования включают библиотеки предварительно написанных функций, и такие библиотеки могут быть очень объемными и сложными. Некоторые из самых популярных на сегодняшний день языков программирования включают в себя:

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

  • C++, более сложная, абстрактная и мощная эволюция C.

  • C#, дальнейшая эволюция, скомпилированная не в двоичный машинный код, а в код, интерпретируемый «средой исполнения».

  • Java, похожий на (но предшествующий) C#, является, пожалуй, наиболее широко используемым языком на сегодняшний день.

  • JavaScript, в отличие от Java, несмотря на сходство в названии, также известный как «ECMAScript», является языком, изначально используемым в веб-браузере, т.е. программой, которая выбирает, интерпретирует и отображает данные с удаленного компьютера, известного как Интернет. сервер; сегодня, однако, он широко используется и на этих серверах.

  • TypeScript, форма JavaScript с более строгими правилами, так что ошибки, также известные как баги, с меньшей вероятностью попадут в программы.

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

  • Ruby, интуитивно понятный язык, чьи высказывания часто читаются почти как письменный английский.

  • Go, простой, мощный язык, который особенно выделяется в параллельных программах, то есть программах, написанных так, что несколько функций работают независимо друг от друга.

  • Swift, новый язык, используемый для написания телефонов и других устройств, которыми пользуется миллиард человек.

  • Rust, предназначенный в качестве замены C, который значительно снижает вероятность появления опасных ошибок.

  • PHP, простой язык, используемый для интернет-серверов.

  • Лисп, очень старый язык с принципиально другим, функционально-ориентированным подходом к программированию.

  • SQL, совершенно другой язык, используемый для извлечения данных из структурированных и высокоэффективных хранилищ данных, известных как базы данных.

  • Ассемблер (или сборка), очень непонятное, ограниченное, но быстрое и мощное семейство языков, в котором существует прямая связь между языковыми конструкциями и машинным кодом рассматриваемого компьютера; это можно считать полускомпилированным кодом.

Разработка, зависимости и открытый исходный код

Разработка

Процесс взятия одного простого файла исходного кода и преобразования его в электрические импульсы в компьютере чрезвычайно сложен. Мы имеем дело с этой сложностью, используя слои абстракции. Абстракция, известная как набор инструкций, позволяет использовать машинный код, выводимый одним компилятором, на разных компьютерах. Автору исходного кода обычно не нужно знать или заботиться о том, какой компьютер или даже какой набор инструкций будет использоваться для запуска этого кода; это абстрагируется компилятором.

Современное программное обеспечение, в свою очередь, намного сложнее, чем один автор, работающий над одной программой для одного компьютера. Он состоит из множества авторов, работающих над многими файлами в одном проекте одновременно, часто используя несколько языков программирования. Кроме того, каждый проект зависит от других, отдельных, автономных проектов в качестве инструментов и / или компонентов, в то время как сами проекты активно работают над ними и, в свою очередь, зависят от других проектов. Заставить все эти движущиеся части работать совместно элегантно и эффективно и является задачей современной разработки программного обеспечения.

Когда несколько авторов исходного кода, также известных как разработчики программного обеспечения, работают над одним проектом, каждый из них имеет свой собственный компьютер и копию всего проекта на своем компьютере. Если каждый из них вносит изменения, то каждый имеет различную версию одного и того же проекта. Процесс согласования нескольких версий проекта называется управлением версиями. Он управляется программным обеспечением контроля версий; в этом архиве - с помощью программного обеспечения под названием Git, в честь которого назван сам GitHub. Каждый репозиторий в этом архиве является Git-репозиторием.

Git может автоматически объединять разные версии программного обеспечения в единую согласованную форму с минимальным вмешательством человека. Git также хранит полную историю, которая позволяет вам откатиться к предыдущей версии по мере необходимости. Однако, чтобы сэкономить место, репозитории этого архива обычно не содержат истории Git.

Когда несколько разработчиков отправляют проект по нескольким различным путям одновременно, это называется ветвлением проекта, а эти пути называются ветвями. Согласованная основная ветвь проекта называется trunk- или master-ветвью. Git предоставляет инструмент, который разработчики могут использовать чтобы обобщить различия между двумя ветвями и предложить объединить их в другие. Это известно как pull request. Современная разработка программного обеспечения состоит в основном из ветвления проекта, написания или редактирования программного обеспечения в вашей ветке и, после завершения, отправки pull request для встраивания вашей работы обратно в основную ветку.

Зависимости

По сути, каждый язык программирования поддерживает создание на основе чужой работы. Без повторного использования чужой работы каждый проект был бы намного более трудным и значительно более медленным, и лишь немногие проекты когда-либо увидели бы фактическое использование в реальном мире.

Если проект A должен включать проект B для того, чтобы A мог выполнять свою работу, то A известен как зависимый от проекта B, а B известен как зависимость проекта A. У A может быть много зависимостей, каждая из которых может иметь много собственные зависимости и так далее. Кроме того, каждая зависимость относится к конкретной версии или диапазону версий данного проекта. Полная детализация всех нескольких уровней зависимостей проекта называется его деревом зависимостей.

Как правило, зависимости перечисляются внутри файлов исходного кода, обычно в самом верху, и каждый раз, когда компилятор или интерпретатор находит зависимость, он ищет ее в наборе предопределенных каталогов. Поскольку дерево зависимостей для проекта может быть очень сложным, иногда оно целиком перечисляются в одном файле в проекте, известном как список пакетов. Например, проекты Ruby могут иметь Gemfile для этой цели, а проекты JavaScript могут иметь файл package.json. Это позволяет инструменту, известному как программное обеспечение для управления пакетами, загрузить все зависимости для проекта сразу с одного или нескольких интернет-серверов.

В случае этого архива, вероятно, что зависимости для любого данного проекта существуют в другом месте в архиве. Чтобы найти зависимость в архиве, необходимо сначала найти имя зависимости в исходном коде или списке пакетов, точные детали которых различаются в зависимости от языка и структуры, а затем использовать главный индекс в направляющей катушке, или, в его отсутствие, индексы в передней части каждого барабана, чтобы определить, на каком барабане и кадре(ах) находится репозиторий, о котором идёт речь.

Открытый исходный код

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

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

В целом, закрытый исходный код ведет к меньшим, изолированным, фрагментированным сообществам, которые испытывают трудности с поиском и принятием новых и лучших идей. Открытый исходный код ведет к созданию больших взаимосвязанных сообществ, каждое из которых помогает проектам друг друга расти, процветать и преуспевать, используя работу друг друга как зависимости и/или повторно используя их код, а также учась друг у друга. Программное обеспечение с открытым исходным кодом - это инструментарий для коллективного использования всего человечества, и чем больше у нас и чем лучше инструментов, тем быстрее и лучше мы можем развиваться как вид.