导航:首页 > 源码编译 > 数据流分析编译

数据流分析编译

发布时间:2022-08-12 01:19:05

编译器中都有哪些算法

词法/语法分析、程序分析与程序变换、代码生成、内存管理、虚拟机、函数式语言的实现与优化。。。每个话题都能出不止一本书。

用到的算法/数据结构多如牛毛:

各种树、图为主,其他如栈、队列、散列表、并查集。。。

贪心、回溯、动态规划、遗传算法、矩阵变换。。

在一个问题下很难回答好。。 先简单介绍一下和图相关的。

1. 和什么图打交道
CFG(Control Flow Graph)
控制流图是对程序中分支跳转关系的抽象,描述程序所有可能执行路径

节点是语句集合(basic block);

每个basic block有唯一入口和出口;

如果A到B有边,表示A执行完后可能执行B

PDG(Program Dependence Graph)
PDG在编译器中用得不多,常见于软件工程/安全相关的应用(程序切片、安全信息流等)

SSA(Single Static Assignment)
SSA简化了很多数据流分析问题。

其他图
DJ Graph, Loop Nesting Forest, Program Structure Tree等等。

可参考:IR for Program Analysis。下面主要介绍CFG

2. CFG初步处理
CFG构造

dominator树生成
在CFG中,如果A是B的dominator,则从程序入口执行到B的任意路径一定经过A

控制依赖分析
根据dominator和post-dominator分析依赖关系。数据依赖、控制依赖信息在自动并行化中尤其重要(如果循环的每次迭代都没有依赖,那么可以并行处理)

控制流图化简
在复杂度相同的情况下,CFG的规模影响算法的效果。如果一个CFG仅通过如下变换能化简为一个节点,则它是可化简的:

如果节点n有唯一的前驱,那么将其和其前驱合并为一个节点

如果节点存在到自身的边,那么将该边删除
构造SSA
SSA可以由CFG构造。

3. CFG与数据流分析
下面才进入主题。。
一般的文献介绍DFA(Data flow analysis),都会用几个基础的分析为例:Constant Propagation,Range propagation,Avaliable expressions,Reaching Definition。而Reaching Definition的一个应用,就是大家喜闻乐见的“跳转到定义处”(真要做到“智能”跳转并不简单)

这部分涉及东西较多,一些算法也和”图“并不直接相关,不再展开。

PS,很多DFA问题可以用graph reachability统一建模,强烈推荐此文:
Program analysis via graph reachability

㈡ 编译原理这门课程第八章代码优化的知识点有哪些

编译原理这门课第八章代码优化的知识点包含章节导引,第一节优化的主要种类,第二节流图中的循环,第三节全局数据流分析介绍,第四节代码改进变换,课后练习,。

㈢ 为什么要进行数据流程分析,数据流图有哪些组成元素

数据流程图中有以下几种主要元素: →:数据流。数据流是数据在系统内传播的路径,因此由一组成分固定的数据组成。如订票单由旅客姓名、年龄、单位、身份证号、日期、目的地等数据项组成。由于数据流是流动中的数据,所以必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。 □:数据源(终点)。代表系统之外的实体,可以是人、物或其他软件系统。 ○:对数据的加工(处理)。加工是对数据进行处理的单元,它接收一定的数据输入,对其进行处理,并产生输出。 〓:数据存储。表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。

㈣ 采用数据流图的方式进行数据流程分析一般应遵循的原则是什么

JPEG(Joint Photographic Experts Group) 是一个由 ISO和IEC两个组织机构联合组成的一个专家组,负责制定静态的数字图像数据压缩编码标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,因此又称为JPEG标准。JPEG是一个适用范围很广的静态图像数据压缩标准,既可用于灰度图像又可用于彩色图像。

JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(Discrete Cosine Transform,DCT)为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法。使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。例如,在V-CD和DVD-Video电视图像压缩技术中,就使用JPEG的有损压缩算法来取消空间方向上的冗余数据。为了在保证图像质量的前提下进一步提高压缩比,近年来JPEG专家组正在制定JPEG 2000(简称JP 2000)标准,这个标准中将采用小波变换(wavelet)算法。

JPEG压缩是有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。压缩编码大致分成三个步骤:

1.使用正向离散余弦变换(forward discrete cosine transform,FDCT)把空间域表示的图变换成频率域表示的图。

