Ruby Programlama Dilinin Birçok Tercümanı ve Çalışma Zamanı

Yayınlanan: 2022-03-11

Tanıtım

Ruby mücevherinin birçok tonu olduğu gibi, Ruby yorumlayıcısının da birden çok uygulaması vardır.

En yaygın kullanılan Ruby yorumlayıcısı, Ruby'nin (Yukihiro Matsumoto) yaratıcısı ve Ruby çekirdek ekibi tarafından C'de geliştirilen referans uygulaması Ruby MRI'dır.

Ruby on Rails İşe Alma Kılavuzumuz, Rails'deki bazı dezavantajların alternatif bir Ruby yorumlayıcısı kullanılarak potansiyel olarak çözülebileceğini veya önlenebileceğini belirtmektedir. Bu makale, günümüzde mevcut olan çeşitli Ruby yorumlayıcı uygulamalarını ve çalışma zamanlarını göstererek her birinin avantajlarını ve dezavantajlarını tartışmaktadır.

mruby, JRuby, RubyMotion, Rubinius ve Ruby MRI dahil olmak üzere Ruby yorumlayıcılarının ve çalışma zamanlarının listesi

Ruby Sürüm Geçmişi (ve alternatif uygulamaları nasıl etkilediği)

Ne yazık ki, Ruby için Python Dil Referansının eşdeğeri yoktur (ISO/IEC 30170:2012, Ruby 1.8 / Ruby 1.9'u tanımlar, ancak Ruby 2.x için karşılık gelen bir özellik yoktur). Böyle bir dil belirtiminin yokluğunda, Ruby uygulayıcıları tipik olarak bunun yerine herhangi bir Ruby yorumlayıcısında çalıştırılabilen testler aracılığıyla Ruby dilinin beklenen davranışlarını belirleyen topluluk güdümlü RubySpec'e güvenir. Bu nedenle RubySpec, Ruby uygulayıcıları tarafından Ruby uygulamalarının fiili standartla davranışsal uyumluluğunu doğrulamak için kullanılır.

Resmi bir spesifikasyonun olmaması nedeniyle, Ruby'nin yeni sürümleri genellikle Ruby MRI'nın yeni sürümlerine karşılık gelir. Ruby'yi (dil) Ruby MRI'dan ayırmak için bir tasarım sürecini tartışan açık bir konu olduğunu belirtmekte fayda var.

Ruby dili ve MRI referans uygulaması arasındaki mevcut sıkı bağlantı göz önüne alındığında, alternatif Ruby uygulamalarının geliştiricileri bazen her yeni MRI yayınında sunulan dil değişikliklerine ayak uydurmak için mücadele ediyor.

Ruby 1.8 ve Ruby 1.9 arasındaki geçişte hiç bu kadar zor olmamıştı. 2007'de, Ruby'nin sözdizimini temizlemek ve pekiştirmek amacıyla (dil, Ruby 1.0'ın piyasaya sürülmesinden sonraki on yılda geliştiği için), Ruby çekirdek ekibi, dilde birçok geriye dönük uyumsuzluk getiren bir sürüm olan Ruby 1.9.0'ı yayınladı. . Sonuç olarak, tüm Ruby uygulamaları sözdizimsel sıçramayı 1.8'den 1.9'a yapmak için gerekli çabayı göstermedi. Bu nedenle, topluluk tarafından artık kullanılmayan, ancak yine de çevrimiçi bulabileceğiniz veya eski Ruby elleri tarafından konuşulan 1.8 tabanlı birkaç Ruby uygulaması vardır.

Ruby MRI'ın yeni bir sürümü, anlamsal bir sürüm oluşturma ilkesini izleyerek her Noel'de yayınlanır. Ruby 2.0 (2013'te yayınlandı) ve 2.1 (2014'te yayınlandı) her biri, Ruby geliştiricilerinin Ruby 1.9 ile geriye dönük uyumluluktan vazgeçmeden yararlanabileceği ek dil özellikleri getirdi.

Neden alternatif bir Ruby uygulaması kullanmalısınız? MR'ın nesi var?

Çok çeşitli kullanım durumları ve ortamlarını destekleyen çeşitli alternatif Ruby uygulamaları vardır. Java Enterprise ortamları. Mobil uygulamalar. JavaScript uygulamaları. Düşük CPU/RAM makineleri. Bu kullanım durumlarını desteklemeye ek olarak, alternatif uygulamalar bazen uygulamanızın özelliklerine bağlı olarak hız veya daha verimli bellek kullanımında ekstra bir artış da sağlayabilir.

Uzun bir süre boyunca birçok Ruby on Rails geliştiricisi MRI yerine Ruby Enterprise Edition'ı (REE) kullandı ve o zamanki MRI sürümüne kıyasla REE'deki daha iyi bellek yönetimi tekniklerinden yararlandı. (REE daha sonra 2012'de durduruldu.)

MRI varsayılan Ruby uygulaması olsa da, tüm ortamlar ve senaryolar için mutlaka doğru seçim değildir. Örneğin, MRI'ın eşzamanlılık desteği, JRuby veya Rubinius'unkinden daha düşüktür. Ayrıca, MRI'nın bellek ve çöp toplama şemaları sürekli olarak gelişiyor olsa da, hala bazı sorunları var.

Aşağıdaki Ruby uygulamaları anketi, projenizin operasyonel hedeflerine ve kısıtlamalarına en uygun yorumlayıcıyı seçmenize yardımcı olmayı amaçlamaktadır.

Matz'ın Ruby Tercümanı (MRI) / CRuby

Yukihiro Matsumoto (“Matz”, Ruby'nin yaratıcısı) liderliğindeki Ruby çekirdek ekibi tarafından C dilinde yazılan MRI, fiili standart olarak hizmet eden Ruby'nin referans uygulamasıdır. Bir işletim sistemi satıcısı, örneğin işletim sistemi yüklü yazılımın bir parçası olarak bir Ruby sürümü içeriyorsa, bu genellikle MRI sürümüdür. MRI, diğer Ruby uygulamalarından daha fazla ücretli çekirdek ekip üyelerinden ve Ruby ekosistemini geliştirmek isteyen kişilerden veya şirketlerden tahsis edilen katkılardan yararlanır.

Ruby MRI'nın yeni bir sürümü - standart kitaplık değişikliklerine ek olarak genellikle yeni dil özellikleri uygular - her Noel'de yayınlanır. Özellikler, genellikle Ruby çekirdek geliştirici posta listesindeki tartışmalara dayalı olarak, ilk olarak Ruby MRI'da uygulanır. Diğer Ruby uygulamaları, bazı durumlarda yıllarca bile geride kalıyor.

JRuby

JRuby, Java Sanal Makinesi (JVM) üzerine uygulanan bir Ruby sürümüdür. Java'nın ötesindeki dillerin JVM'nin üzerinde çalışması popüler hale geldiğinden (sizin yönünüze bakıyorum, Clojure ve Scala), JVM tabanlı bir Ruby uygulamasının popülerlik kazanması muhtemeldir.

JVM'deki Ruby ayrıca, Ruby'nin Java'nın çalışabileceği her yerde çalışabileceği anlamına gelir (örneğin, Ruboto kullanan Android telefonlar gibi). Ek olarak, JVM'nin birlikte çalışabilirliği sayesinde JRuby kodu, hem standart hem de 3. taraf kitaplıkları dahil olmak üzere Java platformunu kullanabilir.

JRuby, Rails tabanlı bir çözümü yalnızca Java dağıtım ortamına getirmek, Rails uygulamasını bir Tomcat kapsayıcısına dağıtmak üzere bir .war dosyası olarak paketlemek veya web ön uçunuzun bir parçası olarak çalışan bir Java uygulaması olarak da kullanışlıdır. , Örneğin.

Yine de JVM'ye alışkın olmayanlar için JRuby, Ruby yorumlayıcısının yavaş başlatılması, 3. taraf Java kitaplıkları kullanıyorsanız CLASSPATH sorunlarının ayıklanması, daha büyük bellek kullanımı ve artık kodunuzun iş parçacığı güvenliği hususları göz önünde bulundurularak yazılmalıdır.

Ayrıca, Ruby'nin bazı özellikleri (C API'leri ve Ruby'nin güçlü iç gözlem araçlarından biri olan ObjectSpace modülü) JRuby'de uygulanmaz.

Bütün bunlar, JVM kullanmanın avantajları, belirli durumlar veya projeler için dezavantajlardan daha ağır basabilir. JVM, JIT derleyicisini açmak veya yerel Java nesnelerini ve API'lerini kullanmak gibi birçok performans iyileştirmesine izin verir.

Zorlayıcı bir JRuby kullanım örneği olarak, eski bir iş arkadaşımın bir zamanlar CPU yoğun bir sorunu vardı ve başlangıçta Ruby 1.9.3'teki iş parçacıklarıyla çözdü. JRuby'ye geçtiğinde ve Java'nın java.util.concurrent.Executors 'ını kullandığında, bu işlem için çok sayıda büyüklük derecesinde (on binlerce kat daha hızlı) bir performans artışı gördü. Onun deneyini burada görün.

Rubinius

Rubinius, Düşük Düzeyli Sanal Makine (LLVM) üzerinde dinamik diller için genel bir çalışma zamanı uygulayan bir Ruby uygulamasıdır. Bu altyapıyı ve JIT derleyici teknolojisini kullanan Rubinius, genellikle Ruby kodunu MRI'dan daha az ek yük ile çalıştırabilir.

Rubinius ayrıca yorumlayıcının/çalışma zamanının geliştirilmesini daha hızlı ve daha kolay hale getirmek için mümkün olduğunca çok Ruby kullanılarak oluşturulmuştur.

Eğlenceli gerçek: RubySpec başlangıçta Rubinius'u uygulama sürecinde ortaya çıktı.

JRuby gibi Rubinius da bir JIT derleyicisi, daha iyi bellek yönetimi ve Ruby MRI'dan daha olgun bir sanal makine içerir. Ancak, JRuby'den farklı olarak Rubinius, Ruby C kitaplıklarını destekler ve Rubinius'un temelleri Java ile değil C++ ile yazılır.

JRuby'nin öğrenme eğrisi veya diğer dezavantajları olmadan Rails sunucularınızda yüksek performansa ihtiyaç duyduğunuzda Rubinius iyi bir orta yol olabilir.

mruby

mruby, Ruby'nin gömülebilir bir versiyonu olacak şekilde tasarlanmıştır (Ruby 1.9.3'ü destekler). mruby ile Ruby'yi yerel uygulamalarda betik/otomasyon dili olarak sunabilir, oyun betikleri için ve hatta Raspberry Pi gibi mikrodenetleyici kartlarını programlamak için kullanabilirsiniz.

Platformunuzun ciddi kaynak kısıtlamaları varsa, mruby sizin için tam olarak Ruby yorumlayıcısı olabilir. mruby ayrıca şunlar için de kullanılıyor:

  • iOS uygulamaları oluşturun (aşağıda tartışılan RubyMotion'a rakip olarak)
  • Geliştirme hızı için Ruby'yi iOS uygulamalarına gömün
  • Son kullanıcılara otomasyon amacıyla gömülü bir betik dili sunun

Nesnelerin İnterneti'nin giderek daha fazla gerçeklik kazanması, ev otomasyonunun kendi haline gelmesi ve son derece taşınabilir (ve nispeten güçlü) bilgisayarların daha yaygın hale gelmesiyle, desteklenecek hedef platformların manzarası giderek daha çeşitli hale geliyor. mruby, masaüstünde kullanılan aynı üretken dille bunu mümkün kılmaya yardımcı olur.

Opal

Opal, Ruby'yi JavaScript'e dönüştürmek için bir aktarıcıdır.

Coffeescript'in yükselişiyle birlikte geliştiriciler, JavaScript'i almak için JavaScript yazmaları gerekmediğini öğreniyor. Coffeescript'in kuşkusuz avantajları olsa da, onu yeterince uzun süre kullanırsanız, dilde sevmediğiniz şeylerle karşılaşmanız kaçınılmazdır.

Opal girin: Ruby yazın, Javascript alın . Oldukça havalı.

Opal, diğer Ruby uygulamalarıyla mümkün olduğunca tutarlı olmaya çalışır ve bu nedenle RubySpec'in bir alt kümesine karşı da test edilir. Bununla birlikte, JavaScript ve JavaScript çalışma zamanlarının doğasından kaynaklanan bazı uyumsuzluklar mevcuttur. Örneğin, Opal'daki dizeler ve semboller eşittir ve Opal herhangi bir iş parçacığı veya kabuk yürütme mekanizması sağlamaz.

Opal bağımsız çalışır veya Rails varlık ardışık düzeninin bir parçası olarak kullanılabilir (örneğin, somefile.js.rb dosyanızı JavaScript'e otomatik olarak aktarmak için).

Belki JavaScript'in eşzamansız eşzamanlılık modeline (küçük bir Node.js hizmeti gibi) uygun bir sorunlu etki alanınız var, ancak Ruby alanından dili veya belirli taşları istiyorsunuz. Opal bu durumda sizin için iyi bir çözüm olabilir.

Ya da tam yığın bir Ruby web uygulaması yazmak isteyebilirsiniz. Opal ile yapabilirsiniz. Sunucu tarafı Ruby kodunuzu çalıştıran bir Ruby yorumlayıcıya sahip olun ve ardından istemci tarafında çalıştırmak için Opal'in JavaScript oluşturmasını sağlayın.

Opal, muhtemelen diğer JavaScript API'leriyle (örneğin DOM veya Node.js) etkileşimde bulunacağınızın farkındadır. Bu nedenle JavaScript'e geçişi kolaylaştırır ve jQuery gibi yaygın JavaScript kitaplıkları üzerinde bir miktar Ruby sözdizimsel şeker sağlar.

Opal'in JavaScript merkezli doğası, hem gücü hem de zayıflığıdır. Olumsuz tarafı, Opal'ın çalışma zamanı JavaScript çalışma zamanıdır ve Opal, JavaScript tasarım kararları tarafından bilgilendirilir. Bu nedenle, küçük bir kabuk betiği yazmak için iyi bir Ruby uygulaması veya Rails uygulamanız için daha iyi bir Ruby çalışma zamanı arıyorsanız, Opal muhtemelen en iyi seçiminiz değildir.

RubyMotion

RubyMotion, hem (a) bir Ruby uygulamasıdır (Objective-C ve Cocoa kullanılarak yazılmıştır) hem de (b) geliştiricilerin Ruby aracılığıyla Cocoa API'lerine erişebilmeleri için bir dizi dil bağlamasıdır.

RubyMotion, Ruby'de Cocoa yerel uygulamaları yazmanıza olanak tanıyan ticari bir üründür. RubyMotion 2.0, iOS ve Mac OS X uygulamalarını Ruby'de yazmanıza olanak tanır ve RubyMotion 3, aynı desteği Android'e getirmeyi vaat eder.

RubyMotion, Ruby dilinin 1.9 sürümünü uygular.

Geçersiz Uygulamalar

Ruby'nin ilk tanıtılmasından bu yana geçen yıllarda, ortaya çıkan bazı Ruby uygulamaları terk edildi veya durduruldu, örneğin:

  • Ruby Enterprise Sürümü (REE). REE, web geliştiricileri için birçok bellek ve çöp toplama geliştirmesi uygulayan Phusion Passenger'daki insanlardan bir MRI 1.8 çatalıydı. Birkaç yıl boyunca, üretim Rails siteleri için dağıtılan varsayılan Ruby uygulamasıydı. Yine de Ruby 1.9 veya Ruby 2.0 için hiçbir zaman güncellenmedi ve sonunda 2012'de durduruldu.
  • DemirRuby. IronRuby, Microsoft .NET'in üzerine uygulanan, C# ile yazılmış Ruby'dir ve bir süre proje Microsoft tarafından finanse edilmiştir. 2011'de terk edilen IronRuby, en son Ruby 1.8.6'yı destekledi.

Sarmak

Ruby ortamında seçilebilecek çok çeşitli çalışma zamanları ve yorumlayıcılar vardır. Çoğu Ruby projesi için Ruby referans uygulaması (Ruby MRI) tercih edilen yorumlayıcı olmaya devam ediyor. Ancak, işlevsel ve teknik hedeflerinize ve kısıtlamalarınıza bağlı olarak, alternatif Ruby uygulamaları projeniz için doğru seçim olabilir.

Ruby'nin referans uygulaması rolünde, MRI yeni dil özelliklerini daha hızlı alır, yeterince iyi eşzamanlılık ve bellek öykülerine sahiptir (yalnızca daha iyi hale gelir) ve taşlarla en geniş uyumluluğa sahiptir (bazıları kısmen C ile yazılmıştır). Sonuç olarak, MRI genel amaçlı Ruby kodu için sağlam ve güvenilir bir seçimdir.

Daha büyük, kurumsal dağıtımlar için veya Java koduyla (veya diğer JVM dilleriyle) etkileşime geçmeniz veya son derece gelişmiş eşzamanlılık kalıplarına ihtiyaç duyduğunuz durumlar için JRuby zorlayıcı bir seçenektir.

Ve elbette, benzersiz ihtiyaçlarınız varsa (örneğin, JavaScript yazma, mevcut nesil gömülü cihazlarda çalıştırma vb.), diğer Ruby alternatifleri tam da aradığınız şey olabilir.

Aralarından seçim yapabileceğiniz çok çeşitli Ruby çalışma zamanları ve yorumlayıcılar ile Ruby, kurumsal büyük bir Java dağıtım mağazasından ofisinizdeki bu trafik ışığını kontrol eden yazılıma kadar çok çeşitli bilgi işlem ortamları için kullanışlı, esnek bir dil olduğunu gösterir. Raspberry Pi'nizi geçen hafta sonuna bağladınız. Doğru amaç için doğru aracı seçmek önemlidir, evet, ancak umarız bu makale size Ruby'nin işletim sisteminizle birlikte gelen varsayılan Ruby yorumlayıcısından çok daha fazlası olduğunu göstermiştir.

Ruby dünyası, dilde değişiklikler önerildikçe çekirdek Ruby MRI ekibiyle birlikte çalışan alternatif Ruby uygulama ekipleri tarafından büyük ölçüde geliştirilmiştir. Zor kazanılan Ruby uygulama deneyimlerini ve dile giren özelliklere ilişkin kendi bakış açılarını ekleyerek Ruby uygulama topluluğuna çeşitlilik katıyorlar. Ruby meraklıları toplu olarak bu takımlara büyük bir minnet borçludur. Çabaları için kendilerine teşekkür ederiz!