Ruby Kodunun Derlenmesi Hakkında (Bytecode, EXE) #DevSecOps

Bunjo

Ar-Ge Ekibi Asistanı
14 Ara 2020
1,639
1,981
💎

6449ti9.gif

pDHFoUY.png


Mehrabalar ben Bunjo, bu konuda Ruby ile yazılmış bir kodun derlenebilir olup olmadığını ve bytecode kavramını ele alacağım.
pDHFoUY.png


Ruby Kodu Derlenebilir mi?

Ruby kodunu derlemeye çalışmak benimde üzerinde uğraş gösterdiğim bir konuydu.

Ruby derlenmiş bir dil olmayp, yorumlanabilir bir dil olduğu için Ruby kodu tam anlamıyla derlenemez. Ruby kodu yorumlayıcı tarafından çalıştırılır, kod satırı satırıyla yorumlanır/okunur ve çalışma zamanında işlenir. Daha önceden kodu tam olarak derleyip, sonrasında derlenmiş kodu çalıştırmak gibi bir seçeneğimiz bu durumda olmuyor.

Bu durum, Ruby'nin dinamik özelliklerinden kaynaklanır. Kodun çalışma zamanında yorumlanması, dinamik tiplerin yönetilmesine ve kodun esnekliğine olanak tanır, ancak aynı zamanda bazı durumlarda derlenmiş dillere göre genellikle daha yavaş çalışma anlamına gelebilir.

Bu özelliklerin sonucuna iyi tarafından bakacak olursak, Ruby Meta Programlama gibi konularda üstün kontrol ve detsek sağlıyor.

pDHFoUY.png


ByteCode Nedir?

Byte Code, genellikle bir yüksek seviye programlama dilinin kaynak kodunun derlenmesi sonucu elde edilen ara bir kod formatıdır. Bu ara kod, genellikle makine diline oldukça yakın ancak belirli bir makine mimarisi bağımsızdır. Byte Code, bir sanal makine tarafından yorumlanabilir veya çalıştırılabilir.

Java gibi bazı programlama dilleri, derleme işlemi sonucunda Java Byte Code adı verilen bir ara kod üretir. Bu Byte Code, Java Sanal Makinesi (JVM) tarafından yorumlanarak veya derlenerek (Just-In-Time derleme) ilgili fiziksel makine koduna çevrilir ve çalıştırılır. Bu şekilde, Java programları farklı işletim sistemlerinde çalışabilir, çünkü JVM, işletim sistemine özgü farklılıkları gizler.

Özetle, Byte Code, bir derleme sürecinin sonucunda elde edilen, yüksek seviye programlama dili kaynak kodunu temsil eden ancak makine diline daha yakın ve genellikle taşınabilir bir formatta olan ara bir kod formatıdır.

Ruby'de bulunan JIT desteği ile Bytecode:

Avantajları:


Taşınabilirlik: Bytecode, yüksek seviye programlama dillerinin platform bağımsız olarak çalışmasını sağlar. Örneğin, Java'nın bytecode'u (Java Bytecode), Java Sanal Makinesi (JVM) üzerinde çalıştırılırken, farklı işletim sistemlerinde aynı bytecode'un kullanılabilmesini mümkün kılar.

Performans Optimizasyonu: Bytecode, JIT (Just-In-Time) derleyicileri tarafından optimize edilebilir. JIT derleme, bytecode'un çalışma zamanında makine koduna dönüştürülmesini sağlayarak performansı artırabilir.

Geliştirme Hızı ve Esneklik: Bytecode, dinamik tiplerle çalışan diller için hızlı prototipleme ve dinamik programlama imkanı sağlar. Bu, program geliştirme sürecini hızlandırabilir ve esneklik kazandırabilir.

Güvenlik: Bytecode, genellikle bir ara dil olarak kullanıldığı için, kaynak kodun güvenliğini sağlar. Bytecode'u dağıtırken, kaynak kodun tamamını açıklamadan uygulamanın çalıştırılmasını sağlayabilirsiniz.

Optimize Edilmiş Dağıtım: Bytecode'un küçük boyutlu olması, uygulamaların dağıtımını ve indirilmesini kolaylaştırabilir. Ayrıca, bytecode'un yorumlanması, düşük kaynak tüketimi ile uygulamaların daha az bellek ve işlemci gücü kullanmasını sağlayabilir.

Dezavantajları:


Bağımlılıklar ve Uyum Sorunları: Bytecode'un yorumlanması veya JIT derlemesi, genellikle bir sanal makine üzerinde gerçekleştirilir. Bu durum, doğrudan makine kodu çalıştırma işlemine kıyasla bağımlılık ve uyumluluk sorunlarına yol açabilir.

Geliştirme ve Bakım: Bytecode'un yorumlanması veya JIT derleme süreci, geliştirme araçlarının ve ortamlarının karmaşıklığını artırabilir. Ayrıca, JIT derleme süreci genellikle geliştirme sırasında beklenmeyen davranışlara neden olabilir.

