你真的了解电脑编程吗?


https://codedocs.org/about-us

关于 CodeDocs(免责声明)

CodeDocs.org 为最常用的编程语言提供教程、文档和参考,包括 HTML 或 CSS 等 Web 开发语言。每个教程都允许您直接在 try it 编辑器中尝试代码,这样您的学习将更加有效。
我们还为每个标签、属性、功能或命令提供文档,因此您需要的所有信息都在一个具有用户友好用户界面的位置。
您可以将我们网站的内容用于非商业目的,但您必须引用作者并链接到我们的网站。

by the way  这个CodeDocs相当不错,内容详实、链接丰富。 知识面相当宽广。


以下内容来自: https://codedocs.org/what-is/computer-programming

电脑编程

计算机编程是设计和构建可执行计算机程序以完成特定计算结果或执行特定任务的过程。编程涉及以下任务:分析、生成算法分析算法的准确性和资源消耗,以及在所选编程语言中实现算法(通常称为编码)。[1] [2]程序的源代码是用一种或多种程序员可以理解的语言编写的,而不是机器代码,由中央处理器直接执行。编程的目的是找到一系列指令,这些指令将自动执行计算机上的任务(可能与操作系统一样复杂),通常用于解决给定的问题。因此,熟练的编程通常需要几个不同学科的专业知识,包括应用领域、专业算法和形式逻辑的知识。

与编程相关的任务包括:测试调试源代码维护、构建系统的实现以及衍生工件的管理,例如计算机程序的机器代码这些可能被认为是编程过程的一部分,但术语软件开发通常用于这个更大的过程,术语编程实现编码保留用于实际编写代码。软件工程将工程技术与软件开发实践相结合。逆向工程是设计师、分析师和程序员用来理解和重新创建/重新实现的相关过程。[3]3

历史

 
Ada Lovelace在 Luigi Menabrea 的论文末尾添加了他的注释,其中包括为分析引擎设计的第一个算法她经常被公认为历史上第一位计算机程序员。

可编程设备已经存在了几个世纪。早在 9 世纪,波斯巴努穆萨兄弟就发明了可编程音乐音序器,他在《机巧之书》中描述了一种自动化的机械长笛演奏器。[4] [5] 1206 年,阿拉伯工程师 Al-Jazari 发明了一种可编程鼓机,其中音乐机械自动机可以通过钉子和凸轮来演奏不同的节奏和鼓模式。[6] [7] 1801 年,提花织机可以通过改变“程序”来生产完全不同的织法——一系列带有穿孔的纸板卡片。

密码破解算法也已经存在了几个世纪。9 世纪,阿拉伯数学家 Al-Kindi在A Manuscript on Deciphering Cryptographic Messages中描述了一种用于破译加密代码的密码算法。通过频率分析首次描述了密码分析,这是最早的密码破解算法。[8]

第一个计算机程序通常可以追溯到 1843 年,当时数学家Ada Lovelace发布了一种算法来计算一系列伯努利数,该算法旨在由查尔斯巴贝奇分析引擎执行。[9]

 
数据和指令曾经存储在外部打孔卡上,这些打孔卡井井有条并排列在程序卡组中。

1880 年代,Herman Hollerith 发明了以机器可读形式存储数据的概念。[10]后来,在他的 1906 年 I 型制表器中添加了一个控制面板(插板),使其能够针对不同的工作进行编程,到 1940 年代后期,IBM 602 和 IBM 604 等单元记录设备由控制面板编程以类似的方式,第一台电子计算机也是如此。然而,随着1949 年引入存储程序计算机的概念,程序和数据都以相同的方式在计算机内存中存储和操作。[11]

机器语言

机器代码是早期程序的语言,以特定机器的指令集编写,通常以二进制表示。汇编语言很快被开发出来,允许程序员以文本格式指定指令,(例如,ADD X,TOTAL),每个操作代码都有缩写,而有意义的名称则用于指定地址。但是,由于汇编语言只不过是机器语言的不同表示法,因此具有不同指令集的任何两台机器也具有不同的汇编语言。

 
IBM 402 会计机的有线控制面板。

编译器语言

