Programar é uma emulação do mundo real? [fechadas]

Oct 19 2020

Suponha que temos um carro no mundo real, esse carro seria composto de átomos e podemos fazer operações nesse carro (por exemplo: podemos mover o carro ou mudar sua cor, etc.).

E suponha que tenhamos um objeto carro no mundo do computador (na RAM), este objeto carro obviamente não é um carro real, mas sim uma representação de um carro real, mas podemos imaginar que este objeto carro é um carro real, e nós também pode fazer operações neste objeto carro (por exemplo: podemos mover o objeto carro ou mudar sua cor, etc.).

Agora, se quisermos, por exemplo, mudar a cor do carro no mundo real, temos que manipular alguns dos átomos que compõem o carro para fazer isso. E para mudar a cor do objeto carro no mundo do computador (na RAM), temos que manipular alguns dos bits que compõem o objeto carro para fazer isso.

No entanto, uma diferença que posso pensar entre o mundo real e o mundo dos computadores é que no mundo real o carro é visível para as pessoas, no entanto, no mundo dos computadores o objeto carro não é visível para as pessoas (você tem que pintar o carro objeto na tela para torná-lo visível para as pessoas).

Então, podemos pensar em programação como uma emulação do mundo real? mais especificamente, podemos pensar no mundo real como "RAM do mundo real" que pode conter qualquer objeto (esses objetos seriam compostos de átomos) da mesma forma que a RAM pode conter qualquer objeto (esses objetos seriam compostos de bits)?

Respostas

19 Telastyn Oct 19 2020 at 21:55

Não.

A programação orientada a objetos às vezes modelará o mundo real, mas como diz o velho ditado "todos os modelos estão errados, mas alguns são úteis". Mesmo no mundo real, mudar a cor do carro não envolve mudar o estado dos átomos no carro, mas adicionar novos com a nova cor. O mundo real não muda de estado tão facilmente como um computador e, à medida que aprendemos mais sobre nosso mundo físico, aprendemos como ele é não determinístico.

E, infelizmente, muitas escolas ensinam OOP através do modelo de programação de "carro", o que é horrível. Modelar o mundo real um a um geralmente é uma maneira inadequada de resolver os problemas em mãos. Eu recomendaria desenvolver um modelo mental melhor para programação, um baseado mais em acoplamento e razões para mudar.

3 Michael Oct 19 2020 at 22:52

Eu tenderia a pensar em programação menos como emular o mundo real e mais como uma forma de modelagem matemática executável. Você pode desenvolver modelos matemáticos para qualquer coisa, mesmo coisas sem equivalente no mundo real (que às vezes se cruzam; a ideia da geometria não euclidiana era uma espécie de especulação intelectual até a revolução einsteiniana e a álgebra booleana teriam parecido uma curiosidade estranha antes de alguém tinha a tecnologia básica para construir um computador digital).

A matemática exige rigor, não utilidade; a programação é a mesma. Certamente posso escrever simulações que se aproximem do mundo real, mas não há nada que o force a ser assim. Assim como você pode modelar sistemas que não existem na natureza, você pode escrever programas que computam coisas sem analogia.

1 RobertHarvey Oct 19 2020 at 22:10

Pensar em um carro como uma coleção de átomos não é particularmente útil, a menos que talvez você esteja examinando algum efeito quântico no carro, o que é improvável. Um mecânico não se preocupa com os átomos quando está girando uma chave inglesa no parafuso do motor. Ele pode se preocupar com a temperatura do motor, mas isso pode ser modelado por uma medição simples; você não precisa do LHC para descobrir isso.

Então, o que resta são atributos do dia a dia, como o passo da rosca do parafuso, o tamanho da chave que se encaixa nele e o padrão de torque que deve ser aplicado a ele quando é apertado. Essas são coisas que podem ser modeladas dentro de um computador, e o computador pode realmente fazer previsões sobre o que provavelmente acontecerá quando você girar a chave inglesa, com base nesses atributos.

Observe que eu não disse nada sobre metalurgia, química (a ferrugem do parafuso) ou a aptidão física da pessoa que gira o parafuso. Nem você, nem o computador, precisam ver tudo para transmitir informações úteis da computação. Muito pelo contrário, na verdade; nós sempre contar com parcial de informações quando estamos modelando alguma coisa, especialmente em um computador.

O computador sempre modela ações ou consequências do mundo real? Não, claro que não. Muitas abstrações em um computador existem para o bem do próprio computador. E muitas dessas abstrações são, bem, abstratas. Temos coleções porque muitas coisas podem ser modeladas como uma coleção de entidades (a "entidade" sendo essencialmente um "substantivo"), incluindo os controles em uma interface de usuário. Essas entidades podem ser qualquer coisa, incluindo carros, mas também podem ser coleções de números em uma rede neural, onde você está realmente pegando algum relacionamento no mundo real, quebrando-o em pedaços e modelando o relacionamento contínuo entre entrada e saída . Isso está muito longe de, digamos, uma bola de beisebol que você está simplesmente segurando na mão.

Lembre-se de que tudo o que o computador sabe sobre aquela cor de tinta com a qual você está prestes a pintar seu carro é a fórmula para misturar os pigmentos que produzem essa cor. Na verdade, ele não sabe mais nada sobre a tinta, a menos que você diga.

RobertBräutigam Oct 19 2020 at 22:34

OO não é sobre o "mundo real" . Não no sentido que muitas pessoas parecem pensar que é.

Os objetos devem modelar sua visão muito especial e estreita de algo no contexto do problema que você deve resolver.

Se o contexto de policiamento de trânsito, um carro pode ter apenas um método ticket(). No contexto do leasing, ele pode ter lease(), repossess(), qualquer que seja. No contexto do descarte de lixo pode haver destroy(): Tonnage, ou seja o que for.

Um "carro" objetivo não existe. Na verdade, nenhum objeto ou modelo existe sem contexto. É por isso que qualquer projeto / arquitetura que comece com "vamos definir o que é um carro" está errado. É também por isso que comentários como "mas um carro não faz leasing no mundo real" não fazem sentido. Não modelamos o mundo real.

Steve Oct 20 2020 at 02:10

O que significa "emular o mundo real"? Significa emular todos os aspectos de um carro que levou milhões de horas de trabalho para conceber, refinar e fabricar?

Ou significa pegar algum programador, provavelmente um com muito pouca experiência em mecânica ou engenharia mecânica, e modelar sua concepção ingênua do que é a essência de um carro?

Eu concordo com a resposta de @Michael de que, em última análise, a programação é mais como um modelo matemático executável. Certamente, um programa é muito mais semelhante à matemática do que ao "mundo real" se isso significar coisas físicas.

Mas, de maneira mais pertinente, o que está sendo modelado em primeiro lugar não é o mundo real, mas alguma concepção humana dele.

No paradigma da "modelagem do mundo real", o programador é escalado como alguém que simplesmente mede ou detecta (de uma forma rotineira ou razoavelmente rotinizada) as características de algo que já existe "no mundo real", e traduz isso em objeto- código orientado. Presume-se que seja óbvio quais são as características de um carro e como a coisa toda se encaixa para ser uma máquina útil.

No mundo real real, a coisa a ser modelada é muitas vezes alguma nova implementação de idéias ou princípios - ou então qualquer coisa que "realmente" exista deve ser modificada de alguma forma como parte da tradução para um programa de computador - então o o programador acaba realmente como o designer e parteira de uma nova concepção. E esse papel de designer continua sendo um papel de especialista profissional, envolvendo enorme conhecimento, julgamento, criatividade e engenhosidade.

E foi aí que esse paradigma caiu: ele mesmo não reflete o mundo real do desenvolvimento de software.

Corey Oct 20 2020 at 10:40

No sentido geral, a programação orientada a objetos não é uma emulação de nada. Na melhor das hipóteses, pode ser usado para fazer analogias com objetos do mundo real, mais para conveniência dos programadores do que qualquer coisa implícita na programação ou OO em si. Em minha experiência, essas analogias são, na maioria das vezes, auxiliares de aprendizagem ou compreensão e, quando você chega aos pequenos detalhes, a analogia cai por terra - o que não é surpreendente, pois essa é a natureza da analogia.

O exemplo do seu carro é um pouco confuso. Sim, podemos criar um Carobjeto que modela aspectos de uma instância concreta do mundo real. Podemos torná-lo tão detalhado quanto quisermos, mas o objeto no computador é, na melhor das hipóteses, apenas uma descrição do objeto do mundo real e algum subconjunto das propriedades do carro real. Talvez possamos usar algumas simulações de física para afetar o carro virtual, mas dentro do computador você tem apenas análogos das várias propriedades físicas.

no entanto, no mundo da informática, o objeto do carro não é visível para as pessoas

No mundo real, vemos as coisas ao interceptar fótons que ricochetearam e acabaram impactando nossas retinas. Os fótons que pularam do carro carregarão informações sobre sua interação com a superfície do carro. Não existe tal coisa no computador, nenhum "mundo" com fótons pulando apenas na memória, armazenamento, E / S, etc.

Portanto, não, nada pode "ver" nada dentro da memória do computador. O melhor que você pode esperar é construir uma emulação da visão ou analogizar a visão em algo como "capaz de ler as propriedades de um objeto" ou algo parecido.

O problema é que falamos sobre essas analogias como se fossem muito mais do que são, simplesmente porque é a maneira mais simples de transmitir uma ideia. Falamos sobre páginas, alças, janelas, fluxos, ponteiros ... todas as palavras que têm significados físicos concretos que muitas vezes estão apenas vagamente relacionados aos termos do computador. Usamos as palavras porque são úteis. Eu sei que um identificador é um índice usado para calcular um deslocamento em um bloco de memória que contém os bytes que o sistema operacional usa para registrar metadados sobre um recurso digital de algum tipo ... mas eu só tenho que pensar "manipular" porque não há razão para pensar sobre memória, metadados, etc. enquanto estou abrindo um arquivo ou trabalhando com um elemento de IU, ou ... e assim por diante.

Portanto, não, não há equivalência entre o mundo real e o estado interno do seu computador, não importa quantas camadas de abstração você coloque lá.