设计一门计算机语言言设计:列表的理解以及为什么它是有害的

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
为什么说Java中继承是有害的(3)
摘要:这个代码成功编译,但是因为基类不知道关于stack指针堆栈的情况,这个stack对象当前在一个未定义的状态。下一个对于push()调用把新的项放入索引2的位置。(stack_pointer的当前值),所以stack有效地有三个元素-下边两个是垃圾。(Java的stack类正是有这个问题,不要用它).对这个令人讨厌的继承的方法问题的解决办法是为Stack覆盖所有的ArrayList方法,那能够修改数组的状态,所以覆盖正确的操作Stack指针或者抛出一个例外。(removeRan
这个代码成功编译,但是因为基类不知道关于stack指针堆栈的情况,这个stack对象当前在一个未定义的状态。下一个对于push()调用把新的项放入索引2的位置。(stack_pointer的当前值),所以stack有效地有三个元素-下边两个是垃圾。(Java的stack类正是有这个问题,不要用它). 对这个令人讨厌的继承的方法问题的解决办法是为Stack覆盖所有的ArrayList方法,那能够修改数组的状态,所以覆盖正确的操作Stack指针或者抛出一个例外。(removeRange()方法对于抛出一个例外一个好的候选方法)。
这个方法有两个缺点。第一,如果你覆盖了所有的东西,这个基类应该真正的是一个interface,而不是一个class。如果你不用任何继承方法,在实现继承中就没有这一点。第二,更重要的是,你不能够让一个stack支持所有的ArrayList方法。例如,令人烦恼的removeRange()没有什么作用。唯一实现无用方法的合理的途径是使它抛出一个例外,因为它应该永远不被调用。这个方法有效的把编译错误成为运行错误。不好的方法是,如果方法只是不被定义,编译器会输出一个方法未找到的错误。如果方法存在,但是抛出一个例外,你只有在程序真正的运行时,你才能够发现调用错误。 对于这个基类问题的一个更好的解决办法是封装数据结构代替用继承。这是新的和改进的Stack的版本:
&class Stack
private int stack_pointer = 0;
private ArrayList the_data = new ArrayList();
public void push( Object article )
the_data.add( stack_poniter++, article );
public Object pop()
return the_data.remove( --stack_pointer );
public void push_many( Object[] articles )
for( int i = 0; i & o. ++i )
push( articles[i] );
到现在为止,一直都不错,但是考虑脆弱的基类问题,我们说你想要在stack创建一个变量, 用它在一段周期内跟踪最大的堆栈尺寸。一个可能的实现也许象下面这样:
&class Monitorable_stack extends Stack
private int high_water_mark = 0;
private int current_
public void push( Object article )
if( ++current_size & high_water_mark )
high_water_mark = current_
super.push( article );
publish Object pop()
--current_
return super.pop();
public int maximum_size_so_far()
return high_water_
这个新类运行的很好,至少是一段时间。不幸的是,这个代码发掘了一个事实,push_many()通过调用push()来运行。首先,这个细节看起来不是一个坏的选择。它简化了代码,并且你能够得到push()的派生类版本,甚至当Monitorable_stack通过Stack的参考来访问的时候,以至于high_water_mark能够正确的更新。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
为什么说Java中继承是有害的(3)相关信息,包括
的信息,所有为什么说Java中继承是有害的(3)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International计算机程序设计语言有哪些?_百度知道
计算机程序设计语言有哪些?
我有更好的答案
计算机程序设计语言有三大类:机器语言、汇编语言、高级语言。机器语言是一连串的0和1,极难记忆与应用,但是,这是计算机唯一可以“读懂”的语言。其它两类语言必须“翻译”成机器语言,计算机才能执行。汇编语言是用字符和代码编写的语言,其中的字符与代码都有一定的含义,便于编程者理解与记忆。汇编语言必须经过“汇编程序”的“翻译”,变成机器语言,计算机才能执行。汇编语言多大用于工业控制领域。高级语言基本上接近与自然语言,编程更加容易,是目前计算机广泛应用的基础。高级语言必须经过“编译程序”的“翻译”,变成机器语言,计算机才能执行。高级语言广泛用于计算机应用的各个领域,开发系统软件和应用软件,某些工业控制机也采用了一些高级语言进行开发。
采纳率:89%
来自团队:
1. 机器语言 2. 汇编语言 3. 高级语言  这是基本语言了,, 下面的都是细分
本回答被网友采纳
计算机语言:计算机语言通常是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。 计算机语言通常分为三类:即机器语言,汇编语言和高级语言。 (了解内容一) 1. 机器语言 机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。 用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。现在,除了计算机生产厂家的专业人员外,绝大多数程序员已经不再去学习机器语言了。 2.汇编语言 为了克服机器语言难读、难编、难记和易出错的缺点,人们就用与代码指令实际含义相近的英文缩写词、字母和数字等符号来取代指令代码(如用ADD表示运算符号“+”的机器代码),于是就产生了汇编语言。所以说,汇编语言是一种用助记符表示的仍然面向机器的计算机语言。汇编语言亦称符号语言。汇编语言由 于是采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。 汇编语言中由于使用了助记符号,用汇编语言编制的程序送入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的“汇编程序“的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。 汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。汇编语言是低级语言。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。 3.高级语言 不论是机器语言还是汇编语言都是面向硬件的具体操作的,语言对机器的过分依赖,要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员是难以做到的,对于计算机的推广应用是不利的。计算机事业的发展,促使人们去寻求一些与人类自然语言相接近且能为计算机所接受的语意确定、规则明确、自然直观和通用易学的计算机语言。这种与自然语言相近并为计算机所接受和执行的计算机语言称高级语言。高级语言是面向用户的语言。无论何种机型的计算机,只要配备上相应的高级语言的编译或解释程序,则用该高级语言编写的程序就可以通用。 目前被广泛使用的高级语言有BASIC、PASCAL、C、COBOL、FORTRAN、LOGO以及VC、VB等。这些语言都是属于系统软件。 (了解内容二) 计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。这种“翻译”通常有两种方式,即编译方式和解释方式。编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。解释方式是:源程序进入计算机时,解释程序边扫描边解释作逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。PASCAL、FORTRAN、COBOL等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C语言是能书写编译程序的高级程序设计语言。 每一种高级(程序设计)语言,都有自己人为规定的专用符号、英文单词、语法规则和语句结构(书写格式)。高级语言与自然语言(英语)更接近,而与硬件功能相分离(彻底脱离了具体的指令系统),便于广大用户掌握和使用。高级语言的通用性强,兼容性好,便于移植。下面介绍几种较有代表性的高级程序设计语言: ⑴BASIC语言 BASIC语言全称是Beginner’s all Purpose Symbolic Instruction Code,意为“初学者通用符号指令代码“。1964年由美国达尔摩斯学院的基米尼和科茨完成设计并提出了BASIC语言的第一个版本,经过不断丰富和发展,现已成为一种功能全面的中小型计算机语言。BASIC易学、易懂、易记、易用,是初学者的入门语言,也可以作为学习其他高级语言的基础。BASIC有解释方式和编译方式两种翻译程序。 ⑵PASCAL语言 PASCAL是一种结构程序设计语言,由瑞士苏黎世联邦工业大学的沃斯(N.Wirth)教授研制,于1971年正式发表。是从ALGOL60衍生的,但功能更强且容易使用。目前,作为一个能高效率实现的实用语言和一个极好的教学工具,PASCAL语言在高校计算机软件教学中一直处于主导地位。Pascal(B.Pascal)是十七世纪法国著名数学家,他于1642年曾发明现代台式计算机的雏型机—加减法计算机。 PASCAL具有大量的控制结构,充分反映了结构化程序设计的思想和要求,直观易懂,使用灵活,既可用于科学计算,又能用来编写系统软件,应用范围日益广泛。 ⑶通用编程语言C C语言是美国AT&T(电报与电话)公司为了实现UNIX系统的设计思想而发展起来的语言工具。C语言的主要特色是兼顾了高级语言和汇编语言的特点,简洁、丰富、可移植。相当于其他高级语言子程序的函数是C语言的补充,每一个函数解决一个大问题中的小任务,函数使程序模块化。C语言提供了结构式编程所需要的各种现代化的控制结构。 C语言是一种通用编程语言,正被越来越多的计算机用户所推崇。使用C语言编写程序,既感觉到使用高级语言的自然,也体会到利用计算机硬件指令的直接,而程序员却无需卷入汇编语言的繁琐。 ⑷COBOL语言 COBOL的全称是Common Business Oriented Language,意即:通用商业语言。 在企业管理中,数值计算并不复杂,但数据处理信息量却很大。为专门解决经企管理问题,于1959年,由美国的一些计算机用户组织设计了专用于商务处理的计算机语言COBOL,并于1961年美国数据系统语言协会公布。经不断修改、丰富完善和标准化,已发展为多种版本。 COBOL语言使用了300多个英语保留字,大量采用普通英语词汇和句型,COBOL程序通俗易懂,素有“英语语言”之称。 COBOL语言语法规则严格。用COBOL语言编写的任一源程序,都要依次按标识部、环境部、数据部和过程部四部分书写,COBOL程序结构的“部”内包含“节”,“节”内包含“段”,段内包含语句,语句由字或字符串组成,整个源程序象一棵由根到干,由干到枝,由枝到叶的树,习惯上称之为树型结构。 目前COBOL语言主要应用于情报检索、商业数据处理等管理领域。 常用的高级程序设计语言,除了上述的几种之外,还有很多,如以英国著名诗人拜伦(G.N.G.Byron)的独生女艾达·拜伦(Ada Byron)的名字命名的军用语言Ada,深受中、小学生欢迎的语言LOGO等等。 目前,程序设计语言及编程环境正向面向对象语言及可视化编程环境方向发展,出现了许多第四代语言及其开发工具。如:微软公司(Microsoft)开发的Visual系列(VC++、VB、FoxPro)编程工具及Power Builder等,目前已经在国内外得到了广泛的应用。
为您推荐:
其他类似问题
您可能关注的内容
计算机程序设计语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。社会化媒体
了解更多>>
桂ICP备 号
阅读下一篇
自媒体运营攻略
行业经验交流
Hi,在你登录以后,就可以永久免费的收藏任何您感兴趣的内容,关注感兴趣的作者!
手机注册或邮箱注册
点击按钮进行验证
请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
你输入的邮箱还未注册
还没有帐号请点击
点击按钮进行验证
你输入的邮箱还未注册
又想起来了?
你已成功重置密码,请妥善保管,以后使用新密码登录
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
转藏至我的藏点计算机语言设计:列表的理解以及为什么它是有害的 - 开源中国社区
计算机语言设计:列表的理解以及为什么它是有害的
英文原文:
This page explains what is List Comprehension, with examples from several languages, with my opinion on why the jargon and concept of “list comprehension” are unnecessary, and harmful to functional programing.
本文将列举不同编程语言的几个小例子,尝试解释什么是列表解析。并且试图宣扬我的观点:“列表解析”不论从概念上还是技术上,完全是函数式编程的一根阑尾——多余而且某种程度上还是有害的。
What is List Comprehension?
Here's a example of List Comprehension (LC) in python:
S = [2*n for n in range(0,9) if ( (n % 2) == 0)] print S # prints [0, 4, 8, 12, 16]
It generates a list from 0 to 8 byrange(0,9), then remove the odd numbers by( (n % 2) == 0), then multiply each element by 2 in2*n, then returns a list.
Python's LC syntax has this form:
[myExpression for myVar in myList if myPredicateExpression]
In summary, it is a special syntax for generating a list, and allows programers to also filter and apply a function to the list, but all done using expressions.
其它翻译版本:1(点击译者名切换)
何为列表解析?
以python中的列表解析为例:
S = [2*n for n in range(0,9) if ( (n % 2) == 0)] print S # prints [0, 4, 8, 12, 16]
它产生一个0到8的列表,将奇数从该列表中移除,最后将剩余元素乘2,最后返回所得列表。
Python的列表解析(LC)的语法如下:
[myExpression for myVar in myList if myPredicateExpression]
总而言之,这种特殊语法产生一个列表,并且允许程序员对其中元素进行过滤,以及将其中元素作为参数传给一个函数,但是所有这些都已“表达式”的形式出现。
(译者注:这个语法本身也是一个“表达式”,所以可以嵌套使用。)
In functional notation, list comprehension is doing this:
map( f, filter(list, predicate))
Other languages's LC are similiar. Here are some examples from Wikipedia. In the following, the filter used isx^2 & 3, and the2*xis applied to the result.
s = [ 2*x | x &- [0..], x^2 & 3 ]
seq { for x in 0..100 do if x*x & 3 then yield 2*x } ;;
[? 2 * x | x &- 0 -- max_int ; x * x & 3 ?];;
(take 20 (for [x (iterate inc 0) :when (& (* x x) 3)] (* 2 x)))
Common Lisp
(loop for x from 1 to 20 when (& (* x x) 3) collect (* 2 x))
S = [2*X || X &- lists:seq(0,100), X*X & 3].
val s = for (x &- Stream.from(0); if x*x & 3) yield 2*x
Here's how Wikipedia explains . Quote:
A list comprehension is a syntactic construct available in some programming languages for creating a list based on existing lists.
列表解析的函数式的写法是这样的:
map( f, filter(list, predicate)) 其他语言的列表解析是相似的。这儿有几个来自维基百科的例子。在下面的例子里,x^2&3作为条件,然后把每个元素乘以2返回结果.
s = [ 2*x | x &- [0..], x^2 & 3 ]
seq { for x in 0..100 do if x*x & 3 then yield 2*x } ;;
[? 2 * x | x &- 0 -- max_int ; x * x & 3 ?];;
(take 20 (for [x (iterate inc 0) :when (& (* x x) 3)] (* 2 x)))
Common Lisp
(loop for x from 1 to 20 when (& (* x x) 3) collect (* 2 x))
S = [2*X || X &- lists:seq(0,100), X*X & 3].
val s = for (x &- Stream.from(0); if x*x & 3) yield 2*x 这里是维基百科对
的解释,引用如下:
A list comprehension is a&
syntactic construct
&available in some programming languages for creating a list based on existing lists.
The following features makes up LC:
① A flat list generator, with the ability to do filtering and applying a function.
② A special syntax in the language.
③ The syntax is one single expression, not made of separate functions.
列表理解(LC)有以下特征:
*1.一个直接的列表生成器,可以对元素进行过滤,并且对每个元素应用一个函数
*2.是某些语言里面的特殊语法
*3.这种语法是一个单独的表达式,而不是由单独的函数组成
Why is List Comprehension Harmful?
o List Comprehensio It hampers communication, and encourage misunderstanding.
o List Comprehension is a redundant concept in programing. It is a very simple list generator. It can be easily expressed in existing functional formmap(func, filter(list, predicate))or imperative form e.g. perl:for (0..9) { if ( ($_ % 2) == 0) {push @result, $_*2 }}.
o The special syntax of List Comprehension as it exists in many langs, are not necessary. If a special purpose function is preferred, then it can simply be a plain function, e.gLC(function, list, predicate).
为什么列表理解是有害的?
列表理解就像一个不透明的俚语一样,它妨碍沟通,造成误会
列表理解是编程里面一个冗余的概念。它只是一个简单的列表生成器。他可以被简单的功能函数formmap(func,filter(list,predicate))代替,或者被一些语句代替,比如perl:for (0..9) { if ( ($_ % 2) == 0) {push @result, $_*2 }}.
这种存在于多种语言中的特殊语法,其实不是必要的。如果需要这样的函数,那么它可以直接是一个一般的函数,比如LC(function,list,predicate).
Map + Filter = List Comprehension Semantics
The LC's semantics is not necessary. A better way and more in sync with functional lang spirit, is simply to combine plain functions:
map( f, filter(list, predicate))
Here's the python syntax:
map(lambda x: 2*x , filter( lambda x:x%2==0, range(9) ) ) # result is [0, 4, 8, 12, 16]
In Mathematica, this can be written as:
Map[ #*2 &, Select[Range@9, EvenQ]]
In Mathematica, arithemetic operations can be applied to list directely without using Map explicitly, so the above can be written as:
Select[Range@9, EvenQ] * 2
It can also be written in a linear prefix style:
(#*2 &) @ (Select[#, EvenQ]&) @ Range @ 9
or linear postfix style:
9 // Range
// (Select[#, EvenQ]&)
// (#*2 &)
列表解析语法并不是很有必要。一个更好更一致的方法是用函数式语言的精髓,使用普通函数的组合。
map( f, filter(list, predicate))
这是python的语法
map(lambda x: 2*x , filter( lambda x:x%2==0, range(9) ) ) # result is [0, 4, 8, 12, 16]
在Mathematica中,可以这样写
Map[ #*2 &, Select[Range@9, EvenQ]] 在Mathematica中,算术操作符可以不使用Map而直接映射到列表,因此上面的代码可以这样写:
Select[Range@9, EvenQ] * 2
还可以写成线性前缀风格:
(#*2 &) @ (Select[#, EvenQ]&) @ Range @ 9 或者线性后缀风格:
9 // Range
// (Select[#, EvenQ]&)
// (#*2 &)
In the above, we sequence functions together, as in
. We start with 9, then apply “Range” to it to get a list from 1 to 9, then apply a function that filters out odd numbers, then we apply a function to multiply each number by 2. The “//” sign is a postfix notation, analogous to bash's “|”, and “@” is a prefix notation that's the reverse of “|”.
在上面,我们就像Unix里的管道那样排列函数在一起。我们从9开始,使用“Range”来获取一个1到9的列表,然后使用一个函数来过滤出偶数,接着我们使用一个函数来把过滤出来的每个数字乘以2。符号“//”是一个后缀符号,类似于bash(shell)的“|”符号,同时,“@”是一个与“|”相反的符号。
List Comprehension Function Without Special Syntax
Suppose we want some “list comprehension” feature in a functional lang. Normally, by default this can be done by
map(func, filter(inputList, Predicate))
but perhaps this usage is so frequent that we want to create a new function for it, to make it more convenient. As a single standalone function, it is easier for compiler to optimize. So, we might create a function LC like this:
LC(func, inputList, Predicate)
this is about whether a lang should create a new convenient function that otherwise require 3 function combinations. Common Lisp vs Scheme Lisp are the typical example of extreme opposites.
无需特殊语法的列表理解函数
在函数式语言中,假如我们想要“列表解析”这一特性。通常地,默认情况这可以这样做
map(func, filter(inputList, Predicate))
但这种用法会很频繁,我们想为此创建一个更方便的函数。作为一个独立的函数,它更容易被编译器优化。因此,我们可以创建一个函数LC像这样:
LC(func, inputList, Predicate)
这个关系到一种语言是否应该创建一个更方便的新函数,否则就需要3个函数的组合。Common Lisp和Scheme Lisp是极端对立的典型例子。
Note, there's no new syntax involved.
Suppose, someone argues that
For instance, this is far more convenient:
[x+1 for x in [1,2,3,4,5] if x%2==0]
than this:
map(lambda x:x+1,filter(lambda x:x%2==0,[1,2,3,4,5]))
How about this:
LC(func, inputList, P)
compared to
[func for myVar in inputList if P]
the functional form is:
Not another idiosyncratic new syntax
其它翻译版本:1(点击译者名切换)
注意,这里没涉及到新的语法。
假设,某人对下面的有争论:
实际上, 这个语法:
[x+1 for x in [1,2,3,4,5] if x%2==0]
远比这个语法方便:
map(lambda x:x+1,filter(lambda x:x%2==0,[1,2,3,4,5]))
那么这个:
LC(func, inputList, P) 与以下的比较
[func for myVar in inputList if P] 这函数式格式:
没有其他特别的新语法
Issues and Decisions on Creating a New Function
Suppose we decided that generating list by a filter is so frequently used that it is worthwhile to create a new function.
LC(func, inputList, Predicate)
Now, in functional langs, in general a design principle is that you want to reduce the number of function unless you really need it. Because, any combination of list related functions could potentially be a new function in your lang. So, if we really think LC is useful, we might want to generalize it to maximize a function's utility.
创建一个新函数的问题和决策
假设我们决定通过过滤器生成列表,这个操作很频繁,是值得创建的一个函数。
LC(func, inputList, Predicate)
现在,在函数式语言中,一般的设计原则是你应该减少函数的数目,除非你真的需要。因为在你的语言里相关函数的任何组合列表可能成为一个新的函数。因此,如果我们确实认为列表解析是有用的,我们可能会
推广到最大限度地发挥一个函数的作用。}

我要回帖

更多关于 设计一门计算机语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信