DEV Community

Cover image for GPL vs DSL: entendendo a diferença entre linguagens de propósito geral e linguagens específicas
Felipe Cezar
Felipe Cezar

Posted on

GPL vs DSL: entendendo a diferença entre linguagens de propósito geral e linguagens específicas

Quando a gente começa a estudar programação, é comum colocar tudo no mesmo balaio e chamar qualquer coisa de "linguagem".

Python? Linguagem.

SQL? Linguagem.

HTML? Linguagem.

CSS? Linguagem.

Regex? Linguagem.

Só que existe uma diferença importante entre esses tipos de linguagem.

Algumas foram criadas para resolver praticamente qualquer tipo de problema. Outras foram criadas para resolver um problema muito específico dentro de um determinado contexto.

É aí que entram dois conceitos bem importantes:

  • GPL: General-Purpose Language
  • DSL: Domain-Specific Language

Observação rápida: aqui, GPL significa General-Purpose Language, não a licença GNU GPL.


1. GPL: General-Purpose Language

Uma GPL, ou linguagem de propósito geral, é uma linguagem criada para construir vários tipos de software diferentes.

Ela não está presa a um único domínio.

Com uma linguagem como Python, por exemplo, você pode fazer:

  • APIs web;
  • automações;
  • análise de dados;
  • inteligência artificial;
  • scripts;
  • jogos;
  • aplicações desktop;
  • ferramentas de linha de comando;
  • integração com bancos de dados.

Python é uma linguagem de propósito geral.

Outros exemplos seriam:

  • Java;
  • JavaScript;
  • C#;
  • Go;
  • C++;
  • Ruby;
  • PHP;
  • Kotlin;
  • Rust.

Essas linguagens geralmente possuem recursos completos de programação, como:

  • variáveis;
  • funções;
  • classes;
  • condicionais;
  • laços de repetição;
  • estruturas de dados;
  • tratamento de erros;
  • módulos;
  • bibliotecas.

Por exemplo, em Python:

def calcular_media(notas):
    total = 0

    for nota in notas:
        total += nota

    return total / len(notas)


notas = [8, 9, 7, 10]
media = calcular_media(notas)

if media >= 7:
    print("Aprovado")
else:
    print("Reprovado")
Enter fullscreen mode Exit fullscreen mode

Aqui a linguagem permite criar lógica, controlar fluxo, usar função, usar for, usar if, manipular listas e assim por diante.

Esse é o tipo de liberdade que uma linguagem de propósito geral oferece.


2. DSL: Domain-Specific Language

Uma DSL, ou linguagem de domínio específico, é uma linguagem criada para resolver um problema dentro de um contexto específico.

Ela não tenta fazer tudo.

Pelo contrário: ela tenta fazer uma coisa muito bem.

Exemplos comuns de DSLs:

  • SQL, para consultar e manipular dados em bancos relacionais;
  • HTML, para estruturar páginas web;
  • CSS, para estilizar páginas web;
  • Regex, para trabalhar com padrões de texto;
  • YAML, para configuração;
  • Terraform HCL, para infraestrutura como código;
  • GraphQL, para consulta de dados em APIs;
  • Dockerfile, para definir imagens Docker.

A ideia de uma DSL é ser mais direta e expressiva dentro de um domínio.

Por exemplo, SQL foi criado para lidar com banco de dados:

SELECT nome, email
FROM usuarios
WHERE ativo = true
ORDER BY nome;
Enter fullscreen mode Exit fullscreen mode

Esse código não parece Python, Java ou JavaScript.

Ele não está tentando criar uma aplicação completa. Ele está dizendo, de forma muito direta:

"Busque o nome e o email dos usuários ativos e ordene pelo nome."

SQL é ótimo para esse domínio: consulta de dados.

Mas você não usaria SQL para criar uma API web inteira, treinar um modelo de IA ou desenvolver um jogo.


3. Comparando GPL e DSL

A diferença central é esta:

Tipo Significado Objetivo Exemplos
GPL General-Purpose Language Resolver vários tipos de problema Python, Java, JavaScript, C#, Go
DSL Domain-Specific Language Resolver um problema específico SQL, HTML, CSS, Regex, YAML

Uma GPL é como uma caixa de ferramentas completa.

Uma DSL é como uma ferramenta especializada.

Com Python, você consegue construir a casa inteira.

Com SQL, você resolve muito bem a parte relacionada aos dados.

Com CSS, você resolve muito bem a parte visual.

Com Regex, você resolve muito bem padrões em texto.

Cada uma tem seu papel.


4. Exemplo usando desenvolvimento web

Vamos imaginar uma aplicação web simples.

Você pode usar Python como linguagem principal:

from fastapi import FastAPI

app = FastAPI()

@app.get("/usuarios")
def listar_usuarios():
    return [
        {"id": 1, "nome": "Ana"},
        {"id": 2, "nome": "Carlos"}
    ]
Enter fullscreen mode Exit fullscreen mode

Nesse caso:

  • Python é a linguagem de propósito geral;
  • FastAPI é o framework web;
  • Uvicorn pode ser o servidor que executa a aplicação.

Agora imagine que essa aplicação precisa consultar um banco de dados.

