Compiler ve Interpreter Nedir?

Derleyici ve Yorumlayıcı

Farklı ihtiyaçlar doğrultusunda oraya çıkan, iş yapış süreçleri, yazım kuralları gibi farklılıklar taşıyan bu diller aynı işlevleri de farklı şekillerde ele alabilirler. Bu tür durumlarda, geliştiriciler amaçlarına en uygun programlama dillerini bir arada kullanabilmektedirler.

AA

Kullanılan dillerin birbirlerinin anlayacağı ve/veya makine diline (machine code) yani 0 ve 1’lere (binary code) dönüştürebilmesi gerekmektedir. Bu yazıda, diller arasındaki iletişimi / dönüştürme işlemini gerçekleştiren araçlara; derleyici ve yorumlayıcılara bir bakalım1.

Compiler (Derleyici)

Bir dilde yazılmış olan kodu (kaynak kodu / source code) başka bir dilde yazılmış koda, örneğin yüksek seviye bir dilden (high-level programming language) alt seviye bir dile (low-level programming language), dönüştüren araçlardır2. Genellikle bu kodlar çalıştırılabilir (executable) şekilde üretilirler3. Bunun nedeni, çoğunlukla diller arasındaki bu işlemin pratik bir şekilde işletim sistemi ve donanım bağımlı kodlara dönüştürülebilmesidir. Örneğin, C dilinde yazılmış bir kodun PASCAL koduna dönüştürmesi gibi4.

Derleyiciler, kodun derlenmesi sürecinde kodun iyileştirilmesi (optimization), hataların yönetimi (error handling) ve en etkin şekilde kodların yorumlanması gibi katkılar sunabilmektedirler. Scanning, Lexical Analysis, Syntactic Analysis ve Semantic Analysis adımlarını zlerler.

Derleyiciler tek geçişli (one pass) ve çok geçişli (multi pass) olarak nitelendirilebilirler5. Tek geçişli (one pass) bir derleyici kaynak kodu baştan sona bir defa okur. Çok geçişli (multi pass) derleyiciler ise bu işlemi birkaç defa gerçekleştirirler. Tek geçişli derleyiciler kodun incelenme sürecini daha hızlı ele alırlarken bazı durumlarda, dilin tasarımı sebebiyle işlevsiz kalabilmektedirler. Diğer yandan, çok geçişli derleyiciler sondaki bir tanımı takip edebilmek, işlemleri bütün kod bağlamında değerlendirebilmek gibi özellikleri sebebiyle daha iyi yorumlama yapabilmektedirler. Derleyicileri ayrıca odaklandıkları süreçlere göre değerlendirebiliriz6:

Source to source compiler
Kaynaktan kaynağa derleyici. Bir dilde yazılı kodu bir başka dile çevirirler. C++ dilindeki bir kodun Java diline çevirilmesi örnek olarak gösterilebilir.
Cross compiler
Çapraz derleyici. Farklı ortamlar (işletim sistemleri gibi) arasında geçiş sağlanmasını sağlayan derleyicilerdir. Örneğin, Linux temelli bir işletim sistemi üzerinde Windows işletim sisteminde çalışacak şekilde kod yazılması gibi.
Just in time compiler
Ttam zamanında derleyici. Genellikle ortamdan bağımsız, kodun yazılması sürecinde iyileştirme amacıyla kullanılan derleyicilerdir.

Derleyiciler kodu bir bütün olarak ele alırlar. Ancak, kodun satır-blok olarak da değerlendirilmesi mümkündür. Bu tür durumlarda yorumlayıcılar (interpreter) öne çıkmaktadır7.

Yorumlayıcı (Interpreter)

Yorumlayıcılar (Interpreter), kodu satır ve/veya bloklar halinde çalıştırırlar ve bir sonraki satır / blokları sırası gelmeden değerlendirmezler. Bu nedenle, sonraki satırdaki hatalar ve kodun bütününü etkileyen iyileştirmeler yorumlayıcılar tarafından yakalanamazlar. Kodu parçalar halinde değerlendirmek amacıyla kullanılırlar.

Bazı programlama dilleri derleyici ve yorumlayıcılara sahip olabilir. Ancak, daha kapsamlı çözümler sunabilen harici derleyici ve yorumlayıcılar da çalıştırılabilmektedir.

Son Olarak

Yayınlayacağım sonraki yazılarda derleyici ve yorumlayıcılarla ilgili kullanılabilecek uygulamalar çerçevesinde katkı sağlamaya çalışacağım. Ancak, konuyu daha detaylı bir şekilde değerlendirmek isterseniz aşağıdaki bağlantılara göz atabilirsiniz. Bu arada, Babel.js çerçevesinde yapılan compiler / transpiler tartışmasına da bir göz atmanızı öneririm8.