Programar é exprimir algo numa qualquer linguagem, escrita ou visual. A única diferença entre uma linguagem de programação e uma linguagem natural é que o seu objectivo é ser executada por uma máquina.
Para interpretar o que está escrito num romance é preciso um enorme contexto comum da nossa sociedade. Para interpretar um programa de computador é preciso interpretar o contexto da linguagem de programação. Este contexto, ao contrário do nosso contexto social, está completa e formalmente definido. É por isso que somos capazes de escrever uma máquina para executar um programa, mas ainda não conseguimos criar uma máquina que executa qualquer ordem escrita em linguagem natural.
Interpretar uma linguagem é descobrir o isomorfismo entre os símbolos da linguagem e os conceitos que nos vão dentro da cabeça. Por exemplo, para perceber fórmulas matemáticas temos de perceber que os '+' querem dizer somar dois números, os '-' subtrair, etc. Podemos a qualquer momento trocar o significado dos símbolos uns pelos outros ou inventar novos, continuando a ter uma linguagem para exprimir fórmulas matemáticas equivalente à anterior.
Para interpretar arte ou literatura também temos de começar por encontrar um isomorfismo entre os símbolos que estão no quadro ou as expressões do texto com os conceitos que nos vão na cabeça. No caso da arte abstracta será talvez perceber que este isomorfismo não existe e que o conteúdo, a existir, é a própria forma.
No caso da programação o isomorfismo não tem de ser descoberto, está definido. Pelo menos ao nível básico da gramática da linguagem. Isto quer dizer que conseguimos criar uma máquina para executar o programa mas isso não quer dizer que consigamos criar uma máquina para o compreender. Assim sendo, programar é tão livremente expressivo como qualquer outra linguagem. São todas igualmente difíceis de compreender, a programação só é mais fácil de executar automaticamente.
Já disse antes que a programação é uma arte. O que ainda não disse, e é bastante mais arrojado, é que a programação é a forma de arte mais expressiva de sempre. Digo isto num sentido potencial. O que já foi expresso pode ser mais ou menos do que as outras artes. Mas o que pode ser expresso é maior.
Mas o que é que podemos exprimir com um programa que não podemos com um texto? Algo não só interpretável mas também executável. Isto não aumenta o poder expressivo da linguagem em si mas antes do resultado. Como exemplo vejamos estas duas definições da sequência de Fibonacci:
Em linguagem natural: Os dois primeiros números da sequência de Fibonacci são 1. Qualquer um dos seguintes obtém-se somando os dois números anteriores da sequência.
Em linguagem de programação (em Ruby):
def fibonacci(num) if num < 2 return 1 else return fibonacci(num-1)+fibonacci(num-2) end end
Ambas estas definições explicam o que é a sequência de Fibonacci. Enquanto que a primeira necessita de compreensão para se conseguir calcular o terceiro número da sequência, a segunda só precisa de execução. Depois de definido isto podemos dizer à máquina para calcular o terceiro número e obtê-lo, sem que para isso tenhamos de compreender o programa. Nem nós nem a máquina, que não compreende o programa, só segue um conjunto de regras mecânicas para o executar.
Na definição em linguagem natural a sequência é um conceito abstracto. Passa a existir quando percebemos a sua regra de formação. Mas só existe como algo abstracto na nossa cabeça. O programa transforma-a em algo concreto. Podemos exprimir a sequência concreta, já que podemos escrever o programa que calcula e imprime numa folha os infinitos números da sequência. Programa esse que funcionará para sempre se o executarmos.
Neste caso o conceito abstracto será mais interessante que a sequência concreta, que é infinita, mas o programa exprime as duas coisas. Se o interpretarmos nós chegamos ao conceito abstracto, se o executarmos produzimos a sequência concreta. Por isso a expressividade não está na interpretação da linguagem mas no facto que uma pode ser executada e a outra não.
O que pode tornar esta diferença de expressividade fantástica é se se provar que a própria inteligência pode ser programada. Nesse caso, um programa poderá exprimir algo inteligente, não como comunicação mas como concretização. Se aprendermos a programar inteligência artificial podemos exprimir conceitos inteligentes não como uma comunicação entre duas entidades inteligentes (um quadro, um romance) mas como um objecto por si só inteligente.

