Quão fácil deve ser uma estrutura de desenvolvimento de linguagem?

11

Isso faz parte de uma série de perguntas que se concentra em um projeto chamado Abstraction Project, que visa abstrair os conceitos usados ​​no design de linguagem na forma de uma estrutura.

Outra página associada a ela relacionada à tipagem estrutural pode ser vista aqui . O meta-tópico associado a uma consulta sobre a estrutura e o local apropriado para publicação pode ser encontrado aqui .

Quão fácil deve ser usar um Framework de Desenvolvimento de Linguagem?

Escrevi estruturas de geração de código em larga escala que também incluíam a capacidade de enviar o resultado ao compilador específico do idioma. O tópico da facilidade de uso surge de um exemplo de estrutura: CodeDOM, ou o Code Document Object Model.

É uma estrutura escrita pela Microsoft que descreve estruturas de código comuns, mas geralmente deixa muito de fora (coerção de expressão) e tende a ser um pouco abstrata na representação de certas construções, emitindo códigos ruins com base no que você estava fazendo: anteriormente CodeDOM mal tratada emitindo PrivateImplementationTypeem CodeMemberMethod, quando o tipo utilizado foi uma interface genérica. O CodeDOM foi minha razão original para escrever meu primeiro gerador de código.

Uma coisa que estou tentando fazer, para simplificar a estrutura, é reduzir a quantidade de trabalho que você precisa para fazer alguma coisa e se concentrar nas ações versus os tipos específicos que compõem essas ações.

Aqui está uma comparação lado a lado de como a estrutura que estou escrevendo funciona:

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

Versus CodeDOM:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

O foco da estrutura são os entusiastas da linguagem, bem como aqueles interessados ​​em gerar código ou aplicativos. Dado seu foco na compilação, geração de código e desenvolvimento de linguagem, a estrutura deve se concentrar na facilidade de uso ou no poder bruto?

Meu principal objetivo é aumentar a disponibilidade dessas ferramentas, para que os interessados ​​no domínio não exijam muita experiência no domínio da teoria da linguagem antes de começarem a trabalhar em seus próprios projetos centrados na linguagem.

Dado que sou o autor do framework, minha visão de "usabilidade" é tendenciosa. Portanto, devo perguntar a outro se o foco e a meta fazem sentido para outras pessoas que não estão associadas ao projeto.

Allen Clark Copeland Jr
fonte
1
Você deve fazer esta pergunta em codereview.stackexchange.com .
Robert Harvey
6
A questão, se uma estrutura deve ser fácil de usar às custas da energia bruta, não parece adequada para a Code Review.SE, onde "a arquitetura de nível superior e o design de sistemas de software" não está presente . tópico lá e está no tópico aqui. A Revisão de código é para quando você tem código de trabalho e deseja uma crítica.
A entrada para um gerador de código é apenas outra linguagem de programação. O desejo de geração de código significa que o idioma que você está gerando é insuficientemente poderoso. Linguagens melhores possuem geradores de código integrados.
Kevin cline
@kevincline O caso de uso típico de um gerador de código é uma linguagem específica de domínio que utiliza uma estrutura de geração de código de uso geral. Isso não é realmente uma escolha, a alternativa seria compilar com sua própria linguagem intermediária interna e interpretá-la por meio de uma VM ou traduzi-la em uma construção de nível inferior, mas no final você está fazendo a mesma coisa . É isso que essa estrutura pretende fazer: quando você precisa fazer o trabalho para gerar código dinamicamente, você usaria isso em vez de implementar sua própria implementação da mesma coisa.
Allen Clark Copeland Jr
Não é tanto que o idioma de origem seja insuficiente, é que uma gramática de idioma é apenas texto até que um software intermediário seja escrito para traduzir do texto de origem para a plataforma de destino. Nesse caso, é a CLI (Common Language Infrastructure), ou código em idiomas de uso geral que tem como alvo a CLI. A estrutura visa lidar com o trabalho pesado de obter representações de alto nível e traduzi-las em construções de nível suficientemente baixo para a geração de IL. ou seja, um compilador, só porque você precisa de um compilador não significa que seu idioma é insuficientemente poderoso. É requerido.
Allen Clark Copeland Jr

Respostas:

2

É difícil criar uma estrutura de desenvolvimento de linguagem. Você precisa decidir que tipo de coisas deseja apoiar e, em seguida, decidir quais daquelas que você sabe fazer e como integrá-las em um todo coerente. Por fim, você fez um investimento suficiente para funcionar com linguagens reais (por exemplo, linguagens típicas de computador e DSLs) e, na verdade, faz algo útil. Meu chapéu está fora de você por tentar.

Você pode comparar seu esforço com o que iniciei há 15 anos, o DMS Software Reengineering Toolkit . O DMS destina-se a fornecer análise, análise e transformação de código de uso geral. Dada uma especificação explícita de linguagem, ele analisará o código, criará ASTs, regenerará o código de ASTs (prettyprint), transformará o código usando padrões escritos na linguagem de programação de destino, criará tabelas de símbolos, computará o controle e o fluxo de dados etc. um faz com que o DMS realize uma ampla variedade de efeitos. (Veja as ferramentas no site; todas elas são DMS de uma forma ou de outra).

Aqui está um artigo técnico sobre o DMS, como está há vários anos atrás. (Continuamos melhorando)

Embora o próprio DMS tenha sido difícil de construir, descobrimos que era necessário um pedaço de engenharia correspondente para definir langauges reais para o DMS, incluindo IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (e muitos outros).

O que achamos que faz (razoavelmente bem): reduza o custo de construção de ferramentas em 1-2 ordens de magnitude. O que isso significa é que tarefas que, de outra forma, levariam de 1 a 10 anos, podem ser contempladas por meros mortais como projetos de 1 mês a 1 ano. O que ainda não é fácil:

  • Definindo novos idiomas
  • Lidando com todas as idiotices dos idiomas atuais
  • Facilitando a gravação do código personalizado específico para sua tarefa
  • Definindo análises novas e complexas
  • Manipulação de programas parciais ou programas que contêm erros
  • (Para o seu ponto inicial) Facilite o uso dessas ferramentas por não especialistas

Portanto, há muito espaço para melhorias. Deixe muitas flores florescerem.

Ira Baxter
fonte
0

Esta pergunta pode ter sido respondida no The Mythical Man Month, na seção "Integridade conceitual". Caso contrário, é pelo menos altamente relevante para sua pergunta. Embora Brooks descreva a arquitetura de um sistema de computação inteiro, o ensaio se aplica perfeitamente a estruturas e novas linguagens.

Acredito que exista uma correlação positiva entre a taxa de adoção de qualquer tecnologia e sua integridade conceitual e facilidade de uso. Deve haver um estudo de caso de tecnologias recentes, como linguagens, estruturas e sistemas operacionais, para provar essa correlação, mas ainda não sabemos nada sobre isso.

maxpolk
fonte
Meu único problema com esta resposta é que ela não fornece nenhum valor real. Referências é uma seção de um livro e, a partir da sua descrição, só seria aplicável depois que o pacote de software fosse lançado. Ele não me fornece uma resposta antes do lançamento, pois está basicamente dizendo 'fará bem se for fácil de usar e relevante para o domínio'. Não sei dizer se vai dar certo, porque ainda não chegou a um ponto em que você possa usá-lo. O problema dos compiladores é que você faz muito e muito trabalho, apenas para perceber que está a meio caminho da montanha, e essa é a parte mais fácil.
Allen Clark Copeland Jr