Dil Çevrimi
Yüksek düzeyli bir dilde yazılmış bir program ancak makine diline çevrilerek bir bilgisayarda çalıştırılabilir.

Yüksek düzeyli bir dilde yazılmış kaynak kodun makine diline (Hedef kod) dönüştürülmesi zorunluluğu Dil çevirici yazılımların oluşturulmasına neden olmuştur.
program gcd(input, output);
var i, j: integer;
begin
read(i, j);
while i <> j do
if i > j then i := i – j;
else j := j – i;
writeln(i)
end.
Derleme işlemi yapıldığı zaman ise


Source language program-> Translator-> Object language program
- Dönüşüm için derleme ve yorumlama olmak üzere iki temel yöntem vardır.
Bir yorumlayıcı, bir programın her deyimini birer birer makine diline çevirerek çalıştırır.
Derleyici, bir programlama dilinde yazılmış bir kaynak kod için o koda eşdeğer olan makine dilinde bir program oluşturur.
Derleme Süreci
Derleme sürecinin başlangıcında derleyiciye verilen yüksek düzeyli bir programlama dili deyimlerini içeren programa, kaynak (source) program, derleme sürecinin sonucunda oluşan makine dilindeki programa ise amaç (object) program adı verilir.
Derleyicinin çalışması sırasında geçen zamana derleme zamanı (compile time) denir.
Hedef programların çalışması sırasında geçen zamana çalışma zamanı (run time) adı verilir.

Sadeleştirilmiş Derleyici Yapısı
Source code
(Karakter Dizisi)
if (b == 0) a = b;
Token dizisi
Soyut Sözdizim Ağacı
Ara Kod
Assembly Kodu
CMP CX,0
CMOVZ DX,CX
Metinsel Analiz-Scanner
- Derleme sürecindeki ilk ve en uzun süren aşamadır.
- Bir derleyicinin ön ucunda yer alan metinsel çözümleyici (lexical analyzer), bir kaynak programı bir dizi token dizisine çevirir.
- Regüler ifade aracı kullanır
Ayrıştırma (Parser) yöntemleri
- Ayrıştırıcı bir sözcük katarının dilin gramer kuralları ile türetilebilirliğini inceler ve sözcük katarına ilişkin bir ayrıştırma ağacı oluşturur
- İki yol vardır.
- Yukarıdan-aşağıya (top-down)
- Aşağıdan-yukarıya (bottom-up)
Sembol Tablosu
- Derleme sürecinde programdaki her tanımlayıcı için bir eleman içeren sembol tablosu oluşturulur. Sembol tablosu, derleme sürecindeki çeşitli aşamalarda kullanılır ve güncellenir.
- Bir tanımlayıcı kaynak programda ilk kez bulunduğunda, o tanımlayıcı için sembol tablosunda bir eleman oluşturulur. Aynı tanımlayıcının daha sonraki kullanımları için ilgili token, aynı sembol tablosu elemanına başvuru içerir.
- Metinsel çözümleme aşamasının sonunda, programdaki token‘lar ve her token‘ın özelliklerinin tutulduğu sembol tablosu elemanına işaret edilen göstergeleri içeren token dizisi oluşturulur.
Anlam Çözümleme
- Anlam çözümleme, kaynak program için söz dizim çözümleme sırasında oluşturulmuş ayrıştırma ağacı kullanılarak, soyut bir programlama dilinde bir program oluşturulmasıdır.
Soyut Dil
Anlam çözümleme sonucunda üretilen kod için kullanılan ara diller, genel olarak, üst düzeyli bir birleştirici diline benzerler. Bu soyut dil, kaynak dilin veri türleri ve işlemleriyle uyumlu olacak şekilde tasarlanmış, hayali bir makine için bir makine dili olup, derleyicinin kaynak ve amaç dilleri arasında bir ara adım oluşturur.
Kod Oluşturma
- Soyut dilde ifade edilen kodu alınarak belirli bir bilgisayar için makine kodunu oluşturulur.
- Derleyicinin ön ucu programlama diline bağımlı, arka ucu ise bilgisayara bağımlıdır.
Eniyileme (Optimizasyon)
- İsteğe bağlı olarak ara kod kısmında iyileştirmeler yapılabilir.
- Buradaki çalışma bir programın daha etkin olarak çalışacak bir eşdeğer programa dönüştürülmesi için yapılır.
Taşınabilir Kod
- Dil çevriminde bütünüyle yorumlama ve bütünüyle derleme yöntemleri, iki uç durumdur. Bazı programlama dilleri, iki yöntemin birleştirilmesi ile gerçekleştirilirler.
- Bir program, kaynak program üzerinde basit düzenlemeler yapılarak bir sanal makinenin daha sonra yorumlanacak olan makine kodu olarak nitelenebilen bir ara koda çevrilebilir. Bu çözüm, ağırlıklı olarak derlemeye dayanır ve farklı makinelerde çalıştırılabilen taşınabilir kod üretmek amacıyla kullanılabilir.
- Java dili bu tür dil çevrimini uygulamaktadır. Java programları, Java bytecode‘u adı verilen bir ara koda dönüştürüldükten sonra yorumlanır.

Örnek
read A
read B
sum := A + B
write sum
write sum / 2
Metinsel Analiz (Lexical Analysis)
- Tokens:
id = letter ( letter | digit ) * [ except “read” and “write” ]
literal = digit digit *
“:=”, “+”, “-“, “*”, “/”, “(“, “)“
$$$ [end of file]
- EBNF
<pgm> -> <statement list> $$$
<stmt list> -> <stmt list> <stmt> | E
<stmt> -> id := <expr> | read <id> | write <expr>
<expr> -> <term> | <expr> <add op> <term>
<term> -> <factor | <term> <mult op> <factor
<factor> -> ( <expr> ) | id | literal
<add op> -> + | –
<mult op> -> * | /
Ara Kod Dönüşümü
- Intermediate code:
read
pop A
read
pop B
push A
push B
add
pop sum
push sum
write
push sum
push 2
div
write
- Target code:
.data
A: .long 0
B: .long 0
sum: .long 0
.text
main: jsr read
movl d0,d1
movl d1,A
jsr read
movl d0,d1
movl d1,B
movl A,d1
Kod üretimi
movl B,d2
addl d1,d2
movl d1,sum
movl sum,d1
movl d1,d0
jsr write
movl sum,d1
movl #2,d2
divsl d1,d2
movl d1,d0
jsr write