Skip to content

Latest commit

 

History

History
283 lines (143 loc) · 41.8 KB

GUIDE_pt.md

File metadata and controls

283 lines (143 loc) · 41.8 KB

Um guia para o cofre de código do GitHub

Introdução

Este arquivo, o GitHub Code Vault, foi estabelecido pelo GitHub Archive Program, cuja missão é preservar o software livre para as gerações futuras. O leitor pode estar lendo isso daqui a um ano, ou mil, mas de qualquer forma, esperamos que seu conteúdo, e talvez o próprio conceito de código aberto, sejam úteis para você.

Este é principalmente um arquivo de software. Software é uma série de comandos usados para controlar as ações de um computador. Um computador é um dispositivo que pode realizar funções matemáticas automaticamente com muito mais rapidez do que a mente humana e tem poderes muito além de nós. Nossos computadores são usados para ajudar a explorar os segredos do universo, para conectar toda a humanidade em uma teia onipresente de informações, para manipular sinais rápido o suficiente para transmitir sons e projetar imagens em movimento detalhadas em telas elétricas e para controlar máquinas extremamente poderosas que excede a capacidade e a precisão do trabalho humano.

Um computador sem software não pode fazer nenhuma dessas coisas. Um computador é uma coisa extraordinária e maravilhosa, mas sem software, todo o seu poder é inútil. O objetivo deste arquivo é passar o que sabemos sobre software para você.

O software é escrito como sequências de comandos complexas, mas legíveis por humanos, os vários sabores dos quais são conhecidos como linguagens de programação, porque uma unidade completa de software é freqüentemente chamada de programa. Esses programas são então convertidos para a linguagem binária de uns e zeros usada por computadores. Este processo é conhecido como compilação.

Como o software compilado é muito difícil de decifrar de volta à sua forma de programa original, também conhecido como código-fonte, é possível que as pessoas mantenham o segredo dessa forma original e reivindiquem a propriedade sobre ele. O software de código aberto não é um tipo diferente de software, mas um ethos diferente. O ethos do código aberto rejeita o sigilo e a propriedade. Os programas de software de código-fonte aberto são disponibilizados para qualquer um que quiser usá-lo, sem nenhum custo, para que eles possam, por sua vez, melhorar esses programas ou usá-los para construir algo novo e melhor.

Um projeto de código aberto é o trabalho coletivo de uma comunidade auto-organizada que pode chegar aos milhares. O acúmulo de todos os projetos de software de código aberto arquivados aqui é o trabalho de uma comunidade de muitos milhões. Embora certos indivíduos possam ter direitos especiais dentro de qualquer projeto, como a capacidade de aprovar ou rejeitar alterações sugeridas para a versão oficial mais recente de seu código-fonte, ninguém o possui. Toda pessoa tem todo o direito de pegar e usar uma cópia completa de qualquer projeto de código aberto a qualquer momento, sem custo ou penalidade. Isso é conhecido como bifurcação de um projeto.

Quando muitas pessoas trabalham no código-fonte ao mesmo tempo, é difícil acompanhar e integrar todas as alterações. Um projeto de código aberto conhecido como 'Git' é dedicado a resolver esse problema. Ele integra um histórico completo de todas as adições e alterações em um projeto em uma entidade conhecida como repositório Git. Este arquivo é essencialmente um arquivo de tais repositórios.

Este arquivo foi criado por uma empresa chamada 'GitHub', que fornece um serviço que permite que pessoas em todo o mundo armazenem os programas de software que escreveram, acompanhem as alterações nesses programas e colaborem com outras pessoas para melhorá-los e expandi-los. O GitHub disponibiliza seus serviços gratuitamente para desenvolvedores de software de código aberto público. Possui dezenas de milhões desses usuários.

O que se segue é uma descrição do que acreditamos que você precisará saber e ter para fazer o melhor uso deste arquivo de software. Se você não sabe ou não entende nada disso, não se desespere! Também incluímos um guia sobre como cumprir esses requisitos. Se por algum motivo você não pode realizá-los sozinho, então seus descendentes podem.

O que você precisa para usar o arquivo

Em princípio, tudo que você precisa para acessar o conteúdo deste arquivo é uma fonte de iluminação e algum tipo de lupa. No entanto, a maioria (embora não todos) de seus dados foi compactada de forma compacta em bobinas de filme de forma codificada e compactada. Ler, decodificar e descompactar esses dados exigirá um cálculo considerável. Em teoria, isso poderia ser feito sem computadores, mas seria muito tedioso e difícil.

Nossa expectativa é que você não precise de nossas definições de software, computador e outros termos. Imaginamos que você tenha seus próprios computadores, provavelmente muito mais avançados do que os nossos, e possivelmente com arquiteturas fundamentalmente diferentes. Depois de compreender a visão geral e o guia abaixo, você poderá acessar facilmente todos os dados.

