热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编程语言是从哪蹦出来的——大型伦理寻根现场

Hello,我是Alex007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫Alex的人太多了,再加上每天007的生活,Alex007就诞生了。聊一聊编程到底是啥,怎

Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了。

聊一聊编程到底是啥,怎么发展起来的呢?

编程语言是从哪蹦出来的?

一、什么是编程?

看过《黑客帝国》这部电影的人们应该会对一个场景印象深刻,黑色的屏幕落下一行行的代码,屏幕前的程序员十指飞舞干脆利落,十分炫酷。

这个画面让很多人以为这就是编程,坐在电脑前飞快的敲键盘,其实也没错,编程确实等价于敲代码,但是可没有电影中表现的那么精彩。

编程其实就是程序员通过键盘输入代码与计算机做沟通,既然是沟通,那就必须是双方的,程序员通过代码向计算机发出指令,计算机执行指令之后将结果反馈到屏幕或文件上显示给程序员。

计算机的反馈,可以是文字,可以是图片,也可以是视频,这是以我们能理解的方式显示,所以编程也是必须以计算机能理解的方式发布指令。

我们都知道,计算机底层所有的工作都是以二进制的形式进行的,也就是说它只认识0和1,当初最早的程序员也确实是靠二进制写程序。

由二进制代码0和1表达的指令称为机器指令,所有的机器指令的集合构成计算机的机器语言。

《编程语言是从哪蹦出来的——大型伦理寻根现场》
慢慢的,程序越来越多,逻辑也越来越复杂,特别容易出错,代码维护极其困难,单独的0和1已经不能够满足需求了,为了让编程变得更加直观,程序员就把二进制的01进行分组,四位二进制数表示一位十六进制数,程序员输入十六进制的数,然后有一个专门的程序将十六进制数转换为二进制数之后再交给计算机执行。

《编程语言是从哪蹦出来的——大型伦理寻根现场》

但是,这种由十个数字和六个字母组成的语言还是不够直观,只有专业人员能看懂,普通人想要理解太过困难,这就导致编程的学习门槛高,最好是能够让计算机直接认识单词,这样的程序看起来也比较直观。

程序员又把二进制的机器语言重新分组,让固定长度的由01字符组成的机器码直接对应英文单词,这样程序员就可以直接输入单词进行编程,于是汇编语言就此诞生。

我们来看一段汇编语言的代码:

section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string

这段代码的功能其实就是输出“Hello World!”而已,这么一个简单的功能,却需要那么多行的代码,那我每次要想输出字符的时候都要把上边的代码再敲一遍。

因此,又有程序员将固定功能的汇编语言代码封装起来,用一个简洁的单词代表,比如上述汇编语言的代码是向屏幕输入一个字符串,那么我把这个功能用一个单词print代表,这样就只需要输入print(“Hello World!”),就可以在屏幕上打印字符串,这就是高级语言。

高级语言简化了编程的过程,具有如下优点:

1.不需要再使用繁琐的二进制或十六进制的机器码
2.更加平易近人,让编程是以程序员的思路进行,而不是思考计算机底层应该怎么做

编程语言经过层层优化,从最开始的机器语言,到汇编语言,再到高级语言,风格越来越优雅,现在通过高级语言编程只需要输入美丽的英文语句就可以向计算机发布指令。

二、高级语言的分类

在屏幕上打印字符串,使用高级语言可以写成:

print("Hello World!")

对我们而言,一看这行代码就知道我们是给计算机发布了一个打印字符串的命令,而在计算机内部会把这条语句转换成用机器语言编写的等价指令,一大堆以01机器码形式表现的指令,看起来非常麻烦。

但是对于计算机来说恰恰相反,高级语言编写的指令就是一堆火星文,毫无用处,计算机本质上还是只能识别二进制的机器码,要想执行我们给它发布的指令,就必须把指程序翻译成机器语言。

我们知道,翻译有两种方式,假如我用中文写了一本书,然后想让一个只懂英语的外国人看,第一种方案是我找一个翻译把整本书翻译成英文版本,把译本直接给外国人,他就可以直接阅读,第二种方案是把翻译人员和外国人都叫过来,我把内容读给翻译人员听,翻译人员理解了之后再翻译成英文说给外国人听。

这两种方案其实就是编程语言的两种分类,一种是将程序代码全部翻译成机器语言之后交给计算机执行,这叫编译型语言,承接翻译工作的是编译器;另一种是将程序代码一行一行的翻译成机器语言然后计算机一行一行的执行,这叫解释型语言,承接翻译工作的是解释器。

统一来讲,编译器或解释器就是将我们能够理解的高级语言程序转换成计算机能够理解的机器语言程序。

程序员负责进行思维活动编写代码,编译器或解释器负责代码的翻译工作。

编译型

我们说编译就类似于将一本书全部翻译成机器语言程序,那么编译的过程肯定要消耗一定的时间,而计算机拿到“这本书”之后可以很快的阅读,不仅如此,编译之后的译本还可以给很多能看懂的计算机执行,相比与此编译所使用的时间就不足为虑了。

编译型语言的优点:

1.执行速度快。
对于同一个任务采用不同的语言实现,一般编译型语言的执行速度是解释型语言执行速度的2~10倍。
2.调试方便。
编译型语言的代码编写要求比较严谨,在调试时比较方便。
3.源码不依赖。
编译型语言执行时不需要源代码。

编译型语言的缺点:

1.代码量大。
完成同一个任务一般编译型语言的代码量是解释型语言代码量的10~50倍。
2.平台依赖性。
编译型语言是要基于不同平台底层实现的,因此对平台的依赖性比较大。
3.更新代价大。
每次修改完源代码之后都要重新编译。

常见的编译型语言:C、C++、Fortran、Visual Foxpro、Pascal、Delphi、Ada。

解释型

解释型语言的优点:

1.代码简洁。
解释型语言的代码相对编译型语言的代码更为简洁,方便阅读。
2.平台独立性和安全性。
解释器内部已经实现了对不同平台的交互处理,这使得解释型语言适合互联网和WEB应用的开发。

解释型语言的缺点:

1.执行速度慢。
相比于编译型语言,解释型语言的执行速度较慢。
2.内存占用大。
必须先运行相关的解释器才能执行解释型语言,而解释器会大量消耗资源,占用CPU周期和内存。

常见的解释型语言:Python、Tcl、Perl、Ruby、Vbscript、 Javascript。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
author-avatar
西北孤狼2502911947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有