Motoko, uma linguagem de programação para construir diretamente na internet

Para oferecer uma experiência perfeita para desenvolvedores, queríamos criar uma linguagem de programação especializada, chamada Motoko, que foi projetada para suportar diretamente o modelo de programação do Computador da Internet, facilitando a construção eficiente de aplicativos

Na Dfinity, estamos construindo o Internet Computer, uma plataforma descentralizada de computação em nuvem que concebemos como um universo de software perfeito no qual os desenvolvedores podem implantar aplicativos e serviços diretamente na Internet. Para concretizar essa visão, decidimos no WebAssembly como a lingua franca do ambiente de execução da plataforma, para que os desenvolvedores possam programá-la em qualquer idioma que compilasse para o WebAssembly.

 

Para oferecer uma experiência perfeita para desenvolvedores, também achamos importante criar uma linguagem de programação especializada, chamada Motoko, que foi projetada para suportar diretamente o modelo de programação do Computador da Internet, facilitando a construção eficiente de aplicativos e aproveitando algumas das características mais incomuns desta plataforma.

 

Estamos animados para compartilhar com você um pouco sobre o que torna este projeto tão especial.

 

WebAssembly

 

Primeiro, temos que falar brevemente sobre WebAssembly— também conhecido como Wasm (sim, escrito corretamente sem todas as tampas). Como você deve estar ciente, Wasm é um novo formato de código de baixo nível que visa ser portátil, seguro e eficiente. Seu caso de uso inicial tem sido a web, mas o nome na verdade é um equívoco: quando projetamos Wasm no Grupo de Trabalho W3C, fizemos cuidadosamente como um padrão aberto e uma plataforma universal. Ou seja, não se destina a nenhuma linguagem de programação específica, paradigma, ambiente de computação ou plataforma, e nos certificamos de que ela não está de todo ligada à web. Portanto, não é absolutamente por acaso que wasm está vendo a adoção em muitos outros ambientes, como computação em nuvem, computação de borda, mobile, sistemas embarcados, IoT e blockchains.

 

Havia muitas, muitas considerações de design que entraram em Wasm, algumas óbvias e algumas bastante sutis. Muitos para entrar aqui. Uma discussão bastante abrangente sobre os objetivos técnicos de Wasm, escolhas de design, semântica formal e técnicas de implementação pode ser encontrada em um artigo científico que publicamos em Comunicações da ACM (uma versão mais antiga e mais técnica deste artigo é livremente acessível aqui).

 

 

A principal diferença de Wasm em comparação com outras máquinas virtuais é que ela não é otimizada para qualquer linguagem de programação específica, mas apenas abstrai o hardware subjacente, com um código de byte diretamente correspondente às instruções e modelo de memória das CPUs modernas. Além disso, Wasm suporta o sandboxing através de uma forte modularidade e uma especificação matemática rígida que garante que a execução seja segura, livre de comportamentos indefinidos e (quase) totalmente determinista. Além disso, essas propriedades realmente têm uma prova matemática verificada pela máquina!

 

Ao todo, essas propriedades foram destinadas a tornar wasm uma escolha atraente para uma ampla gama de ambientes e casos de uso que têm altas expectativas de portabilidade, segurança, generalidade e desempenho — como o Computador de Internet da Dfinity.

 

Criando o Computador de Internet

 

O Internet Computer é uma plataforma descentralizada de computação em nuvem que hospedará software seguro e uma nova geração de serviços de internet aberta. Ele usa um forte protocolo de consenso criptográfico para replicar com segurança computacionais sobre uma rede peer-to-peer de nodes computacionais (potencialmente não confiáveis), possivelmente sobrepostos com muitas sub-redes virtuais (às vezes chamados de fragmentos). As propriedades vantajosas da Wasm tornaram-no uma escolha óbvia para representar programas em execução nesta plataforma. Também gostamos da ideia de não limitar os desenvolvedores a apenas uma linguagem de plataforma dedicada, mas torná-la potencialmente aberta a "todos eles".

 

Essa é a teoria, de qualquer maneira. Na prática, portar uma linguagem de programação existente para Wasm não é totalmente trivial. Obviamente, requer a implementação de um novo backend compilador. Isso é divertido, mas o esforço não termina aí: também requer portar o sistema de tempo de execução da linguagem e os primitivos da biblioteca. E ainda existem alguns recursos, especialmente aqueles relevantes para linguagens de alto nível, que atualmente não podem ser implementados em Wasm facilmente — por exemplo: threads, coroutines, exceções e chamadas de cauda. Embora várias propostas para enriquecer Wasm com suas respectivas funcionalidades estejam no horizonte, elas ainda não foram finalizadas para padronização.

 

