بلوک پایه
در کامپایلرسازی، به رشته‌ای از کدها که هیچ انشعاب وارد شونده ای به غیر از ورودی و هیچ انشعاب خارج شونده‌ای به غیر از محل خارج شدن از آن رشته کد نداشته باشد، بلوک پایه می‌گویند. این محدود بودنْ قابلیت آنالیز شدن را به بلوک پایه می‌دهد. کامپایلرها معمولاً در قدم اول، برنامه‌ها را به بلوک‌های پایه تجزیه می‌کنند. توسط بلوک‌های پایه میان راس‌ها و یال‌های گراف روند کنترلی را مشخص کرد.
در ابتدا تعریف شهودی از یک بلوک پایه را ارائه می‌کنیم و در ادامه تعریف رسمی آن را بیان می‌کنیم. تعریف شهودی بلوک پایه به این صورت است:
کدهایی که در بلوک پایه قرار می­گیرند دو ویژگی زیر را دارند:
تحت این شرایط، هر زمانی که اولین دستور در بلوک پایه اجرا شود، تمام دستورها دیگر بلوک پایه نیز باید به اجبار به ترتیب اجرا شوند.
منظور از "کد" در اینجا انواع مختلف کد است یعنی می‌تواند کد منبع، کد اسمبلی و یا هر ترتیب دیگری از دستورها باشد.
حال تعریف رسمی را بیان می‌کنیم که به این صورت است:
تربیت از دستورها تشکیل یک بلوک پایه را می دهند اگر:
این تعریف رسمی از تعریف شهودی عمومی‌تر است. برای مثال بر اساس این تعریف، امکان اینکه پرش‌های غیرشرطی مقصدهایی داشته باشند که انواع دیگر پرش به آن مقصدها پرش نمی‌کنند را فراهم می‌کند. تعریف رسمی ویژگی‌هایی را برای بلوک پایه‌ها ایجاد می‌کند که کار کردن با آن‌ها را در زمان اجرای الگوریتم‌ها آسان می‌کند.
به بلوک‌های که از آن‌ها وارد یک بلوک پایه می‌شویم، اجداد آن بلوک پایه می‌گویند. همچنین به بلوک‌هایی که وقتی از یک بلوک پایه خارج می‌شویم، به آن‌ها وارد می‌شویم، جانشینان آن بلوک پایه می‌گویند.
برای پیدا کردن بلوک های پایه یک الگوریتم ساده وجود دارد. ابتدا این الگوریتم را به صورت کلی توصیف کرده و در ادامه آن را به طور کامل تشریح می‌کنیم.  توصیف کلی الگوریتم: اجرا کننده‌ی الگوریتم در ابتدا باید یک دور کد را خوانده و مرزهای بلوک پایه را شناسایی کند (مرزهای بلوک پایه دستورها شروع و پایان بلوک می باشند) و آن‌ها را نشانه‌گذاری می‌کند. دستور شروع بلوک پایه می‌تواند مقصد یک دستور پرشی و دستور پایان بلوک می تواند یک دستور پرشی باشد. حال کد را در این نقاط "برش" می‌دهیم؛ بلوک‌های پایه تکه کدهایی هستند که باقی می‌مانند.
توجه داشته باشید که این روش همیشه بلوک پایه ماکسیمال را شناسایی نمی‌کند، ولی بنابر تعریف رسمی، بلوک های پایه پیدا شده دارای شرایط کافی می باشند ( بلوک پایه ماکسیمال بلوکی است که نمی‌توان آن را بدون نقض کردن تعریف بلوک پایه، توسط بلوک های مجاورش گسترش داد).
حال این الگوریتم را به صورت کامل شرح می‌دهیم: ورودی: یک ترتیب از دستورها ( که معمولاً کدهای سه آدرسی هستند). خروجی: یک لیست از بلوک های پایه به صورتی که هر دستور سه آدرسی در یک بلوک پایه قرار گیرد. مرحله اول: ابتدا هدرها را در کد مشخص کنید. هدرها دستورهایی هستند که در یکی از شرایط زیر صدق می کنند:
مرحله دوم: با شروع از یک هدر، تمام دستورها بعد از آن تا هدر بعدی در بلوک پایه مربوط به هدر اولیه قرار می گیرد. بنابراین هر بلوک پایه یک هدر دارد. دستورهایی که در پایان یک بلوک پایه ظاهر می شوند یکی از موارد زیر می باشند:
دستورهایی که در ابتدا یک بلوک پایه ظاهر می شوند یکی از موارد زیر می باشند:
قطعه کد زیر را برای ضرب داخلی دو بردار a و b که طول هر یک برابر 10 می باشد، در نظر بگیرید.
begin
do begin
prod :=prod+ a[i] * b[i];
i :=i+1;
end
while i <= 10
endکد سه آدرسی برای کد منبع فوق به شکل زیر است:
B1
(1) prod := 0
(2) i := 1
B2
(3) t1 := 4* i
(4) t2 := a[t1]
(5) t3 := 4* i
(6) t4 := b[t3]
(7) t5 := t2*t4
(8) t6 := prod+t5
(9) prod := t6
(10) t7 := i+1
(11) i := t7 بلوک پایه B1 شامل دستورها (1) تا (2) و بلوک پایه B2 شامل دستورها (3) تا (12) است. توجه کنید طبق قواعد گفته شده دستور (1) دستور شروع برنامه می باشد بنابراین یک هدر است. همچنین دستور (3) مقصد دستوری پرشی در (12) می باشد بنابراین این دستور نیز یک هدر است.