高级语言使开发程序的过程更简单、更易于理解,并且与底层硬件的绑定更少。FORTRAN是第一个广泛使用的具有功能实现的高级语言,于 1957 年问世[12]并且很快开发了许多其他语言 - 特别是针对商业数据处理的COBOL和用于计算机研究的 Lisp 。

这些编译语言允许程序员使用语法更丰富的术语编写程序,并且更能够抽象代码,从而通过编译声明和启发式方法轻松针对不同的机器指令集。第一个编程语言编译器是由 Grace Hopper 开发的。[13]当 Hopper 于 1949 年去UNIVAC工作时,她带来了使用编译器的想法。[14] [15]编译器利用计算机的力量来简化编程[12] ,例如,允许程序员通过使用中缀符号(例如, Y = X*2 + 5*X + 9输入公式来指定计算。FORTRAN是第一个广泛使用的高级语言,它具有允许抽象可重用代码块的功能实现,于 1957 年问世[12]并且很快开发了许多其他语言 - 特别是针对商业数据处理的COBOL , 和Lisp用于计算机研究。1951 年,Frances E. Holberton 开发了第一台排序合并生成器,它在UNIVAC I上运行。[16]在 UNIVAC 工作的另一位女性 Adele Mildred Koss 开发了一个程序,该程序是报告生成器的先驱。[16]创建 COBOL 的想法始于 1959 年,当时在Burroughs Corporation工作的 Mary K. Hawes,召开会议讨论创建通用商务语言。[17]她邀请了六个人,包括格蕾丝·霍珀。[17] Hopper 参与了将 COBOL 开发为一种商业语言并创建“自文档化”编程。[18] [19] Hopper 对 COBOL 的贡献基于她的编程语言,称为FLOW-MATIC[15] 1961 年,Jean E. Sammet 开发了 FORMAC,还出版了Programming Languages: History and Fundamentals,后来成为编程语言的标准著作。[17] [20]

源代码入口

大部分程序仍然使用穿孔卡片或纸带输入。请参阅打孔卡时代的计算机编程。到 1960 年代后期,数据存储设备和计算机终端变得足够便宜,可以通过直接输入计算机来创建程序。Frances Holberton 在 UNIVAC 工作时创建了一个允许键盘输入的代码。[21]

开发的文本编辑器比穿孔卡片更容易进行更改和更正。1960 年代,玛丽·肯尼斯·凯勒 (Mary Kenneth Keller) 修女在达特茅斯 (Dartmouth) 读研究生时就致力于开发编程语言BASIC 。[22] Smalltalk是最早的面向对象编程语言之一,由包括Adele Goldberg在内的七位程序员在 1970 年代开发。[23]

现代编程

质量要求

无论开发方法是什么,最终的程序都必须满足一些基本属性。以下属性是最重要的:[24] [25]

  • 可靠性:程序结果正确的频率。这取决于算法的概念正确性和编程错误的最小化,例如资源管理中的错误(例如,缓冲区溢出和竞争条件)和逻辑错误(例如被零除或非一错误)。
  • 鲁棒性:程序对错误(而不是错误)引起的问题的预测程度。这包括诸如不正确、不适当或损坏的数据、所需资源(如内存、操作系统服务和网络连接)不可用、用户错误和意外断电等情况。
  • 可用性:程序的人体工程学:人们可以轻松地将程序用于其预期目的,在某些情况下甚至是未预料到的目的。即使与其他问题无关,此类问题也可能成就或破坏其成功。这涉及范围广泛的文本、图形和硬件元素,这些元素可以提高程序用户界面的清晰度、直观性、凝聚力和完整性。
  • 可移植性可以编译/解释和运行程序源代码的计算机硬件操作系统平台的范围。这取决于不同平台提供的编程工具的差异,包括硬件和操作系统资源、硬件和操作系统的预期行为以及源代码语言的平台特定编译器(有时是库)的可用性。
  • 可维护性:现在或未来的开发人员可以轻松地修改程序,以便进行改进或定制、修复错误和安全漏洞,或使其适应新环境。初始开发过程中的良好实践[26]在这方面有所作为。这种质量对最终用户来说可能并不直接明显,但从长远来看,它会显着影响程序的命运。
  • 效率/性能:衡量程序消耗的系统资源(处理器时间、内存空间、磁盘等慢速设备、网络带宽,在某种程度上甚至是用户交互):越少越好。这还包括仔细管理资源,例如清理临时文件和消除内存泄漏这通常是在所选编程语言的阴影下讨论的。尽管语言肯定会影响性能,但即使是速度较慢的语言,例如Python,也可以从人类的角度立即执行程序。速度、资源使用和性能对于成为系统瓶颈的程序很重要,但有效利用程序员的时间也很重要,并且与成本有关:更多的硬件可能更便宜。

源代码的可读性

在计算机编程中,可读性是指人类读者理解源代码的目的、控制流程和操作的难易程度。它影响上述质量的各个方面,包括可移植性、可用性和最重要的可维护性。

可读性很重要,因为程序员大部分时间都在阅读、尝试理解和修改现有的源代码,而不是编写新的源代码。不可读的代码通常会导致错误、效率低下和重复代码。一项研究[27]发现了一些简单的可读性转换[哪个?]使代码更短,并大大减少了理解它的时间。

遵循一致的编程风格通常有助于提高可读性。然而,可读性不仅仅是编程风格。许多因素,与计算机有效编译和执行代码的能力几乎没有关系,都有助于提高可读性。[28]其中一些因素包括:

这方面的表现(如缩进、换行、颜色高亮等)通常由源代码编辑器处理,但内容方面反映了程序员的才能和技能。

还开发了各种可视化编程语言,旨在通过采用非传统的代码结构和显示方法来解决可读性问题。集成开发环境(IDE) 旨在集成所有此类帮助。代码重构等技术可以增强可读性。

算法复杂度

计算机编程的学术领域和工程实践都主要关注为给定类别的问题发现和实现最有效的算法。为此,使用所谓的大 O 表示法将算法分类为顺序,该表示法根据输入的大小表示资源使用,例如执行时间或内存消耗。专业程序员熟悉各种成熟的算法及其各自的复杂性,并利用这些知识来选择最适合环境的算法。

以国际象棋算法为例

“Programming a Computer for Playing Chess”是 1950 年的一篇论文,评估了作为算法复杂性历史一部分的“极小极大”算法;IBM 的 Deep Blue(国际象棋计算机)课程是斯坦福大学计算机科学课程的一部分。[29]

方法论

大多数正式软件开发过程的第一步是需求分析,然后是测试以确定价值建模、实现和故障消除(调试)。每个任务都有很多不同的方法。一种流行的需求分析方法是用例分析。许多程序员使用敏捷软件开发的形式,其中正式软件开发的各个阶段更多地集成到需要几周而不是几年的短周期中。软件开发过程有很多方法。

流行的建模技术包括面向对象的分析和设计 (OOAD) 和模型驱动架构 (MDA)。统一建模语言 ( UML ) 是用于 OOAD 和 MDA 的符号。

用于数据库设计的类似技术是实体关系建模(ER 建模)。

实现技术包括命令式语言(面向对象过程式)、函数式语言逻辑语言

衡量语言使用情况

很难确定哪些是最流行的现代编程语言。衡量编程语言流行度的方法包括:计算提及该语言的招聘广告的数量、[30]销售的书籍和教授该语言的课程的数量(这高估了新语言的重要性)以及估计现有行数用该语言编写的代码(这低估了 COBOL 等业务语言的用户数量)。

有些语言对于特定类型的应用程序非常流行,而有些语言经常用于编写许多不同类型的应用程序。例如,COBOL在企业数据中心[31]中仍然很强大,通常在大型大型计算机上Fortran在工程应用程序中,脚本语言Web开发中,以及C嵌入式软件中。许多应用程序在构建和使用时混合使用多种语言。新语言通常是围绕先前语言的语法设计的,并添加了新功能,(例如 C++ 将面向对象添加到 C 中,而Java将内存管理和字节码添加到 C++,但结果是失去了效率和低级操作的能力)。

调试

 
导致计算机出现问题的第一个已知实际错误是一只飞蛾,它被困在哈佛大型机内,记录在日期为 1947 年 9 月 9 日的日志条目中。[32] “错误”已经是软件缺陷的常用术语,当时它发现错误。

调试在软件开发过程中是一项非常重要的任务,因为程序中的缺陷可能对其用户产生重大影响。某些语言更容易出现某些类型的错误,因为它们的规范不需要编译器像其他语言那样执行大量检查。使用静态代码分析工具可以帮助检测一些可能的问题。通常调试的第一步是尝试重现问题。这可能是一项重要的任务,例如并行进程或一些不寻常的软件错误。此外,特定的用户环境和使用历史可能使重现问题变得困难。

重现bug后,程序的输入可能需要简化,以便于调试。例如,当编译器中的一个错误可能导致它在解析一些大型源文件时崩溃时,对测试用例进行简化(导致原始源文件中只有几行)就足以重现相同的崩溃。需要反复试验/分而治之:程序员将尝试删除原始测试用例的某些部分并检查问题是否仍然存在。在 GUI 中调试问题时,程序员可以尝试从原始问题描述中跳过一些用户交互,并检查剩余的操作是否足以出现错误。脚本和断点也是这个过程的一部分。

调试通常使用IDE完成。也使用像 GDB 这样的独立调试器,这些通常提供较少的可视化环境,通常使用命令行一些文本编辑器(例如Emacs )允许通过它们调用 GDB,以提供可视化环境。

编程语言

不同的编程语言支持不同的编程风格(称为编程范式))。所用语言的选择受许多因素的影响,例如公司政策、任务适用性、第三方软件包的可用性或个人偏好。理想情况下,将选择最适合手头任务的编程语言。这种理想的权衡包括找到足够的了解该语言的程序员来组建团队、该语言的编译器的可用性以及以给定语言编写的程序的执行效率。语言形成了一个从“低级”到“高级”的近似谱;“低级”语言通常更面向机器且执行速度更快,而“高级”语言更抽象且更易于使用但执行速度较慢。用“高级”语言编码通常比用“

