Quando é razoável criar minha própria linguagem de programação?

47

Existem tipos de aplicações killer, classes de problemas algorítmicos, etc., onde é melhor, a longo prazo, criar minha própria linguagem?

PS: Só para ter certeza, quero dizer uma nova linguagem de programação e um compilador, não um novo compilador para uma linguagem existente.

EDIT : Obrigado pelas respostas. Você pode fornecer alguns exemplos, onde é absolutamente desnecessário criar uma DSL ou casos em que uma DSL possa ser uma boa ideia?

    
por Daniel Rikowski 06.02.2009 / 13:13
fonte

28 respostas

40

Certamente é relevante que uma pessoa escreva sua própria língua para fins educacionais. Aprender sobre o design da linguagem de programação e sobre o design do compilador. Mas os usos do mundo real são poucos e distantes entre si.

Ao escrever sua própria língua, você é:

  • Adicionando uma enorme quantidade de complexidade ao seu problema
  • Adicionando uma quantidade significativa de trabalho ao escrever e manter o novo idioma e compilador

Portanto, se você planeja escrever seu próprio idioma para o seu projeto, os recursos que ele fornece para outros idiomas não precisam compensar os custos acima.

Participe do desenvolvimento de jogos, por exemplo. Eles geralmente precisam de mini-idiomas em seus jogos ou linguagens de script. Eles usam essas linguagens para criar uma grande quantidade de eventos do jogo que acontecem. No entanto, mesmo nesse caso, eles quase sempre escolhem linguagens de script existentes e adaptam-nas às suas necessidades.

    
por 06.02.2009 / 13:22
fonte
24

Deixe-me apenas citar Paul Vick, ex-desenvolvedor chefe do compilador VB e agora trabalhando no Projeto Oslo e na linguagem M:

It’s mind-bendingly, stupendously difficult to build a new language, even one that’s largely based on an existing one. Yet many programmers think, “hey, I use languages, how hard can this be?” and go at it. … probably over 98% of them fail to ever gain any traction at all, but god bless the optimists because without them we’d never get the 2% of languages that succeed. I’m personally willing to sacrifice the millions of dollars and hours wasted on languages that never make it just so that we can get languages like C# and Java and Ruby and Python and so on.

So the fact that coming up with a new language is a bad idea shouldn’t dissuade people from developing new DSLs, it should just give them pause and hopefully a little humility. The key, I think, is to start small and to stay small.

DSLs: Definitivamente, uma má ideia!

    
por 04.10.2013 / 12:57
fonte
22

Quando é razoável?

Quando você quiser!

Não ouça essas pessoas que têm comentários sarcásticos que basicamente dizem:

"Não faça isso porque é muito difícil e a linguagem X é melhor do que qualquer outro idioma".

O problema é que criar uma DSL acontece o tempo todo. Um framework é uma DSL. Uma macro é uma DSL. Toda vez que você escreve uma função para o seu programa, isso faz parte de uma DSL. Claro, está dentro dos limites da gramática, mas o vocabulário é parte de uma linguagem. É por isso que as indústrias geralmente criam seu próprio vernáculo: é mais eficiente!

Se "não fizer" fosse a resposta certa, todos nós estaríamos escrevendo COBOL e Fortran.

    
por 17.04.2009 / 09:57
fonte
9

Você pode querer ler partes do próximo livro DSL de Martin Fowler , se estiver pensando em escrever seu próprio idioma .

Eu não consigo pensar em um caso de negócio para criar uma linguagem a partir do zero, além de ser uma tremenda experiência de aprendizado.

Editar: para DSLs, há muitos casos de negócios, mas a chave aqui é não se deixar levar pelo Keep It Simple.

    
por 04.10.2013 / 01:34
fonte
7
Sugiro que as principais perguntas sejam: "Qual problema estou tentando resolver?" e "Quem recebe o ROI?"

Se você está tentando desenvolver suas próprias habilidades e experiência, então vá em frente, mas não em um sistema de produção que supostamente resolva o problema de outra pessoa.

    
por 06.02.2009 / 13:25
fonte
7