Data: 2006-04-12 23:34:01
Texto:
-- Quem perceber a regra de formação em linguagem natural também pode ad eternum calcular os termos da sucessão!!! A linguagem de programação é resultado da interpretação expressiva de alguém que torna praticável a execução de uma ideia. Mas se em vez de if's e return's esse alguém explicar a forma de execução em linguagem natural (como no teu exemplo) o resultado é o mesmo. A vantagem parece-me ser exactamente a facilidade de comunicação, pois é sintética e objectiva, eliminando possíveis erros de interpretação.
PS: Se calhar é defeito profissional... mas, para mim, linguagem de programação é linguagem matemática disfarçada. No teu exemplo da sucessão de Fibonacci, em linguagem matemática seria:
a(0)=a(1)=1
a(n)=a(n-1)+a(n-2), para todo o n>1 natural
tornando sintética e objectiva a comunicação entre pessoas que a conheçam. A "tua" linguagem de programação é uma nova roupagem desta, de forma a poder ser executada por máquinas!
Data: 2006-04-13 00:04:14
Texto:
Pois pode, mas tem de ser uma pessoa para perceber o texto. No outro caso basta uma máquina.
"A linguagem de programação é resultado da interpretação expressiva de alguém que torna praticável a execução de uma ideia. Mas se em vez de if's e return's esse alguém explicar a forma de execução em linguagem natural (como no teu exemplo) o resultado é o mesmo."
Não é porque um pode ser executado por uma máquina e outro não.
"A vantagem parece-me ser exactamente a facilidade de comunicação, pois é sintética e objectiva, eliminando possíveis erros de interpretação."
A vantagem é que não precisa sequer de interpretação, basta execução.
"Se calhar é defeito profissional... mas, para mim, linguagem de programação é linguagem matemática disfarçada."
Não é. A linguagem matemática tal como a natural tem de ser interpretada por um humano. Não é suficientemente rigorosa para ser executada automaticamente. É rigorosa nos conceitos mas não na notação. E ao contrário do que se julga programar não é matemática. A série de Fibonacci é programar algo da matemática, mas podia ter escrito um programa para calcular raízes comuns de palavras e já não tinha nada a ver.
"A "tua" linguagem de programação é uma nova roupagem desta, de forma a poder ser executada por máquinas!"
Ah pois é. E o ponto é mesmo esse, que temos uma linguagem que serve para exprimir o mesmo que as outras com a vantagem que pode ser executada directamente por uma máquina. E é essa possibilidade de execução que a torna mais expressiva.
Data: 2006-04-13 10:11:45
Texto:
-- Não precisa de interpretação porque já está interpretada, porque a máquina que a vai executar já sabe o significado dos termos. Que são obrigatoriamente em número finito, certo? É o tal isomorfismo que não tem de ser descoberto, que já está definido ao nível básico da gramática da linguagem - que é, então, a única coisa que a programação tem: gramática / sintaxe; não tem semântica, é isso?
- "[A linguagem matemática] É rigorosa nos conceitos mas não na notação."
-- Aqui discordamos em absoluto: se há matemática que não é rigorosa na notação é "matemática mal feita" ou pelo menos "matemática preguiçosa" que pode obviamente ser corrigida! Quanto aos conceitos, aí é que as coisas podem correr mal. A definição dos conceitos é habitualmente tida como recursiva (à custa de outros já definidos), mas o processo, por muito que retroceda, tem de começar em algum lado... É esse começo que é problemático! Outro problema é a extensão dessa "lista" de conceitos, que é infinita, "bastante infinita"! O que se passa em programação é que o começo será ditado axiomaticamente - é?... - e a lista de conceitos a definir é finita (ou pelo menos "infinitamente bem comportada") - é, pois é?...
- "podia ter escrito um programa para calcular raízes comuns de palavras e já não tinha nada a ver [com linguagem matemática]"
-- Só para eu tirar as teimas ;), ora escreve lá uma coisa dessas - simples, bem simples, para eu entender, claro!
- "temos uma linguagem que serve para exprimir o mesmo que as outras com a vantagem que pode ser executada directamente por uma máquina."
-- A linguagem de programação exprime o mesmo que as outras, desde que o universo de conceitos das outras se reduza ao tal do isomorfismo pré-definido. Portanto, a linguagem de programação é a mais expressiva de sempre apenas em potência, na expectativa de que o tal do isomorfismo venha um dia a cobrir o real universo dos conceitos. Mas duvido isso aconteça, sem a resolução prévia de todos os problemas matemáticos conceptuais!
[NOTA: Seleccionar frases do post ou de comentários anteriores é deveras complicado! Fica tudo seleccionado desde o início... Dá para contornar a situação, ou tem mesmo de ser assim?]
Data: 2006-04-21 23:48:45
Texto:
A máquina não "sabe" nada. Executa um conjunto de regras mecânicas e sai um resultado. Os termos são finitos, mas os da linguagem natural também, só são mais.
"É o tal isomorfismo que não tem de ser descoberto, que já está definido ao nível básico da gramática da linguagem - que é, então, a única coisa que a programação tem: gramática / sintaxe; não tem semântica, é isso?"
Concerteza que tem semântica. As regras da máquina implementam a semântica da linguagem. Uma linguagem natural não tem nada a mais que uma de programação. É ao contrário, as linguagens naturais é que têm uma propriedade a menos, a de poderem ser executadas por uma máquina.
"Aqui discordamos em absoluto: se há matemática que não é rigorosa na notação é "matemática mal feita" ou pelo menos "matemática preguiçosa" que pode obviamente ser corrigida!"
A matemática é feita em cima de uma linguagem natural. É mais rigorosa do que um romance, mas não é suficientemente rigorosa para ser automaticamente executada. Se fosse, verificar que uma prova estava correcta era um processo automático. A matemática podia ser rigorosa e especificada em lógica proposicional, mas como isso é muito tedioso, ninguém o faz.
"Quanto aos conceitos, aí é que as coisas podem correr mal. A definição dos conceitos é habitualmente tida como recursiva (à custa de outros já definidos), mas o processo, por muito que retroceda, tem de começar em algum lado... É esse começo que é problemático! Outro problema é a extensão dessa "lista" de conceitos, que é infinita, "bastante infinita"! O que se passa em programação é que o começo será ditado axiomaticamente - é?... - e a lista de conceitos a definir é finita (ou pelo menos "infinitamente bem comportada") - é, pois é?..."
Não. :) Os conceitos da matemática e os das linguagens de programação são ambos finitos, e são ambos definidos axiomaticamente. A lógica proposicional em que se baseia a matemática é baseada em algumas regras que são são provadas, aceitam-se por serem óbvias.
"Só para eu tirar as teimas ;), ora escreve lá uma coisa dessas - simples, bem simples, para eu entender, claro!"
Por exemplo:
def tokenize(string)
i = 0
if not string
return []
else
while string.length > 0
if i > string.length
return [string]
elsif string[i] == ' '[0]
return [string[0..i-1]] + tokenize(string[i+1..-1])
else
i += 1
end
end
end
end
Isto divide uma frase em palavras.
"A linguagem de programação exprime o mesmo que as outras, desde que o universo de conceitos das outras se reduza ao tal do isomorfismo pré-definido."
Não necessariamente. As linguagens de programação só definem gramáticas e vocabulários básicos. Podes definir o que quiseres com eles. Por isso tudo o que consigas dizer em português consegues dizer com uma linguagem de programação.
"Portanto, a linguagem de programação é a mais expressiva de sempre apenas em potência, na expectativa de que o tal do isomorfismo venha um dia a cobrir o real universo dos conceitos. Mas duvido isso aconteça, sem a resolução prévia de todos os problemas matemáticos conceptuais!"
Mas que me interessam os problemas matemáticos conceptuais se eu quiser falar da paz, da beleza ou do amor? É que posso fazer tudo isso com qualquer linguagem.
A linguagem de programação cobre tanto o conceito de amor como o português. Não há nada na linguagem que diga o que alguma coisa é. Nós é que usamos a linguagem para definir as coisas. Os dicionários são isso mesmo. Grandes descrições de conceitos.
[NOTA: Seleccionar frases do post ou de comentários anteriores é deveras complicado! Fica tudo seleccionado desde o início... Dá para contornar a situação, ou tem mesmo de ser assim?]
Basta ler a grande nota a vermelho que aparece no topo da página e que avisa que o Internet Explorer é uma porcaria e que sugere o Firefox. :)
Data: 2006-04-27 01:01:59
Texto:
Quanto ao resto:
- "Se [a linguagem matemática] fosse [rigorosa], verificar que uma prova estava correcta era um processo automático. A matemática podia ser rigorosa e especificada em lógica proposicional, mas como isso é muito tedioso, ninguém o faz."
-- Mas verificar se uma prova está correcta só não é automático semanticamente - pois depois de interpretadas pode haver proposições que não se sabe se são verdadeiras ou falsas. A nível sitáctico (depois de decidas as regras a seguir) as coisas até vão funcionando bem. Pode ser, realmente, bastante tedioso mas daí a dizer que ninguém o faz, não é bem assim! Isto é objecto da Lógica, e não se pretende, de modo algum, que seja uma ferramenta de trabalho do dia-a-dia matemático, mas é algo que, a bem dos fundamentos, tem de ser feito - e vai sendo!
- "A lógica proposicional em que se baseia a matemática é baseada em algumas regras que são são provadas, aceitam-se por serem óbvias."
-- Os problemas surgem quando essas regras, ainda que pareçam óbvias, não são unanimemente aceites. Ou seja, os fundamentos podem ser abalados. Mas esses abalos têm por base o questionar daquilo que havia sido ditado axiomaticamente e não aquilo que se construiu com base na axiomática. Portanto, a partir do momento em que nos fixamos numa axiomática consistente, não me parece que a linguagem de programação seja assim tão diferente da matemática.
-- Ora vamos lá tentar dividir uma frase em palavras:
Primeiro associa-se a cada frase uma sequência s de caracteres. Posto isto, as palavras da frase associada à sequência s podem ser dadas pelas sequências p(1), p(2), ..., p(m), com m=#{s(i): s(i)=" "} + 1:
p(1)={s(i) de s: para todo j < = i s(j)!=" "}
e, para todo 1 < n < = m,
p(n)={s(i) de s \ {s(1),...,s(max{k:s(k) pertence a p(n-1)} +1)}: para todo j < = i s(j)!=" "}
Só não sei reconhecer o que é uma frase!... Mas se eu assumir, como os strings, que é aquilo que estiver entre aspas - desde que seja sempre assim escrita -, a coisa fica resolvida. Sim?...
- "A linguagem de programação cobre tanto o conceito de amor como o português. Não há nada na linguagem que diga o que alguma coisa é. Nós é que usamos a linguagem para definir as coisas. Os dicionários são isso mesmo. Grandes descrições de conceitos."
-- A linguagem exprime conceitos, não os define! Os conceitos existem, são ideias, abstracções, a linguagem procura exprimi-los. Assim, pode haver, para diferentes conceitos, diferentes linguagens onde eles podem se expressos de melhor forma. E, sinceramente, não me parece que a linguagem de programação seja a ideal para expressar o conceito de amor - isto, claro, para além de não estar ver como o fazer...
___________________________
NOTA: Tinha-me esquecido disso... Como de há uns tempos para cá já dá para fazer mais coisas por aqui com o IE fui-me esquecendo dessa tua luta incansável... =)
Data: 2006-05-19 23:35:13
Texto:
"Mas verificar se uma prova está correcta só não é automático semanticamente - pois depois de interpretadas pode haver proposições que não se sabe se são verdadeiras ou falsas. A nível sitáctico (depois de decidas as regras a seguir) as coisas até vão funcionando bem. Pode ser, realmente, bastante tedioso mas daí a dizer que ninguém o faz, não é bem assim! Isto é objecto da Lógica, e não se pretende, de modo algum, que seja uma ferramenta de trabalho do dia-a-dia matemático, mas é algo que, a bem dos fundamentos, tem de ser feito - e vai sendo! "
Não digo que não são verificadas. Só que têm passos que não são verificáveis automaticamente.
"Os problemas surgem quando essas regras, ainda que pareçam óbvias, não são unanimemente aceites. Ou seja, os fundamentos podem ser abalados. Mas esses abalos têm por base o questionar daquilo que havia sido ditado axiomaticamente e não aquilo que se construiu com base na axiomática. Portanto, a partir do momento em que nos fixamos numa axiomática consistente, não me parece que a linguagem de programação seja assim tão diferente da matemática. "
É porque é uma linguagem executável. É esse o grande e único ponto.
"Só não sei reconhecer o que é uma frase!... Mas se eu assumir, como os strings, que é aquilo que estiver entre aspas - desde que seja sempre assim escrita -, a coisa fica resolvida. Sim?..."
Podes descrever qualquer programa de computador como regras matemáticas, a questão é que o resultado não tem as mesmas propriedades, porque não é algo executável. Com este exemplo só estava a mostrar que a programação funciona sobre um monte de coisas que não têm nada a ver com a matemática. Isso não quer dizer que não se consiga especificar o que um programa faz com regras matemáticas.
"A linguagem exprime conceitos, não os define! Os conceitos existem, são ideias, abstracções, a linguagem procura exprimi-los. Assim, pode haver, para diferentes conceitos, diferentes linguagens onde eles podem se expressos de melhor forma. E, sinceramente, não me parece que a linguagem de programação seja a ideal para expressar o conceito de amor - isto, claro, para além de não estar ver como o fazer... "
Mas é exactamente isso que estou a dizer. As linguagens em si servem para exprimir os conceitos. Quando disse definir queria dizer que ao exprimirmos um conceito e lhe darmos um nome passamos a ter uma expressão do conceito na linguagem a que chamei uma definição. E não, não vou falar de amor com um programa. Era só um exemplo suficientemente exótico para se notar a diferença entre o que é linguagem e o que é construído sobre a linguagem.
"NOTA: Tinha-me esquecido disso... Como de há uns tempos para cá já dá para fazer mais coisas por aqui com o IE fui-me esquecendo dessa tua luta incansável... =)"
É daquelas coisas que não se percebem. Como é que uma solução em tudo melhor demora tanto tempo a ganhar. Por isso se queres ver bem o site sugiro o firefox ou quase qualquer outro browser que não o IE.
Data: 2006-05-28 19:07:34
Texto:
Já percebi que "[a linguagem de programação] é uma linguagem executável. É esse o grande e único ponto." - até porque tens dito isso em todos os comentários (e mais do que uma vez)! Não estou a pôr isso em causa. O que eu digo é que as tais regras matemáticas fazem mais do que "descrever qualquer programa de computador", mais do que "especificar o que um programa faz". Eu digo que estão na base da linguagem do programa, não digo que são a mesma coisa, mas a estrutura do programa tem por trás uma estrutura matemática. Se calhar tenho a visão toldada pelo tal "defeito profissional" que me deu uma apresentação e utilização da programação em contextos demasiado específicos. Percebo que "a programação funciona sobre um monte de coisas que não têm nada a ver com a matemática", mas também é preciso perceber que a Matemática não são só números e que também funciona sobre um monte de coisas! - é um modo de pensar, um modo de estruturar o raciocínio!!!
________________________________________
Já sei que o firefox é que é bom e que o IE não presta - aliás essa é a opinião geral de todos os que estão ligados à computação. (E, deixa-me adivinhar, o Linux é que é fixe e o Windows que se lixe!...) "Demora tanto tempo a ganhar" porque as pessoas estão habituadas! E enquanto o habitual for dando para os gastos, é muito difícil mudar.
Data: 2008-05-15 02:12:36
Texto:
Data: 2008-07-18 19:53:13
Texto:
Data: 2008-09-13 03:16:24
Texto: