導航:首頁 > 源碼編譯 > 數據流分析編譯

數據流分析編譯

發布時間: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

閱讀全文

與數據流分析編譯相關的資料

熱點內容
lattice可編程介面器件 瀏覽:463
域名伺服器縮寫為什麼 瀏覽:226
華為與小米不能連接到伺服器地址 瀏覽:256
誠信可靠的重慶伺服器託管雲主機 瀏覽:209
解壓蘇軾的小視頻 瀏覽:616
android修改通知欄 瀏覽:251
壓縮變形計算公式 瀏覽:721
資料庫電腦伺服器名稱怎麼查詢 瀏覽:455
變異率范圍遺傳演算法 瀏覽:671
geek在手機里是啥文件夾 瀏覽:902
url編譯js 瀏覽:831
安卓怎麼有壓感 瀏覽:669
怎麼把安卓機改成蘋果機主題布局 瀏覽:420
程序員提現 瀏覽:537
解壓小游戲全部鏟走就勝利了 瀏覽:409
谷歌用什麼app更新 瀏覽:192
逸動16自吸壓縮比是多少 瀏覽:641
linux啟動smb 瀏覽:871
最大回撤演算法 瀏覽:493
什麼叫雲伺服器和普通服 瀏覽:18