2.使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的。

3.使用霍夫曼可变字长编码器对量化系数进行编码。

译码或者叫做解压缩的过程与压缩编码过程正好相反。

JPEG算法与彩色空间无关,因此“RGB到YUV变换”和“YUV到RGB变换”不包含在JPEG算法中。JPEG算法处理的彩色图像是单独的彩色分量图像,因此它可以压缩来自不同彩色空间的数据,如RGB, YCbCr和CMYK。

JPEG压缩编码算法的主要计算步骤如下:

1.正向离散余弦变换(FDCT)。

2.量化(quantization)。

3.Z字形编码(zigzag scan)。

4.使用差分脉冲编码调制(differential pulse code molation,DPCM)对直流系数(DC)进行编码。

5.使用行程长度编码(run-length encoding,RLE)对交流系数(AC)进行编码。

6.熵编码(entropy coding)。

2. 量化

量化是对经过FDCT变换后的频率系数进行量化。量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。量化是图像质量下降的最主要原因。

对于有损压缩算法,JPEG算法使用均匀量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此图中的左上角的量化步距要比右下角的量化步距小。

3. Z字形编排

量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如图5-17所示。这样就把一个8 ? 8的矩阵变成一个1 ? 64的矢量,频率较低的系数放在矢量的顶部。

4. 直流系数的编码

8 ? 8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8 ? 8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,

Delta=DC(0, 0)k-DC(0, 0)k-1 ........ (5-5)

5. 交流系数的编码

量化AC系数的特点是1 ? 64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。

JPEG使用了1个字节的高4位来表示连续“0”的个数,而使用它的低4位来表示编码下一个非“0”系数所需要的位数,跟在它后面的是量化AC系数的数值。

6. 熵编码

使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数作进一步的压缩。

在JPEG有损压缩算法中,使用霍夫曼编码器来减少熵。使用霍夫曼编码器的理由是可以使用很简单的查表(lookup table)方法进行编码。压缩数据符号时,霍夫曼编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的霍夫曼码表可以事先进行定义。

㈤ 在不考虑编译器优化等因素下,下面那个运算比较快

下面是在编译器不优化的情况下的代码反汇编后的结果
14: if (a > b)//我们看到,只有3条指令,
0040104D mov edx,dword ptr [ebp-4] //将a放入寄存器EDX
00401050 cmp edx,dword ptr [ebp-8] //比较EDX和b的大小
00401053 jle main+3Ch (0040105c) //如果a<b跳转到0040105c
15: {
16: return 1;
00401055 mov eax,1
0040105A jmp main+4Fh (0040106f)
17: }
18: if (a - b > 0)//我们看到有4条指令
0040105C mov eax,dword ptr [ebp-4]//将a放入EAX
0040105F sub eax,dword ptr [ebp-8]//a-b的差放入EAX
00401062 test eax,eax//比较EAX是否为0
00401064 jle main+4Dh (0040106d)//条件跳转
19: {
20: return 2;
00401066 mov eax,2
0040106B jmp main+4Fh (0040106f)
21: }
所以我认为if (a > b) {....}
效率更高

㈥ 学习java中,数据流问题。eclipse中编译就出问题了!!

用鼠标定位到红色错误的地方,把错误提示复制上来,我看看

㈦ 怎么用soundtouch对某具体音频文件的数据流做处理

