Tempo de execução de linguagem comum e avaliação de expressão

Importante

No Visual Studio 2015, essa maneira de implementar avaliadores de expressão foi preterida. Para obter informações sobre como implementar avaliadores de expressão CLR, consulte Avaliadores de expressão CLR e Exemplo de avaliador de expressão gerenciada.

Compiladores, como Visual Basic e C# (pronuncia-se C-sharp), que visam o Common Language Runtime (CLR), produzem Microsoft Intermediate Language (MSIL), que é posteriormente compilado para código nativo. O CLR fornece um mecanismo de depuração (DE) para depurar o código resultante. Se você planeja integrar sua linguagem de programação proprietária no IDE do Visual Studio, você pode optar por compilar para MSIL e, portanto, não terá que escrever seu próprio DE. No entanto, você terá que escrever um avaliador de expressão (EE) que seja capaz de avaliar expressões dentro do contexto de sua linguagem de programação.

Discussão

As expressões de linguagem de computador são geralmente analisadas para produzir um conjunto de objetos de dados e um conjunto de operadores usados para manipulá-los. Por exemplo, a expressão "A+B" pode ser analisada para aplicar o operador de adição (+) aos objetos de dados "A" e "B", possivelmente resultando em outro objeto de dados. O conjunto total de objetos de dados, operadores e suas associações são mais frequentemente representados em um programa como uma árvore, com os operadores nos nós da árvore e os objetos de dados nas ramificações. Uma expressão que foi dividida em forma de árvore é muitas vezes chamada de árvore analisada.

Depois que uma expressão é analisada, um provedor de símbolos (SP) é chamado para avaliar cada objeto de dados. Por exemplo, se "A" é definido em mais de um método, a pergunta "Qual A?" deve ser respondida antes que o valor de A possa ser determinado. A resposta retornada pela controladora de armazenamento é algo como "O terceiro item no quinto quadro de pilha" ou "O A que está 50 bytes além do início da memória estática alocada para este método".

Além de produzir MSIL para o próprio programa, os compiladores CLR também podem produzir informações de depuração muito descritivas que são gravadas em um arquivo de banco de dados de programa (.pdb). Contanto que um compilador de linguagem proprietária produza informações de depuração no mesmo formato que os compiladores CLR, o SP do CLR é capaz de identificar os objetos de dados nomeados dessa linguagem. Depois que um objeto de dados nomeado é identificado, o EE usa um objeto de fichário para associar (ou vincular) o objeto de dados à área de memória que contém o valor desse objeto. O DE pode então obter ou definir um novo valor para o objeto de dados.

Um compilador proprietário pode fornecer informações de depuração CLR chamando a ISymbolWriter interface (que é definida no .NET Framework no namespace System.Diagnostics.SymbolStore). Ao compilar para MSIL e escrever informações de depuração através dessas interfaces, um compilador proprietário pode usar o CLR DE e SP. Isso simplifica muito a integração de uma linguagem proprietária no IDE do Visual Studio.

Quando o CLR DE chama o EE proprietário para avaliar uma expressão, o DE fornece ao EE interfaces para um SP e um objeto de fichário. Assim, escrever um mecanismo de depuração baseado em CLR significa que é necessário apenas implementar as interfaces apropriadas do avaliador de expressão; o CLR cuida da vinculação e do manuseio do símbolo para você.