1 Construindo Abstrações com Funções
Os atos da mente pelos quais exerce a sua ação sobre as ideias simples são fundamentalmente estes três: 1. A combinação, numa ideia composta, de várias ideias simples. 2. A segunda é unir duas ideias, sejam estas simples ou complexas, para pô-las uma cerca da outra, sem reduzi-las a uma, pelo qual se chega aos relacionamentos entre ideias. 3. A terceira é a separação de todas as demais ideias que acompanham uma ideia na sua existência real: essa é a chamada abstração, pela qual a mente obtém todas as ideias gerais. — John Locke, Um ensaio sobre o entendimento humano (1690)
Estamos prestes a estudar a ideia de um processo t.. Processos computacionais são seres abstratos que habitam computadores. Enquanto evoluem, processos manipulam outras coisas abstratas chamadas dados. A evolução de um processo é guiada por um padrão de regras chamado de programa. Em efeito, nós conjuramos os espíritos do computador com nossos feitiços.
Um processo computacional é na verdade muito parecido com a ideia de um espírito de um feiticeiro. Não pode ser visto ou tocado. Não é composto por nenhuma matéria. Entretanto, é bem real. Pode realizar trabalho intelectual. Pode responder perguntas. Pode afetar o mundo ao retirar dinheiro de um banco ou ao controlar um braço robótico em uma fábrica. Os programas que usamos para conjurar processos são como os feitiços do feiticeiro. São expressões simbólicas cuidadosamente compostas em arcanas e esotéricas linguagens de programação que descrevem as tarefas que queremos que nossos processos realizem.
Um processo computacional, em um computador funcionando corretamente, executa os programas com precisão e acurácia. Assim, como o aprendiz de feiticeiro, programadores iniciantes devem aprender a entender e antecipar as consequências de suas conjurações. Mesmo erros pequenos (geralmente chamados bugs ou glitches) em programas podem ter consequências complexas e não antecipadas.
Felizmente, aprender a programar é consideravelmente menos perigoso do que feitiçaria, pois os espíritos que lidamos estão convenientemente contidos de uma forma segura. Programação no mundo real, entretanto, requer cuidado, conhecimento, e sabedoria. Um pequeno bug na criação de um programa para controle por computador, pode por exemplo, levar à catastrófica colapso de um avião ou uma represa ou a auto-destruição de um robô industrial.
Engenheiros de software mestres possuem a habilidade de organizar programas de forma que eles possam estar seguramente certos de que os processos resultantes irão realizar as tarefas intencionadas. Visualizam o comportamento de seus sistemas com antecedência. Sabem como estruturar programas para que problemas não antecipados não levem a consequências catastróficas, e quando os problemas surgirem, eles possam debugar seus programas. Sistemas computacionais bem planejados, como automóveis ou reatores nucleares bem planejados, são criados de forma modular, assim as partes podem ser construídas, substituídas, e debugadas separadamente.
Programando em JavaScript
Nós precisamos de uma linguagem apropriada para descrever processos, e iremos utilizar para este propósito a linguagem de programação JavaScript. Assim como nossos pensamentos do dia a dia são geralmente expressos em nossa linguagem natural (como Inglês, Francês, Japonês ou o Português), e descrições de fenômenos quantitativos são expressados com equações matemáticas, nossos pensamentos procedurais serão expressos em JavaScript. JavaScript foi desenvolvida no início dos anos 1990 como uma linguagem de programação para controlar os navegadores da World Wide Web através de scripts incorporados nas páginas da web. A linguagem foi concebida por Brendan Eich, originalmente com o nome Mocha, que depois foi renomeada para LiveScript e finalmente para JavaScript. O nome JavaScript é uma marca registrada da Oracle Corporation.
A despeito de sua origem como uma linguagem de script para web, JavaScript é uma linguagem de programação de propósito geral. Um interpretador JavaScript é uma máquina que realiza os processos descritos na linguagem JavaScript. O primeiro interpretador JavaScript foi implementado por Eich na Netscape Communications Corporation, para o navegador da web Netscape Navigator.
JavaScript herdou suas características das linguagens de programação Schema e Self. Scheme é um dialeto de Lisp. e foi usada como a linguagem de programação para a versão original deste livro. Do Scheme, JavaScript herdou seus mais fundamentais princípios de design como funções de primeira classe escopadas lexicalmente e tipagem dinâmica.
JavaScript possui apenas aparência superficial com a linguagem Java, após a qual foi (eventualmente) batizada; tanto Java e JavaScript usam a estrutura de bloco da linguagem C. Em contraste com Java e C, as quais geralmente utilizam compilação para linguagens de baixo nível, programas JavaScript foram inicialmente interpretados pelos navegadores da web. Após o Netscape Navigator, outros navegadores web proveram interpretadores para a linguagem incluindo o Internet Explorer da Microsoft, cuja versão do JavaScript foi nomeada JScript. A popularidade do JavaScript para controlar navegadores web culminou em um esforço para sua padronização, culminando no ECMAScript. A primeira edição do padrão foi liderada por Guy Lewis Steele Jr. e completada em Junho de 1997 (ECMA 1997). A sexta edição, conhecida como ECMAScript 2015, foi liderada por Allen Wirfs-Brock e adotada pela Assembleia Geral da ECMA em Junho de 2015 (ECMA 2015).
A prática de incorporar programas JavaScript em páginas da web encorajou os desenvolvedores de navegadores web a implementarem interpretadores JavaScript. Assim que foram se tornando mais complexos, esses interpretadores se tornaram mais eficientes em executá-los, eventualmente utilizando implementações sofisticadas como compilação Just-In-Time (JIT). A maioria dos programas JavaScript no momento em que é escrito (2021) são incorporados em páginas da web e interpretados por navegadores, mas JavaScript é cada vez mais utilizada como uma linguagem de programação com propósito geral, usando sistemas com o o Node.js.
Entretanto, é a habilidade dos navegadores de executar programas JavaScript que tornam uma linguagem ideal para uma versão online sobre programas de computador. Executar programas ao clicar nas coisas em uma página da web é natural em JavaScript - afinal é exatamente o que JavaScript foi criado para fazer! Mais fundamentalmente, ECMAScript 2015 possui um conjunto de características que o tornam um excelente meio para estudar importante construtos de programação e estruturas de dados e para relacioná-los com as características linguísticas que os suportam. Suas funções de primeira classe escopadas lexicalmente e seu suporte sintático através de expressões lambda proveem um acesso direto e conciso para a abstração funcional, e a tipagem dinâmica nos permitem adaptar para se manter próximo ao Scheme originalmente utilizado ao longo do livro. E ainda mais, além de todas estas considerações, programar em JavaScript é uma grande diversão.