Como faço para escrever uma especificação de linguagem de programação?

16

Eu realmente gosto de design de linguagem de programação. Às vezes, acho que meus projetos de idiomas e seus usuários em potencial se beneficiariam de um documento abrangente sobre padrões. Examinei muitos padrões de linguagem, desde o formal (C ++) até o informal (ECMAScript), mas não consigo entender como devo resolver as coisas e organizar esse documento, mesmo que eu acho que sou muito bom em redação técnica em geral.

Devo escrever como um longo tutorial ou mais como um trabalho formal de matemática? Como faço para mantê-lo atualizado se estou desenvolvendo-o juntamente com uma implementação de referência? Devo simplesmente desistir e tratar a implementação e a documentação como o padrão de fato? Além disso, existe realmente algum benefício significativo em ter um padrão? A exigência de um padrão significa que o idioma é desnecessariamente complexo?

Jon Purdy
fonte
1
Você já leu Idiomas Específicos de Domínio por Martin Fowler? amazon.com/...
Gary Rowe
@ Gary Rowe: Eu não tenho. Parece uma leitura decente, embora talvez não seja exatamente o que estou procurando.
quer
A vantagem de um padrão sobre uma implementação de referência é que você pode definir onde outras implementações podem se desviar daquilo que sua implementação faz.
Bart van Ingen Schenau

Respostas:

3

Eu achei a especificação da linguagem Java formal e legível, e acho que ela tem uma estrutura sensata. Algumas das especificações do W3C também podem ser bons exemplos.

Fazer o trabalho formal pode ajudar a manter a complexidade do idioma baixa e ver os casos extremos.

Despejo cerebral de cabeçalhos: codificação de origem, lexing, tipos fundamentais, literais, operadores, expressões, declarações simples, condicionais, loops, funções (definições e chamadas), declarações de tipo, módulos, unidades de compilação, escopo variável, vários tipos de resolução de nomes (por exemplo, importações, métodos), modelo de memória, efeitos colaterais, digitação, simultaneidade…

Tobu
fonte
Sua lista de sugestões é muito útil. Eu acho que o que vou fazer é criar uma lista semelhante, classificá-la no formato de tutorial e escrever uma breve especificação informal com alguns adendos formais, como uma gramática EBNF. Definitivamente, também vou dar uma outra olhada nas especificações que você mencionou para obter idéias.
Jon Purdy
7

Leia lotes e mantenha-o simples

Projetar um novo idioma é difícil. Muito difícil. Mas, no final das contas, é muito satisfatório se tornar popular e realmente resolver um problema que as pessoas estão enfrentando de maneira elegante.

Como mencionei nos comentários, recomendo que você leia os Idiomas Específicos do Domínio de Martin Fowler pelos seguintes motivos:

  1. Ele tem muita profundidade prática sobre por que você deve criar uma linguagem
  2. Há detalhes sobre como fazê-lo (analisadores, analisadores lexicais, bancadas de idiomas etc.)
  3. Existem instruções detalhadas de implementação sobre como a sintaxe escolhida pode ser feita para lidar com conceitos como fechamentos, anotações, listas literais, recepção dinâmica etc.

Quanto a como escrever sua especificação, pense no seu público. Obviamente, antes de colocar o dedo no teclado para projetar seu idioma, você terá pensado cuidadosamente sobre o que ele pretende fazer.

Se for uma linguagem nova e interpretada para substituir o JavaScript, você precisará de uma abordagem muito laissez faire para alcançar os desenvolvedores da Web com um tempo de atenção limitado e um desejo de resultados imediatos - ou mais rápido, se possível.

Se ele for usado na próxima missão para Titan, então especificações extremamente detalhadas mostrando provas formais exatas do comportamento de cada componente serão o nível mínimo de entrada.

Portanto, não é uma coisa simples. Para abordar a especificação, provavelmente seria melhor ganhar muita experiência na criação de seus idiomas e também trabalhar com aqueles que realmente os usam no dia a dia. Se você tem vítimas dispostas ... er ... desenvolvedores, no trabalho, que podem levar algum tempo para aprender seu idioma, eles podem dar um feedback sobre o que é necessário para fazê-los usá-lo.

Em resumo, mantenha-o simples e mais pessoas o usarão.

Gary Rowe
fonte
Obrigado por isso. Tenho muita experiência no desenvolvimento de linguagens e até mesmo em documentá-las completamente, mas é a idéia de um padrão que sempre me pega. Talvez eu tenha que pegar a leitura recomendada e experimentar um pouco.
Jon Purdy
@ Jon Purdy Você tem exemplos de idiomas online que podem incluir na pergunta?
Gary Rowe
Ainda não tenho exemplos do meu projeto atual. O exemplo pública só é realmente completa de uma língua que eu fiz (! Que eu realmente usar) está em vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy
@ Jon Purdy Vision parece interessante - uma espécie de velocidade acelerada. Como um aparte, você pode considerar um screencast do YouTube mostrando como instalá-lo e escrever um exemplo de site pequeno (digamos, para um encanador local). Isso tornaria a curva de aprendizado muito mais fácil, pois as pessoas podem vê-la em ação e assumir imediatamente os benefícios. Você pode falar sobre os benefícios em comparação com JSP, Velocity, ASP.Net, Freemarker etc.
Gary Rowe
Essa é uma boa ideia; Eu tenho feito muitos vídeos do YouTube ultimamente (cerca de três por semana), então acho que definitivamente posso encaixar um.
Jon Purdy
3

A Wirth projetou e implementou muitas linguagens de programação: dentre estas, as especificações para as linguagens Oberon e Oberon2 são notáveis ​​por sua integridade, concisão e legibilidade.

Grrussel
fonte
2

Common Lisp e Haskell têm padrões de linguagem. Ruby e Python têm implementações e documentação. Então, eu diria que um padrão de linguagem não é necessário, mas pode ser útil se você espera que haja mais de uma implementação da linguagem que você está projetando. Por outro lado, um padrão é prematuro se você espera mudanças significativas na sua definição de idioma.

Larry Coleman
fonte
Na verdade, Ruby tem duas coisas que podem ser consideradas "especificações". Há a especificação ISO Ruby, que está atualmente em seu estado Final de rascunho e está sendo escrita por algumas pessoas que têm experiência com especificações de idioma (tendo trabalhado no ANSI Common Lisp e ISO C ++). E existe o projeto RubySpec, que é um conjunto de exemplos executáveis ​​no estilo RSpec, formando uma especificação legível por humanos e um conjunto de testes de conformidade executável por máquina para essa especificação.
Jörg W Mittag 5/12
1

qualquer especificação deve ser concisa e capaz de resistir ao teste do tempo

é por isso que você vê uma abstração como o BNF usada para muitos padrões de linguagem ... é concisa e ainda será entendida muito tempo depois que muitas das nossas ferramentas atuais forem deixadas para trás.

é claro que há mais do que apenas uma gramática. veja o que os outros fizeram ... perl6, schema, C ... eles abordam questões com as quais o implementador também se importa.

Brad Clawsie
fonte