No entanto, é possível que você tenha computadores inferiores aos nossos, ou mesmo nenhum computador. Nesse caso, preparamos um rolo de dados não compactado, não codificado e legível por humanos, que chamamos de Árvore Tecnológica. A Árvore Tecnológica contém informações sobre nossas tecnologias fundamentais, nossos computadores e nosso software, na esperança de que, ao longo do tempo, você seja capaz de usar esse conhecimento para recriar computadores que podem fazer uso do software de código aberto neste arquivo.

O que há dentro

O arquivo é tão grande - cerca de 21 trilhões de bytes (explicado abaixo) - porque é extremamente inclusivo e democrático. Muitos milhões de pessoas tornam o software que escrevem disponível para todos. Este arquivo inclui um instantâneo - ou seja, uma única cópia, em um único momento no tempo - de todo o software público que os usuários do GitHub estão desenvolvendo ativamente. Isso significa que inclui milhões de repositórios separados. Nossa esperança é que essa abordagem ampla e democrática seja do interesse dos historiadores do futuro.

Os repositórios incluídos neste arquivo foram determinados puramente pela hora do último commit, ou seja, a última vez que foram atualizados e sua contagem de estrelas. (Os usuários do GitHub podem todos 'marcar' repositórios públicos, para indicar que eles são de interesse ou significância para eles.) O instantâneo foi iniciado em 02/02/2020, ou seja, no segundo dia do mês de fevereiro, em o ano de 2020 do calendário gregoriano, conforme contamos o tempo. Os repositórios incluídos nele são: todos os repositórios com quaisquer commits nos 80 dias anteriores; todos os repositórios com pelo menos uma estrela com quaisquer commits nos 365 dias anteriores; e todos os repositórios com pelo menos 250 estrelas, independentemente de quando foram atualizados pela última vez.

É claro que nem todos esses repositórios são igualmente importantes em termos de influência e dependências. A árvore tecnológica inclui um índice e uma breve descrição dos repositórios mais importantes no arquivo e listas em que cada um pode ser encontrado, de modo que possam ser acessados sem ter que percorrer todos esses milhões de repositórios para determinar quais são os mais práticos útil.

Uma Visão Geral do Arquivo

O arquivo consiste em 188 rolos de filme: um "rolo-guia" de informações e orientações legíveis por humanos, que chamamos de Árvore Tecnológica, e 187 rolos de software arquivado. Cada bobina inclui 65.000 quadros individuais. As molduras no início de cada bobina e as molduras da bobina guia incluem texto e imagens legíveis por humanos. Todos os outros quadros de filme consistem em dados digitais armazenados em uma forma visual conhecida como códigos QR.

Dados digitais significam dados armazenados em formato binário, ou seja, como 0s e 1s, porque os próprios computadores são binários - controlados por sinais elétricos que estão "ligados" ou "desligados", correspondendo a 1 ou 0 - e, portanto, os dados binários são muito mais fácil para os computadores entenderem do que qualquer outro.

Os metadados legíveis por humanos armazenados no início de cada bobina incluem informações sobre o próprio filme, um guia para a codificação QR usada, um programa de software para decodificá-lo e um índice. O índice lista o título, o número do quadro inicial e a soma de verificação de cada arquivo armazenado naquele rolo.

Um arquivo é uma única entidade de dados coerente. Uma soma de verificação é um valor exclusivo de um cálculo, conhecido como função hash, executado em todo o conteúdo de um arquivo, para garantir que seu conteúdo não tenha sido danificado ou corrompido; a função hash usada no arquivo é conhecida como 'SHA-1'.

Cada código QR consiste em um campo de pequenos quadrados brancos ou pretos que ocupam quase todo o quadro do filme. Usamos códigos QR porque eles são muito mais compactos e robustos do que textos legíveis por humanos. Um código QR decodifica em dados binários, ou seja, uma série de uns e zeros.

Essa decodificação é apenas a primeira etapa para transformar esses dados binários em informações significativas. São dados compactados, o que significa que foram compactados para economizar espaço, semelhante a como se escreve "128xA" em vez de escrever a letra A 128 vezes. Depois de decodificado, ele deve ser descompactado.

O resultado após a descompactação é conhecido como um arquivo compactado: um único arquivo contendo todo o conteúdo de um único repositório de projeto de software. A maioria dos repositórios inclui muitos arquivos, então este arquivo é como um livro que contém muitos capítulos separados ou uma caixa que contém muitas outras caixas. Geralmente é vantajoso, embora não seja absolutamente necessário, descompactar o arquivo compactado em seus arquivos componentes antes de acessá-los.

Finalmente, cada arquivo de componente é seu próprio conjunto de dados binários, ou seja, uns e zeros. Os dados podem ser entendidos se você souber seu formato. Por exemplo, no formato conhecido como 'UTF-8', o formato mais comum no arquivo, os uns e os zeros são divididos em grupos de oito, conhecidos como bytes, o byte 01000001 representa a letra A; os três bytes 01101001 01101110 01110100 representam a palavra int; e os dois bytes 11000011 10000011 representam a letra à (A com um acento til no topo).

