`
varsoft
  • 浏览: 2449993 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Edsger Dijkstra经典言论

阅读更多

1. 编程的艺术就是处理复杂性的艺术。

2. 优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避 “聪明的技巧”。——1972年图灵奖演讲

3. 计算机科学是应用数学最难的一个分支,所以如果你是一个蹩脚的数学家,最好留在原地,继续当你的数学家。

4. 我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力。

5. 实际上如果一个程序员先学了BASIC,那就很难教会他好的编程技术了:作为一个可能的程序员,他们的神经已经错乱了,而且无法康复。

6. 就语言的使用问题:根本不可能用一把钝斧子削好铅笔,而换成十把钝斧子会是事情变成大灾难。

7. 简单是可靠的先决条件。

下面是Dijkstra遗孀和子女发出的通告:

>Grateful for most that has befallen him, has peacefully passed away,
> Edsger Wybe Dijkstra,
>our husband and father.
>
>We hold him very dear.
>
>The cremation will take place on
>
>Saterday, August 10th, 12:30 PM at
>Somerenseweg 120
>Heeze
>the Netherlands
>
>Maria C. Dijkstra Debets
>Marcus J. Dijkstra
>Femke E. Dijkstra
>Rutger M. Dijktra
>
>Please forward this message to whomever you feel missing in the
>recipient list.

最后,请重温Dijkstra在1968年发表的那篇短文:

Go To Statement Considered Harmful

For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce. More recently I discovered why the use of the go to statement has such disastrous effects, and I became convinced that the go to statement should be abolished from all "higher level" programming languages (i.e. everything except, perhaps, plain machine code). At that time I did not attach too much importance to this discovery; I now submit my considerations for publication because in very recent discussions in which the subject turned up, I have been urged to do so.

My first remark is that, although the programmer's activity ends when he has constructed a correct program, the process taking place under control of his program is the true subject matter of his activity, for it is this process that has to accomplish the desired effect; it is this process that in its dynamic behavior has to satisfy the desired specifications. Yet, once the program has been made, the "making' of the corresponding process is delegated to the machine.

My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible.

Let us now consider how we can characterize the progress of a process. (You may think about this question in a very concrete manner: suppose that a process, considered as a time succession of actions, is stopped after an arbitrary action, what data do we have to fix in order that we can redo the process until the very same point?) If the program text is a pure concatenation of, say, assignment statements (for the purpose of this discussion regarded as the descriptions of single actions) it is sufficient to point in the program text to a point between two successive action descriptions. (In the absence of go to statements I can permit myself the syntactic ambiguity in the last three words of the previous sentence: if we parse them as "successive (action descriptions)" we mean successive in text space; if we parse as "(successive action) descriptions" we mean successive in time.) Let us call such a pointer to a suitable place in the text a "textual index."

When we include conditional clauses (if B then A), alternative clauses (if B then A1 else A2), choice clauses as introduced by C. A. R. Hoare (case[i] of (A1, A2,···, An)),or conditional expressions as introduced by J. McCarthy (B1 -> E1, B2 -> E2, ···, Bn -> En), the fact remains that the progress of the process remains characterized by a single textual index.

As soon as we include in our language procedures we must admit that a single textual index is no longer sufficient. In the case that a textual index points to the interior of a procedure body the dynamic progress is only characterized when we also give to which call of the procedure we refer. With the inclusion of procedures we can characterize the progress of the process via a sequence of textual indices, the length of this sequence being equal to the dynamic depth of procedure calling.

Let us now consider repetition clauses (like, while B repeat A or repeat A until B). Logically speaking, such clauses are now superfluous, because we can express repetition with the aid of recursive procedures. For reasons of realism I don't wish to exclude them: on the one hand, repetition clauses can be implemented quite comfortably with present day finite equipment; on the other hand, the reasoning pattern known as "induction" makes us well equipped to retain our intellectual grasp on the processes generated by repetition clauses. With the inclusion of the repetition clauses textual indices are no longer sufficient to describe the dynamic progress of the process. With each entry into a repetition clause, however, we can associate a so-called "dynamic index," inexorably counting the ordinal number of the corresponding current repetition. As repetition clauses (just as procedure calls) may be applied nestedly, we find that now the progress of the process can always be uniquely characterized by a (mixed) sequence of textual and/or dynamic indices.

The main point is that the values of these indices are outside programmer's control; they are generated (either by the write-up of his program or by the dynamic evolution of the process) whether he wishes or not. They provide independent coordinates in which to describe the progress of the process.

Why do we need such independent coordinates? The reason is - and this seems to be inherent to sequential processes - that we can interpret the value of a variable only with respect to the progress of the process. If we wish to count the number, n say, of people in an initially empty room, we can achieve this by increasing n by one whenever we see someone entering the room. In the in-between moment that we have observed someone entering the room but have not yet performed the subsequent increase of n, its value equals the number of people in the room minus one!

The unbridled use of the go to statement has an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. Usually, people take into account as well the values of some well chosen variables, but this is out of the question because it is relative to the progress that the meaning of these values is to be understood! With the go to statement one can, of course, still describe the progress uniquely by a counter counting the number of actions performed since program start (viz. a kind of normalized clock). The difficulty is that such a coordinate, although unique, is utterly unhelpful. In such a coordinate system it becomes an extremely complicated affair to define all those points of progress where, say, n equals the number of persons in the room minus one!

The go to statement as it stands is just too primitive; it is too much an invitation to make a mess of one's program. One can regard and appreciate the clauses considered as bridling its use. I do not claim that the clauses mentioned are exhaustive in the sense that they will satisfy all needs, but whatever clauses are suggested (e.g. abortion clauses) they should satisfy the requirement that a programmer independent coordinate system can be maintained to describe the process in a helpful and manageable way.

It is hard to end this with a fair acknowledgment. Am I to judge by whom my thinking has been influenced? It is fairly obvious that I am not uninfluenced by Peter Landin and Christopher Strachey. Finally I should like to record (as I remember it quite distinctly) how Heinz Zemanek at the pre-ALGOL meeting in early 1959 in Copenhagen quite explicitly expressed his doubts whether the go to statement should be treated on equal syntactic footing with the assignment statement. To a modest extent I blame myself for not having then drawn the consequences of his remark

The remark about the undesirability of the go to statement is far from new. I remember having read the explicit recommendation to restrict the use of the go to statement to alarm exits, but I have not been able to trace it; presumably, it has been made by C. A. R. Hoare. In [1, Sec. 3.2.1.] Wirth and Hoare together make a remark in the same direction in motivating the case construction: "Like the conditional, it mirrors the dynamic structure of a program more clearly than go to statements and switches, and it eliminates the need for introducing a large number of labels in the program."

In [2] Guiseppe Jacopini seems to have proved the (logical) superfluousness of the go to statement. The exercise to translate an arbitrary flow diagram more or less mechanically into a jump-less one, however, is not to be recommended. Then the resulting flow diagram cannot be expected to be more transparent than the original one.

References:

  1. Wirth, Niklaus, and Hoare C. A. R. A contribution to the development of ALGOL. Comm. ACM 9 (June 1966), 413-432.
  2. BÖhm, Corrado, and Jacopini Guiseppe. Flow diagrams, Turing machines and languages with only two formation rules. Comm. ACM 9 (May 1966), 366-371.

Edsger W. Dijkstra
Technological University
Eindhoven, The Netherlands

分享到:
评论

相关推荐

    Edsger Dijkstra经典言论.docx

    Edsger Dijkstra经典言论

    分布式系统高引经典获奖论文-Edsger Dijkstra Prize

    2000-2022年分布式系统获奖论文,高引用量

    dijkstra算法详细介绍.zip

    这个算法的名称来源于它的发明者,荷兰计算机科学家 Edsger Dijkstra。以下是Dijkstra算法的详细介绍: 基本思想 Dijkstra算法以起始点为中心向外层层扩展,直到扩展到终点为止。 在这个过程中,始终保持从起点到...

    Rust中 Shutting-yard算法的示例实现_rust_代码_下载

    在 Rust中 Edsger Dijkstra 的Shutting-yard 算法的示例实现。 此实现处理: 二进制+, -, *, /, 和^(指数)运算符 一元+和-运算符 括号 关联性(大多数运算符左侧,取幂右侧) 分流 Rust 包括一个基于正则表达式...

    Assignment_Prim.cs.txt.zip_Science For All_spanning tree

    In computer science, Prim s ... Prim in 1957 and rediscovered by Edsger Dijkstra in 1959. Therefore it is also sometimes called the DJP algorithm, the Jarník algorithm, or the Prim–Jarník algorithm.

    clj-dijkstra:Clojure 中的 Dijkstra 最短路径算法

    Edsger Dijkstra 对单个源的最短路径算法的 Clojure 实现。 用法 ( require '[dijkstra.core :refer [dijkstra]]) ( def vertexes #{ :s :t :x :y :z }) ( def edges {[ :s :t ] 10 [ :s :y ] 5 [ :t :x ] 1 [ :t...

    dijkstra:Dijkstra的最短路径有向图算法在Ruby C C ++ Python JavaScript语言和MooTools框架中实现

    由计算机科学家Edsger Dijkstra构思的Dijkstra算法是一种图搜索算法,它可以解决具有非负边沿路径成本的图的单源最短路径问题,从而生成最短路径树。 如何使用 在页面中包含最新版本的MooTools Framework,然后添加...

    什么是dijkstra算法

    Dijkstra算法是一种用于解决单源最短路径问题的经典算法,由荷兰计算机科学家艾德斯·戴克斯特拉(Edsger W. Dijkstra)在1956年提出。该算法通常用于在带有非负权重的有向图中找到从一个源节点到所有其他节点的最短...

    银行家算法概述、原理及应用.pdf

    银行家算法,是由荷兰著名计算机科学家艾兹格·迪杰斯特拉(Edsger Dijkstra)在1965年为解决资源分配中的死锁问题而提出的一种著名算法。该算法借鉴了银行家贷款时采用的策略,即银行在发放贷款时,需确保自身资金...

    银行家算法

    银行家算法是资源和死锁避免的算法,由艾兹格·迪杰斯特拉(Edsger Dijkstra) 设计的算法用于测已确定总数量的资源分配的安全性,在决定是否该分配应该被允许并进行下去之前,通过“s-state”校验码测试资源分配...

    银行家算法的具体介绍.docx

    银行家算法(Banker's Algorithm)是一个避免死锁的著名算法,由荷兰计算机科学家Edsger Dijkstra(也称为艾兹格·迪杰斯特拉)在1965年为T.H.E系统设计。它以银行借贷系统的分配策略为基础,判断并保证系统的安全...

    TTGen:用 C# 和 WinForms 编写的真值表生成器比较器。 它解析逻辑电路中使用的特定符号中的布尔表达式

    真值表生成器 用 C# 和 WinForms 编写的真值表生成器/比较器。 它解析逻辑电路中使用的特定符号中的布尔表达式,例如: ... 使用 Edsger Dijkstra Shunting Yard 算法和反向波兰符号(伪代码在维基百科中)。

    python-1o1:初学者的Python简介

    python-101 在线阅读发布状态思考的食物这只是语义。... (Edsger Dijkstra,“谦虚的程序员”) 我讨厌代码,我希望在我们的产品中尽量减少代码。 (杰克·迪德里希(Jack Diederich),“停止写作课堂”)

    HikariCP:光HikariCP ・最终成为一个稳定的,高性能的JDBC连接池

    ” -Edsger Dijkstra 指数 伪像 Java 8至11 Maven工件: < groupId>com.zaxxer</ groupId> < artifactId>HikariCP < version>4.0.3 Java 7 Maven工件(维护模式): < groupId>com.za

    HikariCP-analysis:数据库连接池源码分析

    ![]( )HikariCP更快。 Hi·ka·ri [hi·ka·'lē](*来源:日文*):轻; 射线。 [![] [Build Status img]] [Build Status] [![] [Issue Stats img]] [Issue ...” -Edsger Dijkstra Java 7和Java 8 Maven工件:

    影响计算机算法世界的十位大师

    介绍影响计算机算法世界的十位大师.如Don E. Knuth ,Edsger Wybe Dijkstra, George Dantzig, ...

    PriorityQueueNPuzzle

    PriorityQueueNPuzzle A *算法通过使用启发式算法预测下一步。 A *是一种明智的搜索算法,或“最佳优先”搜索,意味着它是根据加权图来表示的:从图的特定起始...它可以看作是Edsger Dijkstra 1959年算法的扩展。 影片

    The humble programmer

    1972图灵奖获得者Edsger W. Dijkstra讲稿

    DiningPhilosophers:餐饮哲学家问题的解决方案

    该项目的目标是实施著名的餐饮哲学家问题,最初由 Edsger Dijkstra 提出。 这种并发算法设计说明了同步问题和解决这些问题的技术。 问题说明几个哲学家坐在一张圆桌旁,每边各有一个叉子。 每个哲学家都会周期性地...

Global site tag (gtag.js) - Google Analytics