Linguagens formais são construídas a partir de um alfabeto de signos e um conjunto de regras gramaticais que definem as frases ou arranjos possíveis e válidos. Caso estas frases possam ser mapeadas em algum arranjo real ou conceitual (estado de coisas), a linguagem ganha poder de representação. Isto é, ela pode representar algo como a aritmética, algoritmos, regras financeiras, mapas de rede, estruturas de dados de dados, etc.

Uma boa linguagem formal produz sentenças precisas (sem dubiedade), o que as torna ótima para especificações que podem ser usadas para a construção de algo como um código binário ou uma estrutura de memória.

Existem, por outro lado, linguagens formais interessantes, que definem as frases ou arranjos válidos, mas que não definem de forma precisa o que representam. Exemplo: no UML existe o diagrama de seqüência que define a interação entre objetos, mas que é pouco útil na geração de código por não representar elementos importantes que caracterizam a decisão do envio ou não de uma mensagem. Um diagrama de seqüência é ótimo para a comunicação entre pessoas, mas tem uso restrito na geração automática de código. Ela é formal, mas não é tão precisa quanto necessitaríamos.

E qual é o contrário de uma linguagem formal? Resposta: a linguagem natural.

Por ser cheia de dubiedade e ambivalência, a nossa linguagem do dia a dia permite a expressão de ironias, metáforas, duplo-sentido, etc. É uma linguagem que expressa e cria sentidos, permitindo a poesia, a gíria, assim como o mal-entendido.

Nossa comunicação, como arquitetos, com as áreas de negócio e desenvolvedores é feita predominantemente com o uso de linguagens naturais e linguagens formais imprecisas.

Já tentamos usar linguagens formais genéricas para a especificação de sistemas. São linguagens baseadas em lógica (ver VDM e Z) que exigem um profissional com formação matemática, e, portanto, inúteis na comunicação com usuários finais ou analistas de negócio (e com a maioria de programadores também).

O uso de linguagens de domínio específica (DSLs) é uma segunda tentativa de diminuir a imprecisão a que estamos sujeitos. Tentamos, assim, aliar precisão com o vocabulário do negócio.