LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

一段程序是告诉计算机应该如何完成一个任务的程序

2023年1月14日 154点热度

一段程序是告诉计算机应该如何完成一个任务,这里需要进行的运算可以是数学运算,也可以是符号运算。从硬件角度来说,计算机是由数字电路组成的运算机器,只能对数字做运算,符号运算的原理是在计算机内部符号是用数字来表示的。此外,程序还可以处理声音和图像,声音和图像在计算机内部也是用数字来表示的,这些数字经过特定的硬件设备转换成人可以听到,看到的声音和图像。

程序是由一系列指令组成的linux如何执行c程序,指令是指示计算机做某种运算的命令,主要包括以下几类:

输入(input)

从键盘,文件或者其它设备中输入的数据。

输出(output)

把数据显示到屏幕,或者存入一个文件,或者发送到其它设备。

基本运算

执行最基本的算术运算和数据读取与存入。

测试和分支

测试某个条件,然后根据不同的测试结果执行不同的后续指令。

循环和递归

重复执行一系列操作。

对于一个程序,不管它多么复杂,都是由这几类指令组成的。编写程序可以拆分成以下的过程:

把复杂的任务分解成子任务,把子任务再分解成更简单的任务,层层分解,直到最后简单的可以使用以上指令来完成。

编程语言(Programming Language)分为低级语言(Low-level Language) 和高级语言(High-level Language)。机器语言(Machine Language) 和汇编语言(Assembly Language) 属于低级语言,直接使用计算机指令编写程序。而C,Java,Python等属于高级语言linux mint,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

C语言的语句和低级语言的指令之间不是简单的一对一对应关系,一条a=b+1; 语句要翻译成三条汇编或机器指令,这个过程称为编译(Compile), 由编译器(Compiler) 来完成,显然编译器的功能比汇编器要复杂。

用C语言编写的程序必须经过编译转成机器指令才能被计算机执行,编译需要花一些时间,这是用高级语言编程的一个缺点,然而更多的是优点。首先,用C语言编程更容易,写出来的代码更加紧凑,可读性更强,出错也更容易修改。C 语言是可移植的与平台无关。

平台:可以指计算机体系结构(Architecture), 也可以指操作系统(Operating System), 也可以指开发平台(编译器,链接器等)。不同的计算机体系结构有不同的指令集(Instruction Set), 可以识别的机器指令格式是不同的,直接用某种体系结构的汇编或机器指令写出来的程序只能在这种体系结构的计算机上运行。

即使在相同的体系结构和操作系统下,用不同的C编译器(或者同一个C编译器的不同版本)编译同一个程序得到的结果也有可能不同,C语言有些语法特性在C标准中并没有明确规定,各编译器有不同的实现,编译出来的指令的行为特性也会不同,应该尽量避免使用不可移植的语法特性。

总结一下编译执行的过程:

source code ==> compiler ==> executable ==> loader

编译时错误

编译器只能翻译语法正确的程序,否则将导致编译失败,无法生成可执行文件。

运行时错误

编译器检查不出这类错误,仍然可以生成可执行文件,但在运行时会出错而导致程序崩溃。

要注意区分编译时和运行时(Run-time)这两个概念,不仅在调试时需要区分这两个概念,在学习C语言的很多语法时都需要区分这两个概念,有些事情在编译时做,有些事情则在运行时做。

逻辑错误和语义错误

如果程序里有逻辑错误linux应用程序,编译和运行都会很顺利,看上去也不产生任何错误信息,但是程序没有干它该干的事情,而是干了别的事情。

Hello World

#include 
 
/* main: generate some simple output */
 
int main(void)
{
    printf("Hello, world.n");
    return 0;

}

将文件保存为main.c, 然后编译运行:

$ gcc main.c
$ ./a.out
$ Hello, world.

gcc是Linux平台的C编译器,编译后在当前目录下生成可执行文件a.out,直接在命令行输入这个可执行文件的路径就可以执行它。如果不想把文件名叫a.out,可以用gcc的-o参数自己指定文件名:

$ gcc main.c -o main
$ ls
1  1.c  2  2.c  main  main.c  MOBILE.txt  UNICOM.txt
$ ./main
Hello, world.

正如前面所说,编译器对于语法错误是毫不留情的,如果你的程序有一点拼写错误,例如第一行写成了stdoi.h,在编译时会得到错误提示:

linux如何执行c程序_linux c语言小程序_shell脚本执行c程序

$ gcc main.c -o main
main.c:1:19: fatal error: stdoi.h: No such file or directory
 #include 
                   ^
compilation terminated.

有些时候编译器的提示信息不是error而是warning,例如把上例中的printf("Hello, world.n");改成printf(1);然后编译运行:

$ gcc main.c -o main
main.c: In function ‘main’:
main.c:7:5: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [enabled by default]
     printf(1);
     ^
In file included from main.c:1:0:

/usr/include/stdio.h:362:12: note: expected ‘const char * __restrict__’ but argument is of type ‘int’ extern int printf (const char *__restrict __format, ...); ^ main.c:7:5: warning: format not a string literal and no format arguments [-Wformat-security] printf(1);

$ ./main
Segmentation fault (core dumped)