A consulta poderia ser escrita em SQL:

SELECT id, nome
FROM usuarios
WHERE ativo = true;
Enter fullscreen mode Exit fullscreen mode

Aqui temos duas linguagens trabalhando juntas:

  • Python, como GPL;
  • SQL, como DSL.

Python organiza a lógica da aplicação.

SQL conversa com o banco de dados.

Cada um faz sua parte.


5. DSLs geralmente são mais limitadas?

Sim, mas isso não é necessariamente um problema.

Na verdade, essa limitação é parte da força delas.

Uma DSL não precisa ter todos os recursos de uma linguagem completa. Ela precisa ser clara, direta e eficiente dentro do seu domínio.

CSS, por exemplo, não foi criado para fazer lógica de negócio. Ele foi criado para estilizar páginas:

.card {
  background-color: #111827;
  color: white;
  padding: 24px;
  border-radius: 12px;
}
Enter fullscreen mode Exit fullscreen mode

Você não usa CSS para criar uma API.

Mas para definir aparência visual, ele é extremamente expressivo.

A mesma coisa vale para Regex:

^[\w.-]+@[\w.-]+\.\w{2,}$
Enter fullscreen mode Exit fullscreen mode

Esse padrão pode ser usado para validar algo parecido com um email.

Regex não serve para criar um sistema completo, mas é muito poderoso para trabalhar com padrões de texto.


6. Algumas DSLs podem ter lógica?

Sim.

É importante tomar cuidado para não simplificar demais.

Algumas DSLs possuem condicionais, funções, variáveis ou algum nível de lógica.

SQL, por exemplo, pode ter CASE, funções, subqueries, procedures e outros recursos dependendo do banco.

SELECT 
    nome,
    CASE 
        WHEN idade >= 18 THEN 'Maior de idade'
        ELSE 'Menor de idade'
    END AS status_idade
FROM usuarios;
Enter fullscreen mode Exit fullscreen mode

Mesmo assim, SQL continua sendo uma linguagem voltada principalmente para o domínio de dados.

Ou seja, a pergunta principal não é:

"Essa linguagem tem if ou for?"

A pergunta melhor seria:

"Essa linguagem foi criada para resolver problemas gerais ou problemas de um domínio específico?"


7. Framework não é linguagem

Outro ponto importante: framework não é linguagem.

Python é uma linguagem.

FastAPI é um framework.

Java é uma linguagem.

Spring Boot é um framework.

JavaScript é uma linguagem.

Express é um framework.

Por exemplo:

Python + FastAPI
Java + Spring Boot
JavaScript + Express
Enter fullscreen mode Exit fullscreen mode

A linguagem é a base.

O framework é uma estrutura construída em cima da linguagem para facilitar um tipo de desenvolvimento.

No caso de aplicações web, o framework ajuda a lidar com rotas, requisições HTTP, respostas, middlewares, autenticação e outras partes comuns.


8. Servidor também não é linguagem

Outro ponto que gera confusão: servidor também não é linguagem.

Uvicorn não é uma linguagem.

Tomcat não é uma linguagem.

Gunicorn não é uma linguagem.

Eles são servidores usados para executar ou servir aplicações.

Exemplo no mundo Python:

Python → linguagem
FastAPI → framework
Uvicorn → servidor ASGI
Enter fullscreen mode Exit fullscreen mode

Exemplo no mundo Java:

Java → linguagem
Spring Boot → framework
Tomcat → servidor embutido/servlet container
Enter fullscreen mode Exit fullscreen mode

Então, quando você acessa:

http://localhost:8000
Enter fullscreen mode Exit fullscreen mode

Você não está acessando "o Python" diretamente.

Você está acessando um servidor rodando localmente, que por sua vez está executando sua aplicação Python.


9. Resumo final

A diferença entre GPL e DSL é uma daquelas coisas simples, mas que melhora muito a forma como a gente entende tecnologia.

Uma GPL é uma linguagem de propósito geral.

Ela serve para construir vários tipos de software.

Exemplos:

  • Python;
  • Java;
  • JavaScript;
  • C#;
  • Go.

Uma DSL é uma linguagem de domínio específico.

Ela serve para resolver um problema específico muito bem.

Exemplos:

  • SQL;
  • HTML;
  • CSS;
  • Regex;
  • YAML;
  • Dockerfile;
  • GraphQL.

No desenvolvimento real, a gente normalmente usa várias dessas linguagens juntas.

Uma API pode ser escrita em Python, consultar dados com SQL, retornar HTML, aplicar CSS e usar YAML para configuração.

Cada tecnologia entra em uma camada diferente do sistema.

E entender essa diferença ajuda a organizar melhor o pensamento:

Linguagem de propósito geral → constrói a aplicação
Framework → organiza o desenvolvimento
Servidor → executa/serve a aplicação
DSL → resolve tarefas específicas dentro do sistema
Enter fullscreen mode Exit fullscreen mode

No fim, não é uma competição entre GPL e DSL.

É mais como uma caixa de ferramentas.

Algumas ferramentas fazem quase tudo.

Outras fazem uma coisa específica muito bem.

E um bom desenvolvedor aprende quando usar cada uma.

Top comments (0)