Embora já existam muitas implementações experimentais de linguagem visando Wasm, a maioria ainda não está pronta para o horário nobre. Os que incluem sistemas de baixo nível como C/C++ e Rust. Estes são certamente ótimos para seus casos de uso, mas são ferramentas menos do que ideais para o desenvolvimento de aplicações de alto nível para o Computador da Internet, onde acessibilidade, produtividade e alta garantia tendem a ser mais desejáveis do que a intromissão manual com o gerenciamento de memória.

 

Em algumas plataformas, incluindo o Internet Computer, há obstáculos adicionais que precisam ser superados para executar Wasm, e eles têm a ver com as limitações dos ambientes de computação que eles fornecem. Por exemplo, o Computador de Internet da Dfinity tem muito pouca semelhança com um sistema operacional convencional: não há funcionalidade como arquivos, I/O ou outros recursos muitas vezes tomados como garantidos em implementações de idiomas e usados liberalmente em tempos de execução ou bibliotecas. Isso significa que portar uma linguagem existente é mais do que apenas uma questão de código de ajuste: você pode precisar encontrar novos meios para substituir os usos da funcionalidade da plataforma ausente, removê-los ou fazer escolhas de design completamente diferentes. Esforços como o WASI tentam resolver esse problema até certo ponto, mas ainda estão em sua infância.

 

Inevitavelmente, esses fatores tornam um porta de idioma para o Computador de Internet da Dfinity um trabalho substancial, mesmo quando adota uma linguagem para a qual uma porta Wasm genérica já existe.

 

Ao mesmo tempo, uma linguagem para o Computador da Internet precisa fornecer acesso aos principais conceitos da plataforma: um modelo de programação distribuída com passagem de mensagens assíncronsas, noções de recursos como ciclos (também conhecidos como gás) e algumas outras idiossincrasias. Claro, todos eles poderiam ser disponibilizados como bibliotecas, mas uma linguagem que inclui nativamente construções apropriadas pode fornecer uma experiência de programação muito mais perfeita.

 

Então, se temos que trabalhar de qualquer maneira para sair do chão, por que não nos aplicar a criar algo que possa proporcionar uma experiência ideal ao usuário e transmitir nossa visão de como programar o Computador da Internet?

 

Motoko

 

É por isso que , apesar de todos os riscos de criar mais uma língua - decidimos criar o Motoko. Queríamos uma linguagem segura, fácil de usar e exponha perfeitamente os conceitos da plataforma, bem como uma que pareça suficientemente amigável e acessível para a maioria dos programadores. Atualmente, esse último objetivo torna praticamente inevitável que esteja firmemente no campo de línguas de ponto e vírgula. E nenhuma linguagem adequada existia neste campo.

 

Mas a pele bastante convencional de Motoko é apenas superficial: seu interior é o de uma linguagem moderna. Por exemplo, cada construção é uma expressão, tem fechamentos, tem tipos de variantes e correspondência de padrões estaticamente verificada, tem coleta de lixo, e é claro que tem um sistema de tipo flexível que é realmente sólido, ou seja, ele realmente garante a ausência de certos erros como travas, comportamento indefinido, erro de interpretação de dados, ou simplesmente perder um caso em um switch. Sem buracos! 

 

Ao mesmo tempo, tentamos intencionalmente não ser extravagantes ou reinventar a roda, mas sim construir uma riqueza de história, tanto prática quanto teórica, e reconhecemos as lições que foram aprendidas ao longo de décadas neste campo. Além de montar uma mistura coerente de características bem compreendidas, o design da Motoko incorpora muitas pequenas decisões para minimizar as armas de pé e errar no lado da segurança, por exemplo, os números não podem transbordar por padrão, os locais são imutáveis por padrão, a execução simultânea é atômica por padrão, nula não pode ocorrer por padrão, os campos são privados por padrão, e assim por diante. E não há herança, apenas subtipagem.

 

Implementar essas partes de Motoko e compilá-las para Wasm é uma nave compiladora convencional. O compilador Motoko, escrito em OCaml, usa uma representação intermediária digitado, alguns passes de transformação e cospe código wasm byte. O módulo Wasm gerado inclui um pequeno sistema de tempo de execução, escrito em C e Rust, que implementa principalmente um simples coletor de lixo usando a memória Wasm como seu monte. Isso não foi difícil, mas certamente há muito potencial para melhorar aqui.

 

Atores

 