Parece que a principal razão pela qual você deseja um novo idioma é que você comece a descobrir padrões em seu código que os idiomas existentes não manipulam bem. Mas há muitos problemas em criar seu próprio idioma. Você perderá todas as bibliotecas e estruturas criadas para os idiomas existentes. Você passará muito tempo projetando e implementando o novo idioma, que é o tempo todo que você não precisa gastar na tarefa de programação real. Você gastará muito esforço para convencer outros desenvolvedores de que eles devem usar seu idioma. E você terá dificuldade em recrutar e treinar novos desenvolvedores.

Por que não escrever em uma linguagem como o Lisp, que permite estender a linguagem à medida que você descobre novos padrões? Então, você obtém todo o poder de um novo idioma com todos os benefícios de uma linguagem estabelecida.

    
por 06.02.2009 / 13:29
fonte
6

Um motivo poderia ser criá-lo como uma experiência para aprender sobre design de linguagem e construção de compiladores.

Outro motivo poderia ser criar uma linguagem de script em um aplicativo quando você não tem a opção de adicionar uma API de terceiros.

    
por 06.02.2009 / 13:18
fonte
6

Eu não acho que você pode programar sem criar um novo idioma, por isso é bom perceber o que você está fazendo e entender os problemas.

  • O que é uma linguagem?
    Vocabulário, sintaxe e semântica.

Uma linguagem off-the-shelf como VB, Java, C #, etc. é apenas uma linguagem base . Assim que adicionar classes, métodos, etc. a ele, você adicionou vocabulário e semântica. Existem muitas maneiras de implementar idiomas - parsing & traduzindo, analisando & interpretando, macros em cima de uma linguagem existente, adicionando classes e métodos a um idioma existente.

  • O que você quer que um idioma faça?
    Seja bom para expressar problemas de forma concisa.

Como você sabe se fez isso? A medida que eu uso é edit count . Se o requisito de uma frase A aparecer, procuro implementar o requisito no código. Quando eu terminar e & tirei todos os bugs, verifiquei o código e o repositório de código me fornece uma lista das alterações que eu fiz, B. Quanto menor B, melhor a linguagem. Média do espaço de real & requisitos possíveis, essa medida me diz como "domínio específico" a linguagem é.

  • Por que a concisão é boa?
    Porque minimiza os erros.

Se forem necessárias alterações no código N para implementar um requisito, e você algumas vezes cometer erros, então o número de erros que você introduz é aproximadamente proporcional a N. No limite onde N = 1, é quase impossível introduzir um bug sem tentar.

Note que este é um desafio direto para o "código inchado" que vemos hoje em dia.

ADICIONADO: em resposta ao seu pedido de um exemplo, consulte execução diferencial . Não direi que pode ser entendido rapidamente, mas reduz significativamente o código da interface do usuário.

    
por 23.05.2017 / 14:40
fonte
5

É sempre "factível", usar a palavra em sua pergunta (original), mas não é muito útil e muito raramente ideal, dada a abundância de linguagens e estruturas bem suportadas e maduras que existem.

É um desafio intelectual interessante, no entanto.

    
por 06.02.2009 / 13:17
fonte
5

Somente se o core business de sua equipe for linguagens de programação.

Eu trabalhei em uma linguagem de programação que foi criada em uma empresa financeira.

Claramente, para o próprio arquiteto, esse foi um grande desafio e melhorou suas habilidades.

Inevitavelmente, a linguagem não poderia crescer ou melhorar em qualquer lugar perto da taxa que algo como C # ou Java poderia - eles têm equipes dedicadas a fazer isso.

A linguagem logo estagnou, pois ninguém queria assumir a tarefa de melhorar o projeto de estimação de outra pessoa.

O arquiteto original saiu. A língua murcha e morre depois de 10 anos.

Esses 10 anos foram um inferno para quem teve a infelicidade de trabalhar em um idioma sem saída.

Então, vá em frente, crie seu próprio idioma, mas, por favor, não peça a ninguém para usá-lo. Por favor, não espere que mais ninguém lhe agradeça por isso.

    
por 06.02.2009 / 13:27
fonte
4

Projetar idiomas pode ser divertido. Mas você não precisa se restringir a linguagens de programação.

Se eu criar um aplicativo moderadamente complexo, gostaria de adicionar um tipo de linguagem de macro / script para facilitar a execução de tarefas repetitivas complexas. A maioria dos usuários não usa essa funcionalidade, mas os poucos que a usam são muito gratos. Além disso, tenho certeza de que é valioso para as pessoas de suporte ajudá-las a consertar os problemas dos clientes.

    
por 06.02.2009 / 13:30
fonte
4