Este processo de arquivamento de dados, arquivos binários compactados em arquivos compactados e, em seguida, codificados por QR, é obviamente complexo em comparação com a simples escrita de texto legível. O processo de desarquivamento pelo qual você precisará passar - QR para binário compactado; comprimido para não comprimido; arquivar arquivo em vários arquivos; arquivos de texto para texto legível por humanos - é similarmente complexo. Isso ocorre porque essa complexidade nos permite armazenar muito mais dados do que seria possível de outra forma, de uma forma legível por computador com relativa facilidade.

Se essa complexidade for difícil e cara para você, pedimos desculpas, mas nossa expectativa é que, se for o caso, este guia e a árvore de tecnologia legível por humanos aliviarão essa complexidade e talvez possam ser mais úteis para você do que o arquivo conteúdo, pelo menos até que seus computadores estejam avançados o suficiente para que a complexidade dos dados do arquivo seja fácil de lidar.

Arquivos, diretórios, repositórios e formatos de dados

Pode ser instrutivo discutir como o arquivo está logicamente dividido. Em particular, uma discussão sobre arquivos, diretórios e formatos de dados provavelmente será útil.

Um arquivo é uma coleção de dados agrupados em uma entidade coerente com um único nome: pense nos dados como areia e um arquivo como uma espécie de bolsa que pode conter areia, e apenas areia. Um diretório é uma coleção de arquivos: pense nele como uma espécie de bolsa que só pode conter outras bolsas. Seguindo essa metáfora, todo repositório consiste em um diretório externo, conhecido como diretório raiz, que contém vários arquivos e / ou vários diretórios. Cada diretório pode, por sua vez, conter arquivos e diretórios.

Essa estrutura é preferida porque os arquivos organizados em grupos são muito mais fáceis de trabalhar do que uma única coleção de arquivos. O identificador de um arquivo específico dentro do diretório externo consiste nos nomes de todos os seus diretórios incluídos, começando com a raiz, seguido por seu próprio nome individual, com um caractere / entre cada nome. Por exemplo, um arquivo chamado README.md no diretório raiz seria identificado como /README.md e um arquivo identificado como /public/www/index.html seria o arquivo index.html no diretório 'www' dentro do ' public 'diretório dentro do diretório raiz.

Cada repositório, por sua vez, tem dois nomes, separados por um divisor, que no arquivo é um _ ou sublinhado. (Historicamente, tem sido uma / ou barra, mas também é usada para indicar um diretório, então usamos _ para maior clareza.) O primeiro nome é a conta GitHub que possui esse repositório; o segundo é o nome do repositório individual. A combinação de repositório e identificadores de arquivo pode ser usada para identificar exclusivamente um arquivo individual no arquivo. Por exemplo, o arquivo 'package.json' no diretório 'web' no repositório 'ykarma' na conta do GitHub 'rezendi' pode ser identificado exclusivamente como /web/package.json em rezendi_ykarma no arquivo.

Tipos diferentes de arquivos têm finalidades diferentes. O arquivo GitHub consiste basicamente em arquivos de texto, ou seja, arquivos cujos dados representam a linguagem escrita. A maioria dos softwares é escrita em arquivos de texto contendo texto altamente estruturado conhecido como código-fonte. Um programa especial conhecido como compilador converte esse código-fonte legível por humanos em instruções legíveis por computador, conhecidas como código compilado ou código de máquina.

Arquivos que não são arquivos de texto, como arquivos que representam imagens visuais ou contêm código compilado, são freqüentemente chamados de arquivos binários. Infelizmente, esse é um termo enganoso, pois os arquivos de texto também têm, em última análise, 1s e 0s. Iremos nos referir a arquivos que não são arquivos de texto como arquivos não textuais.

Existem muitas maneiras de representar a linguagem humana escrita usando 1s e 0s. Por razões históricas, a maior parte do código-fonte foi originalmente escrita no que é conhecido como script latino. A escrita latina tem 26 caracteres básicos que são usados para representar palavras faláveis, cada um dos quais tem duas formas, maiúsculas e minúsculas. Ele também possui 10 dígitos para representar números. A escrita latina, junto com vários outros símbolos associados usados para indicar estrutura e outros conceitos, é codificada em 1s e 0s em um formato conhecido como 'ASCII', que pode representar 128 caracteres diferentes e por razões históricas foi dominante na maioria dos softwares por muitos anos .

No entanto, a escrita latina é apenas um pequeno subconjunto das muitas maneiras como os humanos se expressam na linguagem escrita. Para suportar outros scripts, ao mesmo tempo que permite que todos os softwares escritos para usar ASCII continuem trabalhando sem alterações (um conceito conhecido como compatibilidade com versões anteriores), outro formato de dados conhecido como 'UTF-8' foi introduzido.