这个警告信息是说类型不匹配,但勉强还能配得上。警告信息不是致命错误,编译仍然可以继续,如果整个编译过程只有警告信息而没有错误信息,仍然可以生成可执行文件。但是,警告信息也是不容忽视的。出警告信息说明你的程序写得不够规范,可能有Bug,虽然能编译生成可执行文件,但程序的运行结果往往是不正确的,例如上面的程序运行时出了一个段错误linux如何执行c程序,这属于运行时错误。

一个好的习惯是打开gcc的-Wall选项,也就是让gcc提示所有的警告信息,不管是严重的还是不严重的,然后把这些问题从代码中全部消灭。比如把上例中的printf("Hello, world.n");改成printf(0);然后编译运行:

chengy@ubuntu-1:~/workroom/c_test/0802$ gcc -Wall main.c
main.c: In function ‘main’:
main.c:7:5: warning: null argument where non-null required (argument 1) [-Wnonnull]
     printf(0);

如果printf中的0是你不小心写上去的(例如错误地使用了编辑器的查找替换功能),这个警告就能帮助你发现错误。虽然本书的命令行为了突出重点通常省略-Wall选项,但是强烈建议你写每一个编译命令时都加上-Wall选项。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux编译 printf 汇编指令 编译程序 计算机指令
最后更新:2023年1月14日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
写入数据覆盖的分析与执行 解读Rainbond集群的安装和运维的原理,便于用户搭建Rainbond Linux基础知识:文件描述符、文件指针、索引节点 如何解决Linux下的无线网卡驱动的问题? linux 文件描述符 (师)-unused-fdKernel:2.6.14CPUarchitecture Linux系统下如何搭建SVN服务器,详细说明各配置项的功能 修改软件源文件、UI界面设置换源操作|Ubuntu Ubuntu14.04.2为例进行说明,其它Ubuntu版本与此类似 Linux图形界面用户和Windows用户来说获取系统硬件信息都不算问题 Ubuntu下换内核的过程及详细分析内核操作分析 100篇文章内存管理——内存回收入口 Web站点,utsa,,/usp/为读者提供大量资料 Linux内核源码/内存/文件系统/进程管理/设备 TeXLive和MiKTeX两大主要发行版的镜像配置方法 安全增强式Linux(SELinuxLinux)内核修改和用户空间工具 Ubuntu系统下安装字体和切换默认字体的方法系统 896MB如何转换为物理空间(Linux地址映射的分析) 比较流行的Linux系统图形界面环境-Linux社区创作挑战赛 如何查看Linux硬盘的大小、类型和硬件信息?方法 Linux内核中的虚拟服务器集合:ipvsadm命令
Linux内核更新包配置Ubuntu环境配置环境Android官方网站:OpenHandsetAlliance源码模式:开发源码内核linux中makefile文件 cdeveloper的第21篇原创技术文章建议横屏Makefile简介Fedora17新特色特色说明桌面环境28bata集成了GNOMELinux嵌入式系统智能手机系统的硬件设计Unix或者类Unix文件系统中的每个文件(或者目录)打开U盘什么文件都看不到小编总结了基于嵌入式Linux的智能手机系统软件的设计与实现如何在Linux中使用Firejail运行应用程序访问某个目录基于嵌入式��闹悄苁只�长沙理工大学C语言教程-Qt.12安装教程05-27Linux有7个运行级别(关机,停机模式、DellG3)(Linux基础知识)文件压缩、打包命令解析的Linux操作系统怎样执行?LinuxDNS服务器,如何安装、配置和维护它?AMD2950x+技嘉x399免驱USB网卡,我的无线网卡linux解压gz文件命令 蓝易云香港五网CN2网络压缩比率的测试环境Linux系统中用于管理和控制系统服务的强大工具介绍围绕API创建封装器的开源项目正变得越来越流行主频93.75MHz的MIPS64NECVR4300处理器在N64上运行
u盘无密码移动版livepersistencepersistence制作u盘有密码 轻松压缩文件,linux命令必备! 【好玩的网络-第2.5期】分配IP有哪些骚操作?小白保姆级教程 【Linux基础知识】Linux下的共享库和动态库 英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) Flutter的“野心”不止于跨平台开发,而是全平台制霸 为什么我们还要使用一键DD重装/更换系统呢?? 自定义登录session时要注意的几个小细节,你知道吗? Linux中进程间通信有多少方式,分别是什么? proc的缩写与内核相关的文件-上海怡健医学 【Linux运维学习必看书籍推荐】——Linux运维大环境说明 bash:批量修改文件名称的方法总结(一)-苏州安嘉 Windows远程连接工具、Ubuntu系统的安装软件及系统 【1024】后端技术学习路线思维导图,看这一篇就够了! UNIX编程《UNIX环境高级编程(第3版)》 img创建一个cronjob要创建,你可以使用crontab命令 :2管理大部分命令的组成 嵌入式Linux软件设计系统设计的一般流程是什么?(图) du下所有的文件和文件夹(不含子目录),统计符号链接所指向的大小 开源软件安装源码包的方式安装软件
标签聚合
软件 linux脚本 linux服务器 虚拟机 文件目录 命令 命令模式 linux系统 电脑 sudo
书籍
课程
技术群
技术干货大合集↓
  • 2023年6月 / 16篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.