Pergunta

Nikhil Kothari Roteiro# é possivelmente um dos conceitos mais incríveis que já vi na área de JavaScript há algum tempo.Esta questão não é sobre JavaScript, mas sim sobre compilação de linguagem no tempo de execução do .NET.

Estou bastante interessado em como, usando a plataforma .NET, alguém pode escrever um compilador para uma linguagem que já possui um compilador (como C#) que gerará uma saída separada do compilador original, permitindo que o compilador original gere saída para a mesma fonte durante a mesma operação de compilação, ao mesmo tempo em que faz referência/utiliza a saída do outro compilador também.

Não tenho certeza se entendi o processo bem o suficiente para fazer a pergunta com os detalhes corretos, mas é assim que vejo o processo atualmente, conforme diagramas nos documentos do Script#.Pensei em muitas coisas que envolvem design e compilação de linguagens complexas que podem tirar proveito de conceitos como esse e estou interessado no que outras pessoas pensam sobre os conceitos.

--

Editar:Obrigado por comentar, até agora;suas informações são, por si só, muito intrigantes e eu gostaria de pesquisá-las mais, mas minha pergunta é sobre como eu seria capaz de escrever meus próprios compiladores que podem ser executados na mesma fonte ao mesmo tempo produzindo vários tipos diferentes de saída (potencialmente) interdependentes usando o CLR.Script# serve de exemplo, pois gera JavaScript e um Assembly usando a mesma fonte C#, ao mesmo tempo em que faz o Assembly compilado cooperar com o JavaScript.Estou curioso para saber quais são as várias abordagens e conceitos teóricos para projetar algo dessa natureza.

Foi útil?

Solução

É importante perceber que tudo o que um compilador faz é pegar uma linguagem fonte (C# neste caso), analisá-la para que o compilador tenha uma representação que faça sentido para ele e não para humanos (esta é a árvore de sintaxe abstrata) e então faça um geração de código ingênuo para a linguagem de destino (msil é o destino para linguagens executadas no tempo de execução .NET).

Agora, se o código script# for transformado em um assembly e interagir com outro código .NET, isso significa que este compilador deve estar gerando msil.script# está usando csc.exe para isso, que é apenas o compilador c# padrão.Agora, para gerar o javascript, é necessário pegar c# ou msil, analisá-lo e gerar o javascript para enviar ao navegador.A documentação diz que possui um compilador c # -> js personalizado chamado ssc.exe.

Para fazer com que as coisas interajam de forma consistente tanto no lado do cliente quanto no lado do servidor, ele possui um conjunto de assemblies de referência escritos em .NET, mas também compilados em javascript.Porém, este não é um problema específico do compilador; esses assemblies de referência são o tempo de execução do script#.O tempo de execução é provavelmente responsável por grande parte da mágica do script que você está percebendo.

Outras dicas

Digamos que você queira compilar C# em Javascript.Você está perguntando se pode aproveitar as vantagens dos compiladores C# existentes, então, em vez de compilar C# em Javascript diretamente, você realmente converte o MSIL gerado pelo compilador C# em Javascript?

Claro, você pode fazer isso.Depois de ter o binário MSIL, você pode fazer o que quiser com ele.

A Microsoft tem um projeto de pesquisa chamado Volta que, entre outras coisas, compila msil para JavaScript.

Um conjunto de ferramentas de desenvolvedor para criar aplicativos da Web de várias camadas usando ferramentas, técnicas e padrões existentes e familiares.A divisão declarativa da Volta permite que os desenvolvedores adiem decisões arquitetônicas sobre distribuição até o último momento possível responsável.Além disso, graças a um modelo de programação compartilhado em várias camadas, a Volta permite novos perfis e testes de ponta a ponta para níveis mais altos de desempenho, robustez e confiabilidade do aplicativo.Usando a divisão declarativa de nível, os desenvolvedores podem refinar as decisões arquitetônicas com base nesses dados de perfil.Isso economiza tempo e custos associados à refatoração manual.Com efeito, a Volta estende a plataforma .NET para permitir ainda mais o desenvolvimento de aplicativos de Software+Services, usando ferramentas e técnicas existentes e existentes.

Você arquiteta e cria seu aplicativo como um aplicativo .NET Client, atribuindo as partes do aplicativo que executam na camada do servidor e no nível do cliente no final do processo de desenvolvimento.Você pode segmentar navegadores da Web ou CLR, pois os clientes e a Volta lida com as complexidades da divisão de camadas.O compilador cria JavaScript de navegador cruzado para o nível do cliente, os serviços da Web para o nível do servidor e toda a comunicação, serialização, sincronização, segurança e outro código de caldeira para unir as camadas.Com efeito, a Volta oferece uma experiência de melhor esforço em vários ambientes sem exigir a adaptação do aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top