diff --git a/GUIDE_ptBR.md b/GUIDE_ptBR.md new file mode 100644 index 00000000000..a228a452654 --- /dev/null +++ b/GUIDE_ptBR.md @@ -0,0 +1,283 @@ +# Guia do Cofre de Código GitHub + +## Introdução + +Este arquivo, o Cofre de Código GitHub, foi estabelecido pelo Programa de Arquivamento GitHub, cuja missão é preservar software de código aberto para as gerações futuras. Seja você lendo isso em um ano ou em mil anos, esperamos que seu conteúdo, e talvez até mesmo o próprio conceito de código aberto, seja útil 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 capaz de executar automaticamente funções matemáticas muito mais rapidamente que a mente humana, conferindo-lhe poderes que nos superam em muito. Nossos computadores servem para explorar os segredos do universo, conectar toda a humanidade em uma rede onipresente de informações, manipular sinais rápido o suficiente para transmitir sons e projetar imagens animadas detalhadas em telas elétricas, e controlar máquinas poderosas que excedem em muito a capacidade e precisão do trabalho humano. + +Um computador sem software não pode fazer nada disso. Um computador é uma coisa extraordinária e maravilhosa, mas sem software, todo o seu poder é inútil. O propósito deste arquivo é transmitir a você o que sabemos sobre software. + +Software é escrito como sequências complexas mas legíveis por humanos, chamadas linguagens de programação, porque uma unidade completa de software é frequentemente chamada de programa. Esses programas são então convertidos na linguagem binária de uns e zeros usada pelos computadores. Este processo é chamado de compilação. + +Como é muito difícil reconstruir software compilado em sua forma original, também chamada código-fonte, é possível para pessoas manterem essa forma em segredo e reivindicarem propriedade sobre ela. Software de código aberto não é um tipo diferente de software, mas uma ética diferente. A ética de código aberto rejeita o segredo e a propriedade. Software de código aberto é disponibilizado gratuitamente para todos, para que possam, por sua vez, melhorar esses programas ou usá-los para criar novos e melhores. + +Um projeto de código aberto é o trabalho coletivo de uma comunidade auto-organizada que pode ter milhares de membros. A acumulação de todos os projetos de código aberto arquivados aqui é o produto de uma comunidade de milhões de pessoas. Embora alguns indivíduos possam ter direitos especiais dentro de um projeto específico, como a capacidade de aprovar ou rejeitar mudanças propostas à versão oficial mais recente de seu código-fonte, ninguém nunca o possui. Todos têm 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 é chamado de fazer um fork do projeto. + +Quando muitas pessoas trabalham no código-fonte ao mesmo tempo, é difícil rastrear e integrar todas as suas mudanças. Um projeto de código aberto chamado "Git" é dedicado a resolver esse problema. Ele integra um histórico completo de todas as mudanças feitas a um projeto em uma entidade chamada 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 pessoas ao redor do mundo armazenarem os programas que escreveram, rastrearem mudanças nesses programas e colaborarem com outros para melhorá-los e expandi-los. O GitHub oferece seus serviços gratuitamente para desenvolvedores de software de código aberto público. Tem dezenas de milhões de usuários. + +O que segue é uma descrição do que achamos que você precisará saber e possuir para aproveitar ao máximo este arquivo de software. Se você não entender tudo, não desanime! Também incluímos um guia para cumprir esses requisitos. Se, por qualquer razão, você não puder cumpri-los sozinho, então seus descendentes poderão. + +# 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 luz e algum tipo de lupa. No entanto, a maioria (mas não todos) de seus dados foram armazenados muito densamente em rolos de filme em uma forma codificada e comprimida. Ler, decodificar e descomprimir esses dados exigirá computação considerável. Em teoria, isso poderia ser feito sem computadores, mas seria muito tedioso e difícil. + +Assumimos que você não precisa de nossas definições de software, computador e outros termos. Imaginamos que você tenha seus próprios computadores, provavelmente muito mais avançados que os nossos, e talvez fundamentalmente diferentes em sua arquitetura. Uma vez que você compreenda a visão geral e o guia abaixo, poderá facilmente acessar 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 comprimidos, não codificados e legíveis 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, com o tempo, você possa usar esse conhecimento para recriar computadores capazes de usar o software de código aberto deste 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. Milhões de pessoas tornam o software que escrevem acessível a todos. Este arquivo inclui um instantâneo — isto é, uma cópia única em um momento específico — de todo o software público que os usuários do GitHub desenvolvem ativamente. Isso significa que inclui milhões de repositórios distintos. Esperamos que essa abordagem ampla e democrática interesse aos historiadores do futuro. + +Os repositórios incluídos neste arquivo foram determinados apenas por sua data de último commit, ou seja, a última vez que foram atualizados, e seu número de estrelas. (Os usuários do GitHub podem todos "estrelar" repositórios públicos para indicar que os acham interessantes ou importantes.) O instantâneo foi iniciado em 02/02/2020, isto é, o segundo dia do mês de fevereiro do ano 2020 do calendário gregoriano, como contamos o tempo. Os repositórios incluídos são: todos os repositórios que tiveram um commit nos 80 dias anteriores; todos os repositórios com pelo menos uma estrela e um commit nos 365 dias anteriores; e todos os repositórios com pelo menos 250 estrelas, independentemente de quando foram atualizados pela última vez. + +Claro, nem todos esses repositórios têm igual importância em termos de influência e dependências. A Árvore Tecnológica inclui um índice e breve descrição dos repositórios mais significativos do arquivo, e indica em qual rolo cada um pode ser encontrado, para que possam ser consultados sem ter que percorrer todos esses milhões de repositórios para determinar quais são os mais úteis na prática. + +## Visão geral do arquivo + +O arquivo consiste em 188 rolos de filme: um "rolo guia" de informações e conselhos legíveis por humanos, que chamamos de Árvore Tecnológica, e 187 rolos de software arquivado. Cada rolo compreende 65.000 imagens individuais. As imagens no início de cada rolo, e aquelas do rolo guia, incluem texto e imagens legíveis por humanos. Todas as outras imagens de filme consistem em dados digitais armazenados como forma visual chamada códigos QR. + +Dados digitais significam dados armazenados em formato binário, isto é, 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 assim dados binários são muito mais fáceis para computadores compreenderem que qualquer outro formato. + +Os metadados legíveis por humanos armazenados no início de cada rolo incluem informações sobre o filme em si, um guia da codificação QR usada, um programa para decodificá-la, e um índice. O índice lista o título, número da primeira imagem e 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 único derivado de um cálculo, chamado função hash, realizado em todo o conteúdo de um arquivo para garantir que seu conteúdo não foi danificado ou corrompido; a função hash usada no arquivo é chamada "SHA-1". + +Cada código QR consiste em um campo de minúsculos quadrados brancos ou pretos que ocupam quase toda a imagem do filme. Usamos códigos QR porque são muito mais compactos e robustos que texto legível por humanos. Um código QR se decodifica em dados binários, isto é, uma série de uns e zeros. + +Esta decodificação é apenas o primeiro passo para transformar esses dados binários em informação significativa. São dados comprimidos, isto é, foram compactados para economizar espaço, um pouco como escrever "128xA" em vez de escrever a letra A 128 vezes. Após decodificação, devem ser descomprimidos. + +O resultado após descompressão é chamado arquivo de arquivo: um arquivo único contendo todo o conteúdo do repositório de um projeto de software. A maioria dos repositórios inclui muitos arquivos, então este arquivo de arquivo é como um livro contendo muitos capítulos separados, ou uma caixa contendo muitas outras caixas. Geralmente é vantajoso, mas não absolutamente necessário, descomprimir o arquivo de arquivo em seus arquivos componentes antes de examiná-los. + +Finalmente, cada arquivo componente é seu próprio conjunto de dados binários, isto é, uns e zeros. Podemos dar sentido a esses dados se conhecermos seu formato. Por exemplo, no formato chamado "UTF-8", o mais comum no arquivo, uns e zeros são divididos em grupos de oito, chamados 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 acento til). + +Este processo de arquivamento de dados — arquivos binários agrupados em arquivos de arquivo, primeiro comprimidos então codificados em QR — é obviamente complexo comparado a escrever texto legível por humanos. O processo de desarquivamento que você terá que seguir — QR para binário comprimido; comprimido para descomprimido; arquivo de arquivo para múltiplos arquivos; arquivos de texto para texto legível por humanos — é igualmente complexo. Mas essa complexidade nos permite armazenar muito mais dados do que seria possível de outra forma, de uma forma relativamente fácil para computadores lerem. + +Se esta complexidade lhe parece difícil e custosa, pedimos desculpas, mas achamos que, neste caso, este guia e a Árvore Tecnológica legível por humanos aliviará essa complexidade, e talvez seja mais útil que o conteúdo do arquivo, pelo menos até que seus computadores sejam suficientemente avançados para que a complexidade dos dados do arquivo seja fácil de gerenciar. + +## Arquivos, diretórios, repositórios e formatos de dados + +Pode ser instrutivo explicar como o arquivo é dividido logicamente. Em particular, uma discussão sobre arquivos, diretórios e formatos de dados pode ser útil. + +Um arquivo é um conjunto de dados agrupados em uma entidade coerente com um nome único: imagine os dados como areia, e um arquivo como um saco que só pode conter areia. Um diretório é um conjunto de arquivos: imagine-o como um saco que só pode conter outros sacos. Seguindo esta metáfora, cada repositório consiste em um diretório externo, chamado diretório raiz, que contém um número de arquivos e/ou diretórios. Cada diretório pode, por sua vez, conter tanto arquivos quanto diretórios. + +Esta estrutura é preferida porque arquivos organizados em grupos são muito mais fáceis de trabalhar que uma coleção única de arquivos. O identificador de um arquivo particular no diretório externo consiste nos nomes de todos os seus diretórios englobantes, começando pela raiz, seguidos por seu próprio nome, com um caractere / entre cada nome. Por exemplo, um arquivo chamado README.md na 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 diretório 'public' dentro da raiz. + +Cada repositório tem, por sua vez, dois nomes, separados por um separador, que no arquivo é um caractere _ ou sublinhado. (Historicamente, era um / ou barra, mas isso também serve 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 dos identificadores de repositório e arquivo pode ser usada para identificar unicamente um arquivo individual no arquivo. Por exemplo, o arquivo 'package.json' no diretório 'web' do repositório 'ykarma' da conta GitHub 'rezendi' poderia ser identificado unicamente como /web/package.json em rezendi_ykarma no arquivo. + +Diferentes tipos de arquivos têm propósitos diferentes. O arquivo GitHub consiste principalmente de arquivos de texto, isto é, arquivos cujos dados são destinados a representar linguagem escrita. A maioria do software é escrita em arquivos de texto contendo texto altamente estruturado chamado código-fonte. Um programa especial chamado compilador converte este código-fonte legível por humanos em instruções legíveis por computador, chamadas código compilado ou código de máquina. + +Arquivos que não são arquivos de texto, como aqueles que representam imagens ou contêm código compilado, são frequentemente chamados arquivos binários. Este termo é infelizmente enganoso, pois arquivos de texto são também, em última análise, 1s e 0s. Chamaremos de arquivos não-texto aqueles que não são arquivos de texto. + +Existem muitas maneiras de representar linguagem escrita usando 1s e 0s. Por razões históricas, a maioria do código-fonte foi originalmente escrita no que é chamado alfabeto latino. O alfabeto latino tem 26 caracteres básicos usados para representar palavras pronunciáveis, cada um com duas formas, maiúscula e minúscula. Também tem 10 dígitos para representar números. O alfabeto latino, junto com vários outros símbolos associados usados para indicar estrutura e outros conceitos, é codificado em 1s e 0s em um formato chamado 'ASCII', que pode representar 128 caracteres diferentes e, por razões históricas, dominou a maioria do software por muitos anos. + +No entanto, o alfabeto latino é apenas uma pequena fração das muitas maneiras pelas quais os humanos se expressam por escrito. Para suportar outras escritas, enquanto permite que todo software escrito em ASCII continue funcionando sem modificação (conceito chamado compatibilidade com versões anteriores), outro formato de dados chamado 'UTF-8' foi introduzido. + +ASCII permanece o formato mais comum para código-fonte. Cada rolo deste arquivo inclui um guia dos caracteres ASCII. ASCII é um subconjunto de UTF-8, isto é, todas as codificações ASCII são também codificações UTF-8. O rolo guia contém adicionalmente uma especificação de todos os caracteres UTF-8. Quase todos os arquivos de texto neste arquivo devem ser codificados em UTF-8. + +Arquivos não-texto incluem arquivos destinados a representar imagens e documentos formatados. Uma convenção amplamente usada é que nomes de arquivos terminem com um ponto seguido por um sufixo indicando o tipo de arquivo. Por exemplo, um nome de arquivo terminando em .jpg é provavelmente um arquivo de imagem JPEG; um nome terminando em .PNG é provavelmente um arquivo Portable Network Graphic; e um nome terminando em .pdf um arquivo Portable Document Format. + +Não existe sufixo único indicando arquivos de texto. Para código-fonte, o sufixo indica em vez disso em qual linguagem de programação ou marcação o código está escrito. Linguagens de programação e marcação serão descritas em mais detalhes abaixo. + +## Como extrair o conteúdo do arquivo + +Aqui está uma visão geral de como descomprimir um repositório arquivado em seus vários arquivos constituintes. Este processo consiste em: + +1. Identificar o rolo e as imagens específicas nas quais os dados do repositório são arquivados. + +2. Decodificar a partir dos códigos QR, os campos de pixels pretos, brancos e cinzentos nessas imagens, em um arquivo binário, uma sequência de pelo menos milhares, frequentemente milhões, de 1s e 0s. + +3. Descomprimir o arquivo binário em um arquivo de arquivo não comprimido mais longo. + +4. Descomprimir o arquivo de arquivo em seus sub-arquivos separados. Note, no entanto, que dados de arquivo são geralmente compreensíveis, embora desorganizados, mesmo se esta etapa for omitida. + +5. Finalmente, converter cada um desses sub-arquivos — eles próprios sequências de 1s e 0s, de comprimento variável — em caracteres escritos, se forem arquivos de texto. + +## Identificar o rolo e as imagens específicas nas quais os dados do repositório são arquivados + +Cada rolo de filme começa com um líder de filme em branco, então o Quadro de Referência Zero, que consiste em um retângulo preto sólido em um canto de uma imagem que é vazia de outra forma. A próxima imagem legível é o Quadro de Controle, com informações sobre o rolo. Em seguida vem o Índice, que inclui uma lista de Arquivos de Dados do Usuário. + +Cada repositório neste rolo é um desses Arquivos de Dados do Usuário. A lista inclui um identificador único, um identificador de arquivo e um nome para cada um desses arquivos. Por exemplo, o repositório CPython da conta Python poderia ter o identificador de arquivo 12345, e o nome python_cpython.tar. + +Após a lista dos Arquivos de Dados do Usuário vem uma lista de Localizações de Dados Digitais. Esta lista inclui o identificador de arquivo, uma imagem de início, um byte de início, uma imagem de fim e um byte de fim. Assim, no exemplo hipotético de CPython, o item desta lista com ID 12345 poderia ter uma imagem de início 054321, um byte de início 03210321, uma imagem de fim 054545 e um byte de fim 12321232. + +Isso significa, para obter os dados de CPython: vá para a imagem 54321 deste rolo de filme. Decodifique todas as imagens da imagem de início, 54321, à imagem de fim, 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 vazios sem dados. +Ignore os primeiros 3210320 bytes do primeiro pedaço não vazio. Adicione todos os "pedaços do meio", em ordem. Finalmente, adicione os primeiros 12321232 bytes do último pedaço de dados, 54545. Você agora montou o repositório CPython completo, como um arquivo de arquivo comprimido único. + +## Decodificar a partir dos códigos QR em um arquivo binário + +Os detalhes sobre como decodificar as imagens de filme em dados binários são encontrados nas Informações de Representação legíveis por humanos, que estão localizadas após o Índice no início de cada rolo de filme do arquivo. Esta informação está localizada em cada rolo para que, mesmo se um rolo for separado do arquivo, ainda seja possível decifrar seu conteúdo. Essas Informações de Representação incluem, em ordem: + +1. Um Guia do Programa de Arquivamento GitHub (este documento) + +2. Índice descritivo GitHub, uma lista e breve descrição de todos os repositórios neste rolo + +3. Descrição das Informações de Representação + +4. Preservação digital e como recuperar os dados, uma visão geral dos detalhes de recuperação de dados + +5. Descrição da mídia de armazenamento + +6. Tecnologia de recuperação de dados + +7. Estrutura genérica do rolo de preservação (formato do rolo) + +8. Descrição do formato de imagem 4K genérico + +9. Descrição da biblioteca Unboxing (para códigos QR) + +10. Código-fonte da biblioteca Unboxing + +11. Especificação do formato de dados ASCII + +12. Especificação da linguagem de programação C + +13. Código-fonte do arquivo TAR + +14. Código-fonte PDF + +15. Especificação do formato de arquivo XZ (para compressão/descompressão, veja abaixo) + +O sexto desses itens, o documento sobre Tecnologia de Recuperação de Dados, descreve os requisitos e processos para usar um scanner para capturar os dados em uma imagem de filme codificada digitalmente e transformá-los em uma forma utilizável por computador. O oitavo, a descrição do formato de imagem 4K genérico, fornece as informações técnicas, incluindo código-fonte, necessárias para um computador transformar tal imagem escaneada em dados binários. + +É teoricamente possível, em princípio, converter um repositório de dados codificados em QR para dados binários sem usar um computador. No entanto, isso seria extremamente difícil e provavelmente exigiria esforço considerável de uma comunidade bem organizada ao longo de várias semanas, se não meses ou anos. Como o conteúdo dos repositórios é destinado a ser executado em um computador, seu uso na ausência de um computador seria na melhor das hipóteses mínimo. + +Se os herdeiros deste arquivo não tiverem computadores, eles devem preservar todo o arquivo e mantê-lo seguro até que o tenham. Um dos objetivos da Árvore Tecnológica legível por humanos é acelerar o desenvolvimento de tecnologias e computadores no caso dessa eventualidade. (Seu outro objetivo é codificar nossa tecnologia e seu desenvolvimento para historiadores do futuro.) + +## Descomprimir o arquivo de arquivo em seus sub-arquivos separados + +O arquivo binário de cada repositório está em um formato chamado TAR, para Tape Archive. Um arquivo TAR é essencialmente composto agrupando vários arquivos ligando o fim de um ao início do próximo, como se colasse folhas de papel juntas para fazer um único rolo. Um arquivo TAR pode incluir qualquer número de arquivos, de qualquer tamanho, espalhados por qualquer número de diretórios e subdiretórios. + +Cada sub-arquivo em um arquivo TAR é precedido por um cabeçalho de 512 bytes, que age como a fita na metáfora do rolo. Este 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 arquivos TAR são essencialmente coleções de arquivos com registros de texto entre eles, se um arquivo TAR contém apenas arquivos de texto, ele pode ser tratado como um arquivo de texto ele mesmo. Se contém uma mistura, pode ser tratado como um arquivo de texto contendo uma mistura de texto estruturado e significativo (os arquivos de texto constituintes) e linguagem incompreensível (os arquivos não-texto constituintes). + +É possível aninhar arquivos TAR dentro de outros arquivos TAR, um contêiner dentro de outro, e é assim que a maioria de nossos dados arquivados são armazenados. Para um dado repositório, o arquivo TAR externo conterá pelo menos: + +* um arquivo de metadados não comprimido chamado META, que inclui o nome do repositório, nome da conta, descrição, linguagem, número de estrelas e forks +* um arquivo comprimido (veja abaixo) nomeado COMMITS, que inclui o log de mudanças feitas ao repositório ao longo do tempo +* um arquivo nomeado repo.tar.xz, um arquivo TAR comprimido contendo o conteúdo real do repositório + +Outros metadados, como wikis, gh-pages, issues e pull requests, podem também ser incluídos como arquivos comprimidos separados. +Os detalhes específicos dos arquivos TAR, e software para codificá-los e decodificá-los, são encontrados nas Informações de Representação em cada rolo do arquivo. + +## Descomprimir arquivos comprimidos em arquivos legíveis + +Para incluir tantos repositórios e dados quanto possível, a maioria dos dados foi comprimida. Compressão envolve usar uma pequena quantidade de dados para representar uma quantidade maior, explorando padrões e repetições nesta última. Por exemplo, em vez de escrever o caractere a nove vezes seguidas, poderíamos simplesmente escrever o texto comprimido 9a, se estivermos certos de que o leitor entenderá que 9a significa o texto descomprimido aaaaaaaaa. + +Algoritmos de compressão eficazes são muito mais complexos que isso, mas o princípio é o mesmo. Este arquivo usa um programa de compressão chamado "XZ", que por sua vez usa um algoritmo chamado "LZMA". O segundo arquivo de dados em cada rolo contém o código-fonte e documentação de XZ em um arquivo TAR não comprimido único (o primeiro arquivo de dados contém a Declaração Universal dos Direitos Humanos em todas as linguagens escritas disponíveis). + +LZMA combina o que é chamado algoritmo "LZ77" e "codificação de intervalo". LZ77 substitui dados repetidos com referências a ocorrências anteriores desses dados. Para simplificar, se uma frase de 80 bytes aparece duas vezes, com 400 bytes de intervalo, na segunda vez, o algoritmo compacta os dados dizendo "repetir 80 bytes de 400 bytes antes". A codificação de intervalo essencialmente converte uma mensagem inteira em um único número muito longo, que por sua vez pode ser codificado. + +Os passos específicos do algoritmo a usar para descomprimir os dados são descritos pelo código-fonte XZ contido no segundo arquivo de dados de cada rolo. Embora seja teoricamente possível descomprimir manualmente, isso seria novamente um processo extraordinariamente longo e trabalhoso. Na prática, um computador funcionando será necessário. + +## Converter 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 é chamada "UTF-8". Um único caractere UTF-8, isto é, um símbolo escrito, pode ocupar de 1 a 4 bytes de dados binários. + +Por razões históricas, como eles eram os mais usados na época e região onde o desenvolvimento de software começou, um grupo de caracteres (e conceitos) chamado "ASCII" é codificado da maneira mais eficiente, a 1 byte por caractere. Qualquer coisa não-ASCII é codificada a 2 bytes ou mais por caractere. A maioria dos arquivos de texto neste arquivo está em ASCII, mas um número significativo não está. Muitos outros serão principalmente ASCII com caracteres não-ASCII ocasionais. + +As especificações detalhadas de ASCII são encontradas nas Informações de Representação em cada rolo do arquivo. As especificações detalhadas de UTF-8 são encontradas no rolo guia. O primeiro arquivo de dados em cada rolo do arquivo contém o texto da Declaração Universal dos Direitos Humanos em todas as linguagens escritas disponíveis. Isso servirá tanto como ferramenta de tradução quanto exemplo de ASCII e UTF-8. + +## Tipos de arquivos + +Existem muitos tipos de arquivos de texto, criados por diferentes razões. O tipo principal aqui, a razão de ser deste arquivo, é código-fonte. Código-fonte é texto muito denso e extremamente estruturado, no qual símbolos como "{ " e "; " têm grande importância. + +O essencial sobre código-fonte é que é escrito para ser lido por compiladores. Como compiladores são software, também se pode dizer que código-fonte é escrito para ser lido por computadores. Bom código também é escrito para que outros humanos, se competentes e treinados no campo do software, possam entendê-lo; mas só está correto se um compilador puder entendê-lo. + +Este compilador, por sua vez, através de sequências complexas descritas na Árvore Tecnológica, converterá o código-fonte em sequências de uns e zeros que farão o computador executar 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á convertida pelo compilador em uma série de instruções binárias enviadas ao computador, que farão uma pequena parte do computador, chamada registrador, definir seu valor para 0, então incrementá-lo para 1, 2, 3, então 4. (Este não é um exemplo de código útil; é apenas uma ilustração do processo de múltiplos níveis de transformação de código-fonte em software funcionando.) + +Outros tipos de arquivos de texto, como JSON, XML e HTML, servem para armazenar dados (em vez de comandos) para computadores. Eles geralmente também são legíveis por humanos, embora seus formatos estruturados os tornem mais difíceis de ler que texto menos estruturado como este arquivo. + +A maioria dos outros tipos de arquivos de texto são destinados a serem lidos eventualmente por humanos. Alguns são simples, principalmente não estruturados, como este arquivo que você está lendo atualmente. Um tipo que você encontrará frequentemente no arquivo é Markdown, sinalizado pela extensão .md, que é uma espécie de forma intermediária destinada a ser legível por humanos em sua forma bruta e, ao mesmo tempo, estruturada para que computadores possam formatá-la em apresentações mais atraentes e úteis. A maioria dos repositórios neste arquivo tem um arquivo README.md em Markdown, geralmente destinado a apresentar o repositório, explicar por que existe e como usá-lo. + +Uma breve visão geral das formas mais comuns de arquivos não-texto também pode ser útil. Código compilado é não-texto. Arquivos JPG e PNG codificam imagens em formato digital, e MP3 e WAV codificam áudio. Arquivos PDF codificam documentos com layout preciso e perfeito. E arquivos ZIP e TAR, como mencionado acima, são arquivos contêiner que podem incluir um ou mais outros arquivos. + +# Linguagens e Programação + +## Linguagens Humanas + +Existem milhares de linguagens escritas utilizadas hoje pela humanidade, e ainda mais linguagens faladas. A maioria é utilizada apenas por populações relativamente pequenas, mas há pelo menos vinte linguagens utilizadas como primeira ou segunda língua por pelo menos 60 milhões de pessoas. + +As linguagens mais utilizadas no mundo são o inglês e o chinês. Por razões históricas, durante muitos anos, a maior parte do desenvolvimento de software ocorreu em países de língua inglesa, de modo que, por um tempo, o inglês se tornou a linguagem padrão do software. A maioria das linguagens de programação usa palavras em inglês em sua sintaxe. É a linguagem na qual este guia do arquivo foi originalmente redigido. + +Não há garantia de que os herdeiros deste arquivo conheçam inglês, embora pareça uma linguagem particularmente suscetível de durar indefinidamente. Para auxiliar outras linguagens, incluímos mais de 500 traduções disponíveis da Declaração Universal dos Direitos Humanos na forma de arquivo UTF-8 não comprimido no início de cada bobina, e também na Árvore Tecnológica. Esta declaração é uma lista dos direitos e liberdades de cada ser humano de nossa época, que nunca devem ser retirados. + +## Linguagens de Programação + +As linguagens de programação são aquelas utilizadas pelos humanos para comunicar instruções aos computadores. São as linguagens nas quais o software é expresso. Outros humanos (treinados) também devem poder ler o software escrito nessas linguagens, mas este é um objetivo secundário. + +Uma linguagem de programação é um conjunto de elementos predefinidos, dos quais a maioria são palavras, que podem ser organizados de maneira estruturada para ordenar a um computador que execute a ação especificada da maneira especificada. Um conjunto de tais instruções é chamado de programa, ou código-fonte. O código-fonte é essencialmente software em forma escrita congelada. + +Os programas são geralmente divididos em etapas distintas, chamadas instruções, que são por sua vez agrupadas em conjuntos chamados funções. Um programa inteiro pode estar contido em um único arquivo, ou distribuído em milhares. + +Existem centenas de linguagens de programação diferentes, distribuídas em muitas formas, abordagens e filosofias. Algumas são compiladas em arquivos binários separados, que são então executados; outras, chamadas linguagens "interpretadas", são efetivamente compiladas e executadas de uma só vez, sem etapa intermediária. A maioria das linguagens modernas inclui bibliotecas de funções pré-escritas, e essas bibliotecas podem ser muito volumosas e elaboradas. Entre as linguagens de programação mais populares hoje, encontramos: + +* C, uma das mais antigas, rápidas, universais e poderosas, simples em alguns aspectos mas bastante limitada em outros, e nem sempre intuitiva, fácil de ler ou aprender. + +* C++, uma evolução mais complexa, abstrata e poderosa do C. + +* C#, uma evolução adicional compilada não em código de máquina binário, mas em um "runtime" interpretado. + +* Java, similar ao (mas anterior ao) C#, é talvez a linguagem mais utilizada hoje. + +* JavaScript, muito diferente do Java apesar da similaridade do nome, também chamado de "ECMAScript", é uma linguagem inicialmente utilizada apenas em um navegador web, ou seja, um programa que recupera, interpreta e exibe dados de um servidor remoto; hoje, também é amplamente utilizado nesses servidores. + +* TypeScript, uma forma de JavaScript com regras mais rigorosas para que erros, também chamados bugs, sejam menos suscetíveis de acabar nos programas. + +* Python, uma linguagem elegante popular entre cientistas, ao mesmo tempo poderosa e uma boa primeira linguagem. + +* Ruby, uma linguagem intuitiva cujas instruções frequentemente se assemelham ao inglês escrito. + +* Go, uma linguagem simples e poderosa que se destaca particularmente em programas paralelizados, ou seja, escritos para que múltiplas funções sejam executadas independentemente ao mesmo tempo. + +* Swift, uma nova linguagem utilizada para escrever para telefones e outros dispositivos utilizados por um bilhão de pessoas. + +* Rust, projetada para substituir C, tornando bugs perigosos muito menos prováveis. + +* PHP, uma linguagem simples utilizada para servidores de Internet. + +* Lisp, uma linguagem muito antiga com uma abordagem fundamentalmente diferente, focada em funções. + +* SQL, uma linguagem muito diferente utilizada para extrair dados de bases de dados estruturadas e muito eficientes. + +* Assembly (ou assembler), uma família de linguagens muito crípticas, limitadas, mas rápidas e poderosas, nas quais 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 meio compilado. + +## Desenvolvimento, Dependências e Open Source + +### Desenvolvimento + +O processo que consiste em pegar um simples arquivo de código-fonte e convertê-lo em impulsos elétricos em um computador é extremamente complexo. Gerenciamos essa complexidade usando camadas de abstração. Uma abstração chamada conjunto de instruções permite que o código de máquina produzido por um compilador seja usado em muitos tipos de computadores. Um autor de código-fonte geralmente não precisa saber ou se preocupar com o tipo de computador, ou mesmo com o conjunto de instruções, que será usado para executar esse código; isso é gerenciado pelo compilador. + +O software moderno é, por sua vez, muito mais complexo que um único autor trabalhando em um único programa para um único computador. Consiste em muitos autores trabalhando em muitos arquivos dentro de um mesmo projeto, simultaneamente, frequentemente usando múltiplas linguagens de programação. Além disso, cada projeto depende de outros projetos separados e autônomos como ferramentas e/ou componentes, enquanto esses projetos são eles mesmos ativamente desenvolvidos, e dependem por sua vez de outros projetos. Fazer todos esses elementos funcionarem juntos de maneira elegante e eficiente é o desafio do desenvolvimento de software moderno. + +Quando múltiplos autores de código-fonte, também chamados desenvolvedores, trabalham no mesmo projeto, cada um tem seu próprio computador e uma cópia completa do projeto em seu computador. Se cada um faz modificações, eles têm então versões diferentes do mesmo projeto. O processo de reconciliação de múltiplas versões de um projeto chama-se controle de versão. É gerenciado por um software de controle de versão; neste arquivo, por um software chamado Git, do qual GitHub deriva seu nome. Cada repositório deste arquivo é um repositório Git. + +Git pode automaticamente fundir diferentes versões de um software em uma forma coerente com intervenção humana mínima. Git também mantém um histórico completo que permite voltar a uma versão anterior se necessário. Contudo, para economizar espaço, os repositórios deste arquivo geralmente não incluem os históricos Git. + +Quando múltiplos desenvolvedores levam um projeto por vários caminhos diferentes simultaneamente, isso chama-se criar ramificações (branches), e esses caminhos são chamados branches. A branch principal de um projeto é chamada tronco, ou branch master. Git oferece uma funcionalidade permitindo aos desenvolvedores resumir as diferenças entre duas branches e propor fundir a sua com a de outro. Isso chama-se pull request. O desenvolvimento de software moderno consiste em grande parte em criar uma branch, escrever ou modificar o software em sua branch, então, uma vez terminado, submeter um pull request para que seu trabalho seja reintegrado na branch principal. + +### Dependências + +Praticamente todas as linguagens de programação permitem apoiar-se no trabalho de outros. Sem reutilização do trabalho alheio, cada projeto seria enormemente mais difícil, muito mais lento, e muito poucos projetos veriam alguma vez uso real no mundo. + +Se o projeto A deve incluir o projeto B para funcionar, então A depende de B, e B é uma dependência de A. A pode ter muitas dependências, cada uma podendo ter suas próprias dependências, e assim por diante. Além disso, cada dependência diz respeito a uma versão particular, ou uma faixa de versões, de um projeto dado. A enumeração completa de todas as camadas de dependências de um projeto chama-se sua árvore de dependências. + +Em geral, as dependências são enumeradas nos arquivos de código-fonte, geralmente no topo, e cada vez que o compilador ou intérprete encontra uma dependência, ele a procura em um conjunto de diretórios predefinidos. Porque a árvore de dependências de um projeto pode ser muito complexa, às vezes é enumerada inteiramente em um único arquivo do projeto chamado lista de pacotes. Por exemplo, projetos Ruby podem ter um Gemfile para esse fim, e projetos JavaScript podem ter um arquivo package.json. Isso permite que uma ferramenta chamada gerenciador de pacotes recupere todas as dependências de um projeto de uma só vez, a partir de um ou mais servidores de Internet. + +No caso deste arquivo, é provável que as dependências de qualquer projeto dado existam em outro lugar no arquivo. Para encontrar uma dependência no arquivo, é preciso primeiro descobrir o nome da dependência no código-fonte ou na lista de pacotes, cujos detalhes variam segundo a linguagem e o framework, então usar o índice principal na bobina guia, ou, na falta disso, os índices no início de cada bobina, para determinar em qual bobina e quais imagens se encontra o repositório em questão. + +### Open Source + +Como a execução de um programa em um computador requer apenas o código de máquina compilado, é possível distribuir isso mantendo o código-fonte secreto. Isso chama-se modelo proprietário. Nos primórdios da computação, o código-fonte era geralmente distribuído com o código de máquina, mas posteriormente, à medida que o software se tornou uma indústria lucrativa, o modelo proprietário se tornou mais comum. + +Aprendemos desde então que tornar o código-fonte público, para que qualquer um possa copiá-lo, ramificá-lo e melhorá-lo, é uma abordagem muito mais eficiente do desenvolvimento de software. Quanto mais pessoas puderem ler o código-fonte de um projeto, mais pessoas há para identificar necessidades ou novas funcionalidades úteis, mais pessoas há que entendem suficientemente o projeto para contribuir com ele, mais pessoas há suscetíveis de detectar bugs e propor correções, e mais pessoas há para testar e verificar que o novo código funciona. + +Em geral, o modelo proprietário leva a comunidades menores, isoladas, fragmentadas, que lutam para encontrar e adotar novas ideias. O open source leva a grandes comunidades interconectadas, cada uma ajudando os projetos das outras a crescer, prosperar e ter sucesso, usando o trabalho das outras como dependências e/ou reutilizando seu código, e aprendendo umas das outras. O software open source é uma caixa de ferramentas para uso coletivo de toda a humanidade, e quanto mais ferramentas temos, e melhores elas são, mais rápido e melhor podemos progredir como espécie. \ No newline at end of file