Debugging Zorlukları: Bytecode, genellikle yorumlayıcı veya JIT derleyici tarafından üretilen ara bir kod olduğu için, hata ayıklama süreci zorlaşabilir. Kaynak kodun hata ayıklaması için doğrudan makine kodundan daha az bilgi sunabilir.

Güvenlik Açıkları: Bytecode'un güvenliği, bytecode yorumlayıcı veya JIT derleyicinin güvenliği ile doğrudan ilişkilidir. Bu nedenle, bu bileşenlerdeki güvenlik açıkları, uygulamanın güvenliğini tehlikeye atabilir.

Örnek:

gofdr18.png
sgajx20.jpg


(Genel ağdan alınmıştır.)
pDHFoUY.png

Ruby İçin ByteCode

Mantıklı olarak fikir yürüttüğünüzde aklınıza bytecode kullanarak Ruby kodunu derleyebilir miyiz ve daha sonra da bu derlenmiş hali ".exe" uzantısına çevirebilir miyiz? şeklinde sorular gelebilir.

Şöyle açıklayayım:

Bildiğiniz üzere programlama dillerinde birden fazla derleyici/yorumlayıcı olabiliyor. Örnek olarak her belirli bir seviyeye ulaşmış Python yazılmcısının bildiği CPython ve Python'un Java ile implementasyonunu, Ruby için Rubinius, JRuby, MRI gibi birçok alternatiflerini verebilirim.

Ruby'nin geliştiricisinin yazdığı MRI (Mat'z ruby Interpreter) söz diziminde yazılan bir Ruby kodu ".exe" uzantısına çevirilemez veya doğrudan derlenemez. Diğer alternatiflerin arasında farklı formatlara dönüşümler destekleyen yorumlayıcılar elbette var fakat kütüphane sorunları (uyuşmazlık ve desteklememe vb.) yüksek derecede gözlemleniyor.

Örnek olarak, JRuby derleyicisi ile kodlarınızı ".jar" uzantılı dosyalara çevirebilirsiniz fakat her kütüphane eskisi gibi stabil çalışmaz ve JRuby doğrudan MRI yorumlayıcısının söz dizimini desteklemez.

Sorularımıza tekrar dönecek olursak, Ruby kodu bytecode formatına evet derlenebilir fakat, fark ederseniz sürekli olarak "doğrudan derleme" kavramından bahsettim. Ruby için bytecode formatına yapılan derleme tam anlamıyla ve doğrudan bir derleme sayılmaz, çalıştırılmadan önceki ara kod hali sayılır.

Örnek:

test.rb isminde basit bir http isteği yapan Ruby kodu:

Ruby:
require 'uri'
require 'net/http'