É completamente razoável se for feito para ampliar suas habilidades e aprender.

Fora isso, se você tiver que fazer a pergunta, então não é. Se você está tentando descobrir se é possível lidar com uma determinada classe de algoritmo ou com um determinado domínio de problemas melhor do que com os idiomas existentes, primeiro você precisa ser um especialista na área que está abordando. Você saberá que é apropriado quando suas habilidades e experiência lhe dizem isso.

E você pode estar errado sobre isso também, mas você precisa de outro especialista para convencê-lo (ou para mostrar que você não é o especialista que você pensa que é). Uma discussão animada que seria, não um simples Q-and-A, como você encontrará aqui.

    
por 06.02.2009 / 13:39
fonte
4

Com exceção de propósitos autodidáticos, eu gostaria de afirmar que existe hoje nenhuma necessidade de criar seu próprio idioma. Em qualquer circunstância. Sempre. Independentemente do que você deseja fazer, há vários tipos de idiomas existentes que você pode usar / adaptar às suas necessidades.

    
por 09.02.2009 / 14:29
fonte
3

Depende definitivamente da situação. Como nosklo disse - Se você tem uma boa idéia, um novo conceito ou algo assim, eu recomendo que você faça isso.

Em geral, sugiro depender da tecnologia estabelecida.

Mas se você estiver interessado em criar seu próprio "idioma", verifique: YACC & Lex

    
por 06.02.2009 / 13:19
fonte
3

Você pode, apenas não se pegar no anti-padrão "Recriando a roda quadrada".

Significa que você está recriando o que já foi feito, apenas mais fraco que o (s) original (ais).

    
por 06.02.2009 / 14:39
fonte
3

Wouter era conhecido por criar uma nova linguagem para qualquer nova ideia. Você pode inspirar-se em seu trabalho: página de linguagem de programação de Wouter .

    
por 06.02.2009 / 14:39
fonte
3

Quando criar seu próprio idioma?

Quando você quiser, como um grande projeto de hobby.

Para um idioma específico do domínio. Estes podem ser bastante elaborados; Veja o que acontece na comunidade Interactive Fiction (ou Text Adventure), verificando o arquivo .

Quando seus objetivos são muito ambiciosos, e você acha que pode fazer um avanço real, como o projeto Arc de Paul Graham.

Além disso, em qualquer linguagem suficientemente adaptável (talvez C ++, definitivamente Common Lisp) no processo de desenvolvimento de construções de baixo nível.

Quando evitá-lo como você faria, eu espero, evitar um clichê como evitá-lo como a peste?

Quando é para ser a base do desenvolvimento contínuo de projetos reais. Ele sempre acabará ficando seriamente atrasado em relação ao que está comercialmente disponível, e prejudicará o desenvolvimento futuro. Trabalhei para uma empresa com sua própria versão do COBOL e nunca quis trabalhar em outra empresa que mantivesse seu próprio idioma. Observamos outras versões do COBOL obterem melhores recursos e melhores ferramentas, enquanto estávamos presos aos mesmos problemas. (Eu não quero mais trabalhar com COBOL novamente, mas isso é outra história.)

As situações em que você pode criar sua própria linguagem não se enquadram nisso. Projetos de hobby não são usados para desenvolvimento real. Algo como o Arc será bem-sucedido (e terá várias implementações e mais evolução e desenvolvimento) ou falhará (e ninguém mais o usará). Uma pequena linguagem específica do domínio é apenas parte de um projeto e, como é pequena, pode ser melhorada com o tempo. Uma linguagem de aventura de texto é usada para escrever jogos individuais, e esses jogos, além de serem projetos de hobby, quase nunca são usados para desenvolvimento contínuo.

    
por 09.02.2009 / 19:13
fonte
3

Minha perspectiva é que as DSLs geralmente são uma "ideia fraca", e é mais produtivo a longo prazo usar uma linguagem padrão e criar suas necessidades específicas de domínio como uma biblioteca da "não-DSL".

No entanto, pode ser que suas necessidades sejam personalizadas o suficiente para que seja preferível ter uma DSL (não apenas uma implementação gcc ou lisp levemente modificada) para sua empresa. Muitas empresas usam drop-ins de idiomas atuais que visam o que estão fazendo, sem escrever / manter seu próprio idioma. Por exemplo, ouvi dizer que o PHP tem um bom retorno; Lua é projetada para ser um drop-in, ModelView usa Python e o AutoCAD possui o AutoLISP como seu scripter.

    
por 09.02.2009 / 19:27
fonte
3

