TypeScript já não é mais TypeScript...

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00O TypeScript acabou de lançar um candidato a versão 7 e esta será a versão onde
00:00:04o TypeScript não é o TypeScript. Se você estava por fora, eles vêm trabalhando na reescrita do
00:00:07compilador do TypeScript, do TypeScript em si para Go, e aparentemente os resultados são 10 vezes mais rápidos.
00:00:12Eles esperam lançar o TypeScript 7 no próximo mês, então vamos conferir o que realmente mudou,
00:00:17quão rápido ele é e se há alguma mudança drástica que você precisa saber antes de instalar.
00:00:26Então, se você perdeu a notícia sobre a migração para Go, eles começaram isso há cerca de um ano,
00:00:29e o resumo é que perceberam que o JavaScript nunca foi feito para o trabalho pesado de CPU
00:00:34que um verificador de tipos faz, então começaram a reescrevê-lo em Go, com grande sucesso inicial.
00:00:39Eles começaram basicamente portando a implementação existente do TypeScript, essencialmente linha por linha,
00:00:44então a lógica de verificação de tipos era estruturalmente a mesma e tinha o mesmo comportamento,
00:00:48e você podia até ver que algumas das funções eram quase idênticas, além da linguagem.
00:00:52Também tenho quase certeza de que isso foi antes de você poder simplesmente apontar o Claude
00:00:56para sua base de código e dizer: “Migre para a linguagem que você quiser”.
00:01:00Estou olhando para você, Bun. Os resultados da migração falam por si. Aqui eu tenho
00:01:04o repositório do Playwright e, se eu fizer uma verificação de tipos usando a versão antiga do TypeScript aqui,
00:01:08podemos ver que isso leva cerca de seis segundos para ser concluído e passou por 1400 arquivos
00:01:12e meio milhão de linhas de código. Se eu mudar agora para a versão candidata sem mudar nada além desse comando,
00:01:18no total, levou 0,87 segundos. Isso é uma melhoria séria. Ele também encontrou exatamente a mesma quantidade
00:01:23de erros, os mesmos erros. Ele passou pelos mesmos arquivos e todas as linhas de código, então funciona
00:01:27exatamente como o TypeScript 6. O código nativo do Go é simplesmente mais rápido que o JavaScript
00:01:32para uma tarefa como essa, mas também permite que eles usem paralelismo de memória compartilhada.
00:01:37Então, onde o compilador JavaScript era de thread única, o Go pode realmente espalhar essa verificação
00:01:41de tipos por vários núcleos ao mesmo tempo. No TypeScript 7, você pode forçá-lo a ser de thread única
00:01:46com uma flag, talvez você esteja fazendo alguma depuração ou rodando em uma máquina com recursos limitados.
00:01:50E se eu fizer isso na base de código do Playwright, aqui com o TypeScript 7, podemos ver
00:01:54que, quando em thread única, isso leva cerca de dois segundos, o que ainda é três vezes mais rápido
00:01:58e isso tem como padrão quatro; aumentar esse número pode acelerar suas compilações em bases de código maiores se você
00:02:03tiver muitos núcleos de CPU, mas isso terá o custo de um uso extra de memória se eu definir os “checkers”
00:02:08Isso usa quatro por padrão. Aumentar isso pode acelerar seus builds em bases de código maiores
00:02:12se você tiver muitos núcleos de CPU, mas custará mais uso de memória. Se eu definir os “checkers”
00:02:16para oito neste repositório do Playwright, que é o dobro do padrão, parece reduzir
00:02:20outro terço do tempo. Há também uma nova flag de “builders” para paralelizar builds de referência de projeto,
00:02:24ou seja, construir vários projetos de uma só vez. Essa flag permite controlar o número de “builders” paralelos
00:02:29que podem rodar ao mesmo tempo. Vale notar que se você combinar isso com os “checkers” que acabamos de ver,
00:02:34digamos que você tenha quatro de cada, significa que você pode ter até 16 verificadores de tipo rodando
00:02:38ao mesmo tempo. Além das mudanças de código nativo e paralelismo, outra grande reescrita no TypeScript 7
00:02:43foi seu modo de observação (“watch mode”). Quando migraram para Go, isso foi um pouco mais complicado,
00:02:47já que a biblioteca padrão não fornece APIs de observação de arquivos nativas, e as bibliotecas de terceiros
00:02:53que tentaram tinham problemas com coisas como estabilidade, desempenho e suporte multiplataforma.
00:02:57Então, a equipe olhou para o observador de arquivos do bundler Parcel, que a Microsoft
00:03:01usa um pouco no VS Code. Mas como era em C++, eles também tiveram que portar as partes de que precisavam
00:03:05para Go também. A boa notícia é que eles fizeram tudo e parece estar funcionando muito bem
00:03:10e melhor do que antes. Em seguida, como esta é uma mudança de versão principal, você pode estar esperando
00:03:14muitas mudanças drásticas, especialmente porque é uma grande reescrita, mas acho que não há nenhuma
00:03:19se você estiver atualizando do TypeScript 6 para o 7. Se você quiser ir do 5 para o 7, haverá
00:03:24bastante. Então, parece que eles recomendam que você vá até o 6 primeiro, faça tudo funcionar,
00:03:31e então a atualização de versão para o 7 não deve ser problema. Algumas das grandes mudanças no TypeScript 6
00:03:36foram a remoção do alvo ES5, a remoção da “baseUrl” e a descontinuação dos sistemas de módulo AMD, UMD e SystemJS.
00:03:40Eles também tornaram o “strict” como “true” por padrão, fizeram o módulo ser “esnext” por padrão,
00:03:45e o alvo passou a ser a versão estável atual do ECMAScript imediatamente anterior ao “esnext”.
00:03:49Foi basicamente muito “deixar o passado para trás” e modernizar o TypeScript, o que eu realmente gosto,
00:03:53já que, às vezes, tentar suportar projetos legados em cada versão que você cria pode realmente retardar
00:03:59o progresso de uma ferramenta. Olhando para o resto desta postagem do blog, parece que a única
00:04:04nova funcionalidade ou mudança que realmente diz respeito à linguagem TypeScript em si é que os tipos
00:04:09de template literal agora preservam pontos de código Unicode. Essencialmente, antes do TypeScript 7, o TypeScript
00:04:13realmente dividia em unidades de código UTF-16, então ele acabava dividindo um emoji ao meio,
00:04:18e você acabava com esses tipos estranhos de cabeça e cauda. Aqui, no TypeScript 7, no entanto,
00:04:22ele realmente divide em pontos de código inteiros, ou seja, caracteres completos. Então, agora o emoji
00:04:27é preservado e a divisão é praticamente como você esperaria que fosse. Eu, honestamente, ficaria
00:04:32incrivelmente impressionado se algum de vocês já tivesse encontrado isso em seu tempo usando o TypeScript.
00:04:36Ao todo, essas mudanças devem fazer com que tudo o que usa o TypeScript pareça muito mais rápido,
00:04:41como o TypeScript no seu editor, especialmente para grandes projetos. O lançamento estável é esperado
00:04:44dentro de cerca de um mês, mas uma API programática estável, ou seja, aquilo que os criadores de ferramentas usam para construir sobre o compilador, está chegando na versão 7.1. Por causa disso, há também um pacote de compatibilidade, para que você possa rodar o TypeScript 6 e 7 lado a lado sem entrar em conflito. Me diga o que você acha de tudo isso e estou curioso se você já sentiu que o TypeScript estava lento. Deixe-me saber nos comentários. Enquanto você está aí embaixo, inscreva-se e, como sempre, nos vemos na próxima.

