计算机编程
一位维基教科书用户建议将竞赛编程合并到本书中。 在讨论页面上讨论是否应该进行合并。 |
计算机编程是编写有用、可维护和可扩展的源代码的工艺,这些代码可以被计算系统解释或编译以执行有意义的任务。 计算机编程可以使用多种语言执行,从高级语言到直接用低级机器码编写(即更直接控制计算机硬件细节的代码),一直到编写微代码(直接控制计算机电子器件)。
使用编程语言和标记语言(如XHTML和XForms)需要一些相同的技能,但使用标记语言通常不被认为是“编程”。 然而,许多标记语言允许包含脚本,例如许多HTML文档包含JavaScript。 有一些例外情况,标记语言确实代表了编程,例如SuperX++(http://xplusplus.sourceforge.net/)和o:XML (http://www.o-xml.org/)
计算机编程是更大的学科(称为软件工程)的一部分,其中包括软件制作的几个不同方面,包括设计、构建和质量控制。 本书的主题是软件构建,即编程。 计算机编程对于那些对计算机科学感兴趣的人来说也是一项有用的技能(尽管并不总是必要的)。 软件工程专门研究制作软件,而计算机科学往往倾向于更理论或数学问题。
许多人认为他们必须选择一种特定的编程语言才能成为程序员,他们相信他们只能做那种语言。 他们会问自己,“我应该成为一个C程序员还是一个Java程序员?” 这是一个完全错误的问题。 正确的问题是“我怎样才能成为一个优秀的程序员?” 不幸的是,就业市场通过公司为具有特定(因此有限的)计算机语言技能的员工发布招聘广告以及人力资源 (HR) 处理招聘响应的方式,极大地助长了人们对计算机编程的误解,因为他们没有编程背景。
关于优秀的程序员对特定计算机语言的了解,我们可以说几点。 首先,许多语言基于相同的基本构建块。 学习一门语言应该被视为一种获取这些概念的方式,而不是语言或机器特定的技术。 其次,优秀的程序员通常精通不止一门语言,因为发现解决问题的不同方法本身很有趣且有用。 掌握多种语言甚至不止一门语言并非必要——程序员可以擅长一门语言,并且只对其他语言有一个模糊的工作概念。 了解解决计算机问题的多种方法(也称为算法)是有用的。 一种算法是完成任务的一组明确定义的指令,而了解多种语言意味着能够以多种不同的方式列出计算机指令。 由于计算机编程语言有很多共同点,因此一旦掌握了一种编程语言,通常很容易学习新的编程语言。
那么你如何开始呢? 一种合理的技术就是选择一门语言并开始学习。 不幸的是,我们无法为所有人提供适用于所有用途的正确计算机语言。 问十位程序员你应该学习哪种语言,你会得到十个不同的答案。 考虑到维基教科书的协作性质,你可能会得到与网站上编程语言书籍数量一样多的答案。
对于不熟悉计算机编程的人来说,存在一个普遍的误解,即所有编程语言本质上都是一样的。 在某种意义上,这是正确的,因为所有数字电子计算机都将编程语言转换为一系列称为二进制或机器码的零和一。
虽然主流个人计算机语言往往源于特定传统并且非常相似(因此产生了这种误解的流行),但有些语言属于不同的范式,这些范式提供了截然不同的编程体验。 使用Java进行编程与使用汇编语言进行编程有很大不同,而使用Haskell或Prolog或Forth等语言进行编程也有很大不同。
在《美国科学家》杂志文章《分号战争》[1]中,Brian Hayes 将语言分为四类:命令式、面向对象、函数式和声明式。 命令式和面向对象语言往往在主流中使用,而函数式和声明式语言往往在学术界使用。 函数式和声明式编程爱好者可能会争辩说,这些范式领先于主流 20 年,并且在许多方面都优于主流; 然而,主流语言倡导者可能会反驳说,这些范式很难学习,或者由于其不受欢迎的性质,在实践中并不实用等等。 我们不会对谁对谁错发表任何评论,但至少,我们建议熟悉这四种主要范式是一项非常有价值的练习。
在计算机领域,所有事物都是通过编程来制造的,并且主要由编程来运作。 尽管编程是任何计算机或应用程序功能的重要组成部分,但并非所有编程语言都相同。 事实上,它们彼此之间非常不同,具有不同的用途、功能和不同的复杂程度。 编程语言最基本的说法是,它是一组用于编写计算机程序的规则或指南。 即使是你编写程序,你可能也需要特定类型的软件或程序来使用你所使用的语言。 可以使用的编程语言类型很多,每种语言都有不同的规则集。 编程有两个基本类别。 有低级语言和高级语言,两者之间的区别在于低级语言通常使用 0 和 1,这有效地使计算机能够快速理解需要执行的操作。 高级语言更容易编写,因为它们更接近英语,并且编写起来更灵活,尽管这些可读性也有不同的级别,并且这些语言的类别也可以编写。 一些例子是 Visual Basic、C++ 和 Java。
常见概念
[edit | edit source]编程语言往往有很多共同的概念。可以在下表中查看反复出现的基本概念以及它们在各种语言中的表达方式。
←
语言概念表以及它们在各种语言中的表达方式。
维基代码 | Ada | C | C++ | Java | C# | Perl | Delphi | PHP | Python | VB | VBNet | J2ME |
---|---|---|---|---|---|---|---|---|---|---|---|---|
语句 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 |
控制语句 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 |
变量 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 |
类型 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 |
类型转换 | 没有页面 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
数学计算 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 |
过程和函数 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 |
函数重载 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
结构和样式 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 |
字符串操作 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 |
输入和输出 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 |
内存管理 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
错误处理 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 |
面向对象编程 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 |
泛型编程 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
并发编程 | 页面在此 | 没有页面 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
包和模块 | 页面在此 | 页面在此 | 没有页面 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 页面在此 | 没有页面 | 没有页面 | 没有页面 |
库 | 页面在此 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
组合语言 | 页面在此 | 页面在此 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 | 没有页面 |
要查看各种编程语言中语法的比较,请参阅“Hello World”示例。要查看按语法术语和模式排列在一起的各种计算机语言列表,请参阅维基百科的计算机语法模式列表。
编程技能
[edit | edit source]计算机编程实际上就是解决问题。事实证明,你在现实世界中遇到的许多问题实际上只是一些更普遍问题的特例。幸运的是,许多这些问题已经由计算机科学家研究了很长时间,有时会产生可以证明无懈可击的解决方案,有时会产生足够满足日常需求的解决方案。简而言之,学习一门语言会给你带来技能,但学习数据结构和算法会教你如何明智地运用这些技能。
数据结构和算法
[edit | edit source]与语言相关的技能
[edit | edit source]面向应用程序编程
[edit | edit source]面向平台编程
[edit | edit source]功能
[edit | edit source]编程史
[edit | edit source]总体趋势
[edit | edit source]特定语言
[edit | edit source]以下语言值得特别关注,它们是结构化编程语言和面向对象编程发展过程中的重要语言。它们值得理解,因为它们引入了新的概念。
- ALGOL
- 是第一种结构化编程语言,因此是所有现代命令式语言的基础。它围绕着块的概念构建,块由 BEGIN 和 END 限定,包含声明和语句。ALGOL 是一种递归的通用语言,包括递归调用,当时人们认为这在 FORTRAN 和 COBOL 等语言中太难了。ALGOL 是一种堆栈语言,因此当进入块时,声明的变量被压入堆栈,当块退出时,堆栈被缩减。没有声明的块实际上不是块,而是复合语句,不会造成堆栈构建开销。ALGOL 最初被开发为ALGOL 58,基于形式化的BNF(巴科斯-诺尔范式) 语言设计表示法。ALGOL-60 是一个修订版,它构成了许多其他语言的基础,例如ALGOL-68、ALGOL-W、Pascal、Modula-2、Oberon、C、C++、Java、Simula、Ada 和 Eiffel。ALGOL-60 是第一种用于Burroughs B5000 堆栈机器操作系统中系统编程的语言,在 1960 年代早期(当所有其他都用汇编语言编程,而 ALGOL 在 2006 年仍在使用当前 ALGOL 手册)。学习 ALGOL 将教会你块结构语言和结构化编程概念的基础。
- Simula
- 是 1967 年开发的第一种面向对象语言,它以 ALGOL-60 为基础(就像 C++ 使用 C 一样)。它最初被设想为一种模拟语言(因此得名),用于对现实世界系统进行建模。由于 ALGOL 是一种块结构语言,块在被调用时被压入堆栈,并在退出时从堆栈中删除,因此 Simula 使程序摆脱了这种限制。因此,块可以被进入,但当代码退出时,该块会保留在堆中,而不是堆栈中 - 因此对象诞生了。但是,与其他语言中的记录和结构(结构体)不同,过程与这个保存的块相关联,因此程序员可以定义一个完整的代数来操纵实体。因此,在外部块(类)中声明的变量在原始调用块代码(现在将被视为构造函数或创建例程)之后仍然存在。类中的局部变量和过程的参数会在调用时被压入堆栈,并在退出时被弹出,但会操纵对象的持久状态。类设施可以通过继承进行抽象。Simula 还包含一个复杂的并发范式。学习 Simula 将教会你面向对象和模拟概念以及并发概念以及协程和协作进程的使用。
- Smalltalk
- 由Adele Goldberg、Alan Kay(Windows 的真正发明者)和 Xerox PARC 的其他人在开发。它是一种面向对象的语言,具有自然语言语法。它是一种无类型语言,因此非常灵活和动态,可以快速完成代码,但会导致运行时异常,这些异常在编译时会被类型化语言捕获。它的概念是 Objective-C 的基础。学习 Smalltalk 将教会你使用非常不同的语法的无类型语言中的面向对象编程。
- C++
- C++(发音为“see plus plus”)是一种通用的、面向对象的、静态类型的、自由形式的、多范式编程语言,支持过程式编程、数据抽象和泛型编程。在 1990 年代,C++ 成为最流行的计算机编程语言 之一。
- Bjarne Stroustrup 来自贝尔实验室,是 C++(最初名为“带类的 C”)的设计者和最初的实现者,他在 1980 年代将其作为对 C 编程语言 的增强。增强从添加 类 开始,随后又添加了许多特性,包括 虚函数、运算符重载、多重继承、模板 和 异常处理,这些以及其他特性在关于该主题的几个 Wikibooks 中有详细介绍。
- C++ 编程语言标准于 1998 年被批准为ISO/IEC 14882:1998,其当前版本是 2003 年版本,ISO/IEC 14882:2003。
- 1998 年的 C++ 标准包含两部分:核心语言和标准库;后者包括 标准模板库 和 C 的标准库。许多 C++ 库存在于标准之外,例如 Boost。此外,用 C 编写的非标准库通常可以被 C++ 程序使用。
- C++ 中引入的特性包括声明作为语句、函数式强制转换、new/delete, bool、引用类型、const, inline函数、默认参数、函数重载、命名空间、类(包括所有与类相关的特性,例如继承、成员函数、虚函数、抽象类和构造函数)、运算符重载、模板、::运算符、异常处理、运行时类型识别,以及在几种情况下进行更多类型检查。以两个斜杠("//")开头的注释最初是 BCPL 的一部分,并在 C++ 中被重新引入。C++ 的几个特性后来被 C 采用,包括const, inline、在for循环中的声明,以及 C++ 风格的注释(使用//符号)。
- Visual Basic
- Visual Basic 是世界上最常用的编程语言之一。这是因为它简单易用。BASIC 代表初学者通用符号指令代码,它是在美国达特茅斯学院为学生开发的。Visual Basic 扩展了语言的功能,因此创建窗口、标题栏、输入框、标签、消息框和按钮与从工具栏上拖动您要编码的项目到表单(本质上是一个空白窗口)一样简单。VB 的最基本功能之一是消息框命令。如果我想让一个消息框出现并显示选定的消息,我只需要输入:msgbox "hello world"
附加信息
[edit | edit source]编辑器
[edit | edit source]编辑器只是一个文本程序,比如记事本。据说程序员最好的朋友是编辑器。一个好的编辑器应该是轻量级的,只包含必要工具,并且应该支持您语言的语法高亮显示。
我们有教学书籍的好的编辑器的例子有(按字母顺序)
- Emacs
- 一个可扩展的、可定制的、自由/自由的文本编辑器 - 等等。它的核心是一个 Emacs Lisp 解释器,它是 Lisp 编程语言的一种方言,具有支持文本编辑的扩展。
- Vim
- 这个编辑器的缩写是 Vi Improved,它是根据经典的 Unix 编辑器 vi 建模的。但是,Vim 是一款更加现代的编辑器,它有一个可选的图形界面,并且有很多 vi 没有的特性,这使得它成为有 vi 使用经验的人的首选编辑器。
有关更多文本编辑器,请参阅维基百科的 文本编辑器类别。
工具
[edit | edit source]- gcc,一个免费的编译器集合(Ada、C、C++、Fortran、Java、Objective-C、Objective-C++)。
- make,最流行的构建脚本语言。
- Apache Ant,一个基于 XML 的构建脚本语言,类似于 Make。
- 有些人会在编程时使用集成开发环境 (IDE)。
- Eclipse,一个软件框架,用作 Java、C++、PHP、Python 和其他几种语言的 IDE。
- 维基百科:集成开发环境比较 列出了每种流行编程语言的 IDE。
- Microsoft Visual Studio,一个 IDE(包含编译器)。支持 C、C++、C++/CLI(通过 Visual C++)、VB.NET(通过 Visual Basic .NET)、C#(通过 Visual C#)和 F#(从 Visual Studio 2010[9] 开始)。对其他语言的支持,例如 Python、Ruby、Node.js 和 M 等,可以通过单独安装的语言服务获得。它还支持 XML/XSLT。
- 有些人使用版本控制系统。这些系统让回答“上周的版本可以工作,这周的版本不行。发生了什么变化?”变得容易得多。
流行的库
[edit | edit source]Unix 原生
Windows "原生"
跨平台
- Allegro
- wxWidgets
- OpenGL
- Qt - 流行的面向对象的 C++ GUI 框架。 KDE 是基于它的。各种语言的绑定都可用。
- XUL 基于 XML 的 GUI。
- 简单直接媒体层 (SDL)
格式参考
[edit | edit source]其他
[edit | edit source]- 编码风格
- 调试
- UNIX 中的 C 网络编程
- 计算机编程入门
- 初学者编程论坛
- Hello World 示例 许多编程语言中的 Hello World 程序示例
参考文献
[edit | edit source]- 如何设计程序
- 计算机程序的结构与解释 (视频)
- 维基文库:如何像计算机科学家一样思考 及其翻译成 Python 的版本,Think Python
- 软件工程知识体系 (SWEBOK)