电脑编程
计算机编程或编码是指令序列的组成,称为程序,计算机可以遵循执行任务。它涉及通过使用一种或多种编程语言编写代码来设计和实施过程的算法,逐步规范。程序员通常使用与机器代码更容易理解的高级编程语言,该语言是由中央处理单元直接执行的。熟练的编程通常需要在几个不同的主题上进行专业知识,包括有关应用程序域的知识,编程语言的详细信息和通用代码库,专业算法和正式逻辑。
随附的辅助任务以及与编程有关的任务包括分析需求,测试,调试(调查和解决问题),构建系统的实施以及派生工件的管理,例如程序的机器代码。虽然有时将其视为编程,但通常将“软件开发”一词用于此更大的整体过程 -编程,实现和编码术语为编写和编辑代码本身本身。有时,软件开发被称为软件工程,尤其是当它采用正式方法或遵循工程设计过程时。
历史
可编程设备已经存在了几个世纪。早在9世纪,波斯语Banu Musa Brothers发明了一个可编程的音乐节目器,他在巧妙的设备书中描述了一名自动化的机械长笛演奏者。 1206年,阿拉伯工程师Al-Jazari发明了一台可编程的鼓机,可以通过钉子和凸轮制作音乐机械自动机以播放不同的节奏和鼓图案。在1801年, Jacquard Loom可以通过更改“程序”来产生完全不同的编织,这是一系列带有孔的粘贴卡。
代码破坏算法也已经存在了几个世纪。在9世纪,阿拉伯数学家al-Kindi在一份有关解密的加密信息的手稿中描述了一种用于解密加密代码的加密算法。他通过频率分析(最早破坏代码算法)对隐藻分析进行了第一个描述。
第一个计算机程序通常可以追溯到1843年,当时数学家Ada Lovelace发表了一种算法来计算一系列Bernoulli数字,该算法旨在由Charles Babbage的分析引擎进行。但是,查尔斯·巴巴奇(Charles Babbage)已经在1837年为分析引擎写了他的第一个程序。
在1880年代,赫尔曼·霍勒里斯(Herman Hollerith)发明了以机器可读形式存储数据的概念。后来,一个添加到他1906年的I类制表器中的控制面板(插头板)允许其编程为不同的工作,到1940年代后期,控制面板在类似的控制面板中编程了IBM 602和IBM 604等单元记录设备,例如IBM 602和IBM 604方式,以及第一批电子计算机。但是,随着1949年推出的存储程序计算机的概念,程序和数据都以相同的方式在计算机内存中存储和操纵。
机器语言
机器代码是早期程序的语言,通常用特定机器的指令集(通常用二进制表示法)编写。很快就开发了汇编语言,让程序员以文本格式指定指令(例如,添加X,Total),每个操作代码的缩写和指定地址的有意义的名称。但是,由于汇编语言仅仅是机器语言的不同符号,因此两台具有不同指令集的机器也具有不同的汇编语言。
编译器语言
高级语言使得开发程序更简单,更容易理解,并且与基础硬件的约束更少。第一个与编译器相关的工具A-0系统是由Grace Hopper于1952年开发的,Grace Hopper也创造了“编译器”一词。 Fortran是第一个广泛使用的高级语言,具有功能性实施,于1957年发布,很快就开发了许多其他语言,尤其是针对商业数据处理的COBOL ,以及用于计算机研究的LISP 。
这些编译的语言允许程序员以句法更丰富的术语编写程序,并且更有能力抽象代码,从而易于通过编译声明和启发式方法来定位变化的机器指令集。编译器通过允许程序员使用infix符号输入公式来指定计算来利用计算机的功能使编程更容易。
源代码条目
程序主要使用打孔卡或纸带输入。到1960年代后期,数据存储设备和计算机终端变得足够便宜,可以通过直接输入计算机来创建程序。还开发了文本编辑器,可以比打孔卡更容易更容易进行更改和更正。
现代编程
质量要求
无论开发方法是什么,最终计划都必须满足一些基本属性。以下属性是最重要的:
- 可靠性:程序的结果多久正确。这取决于算法的概念正确性和对编程错误的最小化,例如资源管理中的错误(例如,缓冲区溢出和种族条件)和逻辑错误(例如按零或逐个错误的划分)。
- 鲁棒性:程序如何由于错误(而不是错误)预期问题。这包括诸如不正确,不适当或损坏的数据之类的情况,不可用的资源,例如内存,操作系统服务以及网络连接,用户错误和意外的停电。
- 可用性:程序的人体工程学:一个人可以为其预期目的或在某些情况下甚至是意想不到的目的使用该程序的便利性。即使无论其他问题如何,这些问题都可以使其成功或打破其成功。这涉及各种文本,图形,有时是硬件元素,可提高程序用户界面的清晰度,直觉,凝聚力和完整性。
- 可移植性:可以在其上汇总/解释和运行程序源代码的计算机硬件和操作系统平台的范围。这取决于不同平台提供的编程设施的差异,包括硬件和操作系统资源,硬件和操作系统的预期行为以及用于源代码语言的平台特定编译器(有时是库)的可用性。
- 可维护性:可以通过其当前或将来的开发人员修改程序来进行改进或自定义,修复错误和安全漏洞或将其适应新环境的易用性。初始开发过程中的良好实践在这方面有所不同。对于最终用户而言,这种质量可能并不直接,但长期以来可以显著影响计划的命运。
- 效率/性能:计划消耗的系统资源(处理器时间,内存空间,磁盘,网络带宽等慢速设备,甚至在某种程度上甚至用户交互):越少越好。这还包括仔细管理资源,例如清理临时文件并消除内存泄漏。通常在选定的编程语言的阴影下讨论这一点。尽管该语言肯定会影响性能,但甚至较慢的语言,例如Python ,也可以从人的角度立即执行程序。速度,资源使用和性能对于瓶颈瓶颈很重要,但是有效使用程序员时间也很重要,并且与成本有关:更便宜的硬件可能更便宜。
源代码的可读性
在计算机编程中,可读性是指人类读者可以理解源代码的目的,控制流和操作的便利性。它影响上述质量的各个方面,包括可移植性,可用性和最重要的可维护性。
可读性很重要,因为程序员将大部分时间都花在阅读中,试图理解,重复使用和修改现有的源代码,而不是编写新的源代码。不可读的代码通常会导致错误,效率低下和重复的代码。一项研究发现,一些简单的可读性转换使代码变短,并大大减少了理解它的时间。
遵循一致的编程样式通常有助于可读性。但是,可读性不仅仅是编程样式。许多因素,与计算机有效编译和执行代码的能力几乎没有关系,这有助于可读性。其中一些因素包括:
源代码编辑器经常处理此内容的介绍方面(例如凹痕,划线,颜色突出显示等),但内容方面反映了程序员的才华和技能。
还开发了各种视觉编程语言,目的是通过采用非传统方法来解决代码结构和显示,以解决可读性问题。综合开发环境(IDE)旨在整合所有这些帮助。诸如代码重构之类的技术可以增强可读性。
算法复杂性
计算机编程的学术领域和工程实践都在很大程度上涉及发现和实施给定类别问题的最有效算法。为此,根据输入的大小,使用所谓的大o符号将算法分为订单,该算法表达资源使用,例如执行时间或内存消耗。专家程序员熟悉各种成熟的算法及其各自的复杂性,并使用这些知识选择最适合这种情况的算法。
方法论
大多数正式软件开发过程的第一步是需求分析,然后进行测试以确定价值建模,实现和失败(调试)。每个任务中都有许多不同的方法。需求分析的一种方法是用例分析。许多程序员使用敏捷软件开发的形式,其中正式软件开发的各个阶段更加整合到需要几个星期而不是几年的短周期中。软件开发过程有许多方法。
流行的建模技术包括面向对象的分析和设计( OOAD )和模型驱动体系结构( MDA )。统一的建模语言( UML )是用于OOAD和MDA的符号。
用于数据库设计的类似技术是实体关系建模( ER建模)。
实施技术包括命令式语言(面向对象或程序性),功能语言和逻辑语言。
测量语言使用
很难确定什么是最受欢迎的现代编程语言。衡量编程语言受欢迎程度的方法包括:计算提及该语言的求职广告数量,销售的书籍数量和教学课程(这高估了较新的语言的重要性),并估算了现有代码行的数量用语言(这低估了商业语言用户(例如COBOL)的数量)。
某些语言在特定类型的应用程序中非常受欢迎,而某些语言经常用于编写许多不同类型的应用程序。例如,在大型大型计算机,工程应用程序中的Fortran , Web开发中的脚本语言以及嵌入式软件中的C中, COBOL在公司数据中心中仍然很强。许多应用程序在其结构和使用中都使用了几种语言的混合。通常围绕先前语言的语法设计新的语言,并添加了新功能(例如, C ++将对象 - 方向添加到C中, Java将内存管理和字节码添加到C ++,但是因此,效率和低效率的能力和低效率 - 级别的操作)。
侦错
调试是软件开发过程中非常重要的任务,因为程序中的缺陷可能会对其用户产生重大影响。某些语言更容易出现某些错误,因为它们的规范不需要编译器的执行比其他语言的检查。使用静态代码分析工具可以帮助检测一些可能的问题。通常,调试的第一步是尝试重现问题。这可能是一项非平凡的任务,例如,与并行过程或某些不寻常的软件错误一样。此外,特定的用户环境和使用历史记录可能使重现问题很难。
复制错误后,可能需要简化程序的输入,以使其更易于调试。例如,当编译器中的错误可以在解析一些大源文件时使其崩溃时,简化了测试用例,该测试用例仅导致原始源文件中的几行可以足以重现同一崩溃。需要反复试用/分界线:程序员将尝试删除原始测试案例的某些部分,并检查问题是否仍然存在。在GUI中调试问题时,程序员可以尝试从原始问题描述中跳过一些用户交互,并检查其余操作是否足以显示错误。脚本和断点也是此过程的一部分。
调试通常是通过IDE进行的。还使用了像GDB这样的独立辩论者,通常使用命令行提供的视觉环境通常更少。一些文本编辑器(例如Emacs)允许通过它们调用GDB,以提供视觉环境。
程式设计语言
不同的编程语言支持不同样式的编程(称为编程范例)。使用的语言选择需要许多考虑因素,例如公司政策,任务适用性,第三方软件包的可用性或个人喜好。理想情况下,将选择最适合手头任务的编程语言。从这个理想的权衡涉及找到足够的程序员,这些程序员知道该语言可以建立团队,该语言的编译器的可用性以及以给定语言执行程序编写的程序的效率。语言构成了从“低级”到“高级”的近似频谱; “低级”语言通常更面向机器,更快地执行,而“高级”语言更加抽象,更易于使用,但执行速度较低。通常,用“高级”语言编码比“低级”语言更容易。编程语言对于软件开发至关重要。从最简单的应用程序到最复杂的应用程序,它们是所有软件的构建块。
艾伦·唐尼(Allen Downey)在他的书中如何像计算机科学家一样思考:
- 细节在不同的语言中看起来不同,但是几乎每种语言都出现了一些基本说明:
- 输入:从键盘,文件或其他设备收集数据。
- 输出:在屏幕上显示数据或将数据发送到文件或其他设备。
- 算术:执行基本的算术操作,例如加法和乘法。
- 有条件执行:检查某些条件并执行适当的语句顺序。
- 重复:反复执行一些动作,通常会有一些变化。
许多计算机语言提供了一种机制来调用共享库提供的功能。只要库中的功能遵循适当的运行时间约定(例如,通过参数的方法),则可以用任何其他语言编写这些功能。
程式设计师
计算机程序员是编写计算机软件的人。他们的工作通常涉及:
尽管编程在媒体上是一个数学上的主题,但一些研究表明,好的程序员在天然人类语言方面具有强大的技能,并且学习编码类似于学习外语。