ASCII continua sendo o formato de código-fonte mais comum. Cada bobina deste arquivo inclui um guia para caracteres ASCII. ASCII é um subconjunto de UTF-8, ou seja, todas as codificações ASCII também são codificações UTF-8. Além disso, o rolo de guia contém uma especificação de todos os caracteres UTF-8. Quase todos os arquivos de texto neste arquivo devem ser codificados como UTF-8.

Os arquivos não textuais incluem arquivos destinados a representar imagens e documentos formatados. Uma convenção amplamente usada é que nomes de arquivo terminem com '.' caractere seguido por um sufixo que indica o tipo de arquivo. Por exemplo, um nome de arquivo que termina com .jpg é provavelmente um arquivo de imagem JPEG; aquele que termina com .PNG é provavelmente um arquivo de imagem Portable Network Graphic; e um que termina com .pdf, um arquivo Portable Document Format.

Não há um sufixo único que indique arquivos de texto. Em vez disso, para o código-fonte, é mais provável que o sufixo indique em qual linguagem de programação ou marcação o código foi escrito. As linguagens de programação e marcação serão descritas com mais detalhes a seguir.

Como extrair o conteúdo do arquivo

Aqui, forneceremos uma visão geral de como descompactar um repositório arquivado específico em seus vários arquivos constituintes. Novamente, esse processo consiste em:

  1. Identificar a bobina e quadros específicos nos quais os dados do repositório são arquivados.

  2. Decodificação dos códigos QR, os campos de pixels pretos, brancos e cinzas nesses quadros, em um arquivo binário, uma sequência de (pelo menos milhares e muitas vezes milhões de) 1s e 0s.

  3. Descompactando o arquivo binário em um arquivo mais longo e descompactado.

  4. Descompactar o arquivo nos subarquivos separados que ele contém. Observe, entretanto, que os dados do arquivo são geralmente compreensíveis, embora confusos, mesmo se esta etapa for omitida.

  5. Finalmente, converter cada um desses subarquivos - sequências de 1s e 0s que podem variar de bastante curtas a muito longas - em caracteres escritos, se forem arquivos de texto.

Identificando a bobina e quadros específicos nos quais os dados do repositório são arquivados

Cada rolo de filme começa com um líder de filme vazio e, em seguida, o Quadro de Referência Zero, que consiste em um retângulo preto sólido em um canto de um quadro vazio. O próximo quadro legível por humanos é o Quadro de Controle, com informações sobre o carretel. A seguir está o Índice, que por sua vez inclui uma lista de Arquivos de Dados do Usuário.

Cada repositório nesta bobina é um desses arquivos de dados do usuário. A lista inclui um ID exclusivo, um ID de arquivo e um nome para cada um desses arquivos. Por exemplo, o repositório CPython da conta Python pode ter o ID do arquivo listado como 12345 e o nome listado como python_cpython.tar.

Após a lista de arquivos de dados do usuário, há uma lista de locais de dados digitais. Essa lista inclui o ID do arquivo, um quadro inicial, um byte inicial, um quadro final e um byte final. Portanto, usando o exemplo hipotético de CPython, o item nesta lista com o ID 12345 pode ter um quadro inicial de 054321, um byte inicial de 03210321, um quadro final de 054545 e um byte final de 12321232.

Isso significa que, para obter os dados do CPython: Vá para o quadro 54321 deste rolo de filme. Decodifique todos os quadros do quadro inicial, 54321, até o quadro final, 54545, em valores binários, pelos meios descritos abaixo. Isso lhe dará 225 pedaços de dados numerados de 54321 a 54545, que começarão com um conjunto de pedaços em branco sem dados. Descarte os primeiros 3210320 bytes no primeiro dado não vazio. Anexe todas as partes "intermediárias" dos dados, em ordem. Finalmente, acrescente os primeiros 12321232 bytes da última parte dos dados, 54545. Agora você montou o repositório CPython completo, como um único arquivo compactado.

Decodificando os códigos QR em um arquivo binário

Os detalhes de como decodificar os quadros do filme em dados binários são encontrados na Informação de Representação legível por humanos que se encontra após o Índice no início de cada rolo de filme no arquivo. Esta informação encontra-se em cada bobina para que, mesmo que uma bobina individual seja separada do arquivo, ainda seja possível decifrar o seu conteúdo. Essas informações de representação incluem, na ordem:

  1. Um guia para o programa de arquivamento GitHub (este documento)

  2. GitHub descriptive index, a list and brief description of all the repositories on this reel

  3. Representation Information description

  4. Digital Preservation and How to Retrieve Data, an overview of data retrieval details

  5. Storage Medium description

  6. Data Retrieval Technology

  7. Generic Preservation Reel Structure (reel format)

  8. Generic 4K Frame format description

  9. Unboxing library description (for the QR codes)

  10. Unboxing library source code

  11. ASCII data format specification

  12. C programming language specification

  13. TAR archive file source code

  14. PDF source code

  15. XZ file format specification (for compression / decompression, described below)

The sixth of those items, the Data Retrieval Technology document, describes the requirements and processes to use a scanner to capture the data on a single digitally encoded frame of film and turn it into a form amenable to computer analysis. The eighth of them, the Generic 4K Frame format description, provides the technical information, including source code, required for a computer to take such a scanned image and convert it into binary data.