Key Takeaway

A migração do compilador TypeScript para Go na versão 7 entrega uma performance de compilação até 7 vezes mais rápida ao introduzir paralelismo multithread em vez da execução de thread única do JavaScript.

Highlights

  • A reescrita do compilador TypeScript em Go reduziu o tempo de verificação de tipos de 6 segundos para 0,87 segundos no repositório do Playwright.

  • O novo compilador aproveita paralelismo de memória compartilhada para distribuir a carga de trabalho entre vários núcleos de CPU, superando a arquitetura de thread única da versão anterior.

  • Aumentar o número de 'checkers' para 8 em projetos grandes reduz significativamente o tempo de build, com o custo de maior uso de memória.

  • O modo de observação (watch mode) foi reescrito para utilizar a tecnologia do bundler Parcel, resultando em maior estabilidade e suporte multiplataforma.

  • Tipos de template literal no TypeScript 7 agora preservam pontos de código Unicode inteiros, evitando a divisão indevida de emojis em caracteres UTF-16.

Timeline

Migração para Go e Ganhos de Performance

  • O compilador TypeScript foi reescrito em Go para otimizar tarefas intensivas de CPU.
  • O novo compilador processou 1400 arquivos e 500.000 linhas de código em 0,87 segundos.
  • A implementação em Go permite o uso de paralelismo de memória compartilhada em múltiplos núcleos.

A transição para Go ocorreu após a constatação de que o JavaScript original era ineficiente para o processamento exigido por verificadores de tipo complexos. A nova versão mantém total compatibilidade lógica com o TypeScript 6, garantindo a mesma precisão na identificação de erros de código.

Configurações de Paralelismo e Builders

  • O TypeScript 7 utiliza quatro threads de verificação por padrão, podendo ser customizado conforme a capacidade da máquina.
  • A flag de 'builders' permite a construção paralela de referências de projeto.
  • A combinação de múltiplos 'checkers' e 'builders' permite até 16 verificadores operando simultaneamente.

Embora o desempenho multithread escale com o uso de recursos de hardware, o aumento do número de threads eleva o consumo de memória. O sistema oferece flexibilidade para ajustar a carga de trabalho, permitindo que máquinas com menos recursos rodem em modo de thread única via flags específicas.

Atualizações em Watch Mode e Compatibilidade

  • O novo 'watch mode' integra a tecnologia de observação de arquivos do bundler Parcel.
  • A atualização do TypeScript 6 para o 7 é direta, sem mudanças drásticas na linguagem.
  • A transição a partir do TypeScript 5 requer uma atualização intermediária para a versão 6.

A reescrita do 'watch mode' resolveu problemas crônicos de estabilidade e suporte multiplataforma que as bibliotecas padrão não supriam. A equipe focou em modernizar a ferramenta, removendo alvos legados como ES5 e sistemas de módulos obsoletos durante a transição para a versão 6.

Mudanças na Linguagem e Lançamento

  • Tipos de template literal agora tratam caracteres Unicode como unidades inteiras.
  • A versão estável do TypeScript 7 deve ser lançada no próximo mês.
  • Um pacote de compatibilidade permite a execução paralela das versões 6 e 7.

A única mudança estrutural relevante na linguagem é a correção na manipulação de Unicode, que anteriormente dividia emojis ao meio por processar unidades UTF-16. Ferramentas que dependem da API programática do compilador terão suporte estável na versão 7.1.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video