uri = URI.parse("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme = 'https')
req = Net::HTTP::Get.new(uri)
res = http.request(req)

puts res.body

convert.rb isminde test.rb dosyamı bytecode haline çevirecek kod:
Ruby:
byte_code = RubyVM::InstructionSequence.compile_file 'test.rb'

File.binwrite 'bytecode', byte_code.to_binary

Ruby'nin bytecode halini yükleyip çalıştıracak olan kod:
Ruby:
bytecode = File.binread('bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode

instruction_from_byte_code.eval

Çalıştırdığınız zaman, aynı sonuçları alırsınız ve kütüphaneler çoğunluklu olarak MRI'ya göre geliştirildiğinden bytecode halinde kütüphane sorunlarını en aza indirmiş olursunuz.
pDHFoUY.png

Ruby Kodunu .exe Uzantısına Çevirmeyi Vadeden Yazılımlar ve Kütüphaneler

Topluluklarda, dokümanlarda ve çeşitli yerlerde görebileceğiniz, programlarının bu işlevi sağladığını söyleyen geliştiriciler var.

Ücretli programlardan bazıları bunu gerçekten yapıyor fakat, yine bizi daha önce bahsettiğim kütüphane sorunlarıyla baş başa bırakıyorlar.

Yeni Ruby sürümleri yayınlandığında yapılan değişikliklere bağlı olarak bu programların çoğu yine işe yaramaz hale geliyor.

Buna örnek olarak OCRA kütüphanesini verebilirim.

Araştırdığınız zaman internette bunun gibi makaleler buluyorsunuz.


Makale Linki

Bu ve bunun gibi makalelerde kullanılan yazılımların çoğu Ruby'nin 2.x.x versiyon kuşağının alt sürümlerini destekler ve yeni sürümlerde işlevsellik sağlamaz.
pDHFoUY.png


Bu konuda JIT derlemesinden doğrudan bahsetmedim, Bytecode ile EXE'nin üzerinde durdum ve JIT derlemesinin bytecode ile kullanımına değindim. Bytecode'da olduğu gibi JIT derlemesi de ayrı başlıklarda inceleniyor JIT derlemesi içim daha detaylı bir konu yakında yazacağım.

Okuyan herkese teşekkür ederim.

 

NMSHacking

Katılımcı Üye
4 Haz 2023
256
72

6449ti9.gif


pDHFoUY.png




Mehrabalar ben Bunjo, bu konuda Ruby ile yazılmış bir kodun derlenebilir olup olmadığını ve bytecode kavramını ele alacağım.



pDHFoUY.png




Ruby Kodu Derlenebilir mi?



Ruby kodunu derlemeye çalışmak benimde üzerinde uğraş gösterdiğim bir konuydu.



Ruby derlenmiş bir dil olmayp, yorumlanabilir bir dil olduğu için Ruby kodu tam anlamıyla derlenemez. Ruby kodu yorumlayıcı tarafından çalıştırılır, kod satırı satırıyla yorumlanır/okunur ve çalışma zamanında işlenir. Daha önceden kodu tam olarak derleyip, sonrasında derlenmiş kodu çalıştırmak gibi bir seçeneğimiz bu durumda olmuyor.



Bu durum, Ruby'nin dinamik özelliklerinden kaynaklanır. Kodun çalışma zamanında yorumlanması, dinamik tiplerin yönetilmesine ve kodun esnekliğine olanak tanır, ancak aynı zamanda bazı durumlarda derlenmiş dillere göre genellikle daha yavaş çalışma anlamına gelebilir.



Bu özelliklerin sonucuna iyi tarafından bakacak olursak, Ruby Meta Programlama gibi konularda üstün kontrol ve detsek sağlıyor.




pDHFoUY.png




ByteCode Nedir?



Byte Code, genellikle bir yüksek seviye programlama dilinin kaynak kodunun derlenmesi sonucu elde edilen ara bir kod formatıdır. Bu ara kod, genellikle makine diline oldukça yakın ancak belirli bir makine mimarisi bağımsızdır. Byte Code, bir sanal makine tarafından yorumlanabilir veya çalıştırılabilir.



Java gibi bazı programlama dilleri, derleme işlemi sonucunda Java Byte Code adı verilen bir ara kod üretir. Bu Byte Code, Java Sanal Makinesi (JVM) tarafından yorumlanarak veya derlenerek (Just-In-Time derleme) ilgili fiziksel makine koduna çevrilir ve çalıştırılır. Bu şekilde, Java programları farklı işletim sistemlerinde çalışabilir, çünkü JVM, işletim sistemine özgü farklılıkları gizler.



Özetle, Byte Code, bir derleme sürecinin sonucunda elde edilen, yüksek seviye programlama dili kaynak kodunu temsil eden ancak makine diline daha yakın ve genellikle taşınabilir bir formatta olan ara bir kod formatıdır.



Ruby'de bulunan JIT desteği ile Bytecode:



Avantajları:




Taşınabilirlik: Bytecode, yüksek seviye programlama dillerinin platform bağımsız olarak çalışmasını sağlar. Örneğin, Java'nın bytecode'u (Java Bytecode), Java Sanal Makinesi (JVM) üzerinde çalıştırılırken, farklı işletim sistemlerinde aynı bytecode'un kullanılabilmesini mümkün kılar.



Performans Optimizasyonu: Bytecode, JIT (Just-In-Time) derleyicileri tarafından optimize edilebilir. JIT derleme, bytecode'un çalışma zamanında makine koduna dönüştürülmesini sağlayarak performansı artırabilir.



Geliştirme Hızı ve Esneklik: Bytecode, dinamik tiplerle çalışan diller için hızlı prototipleme ve dinamik programlama imkanı sağlar. Bu, program geliştirme sürecini hızlandırabilir ve esneklik kazandırabilir.



Güvenlik: Bytecode, genellikle bir ara dil olarak kullanıldığı için, kaynak kodun güvenliğini sağlar. Bytecode'u dağıtırken, kaynak kodun tamamını açıklamadan uygulamanın çalıştırılmasını sağlayabilirsiniz.



Optimize Edilmiş Dağıtım: Bytecode'un küçük boyutlu olması, uygulamaların dağıtımını ve indirilmesini kolaylaştırabilir. Ayrıca, bytecode'un yorumlanması, düşük kaynak tüketimi ile uygulamaların daha az bellek ve işlemci gücü kullanmasını sağlayabilir.



Dezavantajları:




Bağımlılıklar ve Uyum Sorunları: Bytecode'un yorumlanması veya JIT derlemesi, genellikle bir sanal makine üzerinde gerçekleştirilir. Bu durum, doğrudan makine kodu çalıştırma işlemine kıyasla bağımlılık ve uyumluluk sorunlarına yol açabilir.



Geliştirme ve Bakım: Bytecode'un yorumlanması veya JIT derleme süreci, geliştirme araçlarının ve ortamlarının karmaşıklığını artırabilir. Ayrıca, JIT derleme süreci genellikle geliştirme sırasında beklenmeyen davranışlara neden olabilir.



Debugging Zorlukları: Bytecode, genellikle yorumlayıcı veya JIT derleyici tarafından üretilen ara bir kod olduğu için, hata ayıklama süreci zorlaşabilir. Kaynak kodun hata ayıklaması için doğrudan makine kodundan daha az bilgi sunabilir.



Güvenlik Açıkları: Bytecode'un güvenliği, bytecode yorumlayıcı veya JIT derleyicinin güvenliği ile doğrudan ilişkilidir. Bu nedenle, bu bileşenlerdeki güvenlik açıkları, uygulamanın güvenliğini tehlikeye atabilir.



Örnek:



gofdr18.png
sgajx20.jpg




(Genel ağdan alınmıştır.)




pDHFoUY.png




Ruby İçin ByteCode



Mantıklı olarak fikir yürüttüğünüzde aklınıza bytecode kullanarak Ruby kodunu derleyebilir miyiz ve daha sonra da bu derlenmiş hali ".exe" uzantısına çevirebilir miyiz? şeklinde sorular gelebilir.



Şöyle açıklayayım:



Bildiğiniz üzere programlama dillerinde birden fazla derleyici/yorumlayıcı olabiliyor. Örnek olarak her belirli bir seviyeye ulaşmış Python yazılmcısının bildiği CPython ve Python'un Java ile implementasyonunu, Ruby için Rubinius, JRuby, MRI gibi birçok alternatiflerini verebilirim.



Ruby'nin geliştiricisinin yazdığı MRI (Mat'z ruby Interpreter) söz diziminde yazılan bir Ruby kodu ".exe" uzantısına çevirilemez veya doğrudan derlenemez. Diğer alternatiflerin arasında farklı formatlara dönüşümler destekleyen yorumlayıcılar elbette var fakat kütüphane sorunları (uyuşmazlık ve desteklememe vb.) yüksek derecede gözlemleniyor.



Örnek olarak, JRuby derleyicisi ile kodlarınızı ".jar" uzantılı dosyalara çevirebilirsiniz fakat her kütüphane eskisi gibi stabil çalışmaz ve JRuby doğrudan MRI yorumlayıcısının söz dizimini desteklemez.



Sorularımıza tekrar dönecek olursak, Ruby kodu bytecode formatına evet derlenebilir fakat, fark ederseniz sürekli olarak "doğrudan derleme" kavramından bahsettim. Ruby için bytecode formatına yapılan derleme tam anlamıyla ve doğrudan bir derleme sayılmaz, çalıştırılmadan önceki ara kod hali sayılır.



Örnek:



test.rb isminde basit bir http isteği yapan Ruby kodu:


Ruby:
require 'uri'
require 'net/http'

uri = URI.parse("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme = 'https')
req = Net::HTTP::Get.new(uri)
res = http.request(req)

puts res.body

convert.rb isminde test.rb dosyamı bytecode haline çevirecek kod:

Ruby:
byte_code = RubyVM::InstructionSequence.compile_file 'test.rb'

File.binwrite 'bytecode', byte_code.to_binary

Ruby'nin bytecode halini yükleyip çalıştıracak olan kod:

Ruby:
bytecode = File.binread('bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode

instruction_from_byte_code.eval

Çalıştırdığınız zaman, aynı sonuçları alırsınız ve kütüphaneler çoğunluklu olarak MRI'ya göre geliştirildiğinden bytecode halinde kütüphane sorunlarını en aza indirmiş olursunuz.



pDHFoUY.png




Ruby Kodunu .exe Uzantısına Çevirmeyi Vadeden Yazılımlar ve Kütüphaneler



Topluluklarda, dokümanlarda ve çeşitli yerlerde görebileceğiniz, programlarının bu işlevi sağladığını söyleyen geliştiriciler var.



Ücretli programlardan bazıları bunu gerçekten yapıyor fakat, yine bizi daha önce bahsettiğim kütüphane sorunlarıyla baş başa bırakıyorlar.



Yeni Ruby sürümleri yayınlandığında yapılan değişikliklere bağlı olarak bu programların çoğu yine işe yaramaz hale geliyor.



Buna örnek olarak OCRA kütüphanesini verebilirim.



Araştırdığınız zaman internette bunun gibi makaleler buluyorsunuz.




Makale Linki



Bu ve bunun gibi makalelerde kullanılan yazılımların çoğu Ruby'nin 2.x.x versiyon kuşağının alt sürümlerini destekler ve yeni sürümlerde işlevsellik sağlamaz.



pDHFoUY.png




Bu konuda JIT derlemesinden doğrudan bahsetmedim, Bytecode ile EXE'nin üzerinde durdum ve JIT derlemesinin bytecode ile kullanımına değindim. Bytecode'da olduğu gibi JIT derlemesi de ayrı başlıklarda inceleniyor JIT derlemesi içim daha detaylı bir konu yakında yazacağım.



Okuyan herkese teşekkür ederim.




çok güzel konu olmuş

bu arada bir şey sormak istiyorum konularında şu üstteki kırmızı taban üzeri siyah TURKHACKTEAM yazısını nasıl yapıyorsun?
 
Moderatör tarafında düzenlendi:

Bunjo

Ar-Ge Ekibi Asistanı
14 Ara 2020
1,639
1,981
💎
Düzenleyen moderatöre teşekkür ederim.

çok güzel konu olmuş

bu arada bir şey sormak istiyorum konularında şu üstteki kırmızı taban üzeri siyah TURKHACKTEAM yazısını nasıl yapıyorsun?
Yazı değil o resim, basit bir şekilde o görseli buradan seçip kopyala daha sonra kendi koduna yapıştır. Daha fazla detay için forumda arama yaparak konu hazırlama rehberlerini bulabilirsin.
 

NMSHacking

Katılımcı Üye
4 Haz 2023
256
72
Düzenleyen moderatöre teşekkür ederim.


Yazı değil o resim, basit bir şekilde o görseli buradan seçip kopyala daha sonra kendi koduna yapıştır. Daha fazla detay için forumda arama yaparak konu hazırlama rehberlerini bulabilirsin.
Teşekkür ederim.
 

LydexCoding

Katılımcı Üye
24 May 2024
431
140
:)

6449ti9.gif


pDHFoUY.png




Mehrabalar ben Bunjo, bu konuda Ruby ile yazılmış bir kodun derlenebilir olup olmadığını ve bytecode kavramını ele alacağım.



pDHFoUY.png




Ruby Kodu Derlenebilir mi?



Ruby kodunu derlemeye çalışmak benimde üzerinde uğraş gösterdiğim bir konuydu.



Ruby derlenmiş bir dil olmayp, yorumlanabilir bir dil olduğu için Ruby kodu tam anlamıyla derlenemez. Ruby kodu yorumlayıcı tarafından çalıştırılır, kod satırı satırıyla yorumlanır/okunur ve çalışma zamanında işlenir. Daha önceden kodu tam olarak derleyip, sonrasında derlenmiş kodu çalıştırmak gibi bir seçeneğimiz bu durumda olmuyor.



Bu durum, Ruby'nin dinamik özelliklerinden kaynaklanır. Kodun çalışma zamanında yorumlanması, dinamik tiplerin yönetilmesine ve kodun esnekliğine olanak tanır, ancak aynı zamanda bazı durumlarda derlenmiş dillere göre genellikle daha yavaş çalışma anlamına gelebilir.



Bu özelliklerin sonucuna iyi tarafından bakacak olursak, Ruby Meta Programlama gibi konularda üstün kontrol ve detsek sağlıyor.




pDHFoUY.png




ByteCode Nedir?



Byte Code, genellikle bir yüksek seviye programlama dilinin kaynak kodunun derlenmesi sonucu elde edilen ara bir kod formatıdır. Bu ara kod, genellikle makine diline oldukça yakın ancak belirli bir makine mimarisi bağımsızdır. Byte Code, bir sanal makine tarafından yorumlanabilir veya çalıştırılabilir.



Java gibi bazı programlama dilleri, derleme işlemi sonucunda Java Byte Code adı verilen bir ara kod üretir. Bu Byte Code, Java Sanal Makinesi (JVM) tarafından yorumlanarak veya derlenerek (Just-In-Time derleme) ilgili fiziksel makine koduna çevrilir ve çalıştırılır. Bu şekilde, Java programları farklı işletim sistemlerinde çalışabilir, çünkü JVM, işletim sistemine özgü farklılıkları gizler.



Özetle, Byte Code, bir derleme sürecinin sonucunda elde edilen, yüksek seviye programlama dili kaynak kodunu temsil eden ancak makine diline daha yakın ve genellikle taşınabilir bir formatta olan ara bir kod formatıdır.



Ruby'de bulunan JIT desteği ile Bytecode:



Avantajları:




Taşınabilirlik: Bytecode, yüksek seviye programlama dillerinin platform bağımsız olarak çalışmasını sağlar. Örneğin, Java'nın bytecode'u (Java Bytecode), Java Sanal Makinesi (JVM) üzerinde çalıştırılırken, farklı işletim sistemlerinde aynı bytecode'un kullanılabilmesini mümkün kılar.



Performans Optimizasyonu: Bytecode, JIT (Just-In-Time) derleyicileri tarafından optimize edilebilir. JIT derleme, bytecode'un çalışma zamanında makine koduna dönüştürülmesini sağlayarak performansı artırabilir.



Geliştirme Hızı ve Esneklik: Bytecode, dinamik tiplerle çalışan diller için hızlı prototipleme ve dinamik programlama imkanı sağlar. Bu, program geliştirme sürecini hızlandırabilir ve esneklik kazandırabilir.



Güvenlik: Bytecode, genellikle bir ara dil olarak kullanıldığı için, kaynak kodun güvenliğini sağlar. Bytecode'u dağıtırken, kaynak kodun tamamını açıklamadan uygulamanın çalıştırılmasını sağlayabilirsiniz.



Optimize Edilmiş Dağıtım: Bytecode'un küçük boyutlu olması, uygulamaların dağıtımını ve indirilmesini kolaylaştırabilir. Ayrıca, bytecode'un yorumlanması, düşük kaynak tüketimi ile uygulamaların daha az bellek ve işlemci gücü kullanmasını sağlayabilir.



Dezavantajları:




Bağımlılıklar ve Uyum Sorunları: Bytecode'un yorumlanması veya JIT derlemesi, genellikle bir sanal makine üzerinde gerçekleştirilir. Bu durum, doğrudan makine kodu çalıştırma işlemine kıyasla bağımlılık ve uyumluluk sorunlarına yol açabilir.



Geliştirme ve Bakım: Bytecode'un yorumlanması veya JIT derleme süreci, geliştirme araçlarının ve ortamlarının karmaşıklığını artırabilir. Ayrıca, JIT derleme süreci genellikle geliştirme sırasında beklenmeyen davranışlara neden olabilir.



Debugging Zorlukları: Bytecode, genellikle yorumlayıcı veya JIT derleyici tarafından üretilen ara bir kod olduğu için, hata ayıklama süreci zorlaşabilir. Kaynak kodun hata ayıklaması için doğrudan makine kodundan daha az bilgi sunabilir.



Güvenlik Açıkları: Bytecode'un güvenliği, bytecode yorumlayıcı veya JIT derleyicinin güvenliği ile doğrudan ilişkilidir. Bu nedenle, bu bileşenlerdeki güvenlik açıkları, uygulamanın güvenliğini tehlikeye atabilir.



Örnek:



gofdr18.png
sgajx20.jpg




(Genel ağdan alınmıştır.)




pDHFoUY.png




Ruby İçin ByteCode



Mantıklı olarak fikir yürüttüğünüzde aklınıza bytecode kullanarak Ruby kodunu derleyebilir miyiz ve daha sonra da bu derlenmiş hali ".exe" uzantısına çevirebilir miyiz? şeklinde sorular gelebilir.



Şöyle açıklayayım:



Bildiğiniz üzere programlama dillerinde birden fazla derleyici/yorumlayıcı olabiliyor. Örnek olarak her belirli bir seviyeye ulaşmış Python yazılmcısının bildiği CPython ve Python'un Java ile implementasyonunu, Ruby için Rubinius, JRuby, MRI gibi birçok alternatiflerini verebilirim.



Ruby'nin geliştiricisinin yazdığı MRI (Mat'z ruby Interpreter) söz diziminde yazılan bir Ruby kodu ".exe" uzantısına çevirilemez veya doğrudan derlenemez. Diğer alternatiflerin arasında farklı formatlara dönüşümler destekleyen yorumlayıcılar elbette var fakat kütüphane sorunları (uyuşmazlık ve desteklememe vb.) yüksek derecede gözlemleniyor.



Örnek olarak, JRuby derleyicisi ile kodlarınızı ".jar" uzantılı dosyalara çevirebilirsiniz fakat her kütüphane eskisi gibi stabil çalışmaz ve JRuby doğrudan MRI yorumlayıcısının söz dizimini desteklemez.



Sorularımıza tekrar dönecek olursak, Ruby kodu bytecode formatına evet derlenebilir fakat, fark ederseniz sürekli olarak "doğrudan derleme" kavramından bahsettim. Ruby için bytecode formatına yapılan derleme tam anlamıyla ve doğrudan bir derleme sayılmaz, çalıştırılmadan önceki ara kod hali sayılır.



Örnek:



test.rb isminde basit bir http isteği yapan Ruby kodu:


Ruby:
require 'uri'
require 'net/http'

uri = URI.parse("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme = 'https')
req = Net::HTTP::Get.new(uri)
res = http.request(req)

puts res.body

convert.rb isminde test.rb dosyamı bytecode haline çevirecek kod:

Ruby:
byte_code = RubyVM::InstructionSequence.compile_file 'test.rb'

File.binwrite 'bytecode', byte_code.to_binary

Ruby'nin bytecode halini yükleyip çalıştıracak olan kod:

Ruby:
bytecode = File.binread('bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode

instruction_from_byte_code.eval

Çalıştırdığınız zaman, aynı sonuçları alırsınız ve kütüphaneler çoğunluklu olarak MRI'ya göre geliştirildiğinden bytecode halinde kütüphane sorunlarını en aza indirmiş olursunuz.



pDHFoUY.png




Ruby Kodunu .exe Uzantısına Çevirmeyi Vadeden Yazılımlar ve Kütüphaneler



Topluluklarda, dokümanlarda ve çeşitli yerlerde görebileceğiniz, programlarının bu işlevi sağladığını söyleyen geliştiriciler var.



Ücretli programlardan bazıları bunu gerçekten yapıyor fakat, yine bizi daha önce bahsettiğim kütüphane sorunlarıyla baş başa bırakıyorlar.



Yeni Ruby sürümleri yayınlandığında yapılan değişikliklere bağlı olarak bu programların çoğu yine işe yaramaz hale geliyor.



Buna örnek olarak OCRA kütüphanesini verebilirim.



Araştırdığınız zaman internette bunun gibi makaleler buluyorsunuz.




Makale Linki



Bu ve bunun gibi makalelerde kullanılan yazılımların çoğu Ruby'nin 2.x.x versiyon kuşağının alt sürümlerini destekler ve yeni sürümlerde işlevsellik sağlamaz.



pDHFoUY.png




Bu konuda JIT derlemesinden doğrudan bahsetmedim, Bytecode ile EXE'nin üzerinde durdum ve JIT derlemesinin bytecode ile kullanımına değindim. Bytecode'da olduğu gibi JIT derlemesi de ayrı başlıklarda inceleniyor JIT derlemesi içim daha detaylı bir konu yakında yazacağım.



Okuyan herkese teşekkür ederim.




Ellerinize sağlık, güzel anlatmışsınız. İhtiyacı olan kişilere yardımcı olacaktır umarım :)
 

legandrary

Üye
24 Ağu 2023
150
26
Arkandayım

6449ti9.gif


pDHFoUY.png




Mehrabalar ben Bunjo, bu konuda Ruby ile yazılmış bir kodun derlenebilir olup olmadığını ve bytecode kavramını ele alacağım.



pDHFoUY.png




Ruby Kodu Derlenebilir mi?



Ruby kodunu derlemeye çalışmak benimde üzerinde uğraş gösterdiğim bir konuydu.



Ruby derlenmiş bir dil olmayp, yorumlanabilir bir dil olduğu için Ruby kodu tam anlamıyla derlenemez. Ruby kodu yorumlayıcı tarafından çalıştırılır, kod satırı satırıyla yorumlanır/okunur ve çalışma zamanında işlenir. Daha önceden kodu tam olarak derleyip, sonrasında derlenmiş kodu çalıştırmak gibi bir seçeneğimiz bu durumda olmuyor.



Bu durum, Ruby'nin dinamik özelliklerinden kaynaklanır. Kodun çalışma zamanında yorumlanması, dinamik tiplerin yönetilmesine ve kodun esnekliğine olanak tanır, ancak aynı zamanda bazı durumlarda derlenmiş dillere göre genellikle daha yavaş çalışma anlamına gelebilir.



Bu özelliklerin sonucuna iyi tarafından bakacak olursak, Ruby Meta Programlama gibi konularda üstün kontrol ve detsek sağlıyor.




pDHFoUY.png




ByteCode Nedir?



Byte Code, genellikle bir yüksek seviye programlama dilinin kaynak kodunun derlenmesi sonucu elde edilen ara bir kod formatıdır. Bu ara kod, genellikle makine diline oldukça yakın ancak belirli bir makine mimarisi bağımsızdır. Byte Code, bir sanal makine tarafından yorumlanabilir veya çalıştırılabilir.



Java gibi bazı programlama dilleri, derleme işlemi sonucunda Java Byte Code adı verilen bir ara kod üretir. Bu Byte Code, Java Sanal Makinesi (JVM) tarafından yorumlanarak veya derlenerek (Just-In-Time derleme) ilgili fiziksel makine koduna çevrilir ve çalıştırılır. Bu şekilde, Java programları farklı işletim sistemlerinde çalışabilir, çünkü JVM, işletim sistemine özgü farklılıkları gizler.



Özetle, Byte Code, bir derleme sürecinin sonucunda elde edilen, yüksek seviye programlama dili kaynak kodunu temsil eden ancak makine diline daha yakın ve genellikle taşınabilir bir formatta olan ara bir kod formatıdır.



Ruby'de bulunan JIT desteği ile Bytecode:



Avantajları:




Taşınabilirlik: Bytecode, yüksek seviye programlama dillerinin platform bağımsız olarak çalışmasını sağlar. Örneğin, Java'nın bytecode'u (Java Bytecode), Java Sanal Makinesi (JVM) üzerinde çalıştırılırken, farklı işletim sistemlerinde aynı bytecode'un kullanılabilmesini mümkün kılar.



Performans Optimizasyonu: Bytecode, JIT (Just-In-Time) derleyicileri tarafından optimize edilebilir. JIT derleme, bytecode'un çalışma zamanında makine koduna dönüştürülmesini sağlayarak performansı artırabilir.



Geliştirme Hızı ve Esneklik: Bytecode, dinamik tiplerle çalışan diller için hızlı prototipleme ve dinamik programlama imkanı sağlar. Bu, program geliştirme sürecini hızlandırabilir ve esneklik kazandırabilir.



Güvenlik: Bytecode, genellikle bir ara dil olarak kullanıldığı için, kaynak kodun güvenliğini sağlar. Bytecode'u dağıtırken, kaynak kodun tamamını açıklamadan uygulamanın çalıştırılmasını sağlayabilirsiniz.



Optimize Edilmiş Dağıtım: Bytecode'un küçük boyutlu olması, uygulamaların dağıtımını ve indirilmesini kolaylaştırabilir. Ayrıca, bytecode'un yorumlanması, düşük kaynak tüketimi ile uygulamaların daha az bellek ve işlemci gücü kullanmasını sağlayabilir.



Dezavantajları:




Bağımlılıklar ve Uyum Sorunları: Bytecode'un yorumlanması veya JIT derlemesi, genellikle bir sanal makine üzerinde gerçekleştirilir. Bu durum, doğrudan makine kodu çalıştırma işlemine kıyasla bağımlılık ve uyumluluk sorunlarına yol açabilir.



Geliştirme ve Bakım: Bytecode'un yorumlanması veya JIT derleme süreci, geliştirme araçlarının ve ortamlarının karmaşıklığını artırabilir. Ayrıca, JIT derleme süreci genellikle geliştirme sırasında beklenmeyen davranışlara neden olabilir.



Debugging Zorlukları: Bytecode, genellikle yorumlayıcı veya JIT derleyici tarafından üretilen ara bir kod olduğu için, hata ayıklama süreci zorlaşabilir. Kaynak kodun hata ayıklaması için doğrudan makine kodundan daha az bilgi sunabilir.



Güvenlik Açıkları: Bytecode'un güvenliği, bytecode yorumlayıcı veya JIT derleyicinin güvenliği ile doğrudan ilişkilidir. Bu nedenle, bu bileşenlerdeki güvenlik açıkları, uygulamanın güvenliğini tehlikeye atabilir.



Örnek:



gofdr18.png
sgajx20.jpg




(Genel ağdan alınmıştır.)




pDHFoUY.png




Ruby İçin ByteCode



Mantıklı olarak fikir yürüttüğünüzde aklınıza bytecode kullanarak Ruby kodunu derleyebilir miyiz ve daha sonra da bu derlenmiş hali ".exe" uzantısına çevirebilir miyiz? şeklinde sorular gelebilir.



Şöyle açıklayayım:



Bildiğiniz üzere programlama dillerinde birden fazla derleyici/yorumlayıcı olabiliyor. Örnek olarak her belirli bir seviyeye ulaşmış Python yazılmcısının bildiği CPython ve Python'un Java ile implementasyonunu, Ruby için Rubinius, JRuby, MRI gibi birçok alternatiflerini verebilirim.



Ruby'nin geliştiricisinin yazdığı MRI (Mat'z ruby Interpreter) söz diziminde yazılan bir Ruby kodu ".exe" uzantısına çevirilemez veya doğrudan derlenemez. Diğer alternatiflerin arasında farklı formatlara dönüşümler destekleyen yorumlayıcılar elbette var fakat kütüphane sorunları (uyuşmazlık ve desteklememe vb.) yüksek derecede gözlemleniyor.



Örnek olarak, JRuby derleyicisi ile kodlarınızı ".jar" uzantılı dosyalara çevirebilirsiniz fakat her kütüphane eskisi gibi stabil çalışmaz ve JRuby doğrudan MRI yorumlayıcısının söz dizimini desteklemez.



Sorularımıza tekrar dönecek olursak, Ruby kodu bytecode formatına evet derlenebilir fakat, fark ederseniz sürekli olarak "doğrudan derleme" kavramından bahsettim. Ruby için bytecode formatına yapılan derleme tam anlamıyla ve doğrudan bir derleme sayılmaz, çalıştırılmadan önceki ara kod hali sayılır.



Örnek:



test.rb isminde basit bir http isteği yapan Ruby kodu:


Ruby:
require 'uri'
require 'net/http'

uri = URI.parse("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme = 'https')
req = Net::HTTP::Get.new(uri)
res = http.request(req)

puts res.body

convert.rb isminde test.rb dosyamı bytecode haline çevirecek kod:

Ruby:
byte_code = RubyVM::InstructionSequence.compile_file 'test.rb'

File.binwrite 'bytecode', byte_code.to_binary

Ruby'nin bytecode halini yükleyip çalıştıracak olan kod:

Ruby:
bytecode = File.binread('bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode

instruction_from_byte_code.eval

Çalıştırdığınız zaman, aynı sonuçları alırsınız ve kütüphaneler çoğunluklu olarak MRI'ya göre geliştirildiğinden bytecode halinde kütüphane sorunlarını en aza indirmiş olursunuz.



pDHFoUY.png




Ruby Kodunu .exe Uzantısına Çevirmeyi Vadeden Yazılımlar ve Kütüphaneler



Topluluklarda, dokümanlarda ve çeşitli yerlerde görebileceğiniz, programlarının bu işlevi sağladığını söyleyen geliştiriciler var.



Ücretli programlardan bazıları bunu gerçekten yapıyor fakat, yine bizi daha önce bahsettiğim kütüphane sorunlarıyla baş başa bırakıyorlar.



Yeni Ruby sürümleri yayınlandığında yapılan değişikliklere bağlı olarak bu programların çoğu yine işe yaramaz hale geliyor.



Buna örnek olarak OCRA kütüphanesini verebilirim.



Araştırdığınız zaman internette bunun gibi makaleler buluyorsunuz.




Makale Linki



Bu ve bunun gibi makalelerde kullanılan yazılımların çoğu Ruby'nin 2.x.x versiyon kuşağının alt sürümlerini destekler ve yeni sürümlerde işlevsellik sağlamaz.



pDHFoUY.png




Bu konuda JIT derlemesinden doğrudan bahsetmedim, Bytecode ile EXE'nin üzerinde durdum ve JIT derlemesinin bytecode ile kullanımına değindim. Bytecode'da olduğu gibi JIT derlemesi de ayrı başlıklarda inceleniyor JIT derlemesi içim daha detaylı bir konu yakında yazacağım.



Okuyan herkese teşekkür ederim.




Elinize sağlık
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.