É teoricamente possível, em princípio, converter um repositório de dados codificados por QR em dados binários sem usar um computador. No entanto, seria extremamente difícil e provavelmente exigiria um esforço considerável de uma comunidade bem organizada durante muitas semanas, senão meses ou anos. Uma vez que o conteúdo dos repositórios são softwares destinados a serem executados em um computador, seu uso na ausência de um computador seria mínimo.

No caso de os herdeiros deste arquivo não possuírem computadores, eles devem mantê-lo completo e seguro até que o tenham. Um dos objetivos da Árvore Tecnológica legível por humanos é ajudar a acelerar o desenvolvimento de tecnologias e computadores no caso dessa eventualidade. (Seu outro propósito é codificar nossa tecnologia e seu desenvolvimento para futuros historiadores.)

Descompactando o arquivo nos subarquivos separados que ele contém

O arquivo binário para cada repositório está em um formato conhecido como TAR, para Tape Archive. Um arquivo TAR é essencialmente composto pelo agrupamento de vários arquivos, conectando o final de um ao início do próximo, como colar pedaços de papel em um único rolo. Um arquivo TAR pode incluir qualquer número de arquivos, de qualquer tamanho, divididos em qualquer número de diretórios e subdiretórios.

Cada subarquivo em um arquivo TAR é precedido por um registro de cabeçalho de 512 bytes, que atua como a fita na metáfora do scroll. Este registro de cabeçalho contém informações sobre o arquivo, como seu nome e tamanho. O fim do arquivo é indicado por pelo menos dois blocos consecutivos de 512 bytes.

Como os arquivos TAR são essencialmente apenas coleções de arquivos com registros de texto entre eles, se um arquivo TAR contiver todos os arquivos de texto, ele poderá ser tratado como um arquivo de texto. Se ele contiver uma mistura, pode ser tratado como um arquivo de texto que contém uma mistura de texto estruturado e significativo (os arquivos de texto constituintes) e linguagem incompreensível (os arquivos não textuais constituintes).

É possível aninhar arquivos TAR dentro de arquivos TAR, um contêiner dentro de outro, e é assim que a maioria dos nossos dados arquivados são armazenados. Para qualquer repositório, o arquivo TAR externo conterá pelo menos:

  • um único arquivo de metadados descompactado chamado META, que inclui o nome do repositório, nome da conta, descrição, idioma, contagem de estrelas e contagem de fork
  • um arquivo compactado (veja abaixo) denominado COMMITS, que inclui o registro das mudanças feitas no repositório ao longo do tempo
  • um arquivo chamado repo.tar.xz, um arquivo TAR compactado que contém o conteúdo real do repositório

Outros metadados, como wikis, páginas gh, questões e solicitações pull, também podem ser incluídos como arquivos compactados separados.

Detalhes específicos dos arquivos TAR e do software para codificá-los e decodificá-los podem ser encontrados nas Informações de Representação em cada bobina do arquivo.

Descompactando arquivos compactados em arquivos legíveis e descompactados

Para incluir tantos repositórios e tantos dados quanto possível, a maioria dos dados foi compactada. Compressão significa usar uma pequena quantidade de dados para representar uma quantidade maior, por meio de padrões de uso e repetição nessa quantidade maior. Por exemplo, em vez de escrever o caractere a nove vezes seguidas, pode-se apenas escrever o texto compactado 9a, se tiver certeza de que o leitor compreenderá que 9a significa o texto não compactado aaaaaaaaa.

Algoritmos de compressão eficazes são muito mais complexos do que isso, mas o mesmo princípio se aplica. Este arquivo usa um programa de compressão conhecido como 'XZ', que por sua vez usa um algoritmo conhecido como 'LZMA'. O segundo arquivo de dados em cada bobina contém o código-fonte e a documentação do XZ em um único arquivo TAR descompactado, descrito abaixo. (O primeiro arquivo de dados contém a Declaração Universal dos Direitos Humanos em todas as línguas humanas escritas disponíveis.)

O LZMA combina o que é conhecido como algoritmo 'LZ77' e "codificação de faixa". LZ77 substitui dados repetidos por referências a aparições anteriores desses dados. Por exemplo, para simplificar grosseiramente, se uma frase de 80 bytes aparecer duas vezes, com 400 bytes de diferença, na segunda vez, o algoritmo compactará os dados dizendo "repita 80 bytes de 400 bytes atrás". A codificação de intervalo essencialmente converte uma mensagem inteira em um único número muito longo, que por sua vez pode ser codificado.

As etapas específicas do algoritmo a ser usado para descompactar os dados são descritas pelo código-fonte XZ contido no segundo arquivo de dados em cada bobina. Embora seja teoricamente possível descomprimir manualmente, novamente, este seria um processo extraordinariamente demorado e trabalhoso. Na prática, um computador funcional seria necessário.