艾伦·唐尼在他的《如何像计算机科学家一样思考》一书中写道:

不同语言的细节看起来不同,但几乎每种语言都有一些基本说明:
  • 输入:从键盘、文件或其他设备收集数据。
  • 输出:在屏幕上显示数据或将数据发送到文件或其他设备。
  • 算术:执行基本的算术运算,如加法和乘法。
  • 条件执行:检查某些条件并执行适当的语句序列。
  • 重复:重复执行某些动作,通常有一些变化。

许多计算机语言提供了一种机制来调用共享库提供的函数。如果库中的函数遵循适当的运行时约定(例如,传递参数的方法),那么这些函数可以用任何其他语言编写。

程序员

计算机程序员是编写计算机软件的人。他们的工作通常包括:

也可以看看

  • 图标计算机编程门户

参考

  1. ^ 贝宾顿,肖恩(2014 年)。“什么是编码”微博于2020 年 4 月 29 日从原版存档2014 年3 月 3检索
  2. ^ 贝宾顿,肖恩(2014 年)。“什么是编程”微博于2020 年 4 月 29 日从原版存档2014 年3 月 3检索
  3. ^ Eilam, Eldad (2005)。逆向:逆向工程的秘密约翰威利父子公司。国际标准书号 978-0-7645-7481-8.
  4. ^ Koetsier, Teun (2001),“可编程机器的史前史:音乐自动机、织机、计算器”,机械与机器理论,Elsevier,36 (5): 589–603,doi: 10.1016/S0094-114X(01 )00005-2
  5. ^ 卡普尔,阿杰;卡内基,戴尔;墨菲,吉姆;龙,杰森(2017)。“扬声器可选:非扬声器电声音乐的历史”有组织的声音剑桥大学出版社。22(2):195-205。doi: 10.1017/S1355771817000103ISSN 1355-7718。
  6. ^ Fowler, Charles B.(1967 年 10 月)。“音乐博物馆:机械乐器的历史”。音乐教育家杂志54(2):45-49。doi: 10.2307/3391092JSTOR 3391092。S2CID  190524140
  7. ^ Noel Sharkey (2007), A 13th Century Programmable Robot , 谢菲尔德大学
  8. ^ Dooley, John F. (2013)。密码学和密码算法简史施普林格科学与商业媒体。第 12-3 页。国际标准书号 9783319016283.
  9. ^ Fuegi, J.; 弗朗西斯,J. (2003)。“洛夫莱斯和巴贝奇以及 1843 年‘笔记的创作”。IEEE 计算历史年鉴25 (4): 16. doi: 10.1109/MAHC.2003.1253887
  10. ^ 达克鲁兹,弗兰克(2020 年 3 月 10 日)。“哥伦比亚大学计算历史 – Herman Hollerith”哥伦比亚大学哥伦比亚大学。于2020 年 4 月 29 日从原版存档2010 年4 月 25检索
  11. “内存与存储 | 计算机历史时间线 | 计算机历史博物馆”www.computerhistory.org 2021年6 月 3 日检索
  12. c Bergstein, Brian(2007 年 3 月 20 日)。“Fortran 创造者 John Backus 去世”美国全国广播公司新闻于2020 年 4 月 29 日从原版存档2010 年4 月 25检索
  13. ^ 史密斯 2013 年,第。6.
  14. ^ Ceruzzi 1998 年,第。84-85。
  15. b Gürer 1995 年,p。176.
  16. b Gürer 1995 年,p。177.
  17. c Gürer 1995 年,p。179.
  18. ^ 史密斯 2013 年,第。7.
  19. ^ Ceruzzi 1998 年,第。92.
  20. “计算机权威在这里发言”时报1972 年 4 月 9 日于2018年10 月 13 日通过 Newspapers.com检索。
  21. “计算机语言先驱弗朗西斯·霍尔伯顿去世”信使杂志2001 年 12 月 12 日于2018年10 月 13 日通过 Newspapers.com检索。
  22. ^ Gürer 1995 年,页。180-181。
  23. “阿黛尔·戈德堡” . 马里兰大学帕克分校2018年10 月 14 日检索
  24. “NIST 开发云路线图”信息周刊2010 年 11 月 5 日。计算计划旨在消除云采用在安全性、互操作性、可移植性和可靠性方面的障碍。
  25. ^ “它基于什么”。计算机世界1984 年 4 月 9 日。13.是否基于... 可靠性 可移植性。兼容性
  26. 《编程101:成为优秀程序员的秘诀——智慧极客》智慧极客2016 年 5 月 19 日2016年5 月 23日检索
  27. ^ Elshoff, James L.; 迈克尔·马科蒂 (1982)。“提高计算机程序的可读性以帮助修改”。ACM 的通信25(8):512-521。doi: 10.1145/358589.358596S2CID  30026641
  28. ^ 多个(维基)。“可读性”多福格于2020 年 4 月 29 日从原版存档2010 年1 月 30检索
  29. ^ 皮耶希,克里斯。“深蓝”1950 年,Claude Shannon 发表了……“为下棋编程计算机”,……“极小极大”算法
  30. ^ Enticknap,尼古拉斯(2007 年 9 月 11 日)。“SSL/Computer Weekly IT 薪资调查:金融繁荣推动 IT 就业增长”
  31. ^ 米切尔,罗伯特(2012 年 5 月 21 日)。“Cobol 人才流失”电脑世界2015 年5 月 9检索
  32. ^ 照片由国家地理杂志 1947 年 9 月提供,弗吉尼亚州达尔格伦的海军水面作战中心

来源

进一步阅读

  • AK Hartmann,计算机模拟实用指南,新加坡:世界科学(2009 年)
  • A. Hunt、D. Thomas 和 W. Cunningham,实用程序员。从熟练工到大师,阿姆斯特丹:Addison-Wesley Longman (1999)
  • Brian W. Kernighan,编程实践,Pearson (1999)
  • Weinberg, Gerald M.,计算机编程心理学,纽约:Van Nostrand Reinhold (1971)
  • Edsger W. Dijkstra,编程学科,Prentice-Hall (1976)
  • O.-J。Dahl,EWDijkstra,CAR Hoare,结构化编程,学术出版社 (1972)
  • David Gries,编程科学,Springer-Verlag (1981)

外部链接




posted @   jinzi  阅读(446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示