`
webcenterol
  • 浏览: 951007 次
文章分类
社区版块
存档分类
最新评论

我的编程语言观

 
阅读更多

我的编程语言观<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

leezy_2000

此文只代表个人观点,仅供参考

关于编程语言的争论虽然此伏彼起,但事实上很少有人真的在做编程语言的比较,同时许多无价值或错误的观点却在真实的误导着许多程序员的认识,为此我决定写这篇文章。

一、前提

本文后述观点是基于这样一种前提:只关注语言特性,而忽略标准库和其他各种商业框架(虽然这些更大程度上决定着人们对语言的选择)。这必将使这篇文章的观点更具有理论意义,而非现实意义。但语言特性是编程语言的根本,无论是做语言比较,还是评论语言,都应该以此为出发点,否则将导致讨论范围的无限增大,进而导致讨论的无结果。为避免有人找碴,必须预先声明的一点是,由标准库实现的语言特性将被看作语言特性,进而列入考虑的范围。同时这里说的编程语言是指一些通用目的的高级编程语言,比如C/C++,Java,Python,Perl等。

二、80% 20%

我学习不同的编程语言时,更多的时候是感觉到其间的共性。于是我对此进行思考,发现这种共性的存在具有必然性。

软件的根本特性是复杂性,对此Dijkstra告诉我们,掌握复杂性的技巧早在古代就有了:divide et impera(分解和规则)”。当我们具体进行分解和设定规则时,我们要用到一些分析和设计方法。当代两大主流分析和设计方法是结构化和OO。结构化设计方法的三种基本结构是顺序,分支和选择。OO的三大基本特性是封装,继承和多态。各种设计语言通常都支持这两种分析和设计方法,其基本语言特性也必然涵盖上述六个要素。所以从这个角度看不同编程语言必然具有相当多的共性。

可为佐证的首先是《The Art of Computer Programming》这本书。这本书中的算法用低级语言描述的,但其内涵被大多掌握不同编程语言的开发人员所分享。有人评论说,当今软件开发人员所掌握的绝大多数计算机程序设计的知识都来源于此,这意味着相当多程序设计知识可以具体实现在各种编程语言中。

另一个是《设计模式》,你很难说那个设计模式是专属于那种语言的,大多的设计模式可以用各种编程语言来实现的。虽然具体的实现上会因为语言特性而做相当的调整。应该可以说不同的编程语言在某个确定的设计模式面前,体现的也是共性。

把上面的内容总结一下就是:很多的场合下,不同的语言是可以互换的。互换的基础是不同种语言间的共性,而存在这些共性的基本原因是不同的编程语言要支持的根本思想中大部分是相同的。

故老相传,学到高处,语言间切换是很容易的,很多人的经历也验证了这句话。上面说的正是这句话的所以由来。

这里没有把各种语言等同起来的意思,但编程语言的个性同共性相比反倒是较小的部分。它们往往成为关注的焦点,同时也是存在这么多编程语言的一个主要原因。

大多数人对此的体验大概来自基本语法,事实上这是让人非常懊恼的一个方面。基本语法的不同起源于什么无从考证,但根本事实是这种不同在浪费学习者的时间。我们来做个类比大家就知道这种浪费有多么不值得,UML出现前,OO表示法主流上有三种,他们表达意思差不太多,但他们不一样。学习的人,工作的人要为同一件事花近三倍的力气(要不然别人用另外的表示法写的文档你怎么看的懂),现在这些人得到了解放。但在编程语言领域这种糟糕的事仍然在继续,差不多每个人都要记住好多种if语句,虽然事实上它们可以统一。

抛却基本语法不谈,其它的方面是真的不多。即使把C++Python这两种差别非常巨大的语言放在一起进行类比。一时间能想起的主要差别也只有:Python内置了listtuple等一些数据结构作为内置类型(当然还有与此相关的操作)。而C++中要用基本类型对此进行定义。Python支持函数生成器和函数嵌套定义。而C++不支持。Python是动态类型语言,先天具有范型能力。而C++要通过模板的概念支持范型。这不是一个完整的列表,如果愿意,这个列表确实可以变长,但另外一张反映共性的标通常会更长。

(注:我没有参考相应的书籍把两者的语言特性一一罗列,并彻底的比较其异同,仅是把平常使用时经常用到的语言特性想了一下,写了上面的东西。如果那位使用过两种以上的语言,我也建议能用这种方式来确定两种不同语言的常用部分有多大的重叠度。)

这也正是题目所说的80%20%的根本含义。不同的语言虽然看起来差别很大,但共性要大于个性。至于是不是41的关系,老天知道,那位感兴趣,可以统计出一份数据来。

三、结论

(事先声明,这里是从学习的角度来下这个结论,而非混饭的角度)

好多年前就有这句话:编程语言并不重要,设计思想才重要。这几年在托鼠标即是编程的大潮中,这句话逐渐被遗忘了。

在这篇文章的结尾,我想对这句话进行一些诠释。编程语言不是不重要,光有想法,基本语法都搞不清楚的人肯定什么都做不出来。但而后呢?不停的学习新的语言,接触新的语法么?从上面的分析看,如果你这样做,那意味着你在做重复劳动,并且没有实际的进步。真的程序员不该如此堕落,总要学些思想性的东西吧。总不能去研究怎么才能把一个钮拖到另一个地方的路径缩到最短吧?

学习编程语言,熟悉基本语法后,一定要关注某些语言特性背后所承载的东西。但

单知道这两样仍然是不够的,还要知道什么时候这些被承载的东西适合使用。这是远比前两者更难的东西。

为避免结论过于抽象,举个例子来描述这三重境界:比如说学习模板的时候,第一步是要把基本语法搞清楚,要能够确保写出来的模板类、模板函数没有语法错误,能够通过编译。第二步要去理解范型这种思想,去思考范型存在的根本目的是什么?第三步是能够在碰到具体问题时,来正确的取舍是否需要使用这种特性,用的话又怎么去用。

四、尾声

程序员作为一个笼统的称呼,其真正的含义正在分化。Bjarne Stroustrup自称:“是的,我是一个程序员”。而一个只会拖拖鼠标,完成指定功能的新手,通常我们也称之为程序员。但事实上这同一个称呼,其内在含义是不一样的。

可视化编程和RAD的快速发展所产生的一个明显后果就是,所谓的软件蓝领离我们是如此之近。并且越来越多的人以闪电般的速度切入这个队伍。这又是怎么样一场绚丽却虚假的繁华。于是许多妖言应势而生,最为让人哭笑不得的莫过一句“程序员是吃青春饭的”。这未免太小觑程序员这个职业了,这句话成立的前提是做程序员没什么难度,不需要什么积累,主要是力气活。诚然如果程序员只是一个拖鼠标的职业,那么年富力强者具有先天的优势。但很不幸大多时候他不是,或者说不应该是。

在这里我姑且漠视许多公司对软件蓝领的呼唤,单从个人发展的角度提醒一句,实践实用主义的同时,莫要忘了什么是编程的根本,莫要忘了提升自己的境界。

分享到:
评论

相关推荐

    面向对象的分布式脚本编程语言Reia.zip

    Reia是一种面向对象的分布式脚本编程语言。 运行在erlang虚拟机上,它的语法像Ruby/Python。 1.它是一种脚本语言,类似Ruby,Python 2.它是面向对象的,类似Ruby 3.它是面向分布式计算的,运行在erlang虚拟机上 ...

    编程语言项目式教学的课程思政实践及研究——以“Java企业级开发”教学为例.pdf

    编程语言项目式教学的课程思政教学具有明确的特征,教学目标将立德树人作为根本任务引领知识学习和能力培养,要求树立正确的三观,同向同行,形成协同效应。为了落实立德树人根本任务,必须将价值塑造、知识传授和...

    2023NOC软件创意编程赛项真题图形化小学高年级-决赛

    本次赛事特设小学高年级组别,并采用了图形化编程语言作为主要编程工具。图形化编程语言以其直观易懂的特点,降低了编程学习的门槛,使得小学生也能轻松上手。 ### 二、图形化编程语言 #### 1. 定义与特点 图形化...

    java编程语言的源码,可供应用学习

    Java编程语言是全球广泛使用的高级程序设计语言,以其“一次编写,到处运行”的特性而闻名。这个压缩包中包含的源码提供了深入学习Java语言的机会,涵盖了从基础语法到高级特性的各个方面。以下是对Java编程语言及其...

    《语言深入编程综合实训》教学大纲.docx

    语言深入编程综合实训教学大纲 《语言深入编程综合实训》教学大纲是地理信息科学专业的一门综合性工程实践课程,旨在帮助学生掌握语言深入编程的基本理论和知识,具备分析和解决实际问题的实践能力。本课程是对学生...

    tasteofhaskell:Haskell编程语言快速入门

    哈斯克尔的味道Haskell编程语言的快速介绍。 在线大纲第1部分Haskell的主要功能价值观和职能内置类型,函数类型,类型推断运营商列表,惰性评估,元组傻瓜第2部分多态类型,类型类约束内置类型类,类型推断咖喱,高...

    forward:基于堆栈的编程语言

    forward:一种基于堆栈的编程语言。 一种基于堆栈的编程语言。 足够强大,简单,正确。 文档: ----- 使命 创建一种简单到可以在一周内完全理解的编程语言,但具有足够强大的思维模型,以允许其在不同的问题域中...

    基于《Java高级编程语言》的“五主”教学法探讨.pdf

    "基于《Java高级编程语言》的“五主”教学法探讨" 基于《Java高级编程语言》的“五主”教学法探讨,旨在解决职业技术院校学生职业技能培养的教育教学方法问题。本文通过对传统教学方法进行组合优化,提出了“五主”...

    编程笔记、观影指南、读书笔记、生活感悟、Switch游戏.zip

    前言我的年度计划新闻观影隨筆學编程其他JavaLeetCode 题解思维导图系列Redis 源码剖析系列春天遊戲我的博客我的公众号关于转发前言很早之前读过《Java编程思想》,用思维导图做笔记把思维导图的截图贴在了简书上,...

    C++编程艺术(对C++编程的独到理解)

    《C++编程艺术》是一本深入探讨C++编程技巧与理念的著作,旨在提供对C++编程的独特理解和实践智慧。本书不仅涵盖了C++的基础语法,更...无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的编程技能和审美观。

    Scratch2创意编程

    Scratch是一种面向儿童和初学者的编程语言,它由麻省理工学院媒体实验室终身幼儿园团队开发,是一个图形化编程环境,使用户能够创建故事、游戏、动画和交互式艺术作品等。Scratch的目标是提供一个易于使用且有趣的...

    2021少儿编程教育行业报告.pdf

    技术是少儿编程市场发展的核心驱动力之一,自主研发的少儿编程语言和工具符合中国孩子的学习习惯,有助于形成独特的产品生态和技术优势。IP运营与游戏化教学的结合,能显著提升学员学习编程的动力。 知识点五:市场...

    Java极限编程.rar

    3. **Java与极限编程的结合**:Java作为一种强类型、面向对象的语言,与XP的理念相结合,可以提供良好的可维护性和扩展性。例如,利用Java的接口和抽象类进行设计,支持TDD中的单元测试,以及使用JUnit等工具进行...

    成为编程高手的八大奥秘

    了解编译原理不仅能够帮助程序员编写更高效的代码,还能增强对编程语言特性的理解,从而更好地利用这些特性。 #### 二、丰富的想象力 编程不仅仅是技术活,也是一种创造性的活动。拥有丰富的想象力意味着能够跳出...

    Python编程教案(1).docx

    随着科技的迅猛发展,编程已成为一项重要的技能,Python语言以其易学易用、跨平台、拥有庞大库支持等特点,在众多编程语言中脱颖而出。为了培养更多掌握Python编程技能的人才,相应的教学材料也显得尤为重要。本篇...

    学习计算机编程需要什么基础知识.docx

    本文将详细探讨学习计算机编程所需的基础知识,以及如何选择合适的编程语言和学习路径,帮助初学者做好准备,开启IT世界的大门。 首先,选择一门编程语言是学习计算机编程的首要任务。考虑到不同的应用场景和编程...

    scratch创意编程《画任意正多边形》的教学设计.docx

    本教学设计旨在帮助学生掌握 Scratch 编程语言,培养学生的计算思维能力和信息意识。通过本教学设计,学生将学会使用模块中的指令,学会使用模块中的和指令,学会使用模块中的指令。同时,本教学设计还旨在培养学生...

    编程人员面试简历模版

    3. **技能列表**:列出你掌握的编程语言、框架、工具和技术,并按照熟练程度排序。例如,C++、Java、Python、JavaScript,数据库管理,前端框架(React、Vue、Angular),版本控制(Git),云计算平台(AWS、Azure、...

Global site tag (gtag.js) - Google Analytics