SoundTouch音频处理库的使用异常简单,经过简单的编译之后,设置编译环境,以vc为例
,直接在include包含SoundTouch目录下的include路径,接着在lib添加SoundTouch目录下
的lib路径,然后在代码的头文件中添加头文件以及引用的库。如下:根据_DEBUG这个宏,
我们可以进行一些编译预处理,假如是以DEBUG编译就采用debug库,其他的话就采用
release库。他们的区别就是文件名后面是否多了一个“D”。
#include <SoundTouch.h>
#ifdef _DEBUG
#pragma comment(lib, "SoundTouchD.lib")
#else
#pragma comment(lib, "SoundTouch.lib")
#endif
当然你也可以直接在vc的项目工程中直接添加,某些人比较喜欢如此。
最重要的一点还要声明一个命名空间,至于原因,和SoundTouch这个库的声明定义有关,
以下在分析的时候会提到。
using namespace soundtouch
然后就可以直接在自己的代码中定义一个类变量SoundTouch m_SoundTouch;
SoundTouch 类的声明包含在SoundTouch.h和SoundTouch.cpp之中,由FIFOProcessor类直
接派生,而FIFOProcessor类又直接从基类FIFOSamplePipe派生。同时声明SoundTouch这个
类包含在命名空间 soundtouch,这就是为什么我们使用这个库的时候需要声明命名空间的
主要原因。感觉有点多余。且仅仅定义了一些常量,诸如版本号,版本ID号等等,这两个
父类都包含在FIFOSamplePipe.h和FIFOSamplePipe.cpp文件中。
不管什么库,如果要使用的话,一般的流程都是先定义然后进行一些必要的初始化,
SoundTouch(以下简称ST)也不例外。ST的初始化也和他的编译一样异常的简单,具体可以
参考他的例子SoundStretch来实现,也可以参考源代码中有关SoundTouch这个类的声明,
现在只关心我们会用到的那部分,可以看到在private中定义了另外两个类指针
RateTransposer*,TDStretch*;
RateTransposer从FIFOProcessor派生,而FIFOProcessor又直接从基类FIFOSamplePipe派
生,TDStretch和RateTransposer类似。由此可见,单单从两个类的名字上看:拉长?传输
速率?不难想象出这个库对声音信号的处理可能就是“拉长”,然后“变速”。难道就是传说
中的不变调变速?事实正是如此。这还不是我们现在关心的话题。
……
private:
/// Rate transposer class instance
class RateTransposer *pRateTransposer;
/// Time-stretch class instance
class TDStretch *pTDStretch;
/// Virtual pitch parameter. Effective rate & tempo are calculated from
these parameters.
float virtualRate;
/// Virtual pitch parameter. Effective rate & tempo are calculated from
these parameters.
float virtualTempo;
/// Virtual pitch parameter. Effective rate & tempo are calculated from
these parameters.
float virtualPitch;
/// Flag: Has sample rate been set?
BOOL bSrateSet;
/// Calculates effective rate & tempo valuescfrom 'virtualRate',
'virtualTempo' and
/// 'virtualPitch' parameters.
void calcEffectiveRateAndTempo();
protected :
/// Number of channels
uint channels;
/// Effective 'rate' value calculated from 'virtualRate', 'virtualTempo'
and 'virtualPitch'
float rate;
/// Effective 'tempo' value calculated from 'virtualRate', 'virtualTempo'
and 'virtualPitch'
float tempo;
/// Sets new rate control value. Normal rate = 1.0, smaller values
/// represent slower rate, larger faster rates.
void setRate(float newRate);
/// Sets new tempo control value. Normal tempo = 1.0, smaller values
/// represent slower tempo, larger faster tempo.
void setTempo(float newTempo);
/// Sets new rate control value as a difference in percents compared
/// to the original rate (-50 .. +100 %)
void setRateChange(float newRate);
/// Sets new tempo control value as a difference in percents compared
/// to the original tempo (-50 .. +100 %)
void setTempoChange(float newTempo);
/// Sets new pitch control value. Original pitch = 1.0, smaller values
/// represent lower pitches, larger values higher pitch.
void setPitch(float newPitch);
/// Sets pitch change in octaves compared to the original pitch
/// (-1.00 .. +1.00)
void setPitchOctaves(float newPitch);
/// Sets pitch change in semi-tones compared to the original pitch
/// (-12 .. +12)
void setPitchSemiTones(int newPitch);
void setPitchSemiTones(float newPitch);
/// Sets the number of channels, 1 = mono, 2 = stereo
void setChannels(uint numChannels);
/// Sets sample rate.
void setSampleRate(uint srate);
/// Changes a setting controlling the processing system behaviour. See the
/// 'SETTING_...' defines for available setting ID's.
/// /return 'TRUE' if the setting was succesfully changed
BOOL setSetting(int settingId, ///< Setting ID number. see SETTING_...
defines.
int value///< New setting value.
);
……
参考ST提供的例子SoundStretch,初始化SoundTouch这个类:
m_SoundTouch.setSampleRate(sampleRate);//设置声音的采样频率
m_SoundTouch.setChannels(channels);//设置声音的声道
m_SoundTouch.setTempoChange(tempoDelta); //这个就是传说中的变速不变调
m_SoundTouch.setPitchSemiTones(pitchDelta);//设置声音的pitch
m_SoundTouch.setRateChange(rateDelta);//设置声音的速率
// quick是一个bool变量,USE_QUICKSEEK具体有什么用我暂时也不太清楚。
m_SoundTouch.setSetting(SETTING_USE_QUICKSEEK, quick);
// noAntiAlias是一个bool变量,USE_AA_FILTER具体有什么用我暂时也不太清楚。
m_SoundTouch.setSetting(SETTING_USE_AA_FILTER, !(noAntiAlias));
// speech也是一个bool变量,初步估计可能是没有音乐只有人声的时候,需要设置一下。
if (speech)
{
// use settings for speech processing
m_SoundTouch.setSetting(SETTING_SEQUENCE_MS, 40);
m_SoundTouch.setSetting(SETTING_SEEKWINDOW_MS, 15);
m_SoundTouch.setSetting(SETTING_OVERLAP_MS, 8);
fprintf(stderr, "Tune processing parameters for speech processing./n");
}
通过那么简单的几个函数调用,现在我们就可以感受一下ST的强大。通过SoundTouch类提
供的函数调用方法:
putSamples(sampleBuffer,nSamples);
第一个参数为一个指向PCM编码的一段音频数据的指针,第二个参数就是要处理多少个
sample也可以理解为多少帧。
需要注意的是,一般数据流都是字节流,也就是说,sample的大小和声道、位的声音参数
有关,假如sampleBuffer指针指向一个 长度为64bytes的一个PCM数据缓冲区,16位2声道
,那么实际上这里只存放了(16*2)/8=4bytes,64/4=16;16个sample,这是我们需要注意的
地方。m_SoundTouch.putSamples(sampleBuffer, nSamples);数据是传进去了,可是从哪
里接收处理过的音频数据呢?这个时候我们就要用SoundTouch提供的receiveSamples函数
调用方法。
uint receiveSamples(SAMPLETYPE *outBuffer, ///< Buffer where to output
samples.
uint maxSamples ///< How many samples to receive at max.
);他也是两个参数,第一个为接收数据的参数,第二个最大可以接收多少sample。
通过这段注释,大概明白receiveSamples这个函数不会在putSamples之后马上返回数据,
另外一方面有可能返回比maxSamples更多的数据,因此需要放在一个do…while(…)的循环里
面把他们都榨干。
// Read ready samples from SoundTouch processor & write them output file.
// NOTES:
// - 'receiveSamples' doesn't necessarily return any samples at all
// ring some rounds!
// - On the other hand, ring some round 'receiveSamples' may have more
// ready samples than would fit into 'sampleBuffer', and for this reason
// the 'receiveSamples' call is iterated for as many times as it
// outputs samples.
do
{
nSamples = m_SoundTouch.receiveSamples(sampleBuffer, buffSizeSamples);
//把sampleBuffer写入一个文件,或者填充进声卡的缓冲区,播放声音。
} while (nSamples != 0);
今天就先写到这里,比较劳累。
转载

