O que é computação?
No século XIX, nossa sociedade mudou fundamentalmente a maneira como produzia bens materiais. Enquanto a produção dependia anteriormente do trabalho humano e animal, a máquina a vapor permitia que grande parte desse trabalho fosse transferido para máquinas. Isso tornou a fabricação de muitos bens e serviços mais eficientes e, portanto, mais baratos. Ela disponibilizou outros tipos de produtos que, de outro modo, seriam impossíveis de fabricar. Ao mesmo tempo, causou um deslocamento econômico generalizado, colocando muitos comerciantes qualificados fora do trabalho e obrigando grande parte da população a deixar suas comunidades rurais para as cidades, mudando radicalmente o próprio ambiente em que viviam. A cultura do consumo, a televisão, as empresas e os automóvel, não teria sido possível, ou pelo menos tão influente, sem essa automação da produção, mais conhecida como revolução industrial.
Agora ouvimos que estamos no meio de uma "revolução da informação". Como a revolução industrial, envolve a automação –a transferência do trabalho humano para as máquinas. No entanto, essa revolução não envolve trabalho físico, mas trabalho intelectual. Embora não possamos conhecer as consequências finais dessas mudanças, a tecnologia da informação tem desempenhado um papel cada vez mais central em nossa sociedade nas últimas duas décadas. Na década de 1950, se você e seus amigos quisessem ir ao cinema, você não teria começado a caminhar até a biblioteca. Mas hoje você não pensaria duas vezes antes de verificar a internet para ver comentários e exibir horários. Da mesma forma, as pessoas comuns não publicaram seus diários na década de 1950, mas hoje as pessoas escrevem em blogs sobre tudo, desde a política internacional até os brinquedos favoritos de seus animais de estimação.
No entanto, apesar de toda a importância dessas tecnologias, as pessoas ainda tendem a pensar em computação como sendo sobre números, e ciência da computação como sendo sobre o culto esotérico de siglas e pontuação.
A computação não está vinculada a números, acrônimos, pontuação ou sintaxe. Mas uma das coisas que torna isso tão interessante é que, com toda a honestidade, não está totalmente claro o que a computação realmente é. Todos nós geralmente concordamos que quando alguém controla o seu talão de cheques, eles estão fazendo cálculos. Mas muitas pessoas argumentam que o cérebro é fundamentalmente um computador. Se isso é verdade, significa que (todo) pensamento é computação? Ou que toda computação é pensada? Sabemos que os ambientes “virtuais” em jogos de computador são apenas simulações computacionais. Mas também se argumentou que o universo real é efetivamente um computador, que a física quântica é realmente sobre informação e que matéria e energia são na verdade apenas abstrações construídas a partir de informações. Mas se o universo é "apenas" computação, então o que não é computação? E o que significa dizer que algo é ou não é computação?
A computação é uma ideia em fluxo; nossa cultura está em processo de renegociar o que significa pelo termo. Há cem anos, quase todos pensavam em computação como uma operação mental envolvendo números. E sendo uma operação mental, isso só poderia ser feito por pessoas. Hoje, a esmagadora maioria do que consideramos ser computação é feita por máquinas. Mas, ao mesmo tempo, ainda associamos isso de alguma forma ao pensamento. Na cultura ocidental, tendemos a tomar nossa capacidade de pensar como a distinção central entre nós e outros animais. Além disso, vemos nossos pensamentos e sentimentos específicos como sendo um dos principais constituintes de nossa identidade pessoal. Assim, o pensamento é constitutivo da nossa humanidade coletiva e das nossas identidades individuais.
Mudar nossas ideias sobre computação muda nossas ideias sobre o pensamento e, assim, nossas ideias sobre nós mesmos. Ele reverbera em nossa cultura, produzindo excitação, ansiedade e inúmeros filmes em quadrinhos sobre realidade virtual.
E, no entanto, para todo o nosso fascínio coletivo pela computação, o que queremos dizer com o termo ainda é um tanto misterioso.
Perguntas e respostas
Eu disse que computação não é fundamentalmente sobre números. No entanto, vamos começar pensando em aritmética, pois todos podemos concordar que é um exemplo de computação. Suponha que você pergunte a alguém:
"Quanto é sete mais três?"
Se eles respondem "dez", então eles apenas realizaram uma computação. Assim, podemos provisoriamente pensar em computação como uma espécie de pergunta-resposta. No caso de adição, a questão sempre envolve um par de números e a resposta é sempre outro número. Para
qualquer questão de adição específica, existe um número correspondente,
determinado pelo par de números, que é a resposta desejada.
Agora
suponha que você pergunte a eles "o que é um milhão, setecentos e
oitenta e dois mil, seiscentos e setenta e oito mais três milhões,
duzentos e noventa e dois mil, setecentos e quatro?" A menos que sejam
especialmente bons em aritmética mental , eles não
serão capazes de manter todos os números em suas cabeças e então eles
terão que tirar lápis e papel, pedir para você repetir a pergunta,
anotá-la, fazer a adição no papel e ler a resposta.
Mas agora a aritmética não é mais apenas uma operação mental. É também uma operação física: envolve manipulação e mudança de objetos físicos (lápis e papel). Estamos acostumados a pensar na aritmética que fazemos como sendo uma coisa "mental" que ocorre "em" nossas cabeças. Mas, neste caso, está espalhada entre a cabeça, as mãos, o lápis e o papel de uma pessoa. Outra mudança do exemplo dos sete e três é que, enquanto apresentamos os números à pessoa como um conjunto de sons em inglês falado, eles então os apresentaram novamente como símbolos no papel, presumivelmente em algarismos arábicos.
O que é interessante aqui é que nenhuma dessas diferenças é importante. Enquanto a pessoa tiver a resposta certa em qualquer sistema ou sistema representacional que esteja usando, consideramos que ela realizou com sucesso a aritmética. Dito de outra forma, não importa qual caminho seguiremos no diagrama abaixo:
No caso de questões adicionais, as únicas partes relevantes da questão são os números a serem adicionados. Para uma máquina de calcular, a parte "o que é a soma" de uma questão de adição é irrelevante, porque esse é o único tipo de pergunta que ela pode responder. Então, vamos dispensar as partes irrelevantes e apenas dizer que a questão consiste nos bits relevantes, neste caso, o par de números a serem adicionados. Da mesma forma, destilaremos a resposta para apenas um número.
Então, enquanto nós ainda não sabemos o que é computação abstrata, podemos ao menos dizer algo sobre o que entendemos por um problema computacional. É um grupo de perguntas relacionadas, cada uma com uma resposta desejada correspondente. Chamaremos as informações na pergunta específica de que o valor de entrada e o desejado atendem ao valor de saída. Para qualquer entrada, existe uma saída desejada correspondente. As noções de entrada e saída são os conceitos mais básicos de computação: a computação é –no momento– o processo de derivar a saída desejada de uma dada entrada(s).
Se você fez os cursos de matemática certos, pode perceber que o que estamos chamando de "problema computacional" é o mesmo que os matemáticos chamam de função. Uma função é apenas uma especificação de valores de saída para qualquer dado (s) de entrada. Seno e cosseno são funções; eles especificam valores de saída (números) para cada número de entrada possível. A adição também é uma função, mas de duas entradas em vez de uma. E operações mais esotéricas na matemática, como a derivada, também podem ser pensadas como funções, embora sejam funções cujas entradas são, elas próprias, outras funções. Mas as funções não precisam ser sobre números. Por exemplo, um MP3 player calcula uma função cuja entrada é uma música comprimida e cuja saída é uma forma de onda de áudio.
Um procedimento (também conhecido como algoritmo, programa, rotina ou sub-rotina) é um método específico para determinar um valor de saída de um conjunto de valores de entrada. Assumindo que o procedimento sempre produza a mesma saída para um determinado conjunto de entradas (por exemplo, não envolve dados rolantes ou outras operações não determinísticas), então “age como” uma função, pois tem uma correspondência estrita entre entradas e saídas. . A diferença entre procedimentos e funções é que as funções apenas especificam quais são suas saídas, enquanto um procedimento especifica como calculá-las. Normalmente, existem muitos procedimentos diferentes para calcular uma determinada função, mas, como veremos, há algumas funções que não podemos computar. Podemos pensar provisoriamente na Ciência da Computação como o estudo do conhecimento procedimental: como descrever procedimentos, construí-los e comparar procedimentos concorrentes para computar a mesma função. Estamos assumindo aqui que a única parte importante do comportamento de um procedimento é sua saída. Vamos chamar isso de modelo funcional de computação: procedimentos são maneiras de computar funções e, portanto, dois procedimentos são comportamentalmente equivalentes se e somente se computarem a mesma função (embora possam diferir nos recursos de que necessitam, como duração ou quantidade de papel de rascunho). Esta é uma visão limitada da computação, mas cobre uma quantidade surpreendente de terreno. Lembre-se de que as entradas e saídas de nossas funções não precisam ser números. Eles podem perfeitamente ser coisas como arquivos MP3 ou imagens de uma web cam.
A maioria das pessoas não é especialmente boa em computar porcentagens em suas cabeças porque envolve multiplicar números de vários dígitos; Se eu lhe perguntasse o que 73% era de 151,05, você provavelmente teria que tirar lápis e papel ou usar uma calculadora. Mas 20% tem a propriedade útil que podemos usar o seguinte procedimento:
Isso é muito mais fácil porque a maioria das pessoas pode dobrar o número de alguns dígitos em suas cabeças, enquanto a computação de múltiplos mais altos é mais difícil para eles. Por outro lado, pressupõe-se que representemos o número como uma cadeia de dígitos decimais, de modo que a remoção de um dígito divida o número por dez. Se a pessoa que espera escrever o cheque em algarismos romanos, você está sem sorte (rápido: o que é XX% do MMCMXLIV?).
Parte da razão pela qual a representação importa é que ela afeta os procedimentos mais simples que você pode considerar como certos. Os procedimentos são sempre escritos em termos de outros procedimentos mais simples. No algoritmo acima, assumimos que o leitor já sabia como dobrar um número e como apagar um dígito, já que são relativamente fáceis de fazer em notação decimal. No entanto, se estivéssemos ensinando a uma criança que não aprendeu a multiplicação, poderíamos dizer:1. Adicione o número a si mesmo2. Apague o último dígitoIsso é tecnicamente um procedimento diferente, pois substitui a multiplicação pela adição, mas, como ele calcula a mesma saída, é comportamentalmente equivalente à original. Agora, suponha que a criança não tenha aprendido a fazer acréscimos de vários dígitos, e ainda assim queremos que eles computem nossa dica para nós, talvez como tortura de um irmão mais novo. Então poderíamos dizer:1. Comece com o último dígito2. Adicione a si mesmo3. Se o resultado for maior que dez, escreva o 1 acima do próximo dígito4. Se houver algum algarismouma. Mover para o próximo dígitob. Vá para o passo 2, lembrando-se de adicionar o 1 acima, se você carregou um 1 sobre 5. Caso contrário, apague o último dígitoEste procedimento explica o cálculo de uma ponta de 20% em um número de vários dígitos em termos de adição de um único dígito. Mas suponha que a pobre criança não possa adicionar, mas só pode contar, mas está inexplicavelmente ansiosa para agradar a você, seu sádico irmão mais velho. Então poderíamos dizer à pobre criança para:1. Comece com o último dígito2. Adicione a si mesmo fazendo o seguinteuma. Escreva um 0 abaixo deleb. Se o número abaixo for o mesmo que o dígito com o qual começamos, vá para a etapa ec. Conte cada número por umd. Volte para o passo be. Se houver um carregamento escrito acima do dígito original, conte-o mais uma vez6. Se o resultado for maior que dez, escreva o 1 acima do próximo dígito7. Se houver algum dígito deixado a. Mover para o próximo dígito b. Vá para o passo 2, lembrando-se de adicionar o 1 acima, se você carregou um 1 sobre8. Caso contrário, apague o último dígito Mas, claro, para fazer isso, você teria que ser realmente sádico.
Níveis de abstração Nós descrevemos a multiplicação em termos de adição, que quebrou em adição de dígitos, e depois contando. Na prática, nós explicitaríamos isso descrevendo procedimentos em termos de subprocessos:
• Para dobrar um número: adicione-o a si mesmo
• Para adicionar dois números: adicione os últimos dígitos, adicione os próximos dígitos, com o carry, etc.
• Para adicionar dois dígitos: adicione repetidamente 1 a 1 enquanto subtrai um do outro até que o segundo dígito seja zero.
Se fôssemos diagramar todos os procedimentos envolvidos, poderia ser assim:
A maioria dos programas se dividem em camadas como essa. Os procedimentos são construídos em cima de procedimentos mais simples, que geralmente são construídos sobre procedimentos ainda mais simples, até chegarmos ao nível das operações primitivas que o hardware do computador pode executar diretamente. No entanto, você nunca pode descrever um procedimento “completamente”; você só pode descrevê-lo em termos de outros procedimentos que o leitor já entenda.
tradução de: What is computation?
Mas agora a aritmética não é mais apenas uma operação mental. É também uma operação física: envolve manipulação e mudança de objetos físicos (lápis e papel). Estamos acostumados a pensar na aritmética que fazemos como sendo uma coisa "mental" que ocorre "em" nossas cabeças. Mas, neste caso, está espalhada entre a cabeça, as mãos, o lápis e o papel de uma pessoa. Outra mudança do exemplo dos sete e três é que, enquanto apresentamos os números à pessoa como um conjunto de sons em inglês falado, eles então os apresentaram novamente como símbolos no papel, presumivelmente em algarismos arábicos.
O que é interessante aqui é que nenhuma dessas diferenças é importante. Enquanto a pessoa tiver a resposta certa em qualquer sistema ou sistema representacional que esteja usando, consideramos que ela realizou com sucesso a aritmética. Dito de outra forma, não importa qual caminho seguiremos no diagrama abaixo:
Chamaremos
isso de princípio da equivalência comportamental: se uma pessoa ou
sistema produzir de forma confiável a resposta certa, pode-se considerar
que ela resolveu o problema, independentemente de qual procedimento ou
representação ele usou. A equivalência
comportamental é absolutamente central para a noção moderna de
computação: se substituirmos um sistema computacional por outro que
tenha o mesmo comportamento, o cálculo ainda funcionará.
O modelo funcional
Vamos tentar ser mais precisos sobre o que queremos dizer dizendo que computação é um tipo de pergunta respondida. Primeiro de tudo, existem diferentes tipos de problemas de computação. Por isso, é justo perguntar a uma máquina de somar o que é 3 + 7, mas não qual é a capital da Índia. A capacidade de realizar uma tarefa como a adição é basicamente a capacidade de responder a um determinado conjunto de perguntas prescritas com a resposta correta. Assim, podemos pensar em um problema computacional como um conjunto de possíveis perguntas, cada uma com uma resposta correta desejada.No caso de questões adicionais, as únicas partes relevantes da questão são os números a serem adicionados. Para uma máquina de calcular, a parte "o que é a soma" de uma questão de adição é irrelevante, porque esse é o único tipo de pergunta que ela pode responder. Então, vamos dispensar as partes irrelevantes e apenas dizer que a questão consiste nos bits relevantes, neste caso, o par de números a serem adicionados. Da mesma forma, destilaremos a resposta para apenas um número.
Então, enquanto nós ainda não sabemos o que é computação abstrata, podemos ao menos dizer algo sobre o que entendemos por um problema computacional. É um grupo de perguntas relacionadas, cada uma com uma resposta desejada correspondente. Chamaremos as informações na pergunta específica de que o valor de entrada e o desejado atendem ao valor de saída. Para qualquer entrada, existe uma saída desejada correspondente. As noções de entrada e saída são os conceitos mais básicos de computação: a computação é –no momento– o processo de derivar a saída desejada de uma dada entrada(s).
Se você fez os cursos de matemática certos, pode perceber que o que estamos chamando de "problema computacional" é o mesmo que os matemáticos chamam de função. Uma função é apenas uma especificação de valores de saída para qualquer dado (s) de entrada. Seno e cosseno são funções; eles especificam valores de saída (números) para cada número de entrada possível. A adição também é uma função, mas de duas entradas em vez de uma. E operações mais esotéricas na matemática, como a derivada, também podem ser pensadas como funções, embora sejam funções cujas entradas são, elas próprias, outras funções. Mas as funções não precisam ser sobre números. Por exemplo, um MP3 player calcula uma função cuja entrada é uma música comprimida e cuja saída é uma forma de onda de áudio.
Um procedimento (também conhecido como algoritmo, programa, rotina ou sub-rotina) é um método específico para determinar um valor de saída de um conjunto de valores de entrada. Assumindo que o procedimento sempre produza a mesma saída para um determinado conjunto de entradas (por exemplo, não envolve dados rolantes ou outras operações não determinísticas), então “age como” uma função, pois tem uma correspondência estrita entre entradas e saídas. . A diferença entre procedimentos e funções é que as funções apenas especificam quais são suas saídas, enquanto um procedimento especifica como calculá-las. Normalmente, existem muitos procedimentos diferentes para calcular uma determinada função, mas, como veremos, há algumas funções que não podemos computar. Podemos pensar provisoriamente na Ciência da Computação como o estudo do conhecimento procedimental: como descrever procedimentos, construí-los e comparar procedimentos concorrentes para computar a mesma função. Estamos assumindo aqui que a única parte importante do comportamento de um procedimento é sua saída. Vamos chamar isso de modelo funcional de computação: procedimentos são maneiras de computar funções e, portanto, dois procedimentos são comportamentalmente equivalentes se e somente se computarem a mesma função (embora possam diferir nos recursos de que necessitam, como duração ou quantidade de papel de rascunho). Esta é uma visão limitada da computação, mas cobre uma quantidade surpreendente de terreno. Lembre-se de que as entradas e saídas de nossas funções não precisam ser números. Eles podem perfeitamente ser coisas como arquivos MP3 ou imagens de uma web cam.
Procedimentos
Vamos considerar um último exemplo aritmético. Suponha que você esteja em um restaurante e queira deixar uma gorjeta de 20%. Como um problema computacional, isso envolve pegar um número como entrada e computar 20% dele. Se chamarmos a entrada c de “check”, então estamos computando a função:
gorjeta(c) = 0,2 × c
A maioria das pessoas não é especialmente boa em computar porcentagens em suas cabeças porque envolve multiplicar números de vários dígitos; Se eu lhe perguntasse o que 73% era de 151,05, você provavelmente teria que tirar lápis e papel ou usar uma calculadora. Mas 20% tem a propriedade útil que podemos usar o seguinte procedimento:
- Dobrar o número
- Apague o último dígito (assumindo que a conta e a gorjeta são números inteiros)
Isso é muito mais fácil porque a maioria das pessoas pode dobrar o número de alguns dígitos em suas cabeças, enquanto a computação de múltiplos mais altos é mais difícil para eles. Por outro lado, pressupõe-se que representemos o número como uma cadeia de dígitos decimais, de modo que a remoção de um dígito divida o número por dez. Se a pessoa que espera escrever o cheque em algarismos romanos, você está sem sorte (rápido: o que é XX% do MMCMXLIV?).
Representação
Na prática, entradas e saídas são sempre codificadas em alguma representação específica. Muitas vezes, podemos ignorar qual representação é usada e apenas pensar sobre o procedimento como manipular a “informação” na entrada, em vez de manipular os componentes de uma representação específica. Consequentemente, a computação é frequentemente referida como processamento de informações e a indústria da computação como o setor de tecnologia da informação. No entanto, como este exemplo mostra, a escolha da representação pode afetar nossa escolha de algoritmo. Consequentemente, a Ciência da Computação também está muito preocupada em estudar as propriedades de diferentes tipos de representações ou estruturas de dados.Parte da razão pela qual a representação importa é que ela afeta os procedimentos mais simples que você pode considerar como certos. Os procedimentos são sempre escritos em termos de outros procedimentos mais simples. No algoritmo acima, assumimos que o leitor já sabia como dobrar um número e como apagar um dígito, já que são relativamente fáceis de fazer em notação decimal. No entanto, se estivéssemos ensinando a uma criança que não aprendeu a multiplicação, poderíamos dizer:1. Adicione o número a si mesmo2. Apague o último dígitoIsso é tecnicamente um procedimento diferente, pois substitui a multiplicação pela adição, mas, como ele calcula a mesma saída, é comportamentalmente equivalente à original. Agora, suponha que a criança não tenha aprendido a fazer acréscimos de vários dígitos, e ainda assim queremos que eles computem nossa dica para nós, talvez como tortura de um irmão mais novo. Então poderíamos dizer:1. Comece com o último dígito2. Adicione a si mesmo3. Se o resultado for maior que dez, escreva o 1 acima do próximo dígito4. Se houver algum algarismouma. Mover para o próximo dígitob. Vá para o passo 2, lembrando-se de adicionar o 1 acima, se você carregou um 1 sobre 5. Caso contrário, apague o último dígitoEste procedimento explica o cálculo de uma ponta de 20% em um número de vários dígitos em termos de adição de um único dígito. Mas suponha que a pobre criança não possa adicionar, mas só pode contar, mas está inexplicavelmente ansiosa para agradar a você, seu sádico irmão mais velho. Então poderíamos dizer à pobre criança para:1. Comece com o último dígito2. Adicione a si mesmo fazendo o seguinteuma. Escreva um 0 abaixo deleb. Se o número abaixo for o mesmo que o dígito com o qual começamos, vá para a etapa ec. Conte cada número por umd. Volte para o passo be. Se houver um carregamento escrito acima do dígito original, conte-o mais uma vez6. Se o resultado for maior que dez, escreva o 1 acima do próximo dígito7. Se houver algum dígito deixado a. Mover para o próximo dígito b. Vá para o passo 2, lembrando-se de adicionar o 1 acima, se você carregou um 1 sobre8. Caso contrário, apague o último dígito Mas, claro, para fazer isso, você teria que ser realmente sádico.
Níveis de abstração Nós descrevemos a multiplicação em termos de adição, que quebrou em adição de dígitos, e depois contando. Na prática, nós explicitaríamos isso descrevendo procedimentos em termos de subprocessos:
• Para dobrar um número: adicione-o a si mesmo
• Para adicionar dois números: adicione os últimos dígitos, adicione os próximos dígitos, com o carry, etc.
• Para adicionar dois dígitos: adicione repetidamente 1 a 1 enquanto subtrai um do outro até que o segundo dígito seja zero.
Se fôssemos diagramar todos os procedimentos envolvidos, poderia ser assim:
A maioria dos programas se dividem em camadas como essa. Os procedimentos são construídos em cima de procedimentos mais simples, que geralmente são construídos sobre procedimentos ainda mais simples, até chegarmos ao nível das operações primitivas que o hardware do computador pode executar diretamente. No entanto, você nunca pode descrever um procedimento “completamente”; você só pode descrevê-lo em termos de outros procedimentos que o leitor já entenda.
Comentários
Postar um comentário