Convertendo cada arquivo individual em caracteres escritos

A humanidade usou muitos caracteres escritos ao longo dos milênios. A codificação usada para representar esses caracteres como 1s e 0s neste arquivo é conhecida como 'UTF-8'. Um único caractere UTF-8, ou seja, um único símbolo escrito, pode ocupar de 1 a 4 bytes de dados binários.

Por razões históricas, por serem os mais amplamente usados na época e região onde e quando o desenvolvimento de software começou, um grupo de caracteres (e conceitos) conhecido como 'ASCII' são codificados de forma mais eficiente, a 1 byte por caractere. Qualquer coisa que não seja ASCII é codificada como 2 ou mais bytes por caractere. A maioria dos arquivos de texto neste arquivo são ASCII, mas um número substancial não é. Muitos mais serão principalmente ASCII com caracteres não ASCII ocasionais.

As especificações detalhadas do ASCII podem ser encontradas nas Informações de Representação em cada bobina do arquivo. As especificações detalhadas do UTF-8 podem ser encontradas no carretel do guia. O primeiro arquivo de dados em cada rolo do arquivo conterá o texto da Declaração Universal dos Direitos Humanos em todas as línguas humanas escritas disponíveis. Isso servirá como uma ferramenta de tradução e como um exemplo de ASCII e UTF-8.

Tipos de arquivos

Existem muitos tipos diferentes de arquivos de texto, criados por diferentes motivos. O tipo principal aqui, a razão pela qual este arquivo existe, é o código-fonte. O código-fonte é um texto muito denso e extremamente estruturado, no qual símbolos como '{' e ';' têm grande importância.

O principal aspecto do código-fonte é que ele foi escrito para ser lido por compiladores. Como os compiladores são softwares, outra maneira de expressar isso é que o código-fonte é escrito para ser lido por computadores. Um bom código também é escrito de forma que outros humanos, se forem qualificados e educados na área de software, possam entendê-lo; mas só é correto se um compilador puder entendê-lo.

Esse compilador irá, por sua vez, por meio de sequências complicadas descritas na árvore tecnológica, converter o código-fonte em sequências de uns e zeros que farão com que o computador execute as funções e atividades descritas pelo código. Para dar um exemplo muito simples, a linha de código

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

será convertido pelo compilador em uma série de instruções binárias alimentadas ao computador, o que fará com que uma pequena parte do computador, chamada de registrador, defina seu valor para 0 e, subsequentemente, incremente esse valor para 1, 2, 3, e depois 4. (Não é um exemplo de código útil; é apenas uma ilustração do processo de várias camadas de transformar o código-fonte em software em execução.)

Outros tipos de arquivos de texto, como JSON, XML e HTML, são usados para armazenar dados (em oposição a comandos) para computadores. Eles geralmente também podem ser lidos por humanos, embora seus formatos estruturados os tornem mais difíceis de ler do que textos de narrativa menos estruturados como este arquivo.

A maioria dos outros tipos de arquivos de texto devem ser eventualmente lidos por humanos. Alguns são textos simples, em sua maioria não estruturados, como este arquivo que você está lendo no momento. Um tipo que você encontrará amplamente no arquivo é Markdown, significado pela extensão .md para um arquivo, que é uma espécie de forma intermediária destinada a ser lida por humanos em sua forma bruta e também, ao mesmo tempo, estruturada de modo que os computadores podem formatá-los em layouts visualmente mais atraentes e úteis. A maioria dos repositórios neste arquivo possui um arquivo README.md Markdown, que geralmente tem a intenção de ser uma introdução inicial ao repositório, descrevendo o que é, por que existe e como usá-lo.

Uma breve visão geral das formas mais comuns de arquivos não textuais também pode ser útil. O código compilado não é texto. Arquivos JPG e PNG codificam imagens em formato digital, e MP3 e WAV codificam áudio. Os arquivos PDF codificam documentos com formatação precisa e perfeita. E os arquivos ZIP e TAR, conforme mencionado anteriormente, são arquivos de contêiner que, por sua vez, podem incluir um ou vários outros arquivos.

Linguagens Humanas e Linguagens de Programação

Línguas Humanas

Existem milhares de línguas escritas usadas pela humanidade hoje, e ainda mais línguas faladas. A maioria deles é usada apenas por populações relativamente pequenas, mas há pelo menos vinte línguas usadas como primeira ou segunda língua por pelo menos 60 milhões de pessoas.

Os idiomas mais usados no mundo são o inglês e o chinês. Por razões históricas, por muitos anos, a maior parte do desenvolvimento de software ocorreu em países de língua inglesa; portanto, por um tempo, o inglês se tornou o idioma padrão do software. A maioria das linguagens de programação usa palavras em inglês em sua sintaxe. É o idioma no qual este guia para o arquivo foi escrito pela primeira vez.