㈧ HTTP数据流协议分析及还原实现

由于某些数据流需要更高的优先权,特别是在广域网上。选项包括承诺服务质量和服务级别。前者指某一用户或“流”动承诺性能,后者提供尽可能的。 以太网通过将网络的优先权映射到诸如对的资源预留协议()这些以机制或对的其它机制。...www.wsdxs.cn/html/network

阅读全文

与数据流分析编译相关的资料

热点内容
免费在线国产小电影 浏览:544
尺度大的女同电影 浏览:371
纯爱高干生子的小说 浏览:879
linux开发服务端 浏览:962
不要VIP的电视网站 浏览:780
看欧美出轨的.看欧美出轨的女人 浏览:872
linuxsignal函数 浏览:248
你的名字 国语 下载 浏览:280
银河麒麟下编译qt源码 浏览:163
读单片机的flash 浏览:839
安全不收费的看片网站 浏览:945
单片机显示屏加排阻 浏览:729
新京报pdf 浏览:403
日本韩国推理片电影免费 浏览:823
c语言求n的阶乘递归算法 浏览:203
服务器未回应是什么原因 浏览:816
缥缈白姬和轩之结局 浏览:593
全球票房在哪里查 浏览:781
宝书网小说 浏览:812
无水印高清电影 浏览:772