o Olá pessoal Fabio Akita todo bom iniciante que se preza mais cedo ou mais tarde vai engajar numa discussão sobre porque sua linguagem favorito é melhor que dos outros e invariavelmente um dos argumentos que vai aparecer é que você com que lado é melhor é mais performático o que será interpretada melhor porque é mais produtivo e certamente todos que estão participando dessa discussão estão errados de maneiras que vocês nem imaginam hoje eu quero falar um pouco sobre o que significa uma linguagem se compilada ou interpretada E por que a maioria dos programas dois interpreta isso
errado o objetivo de hoje não vai dizer qual é melhor e sem porque sua linha de raciocínio não leva em conta diversos outros fatores que são mais importantes e no final do vídeo você vai enxergar todas as suas linguagens de uma forma diferente e [Música] Oi para todo mundo que tá estudando ou já se formou em Ciência da Computação não eu não vou falar do livro do Dragão de compiladores também não vou falar do livro de sistemas operacionais do trem-bal porém todo mundo que estudou essas duas matérias vai ter um aproveitamento melhor desse vídeo aproveita
em pé discutir os detalhes técnicos com seus colegas ou fazer mais perguntas para os seus professores da faculdade e nos cursos compiladores e sistemas operacionais são conteúdos para pelo menos um ano ou mais do curso de Ciências da Computação partes desses assuntos eu já expliquei em vídeos como o guia mais Hardcore de introdução computação e um hello world como você nunca viu antes e todos os outros na playlist de como seu computador funciona mais o para ter uma ideia na faculdade outros trabalhos é fazer seu próprio compilador se nunca fez Depois do vídeo fica de
desafio tentar fazer o seu próprio E para isso já do spoiler para pesquisar tutoriais sobre a ferramenta em Thriller mas eu não vou falar especificamente de entre hoje também vamos começar do começo isso aqui é um hello world e agora isso aqui é um terminal de Linux no wsl2 no meu PC e compilamos esse arquivo texto com o código em ser um binário elf compatível com Linux usando o compilador CC que significa compiler Collection e pronto isso é tudo que a maioria tem na cabeça quando se pensa em transformar código o texto em um executável
e no vídeo sobre arquivos texto seminários eu explico como realmente as coisas funcionam e como executável funciona mais bom para outro exemplo agora isso aqui é um hello world em Java novamente vamos para o terminal e é assim que se aprende na faculdade roda Java ser reloponto jovem ele vai gerar um Hello. Classe e para rodar é só fazer Java Hello e vou lá muita gente costuma dizer que Java é uma linguagem compilada entre "só que olha o que estamos fazendo chamando o executável Java antes e dando com o parâmetro a calça Hello que acabamos
de compilar se fosse realmente compilado no sentido clássico deveria dar para só fazer./Hello. Clássico mas sem isso não o sistema operacional não tem nenhuma ideia de como executar isso porque um binário. Classe não é o executável em formato elf como eu tinha explicado no vídeo de arquivos para o Lino que saber que um binário pode ser executado ele precisa tá num formato chamado Elf que significa execurobo em lin Carbon Format em particular todo binário Elf começa com a sequência quem hexadecimal seria 7 f45 446 que propositalmente é as que para stringhi elf isso é totalmente
arbitrário me Quem inventou o Elson definir o que é assim e pronto mas se abrirmos os primeiros bicos da classe hello world Java o que vemos nos primeiros vai é a sequência hexadecimal café baby obviamente uma piada de café e Java que o James gostem escolheu para serem os primeiros bailes de todos as calças de aula se definimos que compilar é o processo de pegar um código fonte texto por exemplo em ser passar por uma ferramenta como cês e que vai curtir um binário que o sistema operacional vai conseguir executar diretamente então não o Java
não é compilado por outro é que nem um interpretador o interpretador é um programa que vai pegar ou arquivo texto do código ou uma representação intermediária como esse ponto Class e vai traduzir para o binário de máquina que aí sim o sistema operacional e o processador vão entender portanto por essa definição Java é uma linguagem interpretada isso o que você vai encontrar na bolha deve Na verdade o que eu acabei de falar não tá nem totalmente certo nem totalmente errado tanto você quanto Java São linguagens compiladas e antes de explicar qual a diferença eu preciso
começar explicando o que é o processo de compilação esse processo tem diversos passos mas minha intenção não é escova Beats hoje mas sem fazer com que vocês tenham um modelo mental fácil na cabeça para não cair em pegadinhas de discussão online conseguir entender as principais diferenças o estudo de linguagens de programação é meio que um subconjunto do estudo de linguagens em geral tipo o português ou inglês em Ciência da Computação na teoria formal de linguagem as imagens de programação como C ou Java ou Python são que chamamos de linguagens regulares por sua vez uma linguagem
regular é uma linguagem ser mal e pode ser definida por expressões regulares sabe o renex que você usa todo dias para validar formato de e-mail você Péricles e por sua vez uma expressão regular pode ser definida como uma linguagem que pode ser reconhecida por um autômato finito alguns de vocês já deve ter esbarrado no termo máquinas de estado finito que é outro nome que se dá autômatos de estado finito Mas relaxa Nem eu sei tudo em todos os detalhes eu não vou descer na matemática por trás de autômatos não mas é para saber que existe
esse campo de estudo na prática pensa assim temos um texto em português que que é um texto é uma coleção de parágrafo e o que são parágrafos é uma coleção de frases e o que é uma frase é uma coleção de palavras palavras são coleções de letras separadas por espaço ou outras pontuações com, ou ponto então se eu juntar quase que letra o seu juntar com a esquer palavras eu vou ter frases não existe uma ordem que funciona conjuntos de letras ó formam palavras elas existem no dicionário que é uma coleção arbitrárias de conjuntos de
letras que a gente definiu se eu juntar as letras h e l l o um atrás do outro no dicionário em inglês isso definir uma saudação em uma forma de iniciar uma comunicação por telefone por exemplo tire 1l dessa palavra já não significa a mesma coisa para cima frases não pode sair juntando quaisquer palavras elas precisam obedecer uma gramática sujeito predicado adjetivos pronomes tempos verbais e tudo mais que fazem uma frase tem sentido se eu disser a frase não vai ter jeito significa que não tem mais conserto fudeu já mas se na verdade faltou uma,
nessa frase depois do não então seria não vai ter jeito que é exatamente o significado do posto uma única, faz diferença e quem já programou e teve Bang porque esqueceu uma vírgula em português também eu esqueci uma pontuação voltando para o código se pro computador um texto é só um linguição de baixo linguição de caracteres tem letras tem espaços tem inchado mas não quer dizer nada mesmo para você ser humano assistindo se nunca programou esse texto também não quer dizer bulhufas eu preciso dar um jeito de fazer o computador juntar letras que formam palavras que
no caso chamamos de Tocantins que fazem sentido gente é um conjunto de letras que faz sentido print F é outra conjunto de letras que faz sentido então preciso quebrar esse texto todo em uma lista de Tocantins para isso vô Tom kimiza olexa isso é o trabalho de uma ferramenta que faz análise léxica na realidade precisamos definir os looks da linguagem o equivalente de dicionário podemos definir que dígitos são todos os caracteres de 0 até 9 e definimos como não dígitos todos os caracteres de até 100 minúsculo e maiúsculo também definimos que pontuação são todos esses
outros caracteres com parentes colchetes, em alguns desses caracteres podem repetir em outra definição parentes podem ser operadores assim como sinal de mais de menos asteristico assim por diante agora um analisador léxico como um chamado Flex pode pegar meu código em C e entender que tem sinais Strings dígitos operadores e traduzir isso uma lista de Tocantins uma vez tendo essa lista de tokens precisamos saber o que significam eu preciso que o computador entenda que o que vai entre parentes e depois do Token print é um argumento eu preciso que ele entenda que o item 0 na
última linha entre Chaves se refere ao tipo int declarado no começo da função Man elas precisam estar seguindo alguma regra uma vez tendo uma lista de tokens precisamos checar contra uma gramática antes de ficar teórico demais deixa eu mostrar um exemplo prático para isso eu fiz a linguagem de programação mais idiotas do mundo ela não é turing-complete só aceita uma expressão no formato um é de 2 para somar ou 4 subir três para subtrair só isso olha e o programa nessa linguagem salvei com o Hello. Stupid porque não para rodar esse programa eu fiz um
interpretador em Java Script chamado JS Stupid vão abrir cabelo Quem faz as primeiras linhas é o jeito mais pouco de pegar o argumento da linha de comando eu vou executar fazer o ponto barra Stupid ponte JS Hello. Stupid igual usava faz com Java Hello antes lembra para isso eu botei um Xing na primeira linha que vai executar o nome de automaticamente que carregar o resto do script nele Depois eu pego o primeiro argumento e usa a biblioteca PF para formar o caminho absoluto até esse arquivo daí os a biblioteca F SD files System para ler
o arquivo se eu passar um arquivo que não existe vai dar um erro e sair senão eu pego o conteúdo do arquivo nem por coisas no final como o caractere de nova linha caso tenha sábio/N E aí simula o que seria o trabalho do tal analisador léxico que vai tokenizar o conteúdo do arquivo meu leque é tão simples que é só um split the string JavaScript a quebra onde tem espaço e joga os tokens nesse a rico eu chamei de tokens nesse ponto eu converti o texto do arquivo numa lista e ainda converti o primeiro
e último Token para serem números essa minha linguagem é tão besta que não precisa de um analisador sintático eu só faço um Switch case e veja o segundo Tolkien da lista se for AD eu faço uma soma se for subir eu faço uma subtração e é isso aí eu posso adicionar quantas operações quiser seguindo esse formato e no final se eu colocar o operador que não está declarado vai dar erro de syntaxe e sair se tiver um pouquinho de imaginação vai conseguir a linguagem bem simples usando só esse esquema mas dando spoiler eu já adianto
onde que vai dar nó na cabeça e se eu quisesse suportar uma expressão com mais de dois números tipo fazer 1 + 2 + 3 como você faria E se eu quisesse adicionar multiplicação e quiser que um + 2x 3D a resposta correta Note que multiplicação tem precedência então duas vezes três tem que vir antes de chamar por um e dá para ir complicado E se eu quisesse o porto a variáveis e se eu quiser suportar funções obviamente Isso é um problema já resolvido e o primeiro conceito é separar a análise de syntaxe da execução
propriamente dita que é o que costumamos chamar de tempo de compilação e tempo de execução recapitulando A análise léxica só dividir o texto em tom que e agora análise sintática vai dar significado para esse estou aqui para isso é precisar de uma gramática que define o que são expressões O que são funções O que são condicionais por exemplo podemos ver a gramática da linguagem se as ferramentas tradicionais que aprendemos na faculdade são Lex ou Flex para definir a análise léxica e o by zooey aqui para definir a gramática sem procurar no Big Ramy É fácil
de achar a gramática de todas as linguagens a gramática do ser em aqui é bem curtinho você imagina que define uma linguagem deve ser milhares de linhas mas na realidade não é mais que meia dúzia de page Down algumas centenas de linhas isso a todo compilador Claro só o parser Bom vamos lá no fim da gramática eis a definição do que é uma função de ser literalmente ele nomeia como function-definition e pode ser construído de quatro formas diferentes a primeira são especificadores de declaração seguido de declarador seguido de nista de declaração e terminando com composição
de stations em português eu não sei como chão Statement Alguns chamam de expressão mas a definição de Expression e insistentemente são diferentes eu acostumei uma distante Então vai assim mesmo mas o que tudo isso quer dizer esses nomes são como etiquetas a definição de cada uma tá mais para cima por exemplo vamos ver o que compound Statement quer dizer olha só pode ser também quatro coisas um bloco entre Chaves vazias ou uma lista de stateness entre Chaves ou uma lista de declarações entre Chaves e por último pode ser uma lista de declarações seguido de uma
lista de statements mas o principal é que estamos olhando para declaração oficial completa e não ambígua no que você chama de função não é a discussão Essa é a gramática que define os E agora o que que é um Statement list aqui vemos a definição e ela pode ser um Statement ou vários statements Isso é meio que uma definição recursiva por ser ela mesma várias vezes mas isso só definir que pode ter um ou mais insistentemente então agora precisamos ver o que é um Statement Agora sim um Statement pode ser de diversos tipos como lei
bold Statement compound Statement que vimos antes mas interessante vai ser esse a iteration Statement e olha só é isso que ser chama the state's de interação pode ser Uai ou pode ser um guaiú pode ser four eofor pode ser de dois jeitos diferentes com ou sem uma expressão no final e assim por diante se você tiver paciência para a definição léxica e a gramática de iaque Tecnicamente é toda a sintaxe semântica dos e definida em dois arquivos asua mente curtos dá para decorar e saber de cabeça Claro não é o iniciante que vai nesses arquivos
entender tudo mas se alguma vez I perguntou onde que tem a definição exata de uma linguagem São nesses arquivos e não em blog post por exemplo o Java script tem uma definição semelhante no site do actionscript podemos ver como é definido a versão mais nova 2023 e se pularmos aqui no menu para anotação de gramática Olha só como é a definição de um verbo declaration ou declaração de variável é um brinde a identifier e o início a laser um dia a gente Fire são tokens com com estilete ovar e o inicializar é uma expressão de
Açaí em mente como x igual a 1 e olha aqui embaixo ele define com mais um look com for um forte Statement que pode ser definido de 4 maneiras diferentes todos com o Alex com declaration e variando a forma da Expression Mas beleza essa é a gramática Mas e daí para que que serve o objetivo é quebrar seu código-fonte que é um texto em uma listona de Tolkien depois usar gramática para organizar esses todos em uma estrutura de dados que podemos manipular programaticamente o o código em uma árvore Mais especificamente uma parceria entre lembro eu
sempre falo que uma das estruturas de dados mais importantes é uma árvore por isso eu dediquei um vídeo inteiro só sobre isso no final seu código-fonte vai ficar mais ou menos assim aliás tudo que eu expliquei até agora sobre analisadores léxicos e sintáticos o processo de transformar um texto de código PIN poucas e reorganizar esses toques numa árvore é o que muita gente chama de parça mas na realidade a primeira etapa de tokenizar efeito por um leque ser e a segunda parte de pegar os toques e transformar em árvore é feita por um parser para
simplificar eu vou pular explicação do que é uma parte entre e direto para outra representação da mesma árvore que a árvore de syntaxe sinta que estreou Mais especificamente uma abstract syntax Tree ou a ST Lembra daquela minha linguagem de programação mais estúpida do mundo que só aceita uma linha e só faz soma de dois elementos Digamos que o evolui como fazer conta com mais de dois elementos e o que ele escrever aquele um mais 2 x 3 Essa é a notação que chamamos in fixa onde operadores como sinal de + e o asterisco vão no
meio dos operamos que são os números é anotação ou forma de escrever que nós humanos estamos mais acostumados a ver mas não é a única lotação e nem a melhor quem tá acostumado com as boas e velhas calculadoras de engenharia da HP conhece a famosa anotação rpn ou notação polonesa reversa onde começamos digitando Três depois dois depois* na ele multiplica ou três pelos dois que dá seis continuamos digitando 1 e só depois do sinal de soma que vai somar um com o resultado parcial 6 isso vai dar 7 notação polonesa reversa é o que chamamos
de posse fixa portanto notação polonesa é a pré-fixa e numa árvore syntax inscrevemos de forma para é fixa o importante é saber que o que você considera bom senso Nem sempre é têm formas melhores vamos ver como eu fico E aí Pra essa conta começa com o nó raiz que seria um sinal de Maio começamos pelo operador por isso prefixo daí dividir em dois Galhos o nosso da esquerda podia ser o asterisco e o lado da direita o número um debaixo do Norte* dividir um nós querida para seu dois em um outro a direita para
seu três essa representação seria equivalente a escrever direto em polonês como mais entre parentes asteristicos entre parentes 2,3, um já vi no Stories Vamos mudar o símbolo de mais e chamar de somar e trocar* por multiplicada Aí ficaria somar entre aparência multiplicar entre parentes 2,3 fecha, um ficou mais claro agora é assim que você programa A maioria das linguagens de programação no caso especial de quantos anos temáticas como soma ou multiplicação deixa você escrever da forma em fixa mas tem internamente depois do par se o compilador tá mudando para forma prefixo a árvore assim como
todo o resto das suas funções Isso tudo foi para ilustrar rapidamente que a forma que você escreve o código não é a o computador vai executar vamos ver como isso funciona Vamos fazer outro programinha idiota em Java que pegue os três primeiros parâmetros converter texto em número que vai ser os números um dois e três que usamos no exemplo anterior então precisa chamar o método estático parciente da classe interior daí eu vou imprimir no console consistem. Alto ponto print a soma de A com B vezes ser exatamente como no exemplo agora como quilômetros Como já
vai ser e podemos chamar Java Calc um dois três e deu sete como deveria nenhuma surpresa mas o que de fato Executor para quem não sabe existe a ferramenta javap que vem no jdk The Java que serve para desassemblar para mostrar o assembly de bytecodes de Java Lembra no Episódio do dia mais Hardcore de introdução a computadores que eu mostrei uma parte do assembly da CPU 6502 que era usada no antigo nintendinho mesma coisa a ferramenta já vai ser vai passar nosso código por um parser fazer algumas mágicas que eu já vou explicar e cuspir
instru em áreas de máquina o que comumente se chama de byte code so assembly eu já vou a pé só mostra esses byte cores na tela de forma que nós humanos conseguimos ler parece complicado mas para esse exemplo simples não é esse trecho que vai até a linha 21 São as instruções para pegar os argumentos que passamos e converter e inteiro aquele entender ponto parciente percebo que a gente só escreveu uma linha de código para cada um dos três parâmetros mas para cada um e Níger Ou pelo menos quatro instruções isso sem contar e se
envolve estética que chama Seja lá o seu parciente faça novamente o que você escreve na sua linguagem sempre vira bem mais instruções depois de compilado e esse é o objetivo antigamente até antes dos anos 90 era super comum a escrever direto em assembly em linguagem de máquina porque era mais eficiente não tinha nem memória nem processamento suficiente para existir um compilador inteligente como os de hoje mas agora os compiladores evoluíram tanto que geram assim é muito melhor do que é possível fazer na mão Além disso os programas que inscrevemos hoje são muito maiores seria impossível
escrever tudo em assembler se alguém já se perguntou se seria mais eficiente escrever tudo em a sempre Não não é tirando raríssimas exceções nenhum programador hoje é melhor que um compilador de qualquer forma a parte que importa é só as minhas 24 a 28 aqui esse byte Code em load vai empinando na steck os números que converteu daí chama o bytecode e Muriqui como dá para ver pelo nome é a multiplicação ele dizem pilha os últimos dois números multiplica e em pilha de volta ao resultado chega na instrução e ad que desempenha os últimos dois
valores na steck soma e empilhe o resultado lembro eu expliquei pilhas no episódio de hello world como você nunca viu se não sabe como é um sistema baseado em pilha assista a esse episódio de pois os mais espertos aí assistindo talvez tenha anotado mas porque eu fiz essa forma complicada já tem que passar o e como parâmetros na linha de comando porque eu não deixei hard code de direto no código 1 + 2 x 3 vamos fazer isso agora deixa eu criar uma nova classe chamada Country 2 e fazer direto System. Alto. Print 1 +
2 x 3 aliás ignorem A nomenclatura de classe que eu estou usando tá bem porco mesmo só para ir mais rápido mas obviamente não faça um homens como kalki dois em projeto de verdade né enfim agora salvamos compilando de novo com já vai ser e podemos executar com Java Call que 2 e devolve 7 de novo se for como no exemplo anterior agora deve ter cortado Aquele monte de bytecodes de parciente Mas deve ter as mesmas instruções de download para empilhar emo e ad para multiplicar e somar né vamos conferir fazemos Java Petra sussecao que
2 e olha só Ué cadê a multiplicação e adição não tem em vez disso tem esse but could be puxe que quer dizer empine esse número inteiro na estética no caso o número sete que já é direto o é mais 2 x 3 sacaram na hora de compilar o Já você já viu cara essa conta vai dar 7:00 sempre nunca vai mudar então para quê que eu vou refazer o cálculo toda vez deixa eu já pré calcular e da direto resultado assim ele economizou trem chamadas de iludir e as chamadas para e em vez disso
ficou só uma chamada bem puxa para empilhar direto resultado final 7 e daí já pula para chamada que vai imprimir o texto no console compilador literalmente reescreveu o meu código lembro daquele meu interpretador para linguagem mais estúpida do mundo ele pega o código do meu programa tokenize e coloca os toques no Array e faz um Switch case se achar operador é de executá-la soma-se achar um muro faz multiplicação e olhando para isso Vocês poderiam pensar tá só faz sentido para que que precisa de tanto trabalho para converter os tokens numa árvore depois da árvore converter
instruções de máquina em vez de direto já cuspir instruções e esse é um dos motivos vamos filosofar um pouco não a sintaxe de linguagens você acha mais bonita ou mais elegante ou mais produtiva Não importa se você gosta de usar chaves para delimitar funções como no jabá ou se prefere usar identação como em Python Não importa se prefere dividir tudo em várias pequenas funções de poucas linhas ou prefiro jeito got worse de puxar o máximo de linhas dentro de uma função Não importa se gosta ou não de colocar comentários detalhados antes de cada função tudo
isso é totalmente irrelevante para o computador depois que seu código for parcelado e compilado o que vai sobrar são instruções de máquina muito do que você escreveu vai ser reescrito o computador vai pensar porque esse idiota deixou um cálculo hardcoded e sempre da mesma resposta foi escrever e deixar direto só a resposta assim o compilador Vai jogar fora tudo que você escreveu e vai reescrever tudo do zero da forma que ele acha mais eficiente E é isso que o computador vai ver no final e executar Mas então tudo o que sempre me falaram de código
Limpo boas práticas serve para quem então se no final o computador tá cagando e andando para quê que eu tô perdendo tempo organizando todo o meu código escolhendo nomes fáceis de entender e tudo mais porque você não tá E nem deve estar programando para o computador você programa para outras pessoas entenda essa verdade o seu trabalho não é programar para o computador e sem pra que outras pessoas entendam incluindo você daqui alguns dias ou meses se como eu você curte retro games já deve ter assistido vídeos explicando os truques que programadores faziam antigamente para conseguir
extrair o máximo de máquinas de processador de super fracos como z80 o 6502 com quase nada de hum na faixa de 2 kg pensa que o Super Mario World inteiro com todos os gráficos fazem e lógica ocupa meu o megabyte em meio megabytes hoje você não consegue fazer nada qualquer página Web simples precisa de múltiplos megabytes Nisso porque antigamente ciclos de CPU e RAM eram um super cara pelo mesmo preço que se comprava o nintendinho nos anos 80 hoje você compra um Playstation 5 literalmente no começo dos anos 80 um nintendinho custava quase $180 que
se ajustar para inflação da quase $500 que é o preço de um PS5 por isso antigamente era hiper importante economizar Secos e bytes ao máximo mesmo que fosse ao custo de dificultar a vida dos programadores porque o custo do Hardware era muito maior que o curso de programadores 10kg a mais de ranking desperdiçasse em 1983 era $200 a mais por isso escova hábitos era a coisa mais importante mas o tempo passou e agora 200 doses você compra mais de 16 GB de Ram por isso que desperdice a 1 ou 2 GB de Ram o surdo
que pareça não é mais grande coisa por outro lado o que subiu foi a hora de programador se o programador tem que gastar o dia todo para descobrir que diabos é esse número sete e que a conta original era um mais 2 x 3 que se estivesse explícita no código ia custar dois segundos para entender faz muita diferença toda boa prática de código é feito para economizar hora de programador e não hora da máquina e mesmo se você trabalha sozinho as moças práticas e código Limpo continua fazendo sentido porque o você de amanhã as duas
horas da manhã numa emergência vai te agradecer por ter feito tudo organizado e fácil de ler Lógico eu não estou dizendo que você não tem que saber programar direito sabendo como a máquina vai se comportar nem o melhor compilador do mundo vai melhorar o seu código bosta que dá select* na tabela gigante do banco só para pegar uma linha porque ele não tem como saber durante a compilação que pode ser uma tabela de um milhão de linhas sendo consumida errado e Kauan o momento de memória ele vai fazer o melhor possível mas não existe limites
para um programador ruim dificultar a vida do compilador mas a tecnologia de compiladores Não serve só para cuspir binários utilizados aquela árvore de sintaxe abstrata AASP é útil para o programador sabe quando no vs code você instala o Max tensão para já me scripts que rodam JS linter e ele marca no seu código hoje tem problemas e possíveis bugs essa análise é feita em cima do a ST ele não tá olhando o texto do seu código por baixo dos panos ele passou pelo parser do V8 gerou a estrutura de árvore e está processando os nós
dessa árvore os nós podem conter meta dados que apontam de Volta Para qual linha do código que representa e assim dá para analisar e devolver a análise para o editor mostrar bonitinho para você todo linter funciona assim um litro ou ferramentas de análise estática tentam te orientar para escrever código melhor e a conta coisas que seriam ambíguas a dor Daiane pode dizer o equivalente a tem certeza que é isso que você quer fazer o que eu mostrei até aqui é a fase de par se essa ideia de criar uma gramática livre de contexto veio de
ninguém menos que John Bacos criador do fortran provavelmente a primeira linguagem de alto nível de sucesso comercial lá nos anos 60 e não só ele fez a linguagem como se inspirou nos trabalhos de pesquisadores como um grande turnê ou no antes que cujo foco era linguagens no termo mais genérico tipo língua portuguesa o inglês mais os resultados poderiam ser aplicados em linguagens de computador o barco sem inventou essa ideia de uma linguagem que descreve outra linguagem ou seja uma metalinguagem e usou para definir uma outra linguagem chamada e ali que viria a se tornar o
algol muita gente costuma pensar em ser como o avô das linguagens mais por causa dos blocos com Chaves e insistentemente terminando com ponto-e-vírgula outros consideram os ser muito novo para ser avô e o verdadeiro a voz seria o cobol mas é diferente no máximo cole bom é mais avô de coisas como linguagens de história de possíveis e banco de dados a real linguagem avô do que chamamos de linguagens de uso genérico anterior aos e é o algol antes do CC inventado o hit Karina trabalharam no bcpl que poderíamos chamar de linguagem b e para mim
a linguagem a é o ao gol antes que alguém comente sem eu sei não é exatamente assim ao gol foi uma linguagem criada por cometer e como tudo que é gerado por cometer ficou uma linguagem bom outra de complexa gorda daí na Universidade de Cambridge em Londres surgiu o cpl que é o combine the programming language mais que obviamente os poderiam chamar de Cambridge programming language para ser ao gol com os pés no chão acabou não sendo muito bem Aceita EA intenção foi melhor que a implementação povo de jogos inscrito já viu o episódio desse
tipo como yarn querendo ser e melhorado ou de no querendo ser node melhorado ainda em que o tarô significar ocpl com o Basic cpl ou bcpl do Martin Richard para ser só as coisas boas do cpl Poucos Anos depois o que em Tom chefiou o projeto de em Unix próximo máquinas pdp-11 e fez um compilador para uma versão reduzida do BC pele que ele chamou de linguagem B mas tanto o BC pele enquanto beram limitadas B era alto nível de mais e como eu disse antes estava recursos escassos e caros de hardware por esses e
outros problemas surgiu denysmite para reescrever a linguagem que seria a sucessora do bebê para ser mais próxima da máquina e daí surgiu os e mais independente disso tá claro que as raízes das principais funcionalidades que reconhecemos hoje como linguagem de uso geral surgiram com o algol e por isso podemos considerar que ela é a verdadeira linguagem a e a linguagem ser é a versão que realmente vingou e Serviu de inspiração para linguagens mais modernas como se fosse Plus objeto de vencer que inspirar o Java Python fechar e todo o resto que vocês usam hoje de
qualquer forma o Cientista da Computação Peter nauer reconheceu o poder da ideia de metalinguagem do Barcos e como já existia o termo chomsky normal forme ele decidiu que a lotação do barcos deveria se chamar barcos normal form ou beneath mas Tecnicamente não era uma forma normal como apontou lendário Donald cnuf e foi ele que sugeriu que o Bia né deveria ser barcos na warform e assim chamamos até hoje mas como eu falei antes poucos programadores hoje eu incluindo estudam As definições matemáticas por trás as notações de linguagem com o Rigor que deveria porque ferramentas como
Flex bairro IACS simplificam tudo isso e a gente tem mais que se preocupar com o design da linguagem propriamente dita que começa em escrever a tabela de lexis Ea gramática num formato que eu mostrei antes em particular Se tiver interesse em estudar mais sobre geradores de parcelas a que eu vejo que o povo considera mais moderna é um é por acaso é feito em Java um parça Não serve só para cumpri-la linguagens de programação Pensa em um arquivo de configuração em Emo ou Jason Ambos não deixam de ser linguagem só que declarativa e não de
programação ambas precisam de um parceiro e de fato para transformar um emo ou Jason um objeto de água inscription resto em Python precisa de um leque ser e de um parça sabe quando você carrega um arquivo texto de html no navegador E agora dá para inspecionar usando as ferramentas de debug você que é de front-end sabe disso ele se transforma no tal do Dom ou doc midi Object Model o que é o dom é uma árvore é o resultado de passar o HTML por um parser e como navegador desenho as coisas na tela navegando nude
a node do Dom o dom para HTML assim como a ST tá para uma linguagem de programação e da mesma forma que você pode modificar nós do Dom o compilador manipula nós boa SP para melhorar seu cod em binários mais eficientes tanto o que você chama de compilador quanto que chama de interpretador começam com o leque ser e um parceiro mas a história não acaba aqui agora vem a parte interessante da história lembra quando fizemos o disassembly dominaria compilador de Java ele não era uma árvore não era uma sequência de instruções o que em Java
se chama de bytecodes depois que o Java se gerou a ST chegou que assim táxi está correta e as dependências estão corretas daí navega não a nossa árvore e cospe os bytecodes correspondentes para gerar o arquivo ponto cruz no final vamos recapitular o que que é um byte code é literalmente isso o código de byte cada instrução como Aquela a load Reload e mu em AD são mnemônicos para um código binário por exemplo a alude é o hexadecimal 32 ou o binário 001000 lembra a máquina hardware da CPU só entende binário e internamente tem instruções
que são representadas por em sequências de bits assistir o episódio de hello world outros vídeos da série como computadores funciona para relembrar disso mas agora vem uma pergunta Quem diabos de instrução é isso de download e upload imo isso não é a sempre de x64 que é o que roda em Intel ou AMD aí no seu PC ou notebook também não são instruções de ar me como os Mac M1 ou qual com do seu Android que diabos de instruções são essas e aqui me a parte que confunde a diferença entre um computador puro e interpretador
essas instruções são para uma máquina virtual que não existe em forma de hardware Se existisse um chip Java e nos anos 90 as até queria mesmo fazer um chip de verdade Java essas seriam as instruções mas esse chip Não existe o que existe é a jvnq1 literalmente significa Java virtual Machine todo o programa Java roda numa máquina virtual por similaridade todo o programa Python roda numa máquina virtual pai contou o script roda numa máquina virtual java script como o Google V8 homosil spider-monkey todo o navegador web vem embutido com uma máquina virtual e sim máquina
virtual como um VirtualBox houve amor já pararam para pensar nisso a gente está acostumado a pensar em máquina virtual só como um VirtualBox ou para ler ou erroneamente um docker que não é máquina virtual pensamos com o programas que podemos instalar no Mac em um para conseguir rodar outros programas compilados com luminárias de Intel e interpretar em tempo real para rodar numa máquina arm Tecnicamente toda a máquina virtual é um interpretador no sentido que interpreta uma instrução de uma máquina para instrução de outra máquina para quem é de Python Como chamamos pai com traços e
com pai ou ao ponto ele vai pegar todos os arquivos texto com extensão. Pai e transformar em ponto pai se ou pai ó para isso o código texto vai passar por um lexa por um parça e no final ST e é transformado em instruções para uma máquina virtual de Python aí ele seria Lisa e salvar esse se tem um binário. Pai se lhe chamamos de interpretador é um caso especial de máquina virtual alguns também chamam isso de um gran Prime mas são só nomes diferentes para a mesma coisa para todos os efeitos de propósito seu
programa Python tá rodando uma máquina virtual o JavaScript do seu navegador ou no node.js também dentre várias coisas que podem ser diferença é que Normalmente quando falamos de interpretadores é quando temos algumas facilidades e desenvolvimento como um rapple que acrônimo para Weed e walprint Hulk que a linha de comando que abre quando você digita pai tão ou longe no terminal e pode sair digitando o código que ele vai executando imediatamente ou seja ele lê faz e valuation Imprima resultado e volta para o look e fica nisso até apertar contra o de para sair Aliás a
linha de comando do seu terminal seja Dash zechel wolffish são interpretadores também é mais específico o interpretador costuma manter o ST num formato que podemos modificar depois dos arquivos do programa tem todos os passados pelo parça toda vez que dentro do console de Paiva a gente definir o novo método estamos adicionando nós na árvore ST é isso que define o que muitos chamam de linguagem dinâmica mesmo Java apesar de mais chatinho tem como modificar o ST que tá em memória eu posso mandar o quase louder da jvm carrega outros arquivos. Class que ainda não tinha
carregado ou usa atende um reflexo para modificar o código em tempo real Claro apesar de parecerem máquinas virtuais interpretadores são diferentes de um VirtualBox VirtualBox na vida de fato tenta o máximo esconder tudo sobre a máquina host por baixo para fazer os programas rodando dentro acredita que tão na máquina de verdade quando um programa lá dentro pede para forçar o disco VirtualBox vai dar para ele um disco virtual e não acesso ao disco de verdade quando o programa pede pra a internet ele não vai ter acesso ao TCP da máquina de verdade mas sim a
uma rede virtual interna como se fosse uma rede Externa separada que faz ponte com a rede da máquina de verdade assim por diante já um interpretador não tem que esconder nada quando o programa de Python pede acesso ao disco o interpretador dá acesso ao disco de verdade quando o programa pede para abrir um Sócrates de rede ele passa pela rede de verdade então Tecnicamente sim Java é uma linguagem compilada Por que no final geram binário com instruções de máquina só que não são instruções de Intel ou arm e sim para jvm uma máquina só virtual
por outro lado ela é interpretada por que a máquina para qual ela foi compilada não existe e para rodar Depende de um interpretador que entende essas instruções e vai converter para as instruções da máquina roxa de verdade como Intel x64 o mesmo vale para parto javscript Ruby PHP e eu sei já tô vendo vocês aí no ferozmente os comentários para discordar porque eu ainda não o Tite Segura a onda aí já vou voltar no assunto de interpretadores de máquinas virtuais Mas o importante é saber que depois da fase de par se o objetivo é transformar
a árvore abstrata de syntaxe em instruções de máquina seja lá para qual a arquitetura de CPU uma de verdade como x64 arm64 ou uma virtual como jvn história não acaba aqui mesmo o compilador de seco GC ser ou o Cilene de lvm não sai da ST depois do parça e já transforma direto em instrução de Intel não acho que hoje em dia praticamente todos os compiladores trabalham com uma representação intermediária o compilador do.net por exemplo chama isso de intermediate language 1 ml no mundo llvm Isso se chama intermediate representation e r no mundo do menino
compiler Collection gcc que todo mundo conhece ele trabalha com rtl que é o Red Star transfer language no mundo de shaders como para rodar em vulcão No Steam de Oi gente o padrão estender porta intermediate representation ou Spears Live e o que diabo é isso de linguagem intermediária agora é a parte da mágica que eu falei antes que eu vou simplificar bastante entenda que essa parte é absurdamente extensa na realidade eu vou usar o exemplo mais besta de todos lembra aquele exemplo da calculadora que eu escrevi em Java para dar print em 1 + 2
x 3 e depois de compilar fizemos o dizendo para ver as instruções e só tinham bipush direto do resultado 7 Pois é o compilador foi inteligente em saber que não precisa traduzir instrução a instrução a multiplicação e some níveis disso já pré cálculo e deixou direto o resultado economizando várias instruções ou seja ele otimizou o código e deixou tanto mais rápido Quanto economizou tem que guardar os números um dois e três na memória Essa é a utilização mais trivial e besta de todas mas o compilador tem a capacidade de fazer centenas de outras otimizações por
exemplo Digamos que seu código tenha 3 a causa dependendo da linguagem e agressividade da utilização Ele Pode até escolher jogar fora esse trecho e nem traduzir sim o compilador pode escolher jogar seu código fora ele pode simplificar chamadas se a ordem dos fatores não influi no resultado pode mudar a ordem do seu código para CPU processar de forma mais eficiente essa fase de otimização pode passar por todo o código mais de uma vez é o que se chama de peças isso para conseguir fazer coisas como achar constantes duplicadas e fazer ambas apontarem para o mesmo
lugar eliminação de código morto ou seja trechos que nunca são executados e podem ser eliminados tem álcool elimination para remover chamadas recursivas que podem ser utilizadas em muito muito mais isso é o que o lvm chama de transformation pets entre aspas É como se você tivesse um minuto órgãos e um John carmack juntos reescrevendo seu código da maneira mais utilizada possível na prática essa etapa é o Real trabalho de um compilador me passa mais tempo e mais recursos porque tem um gerador de código varrendo tudo que você escreveu exaustivamente várias vezes e reescrevendo a melhor
forma que se conhece sem quebrar nem gerar bugs agora imagine o seguinte tá vendo essa lista de transformações de otimizações Imagine se toda vez que inventa uma nova linguagem precisasse reescrever todas essas estratégias tudo de novo para Linguagem Nova você tem um trabalho absurdo e é gerar dezenas de bugs e as últimas ações seriam muito ruim porque criar essas cortinas levou anos e milhares de Horas homem para aperfeiçoar até ficarem perfeitas por isso que o comum é que toda nova linguagem no final do parce seja convertida numa linguagem intermediária que é sempre igual e essa
linguagem costuma-se tipo um assembly para uma máquina virtual e não precisa se preocupar nesse ponto com as limitações de design e Legado de uma CPU de verdade como x64 daí todas essas estratégias de otimização os resultados nessa linguagem intermediária um compilador como GC ou derivados de LM Na verdade são problemas grandões que Podemos dividir em três grandes funções diferentes o primeiro ao front-end que tem a responsabilidade de pegar linguagem rwcc tuas plantas Rust Gol Swift fazer um leque o par sem gerar a árvore sintáxi dela cuspir as instruções de máquina virtual e intermediária sem quase
nenhuma utilização essas instruções intermediárias são o rtl no caso de GC e r no caso de llvm ou e l no caso d.net o Selene dllm seria o front-end descer pra ele ver o conjunto das definições de lexa e gramática do parça agora o segundo programa pega esse e não utilizado E gasta um tempão lendo relendo e reescrevendo e a saída vai ser outro e r totalmente utilizado esse programa do Meio poderia ser chamado The Middle and e Relembrando cada um em ações ou transformation peças que ele faz poderia ser tema de um paper the
phd não são coisas triviais como o exemplo que eu mostrei e finalmente temos o terceiro programa que chamamos de back-end que vai pegar o iir utilizado e traduzir finalmente para as instruções da máquina de verdade ou seja converter de instruções Acende e r para instruções assembly and x64 ou arm64 da vida e esse é o binário final que pode ser executado toda vez que eu quiser inventar uma nova linguagem é só fazer as partes de lexa e par ser fazer só a parte que é o front-end dessa nova linguagem é para isso que serve ferramentas
como um entender que Eu mencionei antes é isso Que linguagens como o rosto e fizeram quando construíram o compilador em cima do lvm ele pode deixar um compilador que já existiu utilizar o que puder não primeiro momento o criador de uma nova linguagem não precisa refazer tudo do zero pode reaproveitar o que já existe porque uma vez o Dr o resto é igual a preocupação Inicial dele é só fazer um parceiro que converta a sua linguagem e r como um transpiler que converte typescript em Java Script Por exemplo quando um designer de chips como uma
época inventa um novo como estais N1 ele só precisa fazer a parte back-end a parte que pega o iir já utilizado e converte em instruções de máquina amanhã a qualcomm lança um novo chip Snapdragon arm ele só precisa atualizar o beck and do compilador todo o resto continua igual AMD lança nova Série 6000 2 ryzen só precisa atualizar o beck and dos principais compiladores se teve alguma mudança nas suas instruções entenderam eu expliquei isso no vídeo de Apple e GPL Mas além obviamente do ar ver qual é o segredo da Apple em consegui migrar tudo
para M1 tão rápido é eles têm investido quase duas décadas melhorando suas tecnologias de compiladores em cima de nlvm com isso conseguiram emigrar se separa então nos anos 2000 e com isso migraram de Intel para a arma e muito rápido e tudo e só o compilador Não consegue resolver eles tem como desenhar um chip para compensar E com isso temos as performances absurdas que vocês assistem nos diversos revios de como programas Originalmente compilados para Intel rodam liso em árvores sem recompilar só sendo interpretados em tempo real se você um cientista da computação e tem vontade
de criar uma nova linguagem provavelmente vai começar fazendo um front-end para ele lvm assim saíram linguagens Rush da Mozilla Júlia Cristo e outros por quem são as empresas têm capacidade para fazer um compilador do zero com todos os tipos possíveis de utilização Java até utilizador próprio desde a era da Sam e depois passou para hora que ele tem dezenas de empresas que investem em pesquisa para continuar melhorando o.net tem a Microsoft que também investe pesado em pesquisa e no meio disso tem um java script e o ver o e agora qual a diferença de cê
já vi já myscript no final do dia quer dizer que ser compilado Por que gera vinagre Nativa de máquina mas Java e JavaScript serão interpretados não no final do dia todos geram binário nativo de máquina usando estratégias diferentes para resolver problemas diferentes a estratégia descer se chama a rede of time com Pioneer oauth e no Java e JavaScript eles usam just-in-time com o painel o famoso digite e mesmo disse tem diversas estratégias diferentes vou fazer outros empregos bem besta só para vocês terem uma imagem na cabeça vamos voltar por exemplo em Java de fazer um
cálculo Quem lembra como calcula a circunferência de um círculo lembra duas vezes pi vezes raio dois Pierre Vamos fazer uma nova classe método estático Man esses tem ponto alto. Print duas vezes 3.14 1592 que é o pe mas eu vou colocar poucos dígitos e vezes 10 que é o raio que quer usar só vamos saímos compilamos com já Oi podemos ir embora lá meia 2.83 blá blá é a circunferência para um raio 10 se fizermos this assembly com Java app olha aqui embaixo essa instrução L dc-2w que puxa uma constante do Pum de constantes e
manda para Ester e no comentário gerado temos que essa constante é um w62. 839 a que é o valor é calculado ele fez a mesma utilização que no caso de um mais 2 x 3 top é o esperado Mas como eu disse antes olha começa a pontinha no código é feio mesmo sendo simples Quem curte código Limpo tem gatilho só de ver isso dá para melhorar vamos escrever uma nova classe eu poderia começar a definir uma constante w chamada pe escrever ali 3.14 1592 mas finjo ser idiota porque obviamente já água já tem uma constante
estática Double DIP que tá na calça Emef Ah mas como que eu ia adivinhar sempre pense coisas triviais assim as chances são que já existe na dúvida procurar no Google Java constante PI e os primeiros links já vem mexe e tanto pai quando você não acha as coisas lá que não existe um são difíceis de achar é você que não procura direito enfim continuamos fazendo uma função estática que retorna Double chamada circunferência que recebe como argumento uma variável Double chamada raio dentro calculamos duas vezes nesse ponto pi vezes a variável raio e agora sim no
método mente vamos assistem. Alto quanto o print como antes mas o argumento vai ser o resultado do método circunferência passando o valor 10 pronto salvamos saímos compilamos com Jeová cê e executamos e tá aí meia 2.83 blablablá como tinha dado na outra versão com para a versão antiga com a nova ficou melhor mas a intenção do código tá muito mais clara esse daqui é um mês eu vou editar esse código dá para saber o que ele faz imediatamente e claro dava para ter feito bem mais bonito que isso fazer uma classe chamada circo um modo
chamado geometria ou qualquer coisa assim mas hoje não é design de orientação a objetos eu fiquei muito com isso hoje mas vamos ver como fica fazendo disassembly com Jabá p e Olha que estranho tem instrução L dc-2w que puxa consta de 10 que é um raio que eu defini e puxa plustek da invoca a função circunferência e da janta aqui para cima daí faz outro L dc-2w para puxar a constante de pipa eztec também na verdade é a constante de duas vezes vez no comentário que lhe gerou mostrando que é o dobro de pe então
ele eu tinha ISO isso mas aí chama instrução demo que multiplicação de w e desempenho nos últimos dois valores que colocamos na estética calcular retorna e finalmente da Evoque vídeo no print F para imprimir na tela mais duas vezes pi vezes dez é tudo constante porque que ele não otimizou o suficiente para arrancar fora essa função circunferência sendo que ai desnecessárias Eu não disse que o compilador reescreve tudo para ficar mais eficiente não dá para ter pré calculado como antes e só guardar constante com o resultado final então aqui que a coisa Começa a complicar
toda a função que criamos no Java a interface se o compilador quisesse ser agressivo ele poderia arrancar tudo fora e deixar só a constante porém a gente não sabe se ninguém mesmo vai usar essa função lembra Java também é uma linguagem interpretada dinâmica cujo código pode ser alterado dentro da jvm se pensarem isoladamente os ó Nessa classe não teria problema mas classe de Jeová não vivem no vácuo elas foram pensados para serem realizadas por exemplo no mesmo diretório eu posso criar um novo arquivo e escrever uma nova classe assim fazendo de novo um System. Alto.
Presente chamado Calc... Circunferência direto assim mesmo e passando 20 como um raio Se eu sair compilar só esse arquivo caught cinco. Java eu posso executar Java Call que 5 e tudo funciona Note que nem na hora de compilar e nem na hora de executar Eu mencionei o carro três porque ele tá no mesmo diretório então quando a jvm carrega clássica o que cinco automaticamente faz o Clécio louder carregar o carro três juntos mas ele não precisou recompilar e três de novo e se eu apagar o cálculo 3. Classe que tentar executar o cálculo cinco agora
vai dar o erro de noclassdeffound faz sentido né Java foi feito de tal maneira que eu não preciso recuperar tudo do zero toda vez que alguma coisa muda ele compila cada classe individualmente e para garantir que outras classes não quebre pelo menos mantém a interface entre eles estável O que significa que não pode sair otimizando demais e eliminando o método mesmo se naquela classe ela não é usada e mesmo se eu tivesse declarado como Private ainda assim não daria para pagar o método porque Java tem sistema de um reflections permite manipular métodos privados portanto qualquer
utilização que quebre a interface não pode ser feita antes de continuar agora precisamos entender rapidamente o que é uma interface mundo binário não existe o conceito de abstração tudo são instruções e endereços quando precisa chamar uma função a máquina na verdade vai guardar o endereço que estamos executando na pilha vai fazer o Jump eu falo que precisa e no final vai retornar para o endereço que tinha guardado para continuar de onde parou eu expliquei isso no vídeo do hello world agora para isso funcionar quando eu comprei a classe Country 3 o compilador precisaria até a
notado que a função circunferência vai tá disponível no endereço x faz-de-conta 9000000 daí quando eu combinei a classical que cinco chama essa função nesse ponto compilador precisaria saber que precisa escrever um zumbi para o tal endereço 90000000 Mas lembro que eu não passei o cálculo 3 com o parâmetro nem nada como que eu Java sabe Para qual endereço tem que dar esse Jump aqui eu estou especulando mas eu imagino que quando a jvm carrega essas quatro nesse momento que ela vai preencher uma tabela interna que disse ok classical que três ó tem um método circunferência
vou colocar o endereço que tem vaga aqui 9000000 depois carrega clássica o que sim que quando executa a função mãe dela aí de lá pede para chamar a função circunferência daí a jvm intercepta essa chamada e consulta é um essa função é a que eu coloquei no endereço 900 000 pula pra lá portanto os endereços não estão nas classes elas são atribuídas na hora que a jvm carrega ela Vamos abrir o disassembly de novo começa executando lá da linha zero e vai indo uma horas bar da salinha seis que tem um enfoque estética e passando
o índice 15 ele olha lá na tabela interna dele ver a número 15 é o endereço 9000 a E aí dá o jump para o lugar certo eu sempre fiquei mais justamente porque os endereços finais são definidos quando carrega o modo e não quando compila dá para compilar as classes Independentes uma da outra como eu fiz aqui individualmente os dois arquivos porque jvm aqui em vai gerenciar os endereços em tempo de execução porém linguagens como C se a tuas plantas Swift Gol Rust Cristal e outras não tem o interpretador ou máquina virtual para controlar isso
portanto cada parte de cada módulo sendo compilado precisa já sabe e o final das coisas não na hora de executar não ia achar nada então como é que faz e aqui vem outro conceito de compilador que eu vou simplificar ao máximo tensa se eu tivesse um projeto com mil arquivos onde uma função no arquivo pode chamar funções e outros arquivos seria uma zona para compilar toda vez que eu mudo uma linha no arquivo precisa recuperar todos os meus arquivos para garantir que os endereços de todo mundo estão corretos e eu não apaguei uma função ou
do conflito de endereço ou duplicou o endereço sem querer então lá realidade tanto GC conta um Cilene de algm conta um rosto de sede Rust vão quebrar a parte final da compilação em duas partes se você é de menino que já instalou um pacote que compila a partir do código-fonte eu deve ter esbarrado no meio que faz aqui nada mais é do que um script que automatiza a função de checar dependências se tudo que precisava cumprir lá tá instalado e para você que é Java Script o equivalente a um teque de ponto de Jason para
você que de pai tipo um aquário e peixes ter ele chama o compilador a todos os arquivos do projeto O que costuma aparecer na tela enquanto compila um monte de arquivos. O sendo gerado esses pontos são objetos simplificando eles são os binários compilados a partir do código-fonte de sede cada arquivo como abrir o Hello pontos e lá no começo número esse impude na primeira linha isso indica o computador procurar por um arquivo de cabeçalho chamado STD aí o ponto H que tem que tar no pé do sistema nesse arquivo é com a interface da função
pente efe que usamos lá embaixo se olharmos nesse arquivo tá dizendo que o print F é uma função que retorna um inteiro e recebe como parâmetro um ponteiro constante deixar basicamente uma rede deixar e tem outros argumentos opcionais sem entrar muito em detalhes sobre voce te essa interface permite o compilador saber se quando estamos usando a função print fs-ta da forma correta porém no momento da compilação do arquivo Hello. Separa o objeto binário Hello ele ainda não sabe qual é o endereço onde encontrar a função porque ela tá numa biblioteca Ester o Mc que é
compartilhada com outros programas no mesmo sistema que dependem dela Praticamente tudo numa distro Linux no ponto onde chama o pinchef o compilador vai tipo deixar um post dizendo confirmar depois Onde fica esse endereço se eu dependesse de outras bibliotecas externas ia ficar deixando vários post-its para confirmar depois para ilustrar vamos fazer disassembly objeto Hello usando o objeto de Dante traço de olhar a sempre sempre meio intimidante mas não tem problema é só focar no Pedaço que interessa que é a função mente começa aqui a partir do endereço 1139 em hexa o print F é uma
função então Estamos procurando um col e no endereço 1147 temos um suspeito um Call mas para o endereço aqui perto 1030 vamos ver o que tem lá e olha lá tem um jump para esse outro endereço e um comentário que é para função Putz da genes E se eu não tô enganado Como se chama o print F com parâmetro opcional nulo ele muda para cútis mais nessa linha na primeira fase o jogador condene ainda não sabe o endereço vai ter algo com um espaço em branco para o endereço um post para segunda fase confirmar esse
endereço essa segunda fase é o trabalho de um link ser no caso do Uno LD até agora eu não precisei chamar o link manualmente porque o GC faz isso sozinho para gente mas se eu quiser manipular vários objetos já compilado transformar numa biblioteca compartilhada como um ponto é seu de lindos um ponto dll do Windows eu posso fazer isso com o comando LD inclusive o único pode fazer utilizações em tempo de link Apesar do nome ser linker que é linkar ou grudar os pedaços ele pode modificar mais do binário é ele que sabe se é
possível por exemplo fazer em online lembra o exemplo besta de Java de circunferência se fossem ser como ninguém mais chama aquela função ele poderia simplesmente copiar o conteúdo da função e colar no lugar onde a função é chamada isso evita no mínimo uma instrução de jump e outra de me Turner no progr o maior tem muito mais ganhos no final o compilador de C consegue analisar seu código e realizar um monte de otimizações e escrever de uma forma otimizada mas isso arquivo arquivo independentemente da Uninter reavalio os binários gerados liga os endereços de cada Uni
precisa e ainda utiliza mais o que diminui ainda mais o tamanho do binário economizar mais e memória e processamento na hora de executar e por isso programas em si e similares como o host são tão rápidos linguagens como Java Java scripts Python e outros não tem o equivalente de um link quando cumpriu do código-fonte para but could intermediário uma das razões disso é aumentar a reusabilidade desses binárias o que também torna a fase de compilação menos demorada que um ser para um projeto do mesmo tamanho põe o binário vai ser menos otimizado Tecnicamente mais lento
do que o equivalente Geraldo por certo então é isso Você sempre vai ser mais performático e qualquer coisa não é bem assim e agora Voltamos para just-in-time com o o geeks quando você carrega um projeto em Java e inicie a máquina virtual jvm daí o Clécio louder começa carregando os arquivos binários. Class do seu projeto e criando tipo uma cabelo na interna que dizem quais endereços internos a memória Então quais classes e quais funções de forma que quando uma classe pede para executar uma função de outra Classe A jvm vai intermediar e arbitrar mandando Executar
a função correta devolvendo o retorno e tudo mais um interpretador o máquina virtual substitui a necessidade de um link está qo porque ele cuida disso dinamicamente então você pode imaginar que você que não tem esse intermediário já precisa saber diante mão endereço de tudo se de fato toda vez a jvm precisa ficar checando endereço nessa tabela virtual para cada chamada de função seria tudo lento mesmo mas claro que no mínimo ela faz Cash disso para ir mais rápido mas ela pode fazer mais ela Analisa os códigos mais executados por exemplo baseado em quaisquer Estes são
mais e os pontos mais quentes do programa literalmente o hotspot que é o nome da máquina virtual de Java quando ele ganhou capacidade de Just in Time com Pioneer oudt se meu programa chamasse aquela função circunferência diversas vezes com o mesmo raio em vez de toda vez executar o cálculo oddity vai ser esperto e cachear o valor final muitas as otimizações que eu falei que ninguém faz em tempo de compilação oddity vai fazer durante a execução por isso que em Java você até ouvido falar de tempo de aquecimento ou o map logo que inicia um
servidor jovem ele vai dar uma performance x depois até parecer baixo mas deixa o mudando um tempo e o mesmo código começa a executar mais rápido oddity é um otimizador em tempo real aplicando mais e mais otimizações nos códigos mais acessados esse destino final tá traduzindo o bytecode do Java em instruções nativas de máquina de verdade mais utilizados em literalmente um compilador mais ou menos um link editor que e em cima de código que realmente é necessário E se o programa for grande tem partes que raramente são acessados ninguém nunca acessa Eles continuam lá sem
Senhor otimizados e o Tite vai fazendo cash no que vai utilizando assim da próxima vez que alguém chamar essa parte ele só executa o binário nativo de novo e nesse ponto esse trecho do código pode tá quase tão rápido como se tivesse sido escrito em ser claro não é só isso que determina a performance final mas oddity diminui bastante a distância entre traduzir bytecode Java de forma interpretada e um binário nativo compilado de ser a mesma coisa acontece com JavaScript no navegador navegadores baseados em Chromium Como o próprio Chrome Microsoft é de ópera Brave todos
acabam usando a máquina virtual Google V8 para executar JavaScript V8 na verdade é o nome de um conjunto de tecnologias de compilador e máquina virtual assim como Java ou Python e internamente ele tem um leque um parça que vai cuspir uma ST e que por sua vez vai gerar uma represa a intermediária em batch code específicos da máquina virtual do V8 sem o que roda no V8 não é já myscript são esses byte code repetindo elas são como instruções de um x64 de verdade mas para uma máquina JavaScript que não existe nesse arquivo batch code.
H tem declarado todos os baeticus eu vou deixar nas descrições abaixo para quem tiver curiosidade uma vez convertido em byte code o interpretador do V8 que se chama em vai ter começa a traduzirem instrução a instrução não vai ser lento mas também não vai ser a melhor performance assim como na jvm ele vai ficar analisando a execução e perceber quais partes precisa otimizar digamos que sua aplicação web achou trocentos bibliotecas por exemplo o arquivo inteiro do dia com ele mas na relva sua princesa da função cifrão para achar um elemento da página EA função feio
ditongo para criar transição animada defende desse elemento todas as outras funções você não usa se houve oito fosse burro e tentar se compilar tudo que sua página baixa a passar um tempão para utilizar a biblioteca do dia inteiro quando na verdade sua página só usa meia dúzia dessas funções mas à medida que o usuário navega pelo site um V8 acha os cortes potes e agora é hora do just-in-time com pai erodite entrar em ação no caso o Google chama o DIT do V8 de turbo Fan é ele quem vai gastar memória e processamento para utilizar
as partes mais usadas e gerar binário nativo de máquina utilizada a parecida com que o Java faz e jogar no cash em memória ou até em disco e por isso programas em Java Script costumam consumir tanta memória por isso que tanto Java quando javscript conseguem atingir velocidades muito boas às vezes muito próximas de ser mesmo sem terem sido agressivamente utilizados por um compilador antes mas porque se dá tanto trabalho e não simplesmente compila tudo antes como você faz isso não tem uma resposta única mas se eu fosse resumir é o que define a diferença entre
linguagens estáticas e dinâmicas a vantagem desse os compiladores amadureceram muito nos últimos 40 anos e um milagre Nativa o final que geram tem de não-sócios mais rápidos em geral mas também a ocupa bem menos espaço em disco é consumir menos memória quando carregam por isso que a Kernel do Linux driver e coisas assim tendem a ser feito com cê porque eu quero o mais utilizado possível e que scale bem para rodar tanto no servidor de data CD com centenas de núcleos de processadores terabyte de hum quanto um mero sbarre pai com quase nada de recursos
uma vez que o vinagre tá com que lado estaticamente é tudo fixo e imutável você não tem como mudar o comportamento dele sem se tiver muita paciência para explorar coisas como injeção de código direto na memória do processo ou fazer Pets de binários expor ó explorar EcoSport segurança aí você consegue mudar alguma coisa mas isso é na gambiarra é o que a comunidade de mods de games faz também eles descobrem qual o endereço da memória que fica o valor de vidas e objeto outro valor lá já mostrei isso nos vídeos do Super Mario por outro
lado pense no seu navegador a qualquer momento eu posso inspecionar um elemento de qualquer página isso aí manipulando eu mesmo quando eu faço capturas de tela para mostrar a imagem de um site nos vídeos se tem uma propaganda muito grande eu abro o inspetor selecione o elemento de propaganda e apago e essa mudança se reflete na página imediatamente isso só é possível porque o navegador mantém estrutura de dados que apresenta essa página em memória de forma acessível via JavaScript e como o código JavaScript não é estático não é fixo porque tem o interpretador que aceita
código novo sem precisar reiniciar dá para fazer essas coisas a grande vantagem de linguagens dinâmicas É permitir esse tipo de flexibilidade se isso é bom ou ruim depende do seu uso tem gente que acha que isso não deveria ser permitido que uma vez compilado devia ser tudo fechado tem gente que acha que precisa ser tudo aberto Independente se vai ficar mais lento consumir mais memória como eu sempre digo em programação a gente troca uma coisa por outras sempre Não Existe resposta definitiva Olá tudo depende de pra que vai usar e no caso de um navegador
web eu acho que todo mundo vai concordar que será aberto e dinâmico é muito mais prático e é por isso que é bem se fez tanto sucesso Além disso linguagens dinâmicas com gel script Ruby paz ali que você já você sabe possuem capacidades muito potência de meta programação onde você pode escrever código que altera o que está em execução praticamente toda linguagem com o interpretador possibilita isso já batem reflection java script S6 tem apenas como um reflexo ou proxy pai então tem a função Type clube tem coisas como refina e a vantagem do interpretador é
que podemos injetar novos but could sem reiniciar o programa com a maioria dos interpretadores possuem algum tipo de Edith esse novo código também pode gerar binário nativo utilizado para não complicar eu vou pular os detalhes sobre metaprogramação ou a diferença com pré-processamento estatístico tem Plate comecei com os planos ou Marcos como embuste estudo e se tiver interesse mas a conclusão de tudo isso a dizer que linguagens está e costumam ter um compilador que gera binárias estáticos cujo byte code não é mais modificado facilmente linguagens dinâmicas costuma tem um interpretador justamente para ter essas propriedades dinamicamente
modificar o byte code e alterar o comportamento do programa em tempo real de execução o custo disso é sem mais mente porque não puderam contar com a utilização agressiva de um compilador e link editor mas hoje em dia essa diferença diminuiu drasticamente porque quase todo interpretador vem com o compilador embutido que roda em tempo real 1 just-in-time com pai erodite no final do dia ambos acabam gerando Binário um artigo utilizado um gera tudo antes o outro já é enquanto corda um usa menos recursos porque faz toda a compilação admiração antes e o outro usa mais
recurso que vai continuar mente com Pilão na medida que o programa é executado como um vídeo ficou super longo já no próximo vídeo vou dar uma pincelada em cada linguagem individualmente mas antes vocês precisavam entender a diferença entre compiladores e interpretadores a ser prestado não significa ser sempre lentos só às vezes um exemplo quem já ouviu falar dn15 de erlang provavelmente reconhece a sua reputação de ser altamente escalável tanto que é com ele que é feito o motor de comunicação por trás do WhatsApp que é gigantesco Mas nem todo mundo entende que erlandia assim como
Java é uma linguagem interpretada que roda numa máquina virtual que é um tipo de interpretador e que tem um just-in-time com palha ou Digite para acelerar as coisas pela popularidade javscript muita gente sabe sobre as performances a misturas que ela consegue atingir o suficiente para portar um game de verdade ou da dentro do navegador em grande parte graças ao dti mas tem mais detalhes disso em muito antes de typescript todas as linguagens transp lados para JavaScript um dos primeiros transparências apareceram no mundo pega P com o hip hop do Facebook de transp lava PHP para
ser pelas plantas hoje em dia nos parar nesse projeto estão investindo mais na máquina virtual hhvm que compatível até certo. 17 o pai tão consegue gravar os bytecodes da quase de parça como arquivo os pontos paz e que são instruções para sua própria máquina virtual Rubi também gera byte code de internamente enfim tem bem mais coisa que vou guardar para o próximo vídeo a intenção do vídeo era só educar vocês para não ficar com cara de bobo argumentando coisas como a sua linguagem interpretada por isso nunca vai ser tão rápida quanto uma compilada ou a
já vai melhor que já me inscrevi porque ela é compilada a grande verdade é que as tecnologias de compiladores e máquinas virtuais evoluiu bastante nos últimos 20 anos e essas noções erradas que eram até corretas nos anos 90 já não é mais tão simples assim se ficaram com dúvidas mande nos comentários abaixo se curtir o vídeo deixa o joinha e assine o canal e não deixe de compartilhar o vídeo com seus amigos a gente se vê até mais programação onde você pode escrever código que altera que quase nenhuma otimização essas instruções intermediárias são aetl no
Caji se pela a Lalá e a diferença com pré-processamento estatístico tempo vamos voltar por exemplo em Java de fazer um cálculo Quem lembra como calcula que pariu 0 na última linha entre Chaves se refere a executar mais rápido oddity é um utilizador em as ferramentas tradicionais Capanema e de lá pede para chamar a função circunferência da jvm intercepta essa chamada consultas usados como se tivesse sido escrito em ser e claro não é só isso determina a seguir Lang provavelmente reconhece a imputação a