Não há nada de errado em escrever sua própria linguagem de programação se você puder aproveitar as ferramentas existentes. No mundo de hoje isso significaria que você quer defini-lo em uma sintaxe utilizável para uma linguagem existente (como Java ou C #) ou escrever um pequeno sistema de transformação (macro expansor) que geram código em uma linguagem existente.

Indo até o código de máquina está reinventando muitas rodas ...

Uma boa razão para uma DSL é representar os dados do domínio de maneira sucinta. Isso permite que especialistas de domínio trabalhem com os dados diretamente, em vez de precisarem passar pelos outros. O truque é então ter os programas resultantes em uma forma fácil de processar.

    
por 28.03.2011 / 12:01
fonte
3

De um modo geral, a resposta seria um grande NÃO. Das centenas de línguas disponíveis, geralmente há uma que se adapte ao seu problema.

No entanto, há circunstâncias em que é uma opção racional desenvolver uma nova linguagem: -

  • Quando um de seus concorrentes agora possui uma de suas principais plataformas de desenvolvimento. Estou pensando na confiança atual do Google em Java e seu desenvolvimento de "go" (ajuda se você tiver um autor da linguagem mais bem-sucedida de todos os tempos na folha de pagamento!).
  • Quando você precisa escrever uma tonelada de código para uma nova plataforma e os idiomas existentes são detalhados e propensos a erros - por exemplo, php para desenvolvimento web.
  • Quando você se deparar com problemas de escala e paralelismo que nunca foram encontrados antes, porque ninguém nunca teve tanto hardware para processar tantos dados antes - por exemplo, Scala e (até certo ponto, GO).
por 04.10.2013 / 03:49
fonte
2

Qual linguagem é boa em composição ou em colocar os mesmos componentes juntos de maneiras diferentes.

Se o seu problema de domínio só precisa de você para definir um monte de switches ortogonais, uma linguagem provavelmente não adiciona muito mais de formulários, uma interface gráfica ou uma configuração de texto direto. Arquivo. (Estou assumindo aqui que um arquivo cheio de pares de valores-chave não é o que você quer dizer com "linguagem".)

OTOH, se sua configuração é como uma linguagem real, por exemplo. verbos e substantivos podem ser reunidos em muitas combinações diferentes (e novas) para qualquer grau de complexidade, então uma linguagem se tornará quase inevitável, porque a explosão combinatória de tentar especificar o que você quer por qualquer outro método é maior.

    
por 04.03.2009 / 03:15
fonte
1

Exercícios de aprendizado à parte, é razoável criar sua própria linguagem de programação apenas quando você entende outras linguagens, seu domínio de problema específico e a forma como os idiomas existentes lidam com esse domínio de problema e esse entendimento é suficientemente profundo para que você conheça um novo idioma é uma solução razoável sem a necessidade de fazer a pergunta.

    
por 09.02.2009 / 14:12
fonte
1

A última vez que me propus a fazer isso em um projeto de hobby comecei a especificar como eu queria que a sintaxe aparecesse e percebi que estava reinventando o prólogo. Outras linguagens que podem ser um bom ajuste quando você acha que precisa inventar uma linguagem são lisp, lua, ou algo como Haskell. Basicamente, todas aquelas línguas que você ignorou na faculdade porque você pensou que elas nunca seriam úteis.

    
por 28.03.2011 / 02:59
fonte
1

Um motivo é para fins educacionais, como já foi dito. Mas tem mais. Por exemplo, existem muitos idiomas de pesquisa como Sing# no sistema operacional Singularity e BitC em Coyotos que foram criados porque os idiomas existentes não oferecem os recursos necessários ( por exemplo, verificação em um nível de linguagem).

    
por 28.03.2011 / 10:40
fonte
1

Tom Van Cutsem escreveu recentemente uma resposta para essa pergunta:

link

Resumo do marcador (dessa página):

  • Linguagem como mecanismo de abstração sintática: para reduzir o código "boilerplate" repetitivo que não pode ser abstraído do uso dos mecanismos de abstração integrados de outra linguagem.
  • Linguagem como modelador de pensamento: para induzir uma mudança de paradigma em como se deve estruturar software (mudando o "caminho de menor resistência").
  • Linguagem como um simplificador: para resumir um paradigma existente a apenas suas partes essenciais, geralmente para aumentar a compreensão e a percepção.
  • Linguagem como aplicador da lei: para impor propriedades ou invariantes importantes, possivelmente para facilitar a inferência de propriedades mais úteis dos programas.
por 12.07.2011 / 13:28
fonte
0

Provavelmente nunca.

Lua é a melhor escolha que você pode obter se quiser incorporar o idioma basicamente em qualquer outro idioma.

Idiomas específicos de domínio pequeno estão no momento, e isso faz sentido em alguns aplicativos.

Além disso, as razões são principalmente acadêmicas.

Criar uma linguagem quando não é necessário, é realmente uma coisa ruim para fazer devido à complexidade envolvida no desenvolvimento e manutenção dela. Eu tenho visto muitos projetos que introduzem algum tipo de linguagem de script específica somente para aquele programa, e foi a coisa que estava retardando o desenvolvimento da base por uma quantidade enorme. Bons exemplos são, por exemplo, linguagens de automação como Phantom, AutoHotKey, AutoIt. Essas ferramentas seriam IMO muito melhores se usassem algum idioma bem conhecido como Lua.

    
por 21.04.2009 / 10:51
fonte
0

Sua "edição" parece ser uma questão substancialmente diferente ("quando devo construir uma DSL?", em vez da pergunta original que as pessoas entenderam como "quando devo construir uma nova linguagem de programação de propósito geral"). Parece que as pessoas responderam completamente à pergunta "original", mas há poucas respostas que fornecem critérios específicos para quando usar uma DSL. Então eu proponho uma lista de verificação:

  1. Sua base de usuários é maior do que algumas pessoas, geralmente não técnicas e / ou com acesso restrito ao sistema (por isso, não é razoável esperar que aprendam / usem um idioma de uso geral existente). Se estiver dentro da sua equipe de desenvolvimento ou organização de software, você pode dizer "apenas escrever um script".
  2. Seus usuários precisam usá-lo com bastante frequência, com comportamentos suficientemente variados e variáveis necessários (ou seja, você não pode apenas fornecer uma biblioteca fixa de funções mantida por você)
  3. O comportamento que os usuários podem especificar é muito complicado para especificar como dados (por exemplo, você não pode obtê-lo usando uma tabela de banco de dados ou uma matriz de entrada de usuário ou uma lista de tarefas ou uma coleção de valores-chave. pense com cuidado porque você pode conseguir muita complexidade com estes). Se você puder obter o comportamento usando a entrada de dados ou a configuração em vez de DSL, provavelmente você deve, porque será muito menos trabalho. Algum tipo de condicionalidade, ou composability / encadeamento em conjunto, ou modelagem de algumas abstrações diferentes podem ser sinais de que o comportamento que você precisa é muito complexo para dados simples / configuração
  4. Mas o comportamento ainda é restrito o suficiente para que você possa especificá-lo em uma DSL concisa. Um grande perigo é o 'inchaço da plataforma', e. se os usuários começarem a solicitar "você pode simplesmente adicionar ...?". Se eles precisarem se conectar à Internet, ou ler e escrever no sistema de arquivos, ou abrir e fechar processos - então isso não é mais uma DSL. (Eu vi isso acontecer de verdade ... usuários autorizados a incorporar pequenas chamadas python, crescendo gradualmente para scripts python e, eventualmente, destruindo quaisquer limites / modularidade / desempenho)

Se tudo isso for verdade, então uma DSL pode ser apropriada.

    
por 20.02.2014 / 16:56
fonte
0

Are there types of killer applications, classes of algorithmic problems, etc., where it is better, in the long run, to create my own language?

Depende.

Vamos levar nosso cérebro. Parece ser uma bagunça tão complexa que encontramos fronteiras com QUALQUER linguagem de programação (pelo menos agora). Então, talvez, para realmente virtualizar nosso cérebro, precisamos de outras abordagens e, portanto, outras semânticas e sintaxes.

De um modo geral, ainda existem tópicos complexos que podem levar a outras estratégias que também incluem uma linguagem "melhor" para um determinado cenário.

    
por 20.02.2014 / 17:26
fonte