Não é garantido que os herdeiros deste arquivo saibam inglês, embora pareça um idioma particularmente provável de durar indefinidamente. Caso alguma orientação em outros idiomas seja útil, estamos incluindo as mais de 500 traduções disponíveis da Declaração Universal dos Direitos Humanos como um arquivo UTF-8 descompactado no início de cada rolo e também na Árvore Tecnológica. Esta declaração é uma lista dos direitos e liberdades de cada ser humano em nossa era, que nunca devem ser retirados.

Linguagens de programação

Linguagens de programação são aquelas usadas por humanos para comunicar instruções aos computadores. Eles são os idiomas nos quais o software é expresso. Outros humanos (treinados) também devem ser capazes de ler o software escrito em linguagens de programação, mas esse é um objetivo secundário.

Uma linguagem de programação é um conjunto de elementos predefinidos, a maioria dos quais são palavras, que podem ser organizados de uma maneira estruturada para instruir um computador a executar a ação especificada da maneira especificada. Uma coleção dessas instruções é conhecida como programa ou código-fonte. O código-fonte é essencialmente software em uma forma escrita congelada.

Os programas geralmente são divididos em etapas discretas, conhecidas como instruções, que por sua vez são agrupadas em coleções conhecidas como funções. Um programa inteiro pode estar contido em um único arquivo ou pode estar distribuído por milhares.

Existem centenas de linguagens de programação diferentes, espalhadas por muitas formas, abordagens e filosofias diferentes. Alguns são compilados em arquivos binários separados, que são executados; algumas, conhecidas como linguagens "interpretadas", são efetivamente compiladas e executadas de uma só vez, sem estágio intermediário. A maioria das linguagens de programação modernas inclui bibliotecas de funções pré-escritas, e essas bibliotecas podem ser muito volumosas e elaboradas. Algumas das linguagens de programação mais populares de hoje incluem:

  • C, uma das linguagens mais antigas e rápidas, mais universais e poderosas, simples em alguns aspectos, mas bastante limitada em outros, e nem sempre intuitiva, fácil de ler ou fácil de aprender.

  • C ++, uma evolução mais complexa, abstrata e poderosa de C.

  • C #, uma evolução posterior compilada não em código de máquina binário, mas em um "tempo de execução" interpretado.

  • Java, que é semelhante (mas anterior) ao C #, é talvez a linguagem mais usada atualmente.

  • JavaScript, bastante diferente de Java apesar da semelhança no nome, e também conhecido como 'ECMAScript', é uma linguagem inicialmente usada totalmente em um navegador da web, ou seja, um programa que buscava, interpretava e exibia dados de um computador remoto conhecido como Internet servidor; hoje, porém, é amplamente usado nesses servidores também.

  • TypeScript, uma forma de JavaScript com regras mais rígidas para que erros, também conhecidos como bugs, sejam menos prováveis de entrarem nos programas.

  • Python, uma linguagem elegante popular entre os cientistas, poderosa e uma boa primeira linguagem.

  • Ruby, uma linguagem intuitiva cujas afirmações costumam ser quase como o inglês escrito.

  • Go, uma linguagem simples e poderosa que se destaca especialmente em programas paralelizados, ou seja, programas escritos de forma que várias funções sejam executadas independentemente ao mesmo tempo.

  • Swift, uma nova linguagem usada para escrever para telefones e outros dispositivos usados por um bilhão de pessoas.

  • Rust, destinado a substituir o C, o que torna muito menos provável erros perigosos.

  • PHP, uma linguagem simples usada para servidores de Internet.

  • Lisp, uma linguagem muito antiga com uma abordagem de programação fundamentalmente diferente e baseada em funções.

  • SQL, um tipo muito diferente de linguagem usada para buscar dados de armazenamentos de dados estruturados e altamente eficientes conhecidos como bancos de dados.

  • Assembler (ou assembly), uma família de linguagens muito enigmática, limitada, mas rápida e poderosa em que existe uma relação direta entre as construções da linguagem e o código de máquina do computador em questão; pode ser considerado código semi-compilado.

Desenvolvimento, dependências e código aberto

Desenvolvimento

O processo de pegar um único arquivo de código-fonte simples e convertê-lo em impulsos elétricos dentro de um computador é extremamente complexo. Lidamos com essa complexidade usando camadas de abstração. Uma abstração conhecida como conjunto de instruções permite que a saída do código de máquina de um único compilador seja usada em muitos tipos diferentes de computadores. Um autor de código-fonte geralmente não precisa saber ou se preocupar com que tipo de computador, ou mesmo que conjunto de instruções, será usado para executar esse código; isso é abstraído pelo compilador.

O software moderno é, por sua vez, muito mais complexo do que um único autor trabalhando em um único programa para um único computador. Consiste em muitos autores trabalhando em vários arquivos dentro de um único projeto, simultaneamente, geralmente usando várias linguagens de programação. Além disso, todo projeto depende de outros projetos separados e independentes como ferramentas e / ou componentes, enquanto esses projetos estão sendo ativamente trabalhados e, por sua vez, dependem de outros projetos. Fazer com que todas essas partes móveis funcionem juntas de maneira elegante e eficiente é o desafio do desenvolvimento de software moderno.

