Xcode Build System nasıl çalışır? — 1

Ahmet Bekir Bakkal
DigiGeek
Published in
2 min readDec 30, 2023

Merhaba,

Geliştiriciler olarak üzerinde çalıştığımız programları compiler’larla kolayca çalıştırırız. Çoğu zaman compiler’ların bize sunduğu hazır sistemler üzerinde kodlarımızı geliştirir ve “Run” butonuna basarak program çıktılarımıza erişiriz. Yazdığımız kodların “Build” veya “Run” butonları ile donanım tarafından anlaşılacak seviyeye dönüşmesi ise belirli işlemler ardından gerçekleşir.

Bu yazı dizisi iki yazıdan oluşacak. İlk yazımızda; bir derleyicinin kaynak kodu nasıl makina koduna dönüştürdüğünü inceleyeceğiz. İkinci yazımızda ise Xcode’un Swift ile geliştirilmiş bir programı nasıl bir süreçten geçirerek hedef koda dönüştürdüğünü inceleyeceğiz.

Compiler Aşamaları

“High level” bir programlama dilinde yazılan kodlar “source program” olarak ifade edilir ve bu programlar “target program” olarak ifade edilen “low level” yazılım diline dönüştürülürler. High-level bir dilde yazılmış programlar derleme işlemi ile low-level dile dönüştürülmeden asla çalıştırılamazlar. Bu serüvende her programlama dili için farklı bir derleyici olsa da arka planda gerçekleştirdiği temel işlemler oldukça benzerdir.

Kaynak kodunu makine koduna çevirme süreci 5 aşamalıdır ve sırasıyla şöyledir. Lexical Analysis, Syntax Analysis, Semantic Analysis, Code Generation ve Optimization. Kısaca bunlara değinelim.

Lexical Analysis

Bu aşama derleyicinin high-level olarak yazılan programı bir token listesine dönüştürme aşamasıdır. Bu aşamada derleyici; kaynak kodu karakter karakter okur ve yazdığımız programdaki identifier, keyword, punctuation, literal, ve operator’leri parçalara ayırarak bunların token’larını oluşturur. Bu aşamada oluşturulan token listesi parse edilmek için bir sonraki aşamaya aktarılır.

NOT:

Swift’te lexical analizin nasıl yapıldığını detaylı bir şekilde görmek için aşağıdaki URL incelenebilir.

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/

Syntax Analysis

Bu aşamada yazdığımız program parse edilir. Derleyici, kaynak kodunun ilgili programlama dilinin kurallarına uygun olup olmadığını bu aşamada kontrol eder. Aynı zamanda; hiyerarşik gösterimi sağlayabilmek için uygulamanın parse tree’si oluşturulur ve kod üzerinde bir syntax hatası var ise bu aşamada tespit edilir.

Semantic Analysis

Semantic Analysis, compiler’ın üçüncü aşamasıdır. Bu aşamada; programın tanımlarının ve ifadelerinin anlamsal olarak doğru olup olmadığı kontrol edilir. Bu işlemi gerçekleştirirken Syntax Analyze aşamasında oluşturulan parse tree ve sembol tablosu kullanılır. Type checking, label checking ve flow control checking bu aşamanın fonksiyonlarıdır.

Code Generation

Code Generation, compiler’ın dördüncü aşamasıdır ve kod üretimi aşamasıdır. Bu aşamada derleyici parse tree’yi bilgisayar tarafından anlaşılabilecek makine koduna dönüştürür. Oluşturulan bu kodun verimli olması ve hedef platform için optimize edilmesi gerekir.

Optimization

Optimization, compiler’ın son aşamasıdır. Bu aşamada derleyici, oluşturulan kodu analiz eder ve performansını artıracak optimizasyonlar yapar. Folding, loop unrolling, function inlining bunlardan bazılarıdır.

SONUÇ

Sonuç olarak; compiler’ların arka planda gerçekleştirdiği process bir kaç major aşamayı içeren karmaşık bir süreçtir. İyi bir derleyici, programların verimliliğini ve performansını büyük ölçüde etkiler. Bununla beraber yazdığımız kodlar da her compile işleminde bu aşamalardan geçer. Kod performanslarımızı üst seviyelere taşımak için her senaryoyu ayrı bir şekilde değerlendirmek biz geliştiriciler için oldukça önemlidir.

İkinci yazımızda görüşmek üzere..

--

--