笔记-1
SICP
1
I’d like to welcome you to this course on computer science. Actually that is a terrible way to start. Computer science is a terrible name for this business. First of all it’s not a science. It might be engineering or it might be art ,but we’ll actually see that computer so-called science actually has a lot in common with magic, and we’ll see that in this course. So it’s not a science it’s also not really very much about computers. And it’s not about computers in the same sense that physics is not really about particle accelerators(粒子加速器), and biology is not really about microscopes(显微镜) and petri dishes(培养皿). And it’s not about computers in the same sense that geometry(几何学) is not really about using surveying instruments(仪器)
In fact , there’s a lot of commonality(共性) between computer science and geometry.
What is the essence of computer science or what is the essence of geometry ?
It’s certainly true that these Egyptians went off and using surveying instruments. Computer really what they were doing is starting to learn how to formalize intuitions about process. How to do things, starting to develop a way to talk precisely about how-to knowledge
For instance, here is a piece of mathematics that says what a square root is. The square root of X is the number Y, such that Y squared is equal to X and Y is greater than 0. Now that’s a fine piece of mathematics, but just telling you what a square root is doesn’t really say anything about how you might go out and find one. So let’s contrast that with a piece of imperative knowledge, how you might go out and find a square root. This, in fact, also comes from Egypt ancient Egypt. This is an algorithm due to Heron of Alexandria called how to find a square root by successive averaging: you make a guess, you improve that guess and the way you improve the guess is to average the guess and X / guess and you keep improving the guess until it’s good enough. That is method. That is how to do something as opposed to
declarative knowledge that says what you’re looking for. That is a process. And the thing that directs a process is a pattern of rules called a procedure. That control these magical spirits that are the processes. Using Lisp to make these processes come true.
Lisp is a language designed for talking about casting the spells(编写咒语般的程序) that are procedures to direct the processes.
2
In computer science we are in business of formalizing this sort of how-to imperative knowledge and how to do stuff. The real problems come when we try to build very, very large systems, computer programs that are thousands of pages long so long that nobody can really hold them in their heads all at once. So there are techniques for controlling the complexity of these large systems. And these techniques that are controlling complexity are what this course is really about. And in some sense, that’s really what computer science is about. Computer science, in some sense, isn’t real. Computer science deals with idealized components(理想化组件). We know as much as we want about these little program and data piece that we’re fitting thing tighter.
That means in building large program, there’s not all that much difference between what I can build and what I can imagine, because the parts are these abstract entities that I know as much as I want. I know about them as precisely as I’d like. So as opposed to(与…不同) other kinds of engineering, where the constraints(约束) on what you can build are the constraints of physical systems, that constraints of physics(物理定律) and noise(噪声) and approximation(近似值), the constraints imposed in building large software systems are the limitations of our own minds. So in that sense, computer science is like an abstract form of engineering(工程中的一种抽象模式). It’s the kind of engineering where you ignore the constraints that are imposed(强加) by reality.
3
Well, what are some of these techniques ?
First technique black-box abstraction(黑盒抽象), which is used in all of engineering is kind of abstraction called black-box abstraction: Take something and build a box about it. Let’s for example, if we looked at that square root method I might want to take that and build a box is “to find the square root of X” And that might be a whole complicated set of rules. And that might end up being(封装起来) a kind of what I can put in, say, 36 input, 6 output. And the important thing is that I’d like to design that so that is convenience to other users. If someone want to compute the square root of A plus the square root of B, he can take this thing and use it as a module(组件) without having to look inside and build new box. That’s the fundamental notion of putting something in a box using black-box abstraction to suppress(隐藏) detail, And the reason for that is you want to go off and build bigger boxes.
Second, conventional interfaces(实现相应的接口) suppose I want to express the idea: 将某个元素与另两个元素之和相乘(x(+ a1 a2)),举个例子来说,如果我用1与3的和再乘2得8,但我这里想讨论的是关于线性组合的基本想法,也就是你可以将两个元素的和再乘与另一个元素,在数集内思考这个问题很容易的,但是如果将这个想法应用于对连个向量a1,a2的相加然后乘以某一个因子X然后得到另一向量,或者是a1,a2都是多项式,将多项式相加然后再乘以2得到另一个多项式,再或者a1,a2是两个电信号... Now if our language is going to be good language for expressing those kind of general ideas, (x(+ a1 a2)) I’d like that to express the general idea of all different kinds of thing that a1 and a2 could be. Somewhere, there has to be the knowledge of the kinds of various things that you can add and the ways of adding them(不同的加的方式). So we need to controlling that kind of complexity. And the way you do that is by establishing conventional interfaces, Such as “plus” that have to work with all different kinds of data.