Portuguese, Brazilian sous-titres

← Palestra 1A | MIT 6.001 Estrutura e Interpretação, 1986

Visão geral e Introdução à Lisp

Apesar da nota de direitos autorais na tela, este curso está sendo oferecido agora sob uma licença de Creative Commons: BY-NC-SA. Detalhes em http://ocw.mit.edu/terms

Obtenir le code d’intégration
6 langues

Afficher la révision 16 créée 09/17/2015 par Raissa Mendes.

  1. Gostaria de lhes dar as boas vindas ao
    curso de Ciência da Computação.
  2. Na verdade, esta é um forma terrível de se começar.
    Ciência da Computação é um nome horrível para este negócio.
  3. Primeiramente, nao é uma ciência.
  4. Poderia ser engenharia,
    ou poderia ser arte.
  5. Mas, nós, na verdade, percebemos que a assim chamada ciência da computação tem, na realidade, muito em comum com mágica.
  6. Nos vamos ver isso neste curso.
  7. Então, não é uma ciência. Também não é muito realmente sobre computadores.
  8. E também não é sobre computadores, da mesma forma que Física não é realmente sobre aceleradores de partículas.
  9. E Biologia não é realmente sobre microscópios e placas de Petri.
  10. E não é sobre computadores no mesmo sentido em que geometria
  11. não é realmente sobre usar instrumentos de pesquisa.
  12. Na verdade, há muito em comum entre Ciência da Computação e Geometria.
  13. Para começar, Geometria é outra matéria com um nome inadequado.
  14. O nome vem de "gaia", que significa "a Terra", e "metron", que significa medir.
  15. Geometria originalmente significava medir a Terra, ou investigar.
  16. E a razão disso é que, milhares de anos atrás,
  17. os sacerdotes egípcios desenvolveram os rudimentos da Geometria
  18. de modo a descobrir como restaurar os limites dos campos
  19. que eram destruídos na enchente anual do rio Nilo.
  20. E para os egípcios que faziam isso, Geometria realmente era
  21. o uso de instrumentos de pesquisa.
  22. Agora, o mitov pelo qual nós achamos que Ciência da Computação é sobre computadores
  23. tem muito a ver com a mesma razão pela qual os egípcios pensavam que
  24. Geometria era sobre topografia.
  25. Isto é, quando algum campo de pesquisa está começando
  26. e você não o entende muito bem
  27. é muito fácil confundir a essência do que você está fazendo
  28. com as ferramentas que você usa.
  29. E realmente, sobre algumas medidas absolutas das coisas
  30. nós provavelmente sabemos menos sobre a essência da Ciência da Computação
  31. que os antigos egípcios realmente sabiam sobre Geometria.
  32. O que eu quero dizer com essência da Ciência da Computação?
  33. O que eu quero dizer com essência da Geometria?
  34. Vejam, certamente é verdade que esses egípcios WENT OFF e usaram
  35. instrumentos de topografia, mas quando nós olhamos para eles
  36. após dois mil anos, nós dizemos
  37. o que ele estavam fazendo, a coisa importante que eles estavam fazendo
  38. foi começar a formalizar noções sobre espaço e tempo.
  39. Começar uma maneira de falar sobre verdades matemáticas formalmente
  40. que levaram ao método axiomático que levou, de alguma forma, a
  41. todo o método da matemática moderna
  42. Descobrindo uma maneira de falar de forma precisa do assim chamado
  43. conhecimento declarativo - o que é verdade.
  44. Bem, da mesma forma, penso que no futuro as pessoas vão olhar para trás
  45. e dizer, sim, esses primitivos no século XX estavam
  46. mexendo com essas máquinas chamadas computadores,
  47. mas, na verdade, o que eles estavam fazendo foi começar a aprender como
  48. formalizar intuições sobre processo - como fazer coisas.
  49. Começando a desenvolver uma maneira de falar de forma precisa sobre
  50. "como conhecer" de forma oposta à Geometria,
  51. que fala sobre "o que é verdade."
  52. Deixe-me lhes dar um exemplo disso.
  53. Eis aqui um trabalho de Matemática que diz o que é
  54. uma raiz quadrada.
  55. A raiz quadrada de x é o número y que
  56. levado ao quadrado é igual à x, sendo y maior que zero.
  57. Agora essa é uma boa peça da Matemática, mas
  58. apenas dizer a vocês o que é uma raiz quadrada
  59. não diz realmente nada sobre como vocês
  60. poderiam ir e encontrar uma
  61. Então vamos contrastar que com uma peça de conhecimento imperativo
  62. como você poderia ir e encontrar uma raiz quadrada.
  63. Isso de fato vem do Egito. Não o antigo, antigo
  64. Egito. Esse é um algoritmo de Heron da Alexandria
  65. chamado "Como encontrar uma raiz quadrada
  66. por desvio quadrado médio".
  67. Mas o que isso diz é, para encontrar uma raiz quadrada
  68. você dá um palpite
  69. você melhora esse palpite
  70. e a forma de melhorar o palpite
  71. é ..... o palpite e x sobre o palpite
  72. e mais tarde nós vamos falar um pouco sobre por que
  73. isso é uma coisa razoável
  74. e você continua a melhorar o palpite até que esteja bom.
  75. Mas esse é um método.
  76. É sobre como fazer algo, em vez do conhecimento
  77. declarativo que diz que o que você está procurando.
  78. É um processo.
  79. Bem, o que é um processo em geral?
  80. É meio difícil dizer.
  81. Pode-se pensar nisso como um espírito mágico
  82. que meio que vive no computador e faz algo.
  83. A coisa que dirreciona o processo é um padrão de regras
  84. chamado um prodecimento.
  85. Portanto, procedimento são os feitiços, se vocês preferirem
  86. que controlam esses espíritos mágicos que são os processos.
  87. Bem, eu acho que vocês sabem que todos precisam de uma linguagem mágica
  88. e os bruxos, bruxos verdadeiros, usam antigas
  89. acadiana ou suméria ou babilônica ou ou qualquer outra.
  90. Nós vamos conjurar nossos espíritos numa linguagem mágica
  91. chamada LISP.
  92. Que é a linguagem feita para falar sobre,
  93. para lançar os feitiços que são os procedimentos
  94. para conduzir os processos.
  95. Agora é muito fácil aprender LISP.
  96. Na verdade, em poucos minutos eu vou ensinar a vocês
  97. basicamente tudo sobre a linguagem LISP.
  98. Vou ensinar a vocês basicamente todas as regras.
  99. E vocês não deveriam achar isso particularmente surpreendente.
  100. É mais ou menos como dizer
  101. que é muito fácil aprender as regras do xadrez.
  102. E na verade, em poucos minutos você pode ensinar
  103. a alguém as regras do xadrez.
  104. Mas, é claro, isso é bem diferente de se dizer
  105. que você entende as implicações dessas regras
  106. e como usá-las para se tornar
  107. um mestre no xadrez.
  108. Bem, LISP é a mesma coisa.
  109. Vamos enumerar as regras daqui a poucos minutos
  110. e será bem fácil de ver.
  111. Mas o que vai ser realmente difícil é perceber
  112. as implicações dessas regras - como explorar
  113. essas regras para ser um mestre programador.
  114. E as implicações dessas regras vão
  115. nos levar a, bem, a todo o resto da matéria
  116. e, é claro, muito além.
  117. OK. Então na Ciência da Computação nós estamos tratando
  118. de formalizar o "como" do conhecimento imperativo.
  119. Como fazer coisas.
  120. E as questões verdadeiras da Ciência da Computação não são, é claro,
  121. dizer às pessoas como extrair raiz quadradas.
  122. Porque se isso fosse tudo, não haveria problema nenhum aí.
  123. Os verdadeiros problemas surgem quando tentamos construir
  124. sistemas muito muito grandes.
  125. Programas de computador que possuem milhares de páginas.
  126. Tão longos que ninguém pode realmente tê-los em suas
  127. cabeças de uma vez só.
  128. E a única razão pela qual isso é possível é
  129. porque há ténicas
  130. que são técnicas para controlar
  131. a complexidade desses sistemas enormes.
  132. E essas técnicas para controlar
  133. a complexidade são o assunto deste curso.
  134. E em algum aspecto, isso é, na verdade, o objeto
  135. da Ciência da Computação.
  136. Bem, isso pode parecer algo bem estranho de se dizer
  137. porque, no final, um monte de gente além dos cientistas
  138. da computação lidam com o controle da complexidade.
  139. Um grande companhia aérea é um sistema extremamente complexo
  140. e os engenheiros aeronáuticos que projetaram
  141. isso estão lidando com uma imensa complexidade.
  142. Mas existe uma diferença entre esse tipo de complexidade
  143. e aquela com a qual lidamos na Ciência da Computação.
  144. E a diferença está no fato de que a Ciência da computação, de alguma forma,
  145. não é real.
  146. Vejam bem, quando um engenheiro está projetando
  147. um sistema físico que é feito de partes reais,
  148. os engenheiros não se preocupam como
  149. lidar com problemas de tolerância e
  150. aproximação e barulho no sistema.
  151. Então, por exemplo, sendo um engenheiro elétrico
  152. eu posso sair e facilmente construir um amplificador de ONE STAGE
  153. ou um aplificador de BIVOLT? e eu posso imaginar
  154. sobrepondo vários deles para construir
  155. um amplificador de MILLION STAGE
  156. no entanto, seria ridículo construir algo assim
  157. porque bem antes do MILLONTH STAGE
  158. o barulho termal nesses componentes
  159. WAY no começo vai
  160. amplificar e fazer a coisa toda ficar sem sentido.
  161. A Ciência da Computação lida com componentes idealizados.
  162. Nós sabemos tanto quanto queremos sobre essas
  163. pequenas peças de programas e de dados que nós estamos encaixando.
  164. Portanto, nós não temos de nos preocupar com tolerância,
  165. e isso significa que, ao construir um programa grande,
  166. não existe tanta diferença assim entre
  167. o que eu posso construir e o que posso imaginar.
  168. Porque as partes são essas entidades abstratas
  169. que eu conheço tanto quanto quero.
  170. Eu sei sobre elas precisamente o tanto que eu quiser.
  171. Assim, em oposição a outros tipos de engenharia
  172. em que os limites/restrições/obstáculos on WHICH pode-se construir
  173. são os obstáculos dos sistemas físicos --
  174. os obstáculos da física e barulho e aproximação -
  175. os obstáculos impostos ao se construir grandes sistemas de software
  176. são as limitações de nossas mentes.
  177. Portanto, nesse sentido, a Ciência da Computação é como
  178. uma forma abstrata de engenharia.
  179. É o tipo de engenharia na qual se ignora
  180. os limites que são impostos pela realidade.
  181. OK. Bem, quais são algumas dessas técnicas?
  182. Elas não são privativas da Ciência da Computação.
  183. A primeira técnica, que é usada em toda a engenharia,
  184. é um tipo de abstração chamado "Abstração da caixa preta".
  185. Tome algo e construa uma caixa sobre isso.
  186. Por exemplo, nós vimos o método da raiz quadrada.
  187. Eu poderia pegar isso e construir uma caixa.
  188. Dize-se "Encontrar a raiz quadrada de x."
  189. E isso deveria ser todo um conjunto complicado de regras,
  190. e deveria terminar sendo o tipo de coisa
  191. em que se coloca dentro, digamos, 36, e dizer
  192. "Qual é a raiz quadrada de 36?" e sai 6.
  193. E o importante é que eu gostaria de DESIGN que
  194. de modo que se George chegar e desejar computar
  195. a raiz quadrada de a mais a raiz quadrada de b
  196. ele pode pegar essa coisa e usar como um módulo
  197. sem ter de olhar dentro
  198. e construir algo que se pareça com isso:
  199. deveria ser um a e um b e uma caixa de raiz quadrada
  200. e outra caixa de raiz quadrada
  201. e então algo que some.
  202. E isso deveria dar a resposta.
  203. E pode-se ver que somente do fato de que
  204. eu quero fazer isso ponto de vista do George
  205. a parte interna do que está aqui
  206. não deveria ser importante.
  207. Assim, por exemplo, não deveria importar
  208. quando eu escrevo isso eu disse que quero encontrar a
  209. raiz quadrada de x. Eu poderia ter dito
  210. a raiz quadrada de y ou a raiz quadrada de a
  211. or qualquer coisa.
  212. Essa é a noção fundamental de se colocar algo
  213. numa caixa.
  214. Usar a caixa preta da abstração para suprimir detalhe
  215. e a razão para isso é que
  216. você quer chegar e construir caixas maiores.
  217. Bem, existe outra razão para fazer
  218. caixa da preta da abstração além
  219. de querer suprimir detalhe para construir caixas maiores.
  220. algumas vezes você quer dizer que seu jeito
  221. de fazer algo, seu método de "como fazer"
  222. é uma instância de uma coisa mais geral
  223. e você gostaria sua linguagem para ser capaz
  224. de expressar essa generalidade.
  225. Deixe-me lhes dar outro exemplo
  226. ficando com a raiz quadrada.
  227. Vamos voltar e dar mais uma olhada naquele slide
  228. com o algoritmo da raiz quadrada nele.
  229. Lembra o que ele diz?
  230. Ele diz que, para fazer algo,
  231. eu dou um palpite e eu melhoro esse palpite
  232. e eu meio que continuo melhorando aquele palpite
  233. assim existe uma estratégia geral de procurar
  234. por algo e uma maneira de encontrá-lo
  235. Eu continuo a melhorá-lo
  236. Agora isso é um caso particular de outro
  237. tipo de estratégia para encontrar um ponto fixo de algo
  238. um ponto fixo de uma função é algo, é
  239. um valor - um ponto fixo de uma função f
  240. é um valor y tal que f de y igual a y.
  241. E a forma que eu devo fazer isso
  242. é começar com um palpite
  243. e se eu quero algo que não mude
  244. quando eu continuo aplicando f
  245. é eu vou continuar aplicando f continuamente até
  246. que aquele resultado não mude muito.
  247. Então existe uma estratégia geral.
  248. E então, por exemplo, para computar a raiz
  249. quadrada de x, eu posso tentar encontrar
  250. um ponto fixo da função que toma y
  251. PARA A MÉDIA DE x sobre y.
  252. E a ideia disso é que se eu realmente tivesse y
  253. igual à raiz quadrada de x
  254. então y e x sobre y seria o mesmo valor.
  255. Eles seriam ambos a raiz quadrada de x
  256. e, é claro, x sobre a raiz quadrada de x.
  257. E então a média, if y fosse igual à raiz quadrada de x,
  258. então a média não mudaria. Então a raiz quadrada
  259. de x é como (?) um ponto fixo daquela função particular
  260. Agora o que eu gostaria de ter, eu gostaria de expressar a
  261. estratégia geral para encontrar pontos fixos.
  262. Então o que eu deveria imaginar fazer é encontrar, é ser capaz
  263. para usar minha linguagem, para definir uma caixa que dia: ponto
  264. fixo. Da mesma forma eu poderia fazer uma caixa que diz "raiz
  265. quadrada", e eu gostaria de ser capaz de expressar ESTA em minha
  266. linguagem. Eu gostaria de expressar não apenas o
  267. conhecimento imperativo de uma coisa particular
  268. como a raiz quadrada, mas eu gostaria de ser capaz de
  269. expressar o conhecimento imperativo de como fazer
  270. um ponto fixo. E, de fato, vamos voltar e olhar
  271. aquele slide novamente. Esta é uma parte do conhecimento
  272. imperativo? Como encontrar um ponto fixo, mas
  273. aqui no fundo existe uma nova parte do
  274. conhecimento imperativo que diz que uma maneira de
  275. computar raiz quadrada é aplicar esse método geral
  276. do ponto fixo. Então, eu gostaria também de ser capaz de expressar
  277. aquele conhecimento imperativo.
  278. Isso significaria que "Esta caixa de ponto fixo é tal que
  279. se eu colocar algo na entrada, a fundação que leva "y" à
  280. média de "y" amd x sobre y e o que deveria sair
  281. desta caixa de ponto fixo é um método para se encontrar
  282. raízes quadradas. Então, nessas caixas que estamos construindo
  283. você tem não apenas números de entrada e saída, nós
  284. podemos estar construindo em caixas que, de fato, podem estar construindo
  285. métodos computacionais de como achar raiz quadrada.
  286. E minha opinião é que eles são funções de entrada
  287. como y vai para a média de y e x sobre y.
  288. E a razão pela qual nós deveríamos fazer isso, isso é um procedimento
  289. procedimentos vão ser nosso jeito de falar
  290. sobre conhecimento imperativo.
  291. E a forma de transformá-lo em algo poderoso
  292. é ser capaz de falar sobre outros tipos de
  293. conhecimento. Então aqui está um procedimento que, de fato,
  294. trata de outro prodecimento.
  295. E a estragégia geral que, ela mesma, trata
  296. de estratégias gerais. OK, bem, nosso primeiro
  297. tópico para este curso será, ou melhor, os três maiores
  298. tópicos serão extração de caixas-pretas. Vamos tratar
  299. desse assunto de uma forma um pouco mais detalhada... O que nós vamos
  300. fazer é, nós vamos .... nós vamos começar falando sobre
  301. como a LISP é construída a partir de objetos primitivos.
  302. Como, o que faz a linguagem SUPPLY conosco
  303. e vamos ver que eles são prodecimentos primitivos
  304. e dados primitivos. Então nós vamos ver como
  305. você pega esses primitivos e os combina
  306. de forma a fazer coisas complicadas. Essas formas
  307. de combinação, e vamos ver que existem
  308. formas de ordenar coisas juntas, colocando
  309. prodecimentos primitivos para fazer mais
  310. procedimentos complicados. E vamos ver como
  311. colocar dados primitivos juntos para fazer dados compostos.
  312. Então vamos dizer "Bem, tendo FEITO essas
  313. coisas compostas, como se faz para abstrair delas?"
  314. "Como você colocar essas caixas pretas ao redor delas
  315. de forma que você possa usá-las como componentes em
  316. coisas mais complexas?" E veremos que isso é feito
  317. definindo procedimentos e técnicas para
  318. lidar com dados compostos, chamados "dados de abstração".
  319. E então o que deve ser a coisa mais importante
  320. é passar de apenas regras para "Como um
  321. expert trabalhar?" Como se expressam padrões
  322. comuns de se fazer coisas, como dizer "Bem, existe
  323. um método geral de FIXED-POINT e raiz quadrada
  324. é um caso particular daquilo." E nós vamos usar
  325. algo chamado procedimentos de alta ordem, especialmente
  326. procedimentos cuja entrada e saída são, elas próprias,
  327. procedimentos e então vamosobservar algo
  328. muito interessante: à medida que avançamos mais e mais
  329. nós vamos abstrair, bem..., a linha entre o que
  330. consideramos dados, e o que consideramos
  331. prodecimento vai se tornar tênue de uma forma
  332. incrível. Tudo bem, bem, este é o nosso primeiro assunto: extração da
  333. caixa-preta. Vamos dar uma olhada no segundo tópico: introduza
  334. dessa forma: suponha que eu queira expressar a ideia, e
  335. lembrem-se, estamos falando sobre ideias - eu quero
  336. expressar a ideia de que eu posso tomar algo e
  337. multiplicá-lo pela soma de duas outras coisas. Então, por
  338. exemplo, se eu somar 1 com 3 e multiplicar por 2, eu
  339. obtenho 8. Mas eu estou falando sobre a ideia geral
  340. daquilo que se chama "combinação linear": que você
  341. pode adicionar duas coisas e multiplicá-las por
  342. algo mais. É muito fácil quando eu penso
  343. sobre isso para números, mas suponham que eu também queira
  344. usar esta mesma ideia para pensar sobre "eu posso
  345. somar dois vetores: a1 e a2 e depois SCALE os pelo
  346. mesmo fator "x" e conseguir um outro vetor. Or eu
  347. deveria dizer que quero pensar sobre a1 e a2 como se esses
  348. polinômios, e eu gostaria de somar esses dois
  349. polinômios e depois multiplicá-los por 2 para conseguir
  350. um mais complicado. Or a1 e a2 poderiam ser
  351. sinais elétricos e eu gostaria de pensar como
  352. somar esses dois sinais elétricos e então
  353. colocar a toda coisa num amplificador e
  354. multiplicar por, digamos, 2 ou algo assim. A
  355. ideia é que eu quero pensar sobre a noção geral
  356. daquilo. Agora, se minha linguagem vai ser
  357. uma boa linguagem para expressar essas ideias gerais
  358. de modo que eu realmente possa fazer aquilo, eu gostaria de ser capaz de
  359. diz "eu vou multiplicar por X a soma de a1
  360. e a2, e eu gostaria que isso expressasse a ideia
  361. geral. De todos os diferentes tipos de coisas que a1 e a2
  362. podem ser. Agora, se você pensar bem, existe um problema,
  363. pois, afinal, todas as operacoes primitivas reais que
  364. entram numa maquina vao obviamente ser diferentes
  365. se eu estou adicionando dois números polinomiais
  366. ou se eu estiver adicioando a representacao de dois sinais
  367. eletricos ou formas de onda em algum lugar tem de haver
  368. conhecimento dos tipos de varias coisa que voce pode adicionar
  369. e as formas de adiciona-las. Agora, para construir tal sistema
  370. a questao eh onde eu coloco aquele conhecimento, como eu
  371. penso sobre os diferentes tipos de escolhas que tenho
  372. e se amanhã George chegar com um novo tipo de objeto
  373. que pode ser adicionado e multiplicado. Como é que eu adiciono
  374. o novo objeto de George ao sistema sem estragar
  375. tudo que já estava lá?
  376. Esse vai ser o segundo tópico, a maneira de controlar
  377. esse tipo de complexidade. E a maneira que se faz isso
  378. é estabelecendo interfaces convencionais. Acordadas as
  379. formas de colocar (CONECTAR) coisas juntas. Exatamente como na engenharia
  380. elétrica as pessoas têm padrão IMPENDÊNCIAS para
  381. conectores e então você sabe se você controi
  382. algo com um desses padrões de impendências
  383. que você pode conectar com outra coisa.
  384. Portanto, este vai ser o nosso segundo grande tópico:
  385. interfaces convencionais. O que nós vamos ver
  386. é primeiramente que nós vamos falar sobre o problema das operações
  387. genéricas, à qual eu aludi,
  388. coisas como PLUS que têm de trabalhar com todos os tipos de dados
  389. Nós vamos falar sobre operações genéricas
  390. e depois vamos falar sobre SCALE STRUCTURES,
  391. como juntarmos programas muito grandes
  392. que modelam os tipos de sistemas complexas no mundo real que você gostaria
  393. de modelar e o que vocês vão ver
  394. é que existem duas metáforas muito importantes para
  395. colocar junto tais sistemas - um é chamado de objeto orientado
  396. de programção, onde você pensa o seu sistema
  397. como um tipo de sociedade de pequenas coisas que interagem enviando
  398. informação entre eles. E o segundo são
  399. operações que agregam os chamados STREAMS streams onde você
  400. pensa em sistemas grandes que pôem juntos tipo
  401. como uma única engenharia de processamento pôe junto um grande
  402. sistema elétrico.
  403. Esse vai ser o nosso segundo tópico. Agora, a terceira
  404. coisa que vamos abordar, a terceira técnica básica
  405. para controlar a complexidade é construir novas linguagens,
  406. pois, às vezes, quando você está assoberbado
  407. pela complexidade de um design, a forma de se controlar
  408. essa coomplixidade é escolher uma nova linguagem de design e
  409. o objetivo de novas linguagens de design
  410. será iluminar os diferentes aspectos do sistema.
  411. Ela vai suprimir alguns tipos de detalhes e enfatizar
  412. outros tipos de detalhes.
  413. Essa vai ser a parte mais mágica do curso.
  414. Nós vamos começar olhando efetivamente para a
  415. a tecnologia usada na construção de novas linguagens de computador.
  416. A primeira coisa que vamos fazer é, na verdade, construir
  417. em LISP. Nós vamos expressar em LISP o processo de
  418. interpretar a própria LISP. E isso vai ser um tipo VERY
  419. de coisa autocircular. Existe um pouco de símbolo místico
  420. que tem a ver com o que veremos que é uma ....
  421. O processo de interpretar LISP é um tipo de roda gigante
  422. de dois processos, aplicar e avaliar
  423. que tipo de expressões constantemente reduzem
  424. a cada um. Então, vamos ver todo tipo
  425. de coisas mágicas. Eis aqui outro símbolo mágico.
  426. Este é um tipo de operador Y, que é em algum senso
  427. a expressão do infinito dentro de nossa linguagem procedimental
  428. vamos dar uma olhada nisso. Esta parte do curso é
  429. chamada de abstração metalinguistica ao falar sobre
  430. como construímos novas linguagens
  431. como eu disse que íamos começar a olhar
  432. para o processo de interpretação. Nós vamos olhar
  433. para essa volta LOOP aplicar/avaliar.
  434. E construir LIPS e apenas para mostrar que isso é muito
  435. geral, vamos usar exatamente a mesma tecnologia
  436. para construir um tipo muito diferente de linguagem -
  437. a assim chamada linguagem lógica de programção em que
  438. não se fala realmente sobre prodecimentos de forma alguma que tenha entradas e saídas.
  439. O que se fala é sobre as relações entre coisas
  440. e, aí então, finalmente,
  441. vamos falar sobre como implementar essas
  442. coisas de forma bastante concreta no tipo mais de simples de máquinas
  443. Vamos ver algo como
  444. qual é a EXEMPLO/PICTURE de um chip que é o intéprete da LISP
  445. sobre o qual vamos falar então no hardware.
  446. Bem, ok, aqui está um esboço do curso.
  447. Três tópicos: abstração da caixa preta,
  448. interfaces convencionais e
  449. abstração metalinguística.
  450. Agora vamos para um pouco, para depois darmos início.
  451. [MÚSICA]
  452. Muito bem, bom, vamos na verdade começar a aprender a linguagem LISP agora.
  453. Vamos iniciar aprendendo algo muito mais importante,
  454. talvez a coisa mais importante de todas deste curso -
  455. que não é a LIPS em particular, é claro,
  456. mas um quadro geral para se pensar sobre linguagens.
  457. Eu já me mencionei aqui que, quando alguém lhe diz que vai lhe mostrar uma linguagem,
  458. o que você deveria dizer é "Tudo bem, o que eu gostaria que você me dissesse é, quais são os elementos primtivos?"
  459. Com o que a linguagem vem
  460. Então, quais são as formas que você coloca isso junto, quais são os meios de combinação
  461. Quais são as coisas que permitem que você leve esses elementos primitivos e construa coisas maiores a partir deles.
  462. Quais são as maneiras de se colocar coisas juntas?
  463. E então, quais são as formas de abstração?
  464. Como é que pegamos essas coisas complicadas, e desenhamos essas caixas ao redor delas?
  465. Como a nominamos, de forma que possamos usá-las como elas fossem elementos primitivos
  466. para fazer coisas ainda mais complexas, e assim em diante
  467. Então, quando alguém lhes diz, Nossa, eu tenho uma ótima nova linguagem de computador
  468. Você não diz: quantos caracteres são necessários para inverter a matriz?
  469. Isto é irrelevante. O que você diz é: Como, se, as linguagens não vêm com matrizes construídas, ou com alguma outra coisa construída
  470. Como eu poderia, então, construir aquela coisa? Quais são os meios de combinação que me permitiriam fazer isso?
  471. E então, quais são as formas de abstração que me permitiriam, então, usar aqueles elementos para fazer coisas ainda mais complicadas?
  472. Bem, nós vamos ver que LISP tem alguns dados primitivos, e alguns procedimentos primitivos.
  473. De fato, vamos realmente começar. Aqui está um pedaço de um dato primitivo em LISP.
  474. Número 3, na verade, se eu estiver sendo bem pedante, não é o número 3
  475. é algum símbolo que representa o conceito de Platão do número 3.
  476. Eis aqui alguns dados primitivos na linguagem LISP:
  477. 17.4, ou, na verdade, alguma representação de 17.4.
  478. E eis aqui outro, 5.
  479. Eis aqui outro objeto primitivo que está construído dentro da LISP, adição (+).
  480. Na verdade, para usar o mesmo tipo de pedantismo, este é um nome para o método primitivo de adicionar coisas,
  481. da mesma forma, este é o nome para o número 3.
  482. Este é um nome para o conceito de Plantão de como adicionar coisas.
  483. Certo, aqueles são alguns elementos primitivos. Eu posso colocá-los juntos.
  484. Eu posso dizer: qual é a soma de 3 e 17.4 e 5? E a forma que eu faço isso
  485. é dizer, vamos aplicar o operador de soma a esses três números e eu devo conseguir 25.4.
  486. Bem, eu deveria ser capaz de perguntar Lisp qual é o valor disso, e ela me daria 25.4.
  487. Vamos introduzir alguns nomes. Essa coisa que digitei aqui é chamada de combinação.
  488. E uma combinação consiste em geral de aplicar um operador (então isto é um operador)
  489. para alguns operandos (esses são os operandos).
  490. E é claro que posso fazer coisas mais complexas.
  491. A razão pela qual eu poderia conseguir complexidade disso é porque os operandos mesmos, em geral, podem ser combinações.
  492. Assim, por exemplo, eu poderia dizer: qual é a soma de 3 e o produto de 5 e 6, e 8 e 2.
  493. E eu deveria obter, vamos ver... 43, então Lisp me diz que é 43.
  494. Formar combinações, aqui estamos procurando as maneiras básicas de combinação.
  495. E assim, vocês veem alguma sintaxe aqui. Lisp usa o que chamamos de notação de prefixo,
  496. o que significa que o operador está escrito à esquerda dos operados (é uma convenção apenas).
  497. E observem que está completamente entre parênteses, e os parênteses fazem isso completamente não ambíguo.
  498. Assim, olhando para isso, posso ver o que existe o operador, and existem 1...2...3...4 operandos.
  499. É 3.Eu pedi a Lisp para avaliá-lo, de vocês podem ver que Lisp respondeu
  500. embaixo, e disse, é isso mes, é 3.
  501. Ou eu posso dizer: qual é a soma de 3, 4 e 8? Qual é aquela combinação?