A característica central do Motoko, no entanto, é seu suporte direto para atores,tanto na sintaxe quanto no sistema de tipo. O modelo de ator é um conceito bem conhecido que tem mais de 40 anos, mas, infelizmente, mal chegou a ser um dos principais idiomas. Um ator é como um objeto (e em Motoko, até parece um), na qual encapsula o estado privado junto com um conjunto de métodos para processar mensagens que podem ser enviadas a ele. Mas todas as mensagens são assíncronsas. Consequentemente, ao contrário dos métodos convencionais em OO, os métodos do ator não têm resultados. Além disso, todas as mensagens são recebidas sequencialmente por um ator — ou seja, tem uma fila de mensagens implícita e os métodos são executados atomicamente, mesmo quando as mensagens são enviadas simultaneamente.

 

Os atores são um grande modelo para a programação simultânea porque eles automaticamente evitam condições de corrida (graças à atomicidade e estado encapsulado) e impasses (porque a execução nunca bloqueia), e, portanto, descartam muitos bugs de concorrência. Tudo isso sem exigir que os programadores definam uma fechadura. Os atores também são um ótimo modelo para programação distribuída, pois a assincronia naturalmente lida com a latência envolvida com o envio de uma mensagem para um receptor potencialmente remoto. E, finalmente, os atores são um ótimo ajuste para o Computador de Internet da Dfinity, onde os aplicativos são implantados na forma dos chamados recipientes — essencialmente, atores representadoscomo módulos Wasm que podem se comunicar através de sub-redes. Acontece que o conceito de módulo de Wasm é um bom ajuste para isso, porque podemos interpretar diretamente as exportações de módulos como métodos de ator. Assim, um ator motoko compila para um módulo Wasm, onde os métodos são exportados funções Wasm com convenções especiais de parâmetros definidas pela plataforma.

 

Em suma, um aplicativo em Motoko é um ator (ou vários), que por sua vez é um grande objeto assíncromo compilado em um módulo Wasm. Com a noção de memória de Wasm, tal ator pode imediatamente gerenciar até 4 GiB de estado interno, embora isso possa ser ampliado ainda mais ligando múltiplos módulos Wasm que cada um tem sua própria memória. Estamos curiosos para ver a rapidez com que os primeiros usuários entrarão nesse limite de memória.

 

Futuros

 

Para tornar a programação assíncrona mais conveniente e permitir expressá-la em "estilo direto" sequencial, Motoko adota outra ideia de mais de 40 anos dos anais da pesquisa de linguagem de programação, embora uma que felizmente se tornou um pouco mais popular recentemente: futuros (também chamados promessas em algumas comunidades). No Motoko, eles se materializam na forma de "valores async", valores do tipo "asyncT" que são produzidos por expressões prefixadas com a palavra-chave 'async'. Em particular, um corpo de função pode ser uma expressão assincron, substituindo naturalmente o conceito mais monolítico de uma "função assincron" que existe em algumas outras línguas.

 

Com isso, os métodos do ator podem ter resultados, afinal — desde que sejam futuros. Os futuros podem ser aguardados para obter seu valor, mas apenas dentro de outra expressão assípada, semelhante a async/aguardam monads como conhecidos de outras línguas modernas.

 

O compilador Motoko implementa isso através de uma transformação tradicional de CPS (estilo de passagem de continuação), transformando cada ponto de espera em uma função Wasm separada (além de algum ambiente de fechamento) representando a continuação da espera. Na verdade, é CPS de cano duplo, porque cada mensagem também pode ter uma resposta de falha com uma respectiva continuação de falha. Por convenção, um método com um resultado assincron é aquele que envia uma mensagem de resposta carregando os valores do resultado como argumentos. Esta mensagem é recebida pela função de continuação criada, que pode então retomar a execução que capturou. Esperar por uma resposta não bloqueia um ator — ele pode receber livremente outras mensagens enquanto isso.

 

Persistência

 

Outra consideração importante para o Motoko foi permitir que os desenvolvedores utilizassem a tecnologia blockchain sem ter que aprender um tipo totalmente novo de computação. Então, tiramos todo o conhecimento especial que você pode precisar sobre a raça atual de linguagens de programação blockchain. Por exemplo, não há noção observável de altura de bloco ou bloco, não há construções explícitas para atualizar o estado na blockchain, nem há outra API para escrever dados para armazenamento persistente, como arquivos ou bancos de dados (embora isso possa ser emulado como uma biblioteca). Em vez disso, o Computador da Internet implementa persistência ortogonal— mais uma ideia antiga onde um programa tem a ilusão de funcionar "para sempre" e sua memória permanecer viva (pelo menos até que seja explicitamente derrubada). No Motoko, isso significa que os desenvolvedores não têm que se preocupar em salvar explicitamente seus dados ou se preocupar com arquivos ou um banco de dados externo: quaisquer valores ou estruturas de dados armazenadas em variáveis de programa ainda estarão lá quando a próxima mensagem chegar, mesmo que isso seja meses depois.

 

