惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
S
Schneier on Security
T
Tenable Blog
G
GRAHAM CLULEY
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
Arctic Wolf
I
Intezer
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
K
Kaspersky official blog
Blog — PlanetScale
Blog — PlanetScale
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
The Cloudflare Blog
Help Net Security
Help Net Security
罗磊的独立博客
博客园 - 聂微东
Jina AI
Jina AI
Project Zero
Project Zero
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 最新话题
V
V2EX
人人都是产品经理
人人都是产品经理
美团技术团队
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
J
Java Code Geeks
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
S
Securelist
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
P
Privacy International News Feed
宝玉的分享
宝玉的分享
C
CERT Recently Published Vulnerability Notes

博客园 - 八爻老骥

Gradle模块化项目中使用了非模块化库的编译方法 系统架构一一前端技术 系统架构一一ORM的应用 WPF下的RibbonApplicationMenu控件自定义 系统架构——多线程的应用 系统架构——前后端分离 为什么要学DirectX? D3D实战-在窗口中画一个三角形 - 八爻老骥 - 博客园 DirectX 入门1-初识DirectX Tool Kit DirectX 12 版 俄罗斯方块 WPF俄罗斯方块改进版 - 八爻老骥 - 博客园 【编程漫谈】用JAVA画多边形 【编程漫谈】单机与联机 往Angular应用程序中添加DevExtreme 【编程漫谈】程序的运行环境 创建DevExtreme应用程序 【编程漫谈】程序的进入与退出 【编程漫谈】Hello world! WPF实战俄罗斯方块
【编程漫谈】程序的运行流程
八爻老骥 · 2019-08-16 · via 博客园 - 八爻老骥

自动分拣系统

当我们看到一个程序流程图的时候,这时程序在我们的脑子里是立体的。一条条箭头就像一根根导管,程序就像流水,向着规定的地方流动。程序就像一个自动分拣系统,不同的数据会导致不一样的结果。但无论是哪种系统,都是安照人类的意志,直到结束。

中国象棋

再举个下棋的例子。下棋的过程就是一个程序执行的过程,你在决定下一步怎么走的时候,脑子里有很多条件的输入和输出,我走哪个棋会产生哪个结果,对方走哪个棋会产生什么样结果。传统上我们将怎么走棋归于个人的经验,实际是人的大脑在模拟电脑的演算过程。

程序流程

上边的流程图中,我们可以把A、B、C……相像成棋子子,不同判定表示你决定下一步怎么走棋。所以宏观上理解一个程序运行过程,其实就是这个样子的。

程序的执行流程也有点像走迷宫,迷宫只有一个入口,一个出口,走迷宫就是在迷宫里不停地找出口的过程。程序其实也是这样,从程序入口进入,经过各种判定、跳转最后到程序结束。

但实际上一个应用程序没有相像中那拥有具象,程序实际上一堆线性数据。下图中就是某个程序内容,它们按顺序存放,每一行可能是一条指令或是一条数据。

二进制数据

这个静态的顺序数据,就像展开的六面体。同样我们也给六面体编上号,然后安装顺序折起来,于是就得到一个六面体。程序也是这样的,只是六面的展开图还是二维的,而程序的线性表是一维的。

展开的盒子

为了方便理解这些十六进制表示的二进制数据,我们可以将这些内容转换成汇编程序。

反汇编

这样一个二进制的程序就可以看懂了。不过,这种代码的数据量是非常巨大的,比如一个程序大小为100K,那反编译出的汇编代码可能就有2W5K行,如果是更大的程序,那反编译出来的代码也是海量的。因为太大的程序,阅读汇编是非常不靠谱的。

但我们可以根据汇编代码看出一些程序的执行过程,比如ret,jmp,call,mov等关键字,就是在线性表中跳来跳去。直到跳到程序的结束。

因为汇编这种低级语言,没法看到程序的整体面貌,且编写量巨大,所以一般不会用汇编直接去写程序的,更不用说直接编写二进制代码。首先指令啊、asciis值,字符集,各种文件编码,这些对应关系,就是一个非常复杂的工程。所以用低级语言做个系统,等你做出黄花菜都凉了。因而有人就发明了高级语言,将生成二进制的过程用编译器来做。

有了高级语言之后,我们在写程序的可以忽略底层的机器码。我们将精力放在程序本身要实现的功能上。高级语言发明出来后,人们把一些汇编指令做了一些归纳。

程序流程图

如果程序中没有return ,continue,break等关键字,程序就是从上到下依次执行的,如果当中有if,case之类的条件判断,则某些代码块就有准入条件。

高级语言中肯定什么条件判断的关键字,肯定有上图中的几条执行流程。下边是T-SQL的示例。

DECLARE My_Cursor CURSOR --定义游标  
FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中  
OPEN My_Cursor; --打开游标  
FETCH NEXT FROM My_Cursor ; --读取第一行数据  
WHILE @@FETCH_STATUS = 0  --Sql Server中的循环
    BEGIN  
        --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新  
        --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除  
        FETCH NEXT FROM My_Cursor; --读取下一行数据  
    END  
CLOSE My_Cursor; --关闭游标  
DEALLOCATE My_Cursor; --释放游标  
GO

Typescirpt中的循环控制

for (let index in testArray) {
      console.log("数组的下标:"+index);
    }
/*
数组的下标:0
数组的下标:1
数组的下标:2
数组的下标:3
*/

for (let value of testArray) {
      console.log("数组的值:"+value);
    }
/*
数组的值:20
数组的值:string
数组的值:true
数组的值:hahha
*/

testArray.forEach((value, index, array)=>{
      console.log("value:"+value+"--index:"+index);
      console.log(array);
    });
/*
打印日志:
 value:20--index:0
 (4) [20, "string", true, "hahha"]
 value:string--index:1
 (4) [20, "string", true, "hahha"]
 value:true--index:2
 (4) [20, "string", true, "hahha"]
 value:hahha--index:3
 (4) [20, "string", true, "hahha"]
*/

actionscript中的几种循环:

for同C语言;
for(...in...)循环访问对象属性或数组元素;
for each(...in...)循环访问集合中的项目,迭代变量包含属性所保存的值,不含属性的名称;
while同C;
do...while同C。

F#中的循环写法:

for i = 1 to 5 do
printfn "%d" i;;

Groovy中的循环

for(variable in range) { 
   statement #1 
   statement #2 
   … 
}

从以上的示例可以看出,无论哪种编程语言,总是有相通的地方。也许他们写法各异,但思想方法是接近的。所以说,如果你精通了一门编程语言后,再学其它的编程语言也应该是很轻松的。