Quando vários autores de código-fonte, também conhecidos como desenvolvedores de software, trabalham em um único projeto, cada um tem seu próprio computador e uma cópia de todo o projeto em seu computador. Se cada um fizer alterações, cada um terá uma versão diferente do mesmo projeto. O processo de reconciliar várias versões de um projeto é conhecido como controle de versão. É gerenciado por software de controle de versão; neste arquivo, por um software chamado Git, após o qual o próprio GitHub é nomeado. Cada repositório neste arquivo é um repositório Git.

O Git pode mesclar automaticamente diferentes versões de software em uma forma coerente com o mínimo de intervenção humana necessária. O Git também mantém um histórico completo que permite que você volte para uma versão anterior quando necessário. No entanto, para economizar espaço, os repositórios deste arquivo geralmente não incluem históricos Git.

Quando vários desenvolvedores seguem um projeto em vários caminhos diferentes simultaneamente, isso é conhecido como ramificação de um projeto, e esses caminhos são conhecidos como ramificações. O branch principal acordado de um projeto é conhecido como o tronco ou o branch master. Git fornece um recurso que os desenvolvedores podem usar para resumir as diferenças entre dois ramos e propor unir os deles aos do outro. Isso é conhecido como solicitação de pull. O desenvolvimento de software moderno consiste basicamente em ramificar um projeto, escrever ou editar o software em seu branch e, quando concluído, enviar uma solicitação de pull para que seu trabalho seja reincorporado ao branch master.

Dependências

Essencialmente, todas as linguagens de programação apoiam a construção do trabalho de outros. Sem reutilizar o trabalho de terceiros, cada projeto seria enormemente mais difícil e muito mais lento, e poucos projetos seriam realmente usados no mundo real.

Se o projeto A precisa incluir o projeto B para que A faça seu trabalho, então A é conhecido como dependente do projeto B e B é conhecido como uma dependência do projeto A. A pode ter muitas dependências, cada uma das quais pode ter muitas dependências próprias e assim por diante. Além disso, cada dependência é para uma versão específica, ou intervalo de versões, de um determinado projeto. A discriminação completa de todas as camadas múltiplas de dependências de um projeto é conhecida como sua árvore de dependências.

Geralmente, as dependências são discriminadas dentro dos arquivos de código-fonte, geralmente no topo, e cada vez que o compilador ou interpretador encontra uma dependência, ele a procura em um conjunto de diretórios predefinidos. Como a árvore de dependências de um projeto pode ser muito complexa, às vezes ela é detalhada em sua totalidade em um único arquivo dentro de um projeto conhecido como lista de pacotes. Por exemplo, projetos Ruby podem ter um Gemfile para este propósito, e projetos JavaScript podem ter um arquivo package.json. Isso permite que um tipo de ferramenta conhecido como software de gerenciamento de pacotes busque todas as dependências de um projeto de uma vez, de um ou mais servidores da Internet.

No caso deste arquivo, é provável que as dependências de qualquer projeto existam em outro lugar no arquivo. Para encontrar uma dependência no arquivo, é necessário primeiro descobrir o nome da dependência no código-fonte ou na lista de pacotes, cujos detalhes exatos variam de acordo com a linguagem e estrutura, e então usar o índice mestre no carretel do guia, ou, na sua ausência, os índices na frente de cada bobina, para determinar em qual bobina e quadro (s) o repositório em questão pode ser encontrado.

Código aberto

Como a execução de um programa em um computador requer apenas o código de máquina compilado, é possível distribuí-lo enquanto mantém o código-fonte em segredo. Isso é conhecido como o modelo de código fechado. Nos primeiros dias da computação, o código-fonte era geralmente distribuído junto com o código de máquina, mas posteriormente, à medida que o software se tornou uma indústria lucrativa, o modelo de código-fonte fechado tornou-se mais comum.

Desde então, aprendeu-se que tornar o código-fonte público, para que qualquer pessoa possa copiar, ramificar e melhorar, é uma abordagem muito mais eficaz para o desenvolvimento de software. Mais pessoas que podem ler o código-fonte de um projeto significa mais pessoas para identificar possíveis necessidades e novos recursos úteis, mais pessoas que entendem o projeto o suficiente para contribuir com ele, mais pessoas que podem detectar bugs e enviar correções e mais pessoas para testar e verificar esse novo código funciona.

Em geral, o código fechado leva a comunidades menores, isoladas e fragmentadas que lutam para encontrar e adotar ideias novas e melhores. O código aberto leva a comunidades grandes e interconectadas, cada uma ajudando os projetos uns dos outros a crescer, florescer e ter sucesso, usando o trabalho uns dos outros como dependências e / ou reutilizando seu código e aprendendo uns com os outros. O software de código aberto é um kit de ferramentas para o uso coletivo de toda a humanidade, e quanto mais e melhores ferramentas tivermos, mais rápido e melhor poderemos progredir como espécie.