当前位置: 首页 > news >正文

程序是什么?如何理解编程的本质?

程序是什么?在编程的世界,我们平时所见到的程序,是指以某种逻辑组织起来的指令序列,通过这些指令序列达到一些特定的效果,一个可执行程序呢,它的内部是一系列计算机指令和数据的集合,它们都是二进制形式的,通常的格式是ELF段的二进制文件,CPU 可以直接看到,识别,但是,若是对于程序员来说呢,这些二进制文件就显得晦涩难懂,看得人头皮发麻。

而在windons中呢,我们所说的程序,就是那些平时双击就可以直接运行的程序了,他们不需要安装,而是可以直接执行,这样的程序呢被称为可执行程序,英文名字是Executable Program,所以我们一般平时看到的exe文件呢就是可执行程序名字的一个缩写。在 Windows 下,可执行程序的后缀一般有 .exe 和 .com(其中 .exe 比较常见);而在类 UNIX 系统(Linux、Mac OS 等操作系统)下,可执行程序并没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序,一般格式为ELF文件。

例如,在我们的电脑屏幕上输出“hello world”,C语言的写法为:

puts("hello world");或者printf("hello world");

二进制的写法为:

如果你是程序员,你可以感受一下,直接使用二进制写程序感觉是不是想撞墙?而在计算发展的初期,程序员就是使用这样的二进制指令来编写程序的,因为在那个年代还没有编程语言。

直接使用二进制指令编程对程序员来说简直是噩梦,尤其是当程序比较大的时候,不但编写麻烦,需要频繁查询指令手册,而且除错会异常苦恼,要直接面对一堆二进制数据,让人眼花缭乱。另外,用二进制指令编程步骤繁琐,要考虑各种边界情况和底层问题,开发效率十分低下。

这种情况下,这就逼得程序员开发出了编程语言,提高自己的生产力,例如汇编语言、C语言、C++、Java、Python、Go语言等,逐步提高开发效率。从此,C语言代码由固定的词汇按照固定的格式组织起来,简单直观,便于程序员识别和理解,但是对于CPU,C语言代码是什么东西?根本不认识好吧!CPU只认识一些二进制形式的指令。所以呢!这个时候就需要这么一个工具,将C语言代码转换成CPU能够识别的二进制文件,也就是将代码加工成 .exe 程序;这个工具是一个特殊的软件,叫做编译器(Compiler)。编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译英文是Compile。

编译也可以理解为“翻译”,它是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件架构。然后将人们写的各种c语言或其他语言的语句,翻译成系统才能够理解的语句,进一步进行运算。Windows 下常用的是微软编译器(cl.exr),它被集成在 Visual Studio 或 Visual C++ 中,一般不单独使用;Linux 下常用的是 GUN 组织开发的 GCC,也叫GNU C Compile,很多 Linux 发行版都自带 GCC编译软件。

你的代码语法正确与否,编译器说了才算,编译器可以 100% 保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,那你就是错了,这样以便于你对自己代码的更改。

点击了解更多讯息哦~


转载于:https://juejin.im/post/5c8b0e4c6fb9a04a027b3d84

相关文章:

  • centos7.5+cobbler2.8.4实战图文攻略--2019持续更新
  • Node.js设计模式读书笔记(2)
  • 物流行业如何选择手持终端
  • CH2906 武士风度的牛(算竞进阶习题)
  • 2014年蓝桥杯部分题目与解答
  • 重拾 ObjC 自动释放池
  • 监听JS对象属性变化 Object.defineProperty Proxy 记录
  • 读ios开发有感——建立APP开发体系
  • 回归
  • Kubernetes — 重新认识Docker容器
  • 专业术语------扫盲
  • 实验1
  • nunjucks模版引擎入门
  • git flow常用命令
  • PHP实现多维数组按指定值排序
  • Android组件 - 收藏集 - 掘金
  • cookie和session
  • crontab执行失败的多种原因
  • iOS 系统授权开发
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Iterator 和 for...of 循环
  • JS 面试题总结
  • Logstash 参考指南(目录)
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • oschina
  • PHP 的 SAPI 是个什么东西
  • PHP的Ev教程三(Periodic watcher)
  • Redis 懒删除(lazy free)简史
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里研究院入选中国企业智库系统影响力榜
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 温故知新之javascript面向对象
  • 写代码的正确姿势
  • 最简单的无缝轮播
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #pragma once与条件编译
  • (3)llvm ir转换过程
  • (6)STL算法之转换
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)重识new
  • ..回顾17,展望18
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @KafkaListener注解详解(一)| 常用参数详解
  • @selector(..)警告提示
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [ajaxupload] - 上传文件同时附件参数值
  • [android] 看博客学习hashCode()和equals()