Transcrição do áudio
O coleguinha, é a segunda vez que eu gravo esse vídeo aqui, cara. Vira e mexe, eu vou clicar ali no OBS para ver se ele não falhou, tá? Vamos lá. Então nós temos, naturalmente, já expliquei a questão que nós temos tipos de arquivos do Linux, especiais de bloco, de caractere, não é assim? E os regulares. E aí eu expliquei para vocês que os regulares, dois tipos. Os que são repositórios de dados, como um txt, um .doc, um .xlsx, que é do Excel, um .pdf, não é? São arquivos que são repositórios de dados. Programas consomem esses repositórios de dados, esses arquivos, e programas criam esses arquivos de dados, que eles podem consumir, não é assim? Afinal, você... Você escreve um txt, joga num pendrive, vai para a sua casa e abre o txt na sua casa. Repare, você está usando o txt para a comunicação entre dois processos, legal? E nós temos os arquivos executáveis, que são aqueles que são feitos e projetados para serem processados, que têm instrução e dados. Lembra de Von Neumann, cara, nesse momento. Você tem lá uma memória, você tem as instruções e os dados para a instrução. Legal? Lembre-se de Von Neumann. Beleza, vamos lá. Nesse ponto agora, então, vai nos interessar um tipo, que é o arquivo executável. Esse arquivo executável, ele é um binário, preparado e projetado. Preste atenção. O script não é binário. O script, ele não é um executável, tá? Executáveis são preparados e projetados para a máquina compreender. E então, executar as instruções. O script, ele é interpretado por um shell. Ou ele é interpretado por algum programa, beleza? Vamos lá. Então, nós temos aqui, naturalmente, a... O programa, ele é executado, né? Então, ele sai da memória secundária de armazenamento e vai para a memória principal. Só que, naturalmente, quando isso ocorre, é montado toda uma estrutura para que ocorra o processamento. Não é isso? E aí, o CPU, então, ele faz o processamento. Legal? Bom, olha só. Já um arquivo de dados, ele é apenas uma coleção de dados. Tudo mais. Legal? Bom, tudo está na RAM, porque tudo tem que ir para a memória principal. Tudo vai para a memória principal. Isso foi definido na nossa arquitetura, lá na década de 40, 50, do século passado. Estamos mantendo isso até hoje. E teria que, como eu posso dizer, romper um conceito muito... Consolidado, para que isso não ocorresse. Por isso, que você tem que copiar da memória secundária para a memória principal. E executar a partir da memória principal. Lembre-se do tópico Hierarquia de Memórias, lá do livro do Stallings de AOC, Arquitetura e Organização de Computadores. Dá uma olhada lá naquele capítulo. Legal? Galera, eu conheço todos esses livros. Meu conhecimento já... Alcança esses livros básicos todinhos. E eu consigo relacionar eles. E gerar mais conhecimento a partir de conhecimento. Isso é uma dádiva que o ser humano recebeu. Legal? Então, leia livros também. Maximize sua capacidade. Então, estando na memória principal, o CPU pode, naturalmente, fazer as operações sobre o programa. E esses arquivos, então, naturalmente, esses executáveis, eu posso chamar ele de qualquer lugar do meu sistema de arquivos. Então, vamos imaginar que eu estou aqui. E aí eu tenho um programa aqui, onde eu estou. Então, ponto barra, meu programa. Certo? Só que eu tenho que estar no diretório. Legal? Alguns, repare que eu não digito, né? Não é ciência. R, é BIM, CP para executar o comando CP. Eu já faço CP direto. Porque o Linux, assim como todo sistema operacional, ele tem os diretórios onde ficam os programas. Que são programas do sistema, do usuário. Eles ficam, geralmente, no BIM, S-BIM, S-R-BIM, S-R-S-BIM, local BIM. Barra home, barra usuário, barra, ponto, barra local, ponto. Não, não, pera aí. Deixa eu mostrar para vocês. O do usuário, né? O do usuário fica aqui, ó. CD.local, BIM, tá? PWD. Outro local também que você encontra programas, tá? Aqui são os programas desse usuário específico. Aqui que você coloca, beleza? Bom, e essa estrutura que é colocada na memória é assim, tá? É um texto ou código ou programa, depende do nome, depende do livro aqui na base, tá? Sempre vai estar ali na base. E daqui começa o endereço da primeira instrução e da última instrução que vai ser executado, tá? Tá aqui, nessa parte azul clara aqui, beleza? Aqui você vai encontrar variáveis globais e dados estáticos, tá? Aqui, tudo que é estático e global fica aqui. Bom, logo em seguida você tem duas áreas. Em muitos livros a pilha é descrita como em cima e a rip embaixo. Alguns livros a rip é descrita em cima e a pilha embaixo. Cara, não importa. Não importa. Não importa. Por quê? O que importa é o que eu vou te explicar agora. Sempre entre... A rip e a pilha tem um espaço vago aqui, tá? Tem um grande espaço vago aqui. Beleza. O que que é a rip? A rip é uma área de memória que adicionamos variáveis. Então, se aqui no meu programa eu crio uma variável nova, ela é colocada aqui dentro dessa área. Se aqui dentro do meu programa eu coloco dados numa variável, eu preencho dados nessa rip. Beleza? E a pilha? A stack. Sempre que no meu programa eu chamo uma função ou eu chamo um método, eu empilho aqui, tá? Então, eu chamei uma função, eu empilho. Dentro da função eu chamo outra função, eu empilho. Eu empilho. Eu empilho. E, naturalmente, vai crescendo assim e a rip vem crescendo assim. E elas vão se encontrar um momento. E isso acontece. Mas uma coisa que eu não te falei ainda é que você nunca consegue fazer duas coisas em uma vez. Por exemplo, criar duas variáveis, criar uma variável e uma pilha ao mesmo tempo, criar uma pilha e preencher uma variável ao mesmo tempo, criar duas pilhas ao mesmo tempo. Sempre é uma vez. Desculpa, uma operação por rodada. Tipo um RPG. Certo? Legal. Então, essa área vai se enchendo e a área vazia vai acabando. Certo? Se você leu o livro do Turnbull de Sistemas Operacionais Modernos, no capítulo de memória, ele fala sobre paginação de memória. E ele fala sobre paginação virtual. Essa área vazia, ela pode ganhar mais espaço. Desde que não cresça as coisas aqui de forma muito rápida. Do tipo, você leu um dump de um banco de dados e joga uma variável. Tudo deu. Entendeu? A RIP vai crescer, vai colidir com a pilha, naturalmente. Ou que você não faça uma recursividade maluca, de tal forma que vai crescendo, crescendo, crescendo até encostar lá, sem nenhum ponto de parada. Uma recursividade. Sem ponto de parada. Então, preste atenção. Então, se tudo der tempo ao tempo, o próprio sistema operacional vai constar, o próprio sistema operacional vai constar, vai conseguir aumentar, expandir essa área de memória aqui. Vai expandir. Aos poucos, tem que ler o capítulo de memória do livro do Turnbull. Beleza? Vamos supor, então, que não existe espaço nenhum. E eu falei para vocês que ele não executa duas coisas ao mesmo tempo. Tipo, uma RIP e uma pilha ao mesmo tempo. Ou é um ou é o outro. Então, não tem espaço nenhum. E se eu chamo uma nova função aqui dentro do código, vou tentar empilhar algo, uma função nova. Não tem espaço. Então, vai dar o erro clássico da computação chamada stack overflow. Stack overflow. Vamos dar uma olhada se eu estou realmente gravando. Está gravando ainda, cara. Cara, complicado, hein? Tipo, eu não tenho espaço nenhum, mas eu vou criar uma nova variável. Vai dar um out of memory. São dois erros clássicos. A computação possui quatro erros clássicos da computação. Está ok? Stack overflow e out of memory são dois erros clássicos da computação. Todo cara que estudou compiladores, todo cara que pegou esse livro aqui, foi lá, leu esse livro aqui, copia isso aqui, vai lá. Beleza? Abre um browser. Cara, todo cara que leu esse livro aqui, ele sabe que esse livro aqui... Referência mundial no assunto. Esse aqui é o TANIBO do TANIBO dos compiladores. É o DATA do DATA dos compiladores, tá? Tranquilo? É o STALINDS dos computadores. Dos compiladores, tá? Legal. Então, nós temos os binários, nós temos os EXDs. E aí, nós já vimos o código fonte com o main. Então, para ser o executável, ele tem que estar em linguagem de máquina. Praticamente, está lá, isso é compilado, bonitinho. Uma linguagem que a máquina compreenda. E também, nós vimos que ele pode ser chamado como um programa, porque ele tem um ponto de entrada main. Bom, nós vimos também essa questão que nós temos DLLs, que são bibliotecas que não possuem o ponto de entrada main. Eles não podem ser executados, mas eles podem ser carregados por um executável. Beleza? Vimos até então essa parte de programação. Já fizemos alguns programas aqui nesse material. Legal? Então, eu vou ficar por aqui. Próximo vídeo, compiladores. Espero que tenha gravado essa vez. Vamos agora. A ugh! Vamos! E aí, nessa capa da tela, UNайн? É mais ou menos o mesmo que você está vendo aqui. O desenho que não está Cass William Richmond. E aí, eu vejo, e sempre eu sinto Extra objeto aqui. Eu vejo aqui a propriedade. Isso aqui é a minha beleza numa blusa Ukに climática 70 Fabric DL. Gente, euAAAAA. Nossa. O que temos aqui? E aqui. Aqui?