A plataforma cuida de salvar e restaurar de forma transparente o estado privado de um recipiente entre invocações de métodos. Isso foi relativamente fácil de readequar em um motor Wasm, porque o estado de um módulo Wasm é claramente isolado na memória, globais e tabelas de um módulo. Na maioria das vezes, basta observar memórias wasm com o uso de técnicas de memória virtual expostas por sistemas operacionais. Dessa forma, a plataforma sabe quando páginas em tal memória foram modificadas e pode tomar todas as medidas necessárias para persistir as páginas sujas, bem como hashing-los para o protocolo de consenso distribuído.

 

Além do Motoko: Definições de interface

 

Como o Computador de Internet executa wasm, motoko é apenas uma opção para criar um aplicativo — e intencionalmente assim. Estamos ansiosos para disponibilizar outras opções de idiomas. Mesmo assim, porque cada língua irá compilar uniformemente para recipientes representados em Wasm, esses recipientes podem se comunicar livremente entre si através de mensagens enviam independentemente de sua linguagem de origem.

 

Para tornar essa interoperabilidade bem definida, também introduzimos uma linguagem de definição de interface genérica(IDL)chamada Candid que é independente do Motoko. Ele descreve o conjunto de mensagens compreendidas por um recipiente e que tipo de dados são enviados junto. Os dados são descritos em Candid por uma combinação de tipos de dados canônicos (números, texto, matrizes, registros, variantes, funções, referências a outros recipientes) que são independentes do sistema tipo Motoko ou de qualquer outra linguagem de programação.

 

Ufa, outro tipo de sistema? Bem, os programadores provavelmente ficarão satisfeitos que o compilador Motoko possa consumir e produzir automaticamente tais descrições de interface para exportações e importações de atores e mapeá-los de e para os tipos correspondentes motoko. Ele também gera automaticamente o código Wasm certo para serializar e deserializar os dados de argumento para cada mensagem, interconvertando transparentemente a representação interna do Motoko com o formato binário que Cândido especifica.

 

Dessa forma, os programas Motoko podem se comunicar com recipientes externos de forma tipítil e expressar invocações remotas como se fossem objetos locais no programa. E isso é independentemente de os recipientes remotos estarem escritos em Motoko ou, digamos, Rust; a descrição da interface de um recipiente é suficiente como informações de tipo. Além da mera conveniência, as interfaces também fornecem uma forte forma de modularidade, onde os programas podem ser verificados digitar contra outros atores/recipientes sem ter acesso à sua implementação.

 

Conclusão

 

Nosso objetivo é que o Computador da Internet se torne uma plataforma multilinguística onde todas as línguas têm direitos iguais, podem interagir perfeitamente através dos limites do recipiente, e motoko é apenas uma escolha entre muitos. Isso é importante para tornar a plataforma de Computador de Internet aberta.

 

Wasm provou até agora ser um formato de código versátil para alcançar esse objetivo. Beneficiamos especialmente de sua simplicidade, modularidade e semântica segura e determinista. Mas, apesar dessas propriedades agradáveis, portar compiladores e bibliotecas, muito menos aplicações entre diferentes ecossistemas Wasm, não é tão simples quanto se poderia esperar, uma vez que envolve muito mais do que apenas código nu. Mas Wasm ainda é jovem, e certas barreiras são esperadas.

 

O maior recurso wasm que estamos aguardando ansiosamente é o advento de tipos de referência de primeira classe e referências de função. Isso fará com que uma API de sistema muito mais limpa, através da qual os módulos Wasm (e, portanto, os programas Motoko) conversem com a plataforma Internet Computer). Os programadores interessados podem encontrar mais detalhes sobre o SDK aqui e contribuir para a biblioteca base motoko via GitHub aqui.

 

 

O Avance Network é uma comunidade fácil de usar que fornece segurança de primeira e não requer muito conhecimento técnico. Com uma conta, você pode proteger sua comunicação e seus dispositivos. O Avance Network não mantém registros de seus dados; portanto, você pode ter certeza de que tudo o que sai do seu dispositivo chega ao outro lado sem inspeção.


Strong

5178 博客 帖子

注释