5

Ruby'nin standart MRI uygulamasıyla bir süredir Ruby'de programlama yapıyorum, ancak her zaman hakkında duyduğum diğer uygulamaları merak ettim.Dil kendi başına nasıl yorumlanabilir (Rubinius gibi)?

Geçen gün Rubinius'u, Ruby'de yazılmış bir Ruby tercümanını okudum. Çeşitli yerlere bakmaya çalıştım ama tam olarak böyle bir şeyin nasıl çalıştığını anlamakta zorlanıyorum. Derleyiciler veya dil yazımı konusunda hiç deneyimim olmadı ama bunu anlamak gerçekten çok istiyor.

Bir dil tam olarak nasıl yorumlanabilir? Bunun mantıklı olduğunu anlamadığımı anlamada temel bir adım var mı? Birisi bunu bana bir aptalım gibi açıklayabilir mi (çünkü bu zaten tabandan çok uzakta olmayacaktır)

cevap

8

Düşündüğünüzden daha basit.

Rubinius, sadece çoğunlukla Ruby'de% 100 yazılmıştır. http://rubini.us/

örneğin, C ve Java gibi popüler dillerin büyük bir yönü itibaren

programcı mevcut işlevlerinin çoğunluğu dilin kendisi yazılmış olmasıdır. Rubinius, bu listeye Ruby ekleme amacına sahiptir. Rubyistler, dile daha kolay bir şekilde özellikler ekleyebilir, hataları düzeltebilir ve dilin nasıl çalıştığını öğrenebilir. Mümkün olan her yerde Ruby'de Rubinius yazılmıştır. Mümkün değil (henüz), bu C++.

+0

Bu sadece Rubinius örneğinde mi, yoksa kendi yorumculuğu yapan derleyiciler de, sadece bir şeylerin başlaması için başka bir dil kullanıyorlar mı? – joeellis

+0

Rubinius yalnız değil. Bence daha derin bir konuyla ilgili yorum takiplerinde sorduğun soru. Yani, doğrudan cevaplamak yerine, dergi ile ilgili olarak wikipedia hakkında bu yazıya işaret ederdim. http://en.wikipedia.org/wiki/Compiler Bu soru için, "Derleme" ve "Derleyici Çıktısı" bölümlerine bakınız. – jefflunt

0

Bu teknik genellikle metacircular evaluator denir ve ilk Lisp bağlamında birkaç yıl önce tanıtıldı. farketmez gerçi

tekniğin İyi bir açıklama

1

Çalıştığınız dil bazı dildir varsayalım bölüm 4. Structure and Interpretation of Computer Programs bulunabilir, Lisp'i söylüyorlar. (C++, Java, Ruby, bir şey olabilir.)

Lisp uygulamanız var. Bu uygulamayı Imp olarak adlandırın (sadece IMPlementation için kısa ismi yazdı). Imp kendi içinde bir program olduğu için bilgisayarınız bunu çalıştırabilir. Artık Lisp'de Lisp için kendi uygulamanızı yazıyorsunuz ve buna Circ. Circ sadece Lisp kodundan derlenmiş bir programdır (ya da dilerseniz yorumlanır). Kodunuz yazılır, böylece bir dosyada okur, ayrıştırır (anlamlı veriye işler) ve verilerle bir şeyler yapar. Bu ne böyle? Circ durumunda, verileri yürütür.

Ama nasıl yapıyor?

Basit bir durumda, Circ'in okuduğu ve ayrıştırdığı kodun biraz matematik yapmak ve sonucu vermek gibi basit bir durum olduğunu varsayalım. Circ, kodu kullanımı kolay veriye dönüştürür (Lisp gibi bir dil için başlaması kolaydır, ancak bu noktanın ötesinde) ve saklar. Lisp'de kod numaralarını yazmak için kod yazabilirsiniz, böylece Circ için yazılmış olan kod, Lisp'de yazıldığından da bunu yapabilir. Böylece işlenen veriler, bazı ekleme işleme kodlarına takılı ... ve voila! Sayısal sonuca sahipsin! Sonra Circ programınız sonucu verir.

Aynı şey basit matematikten daha karmaşık şeylerle de yapılabilir. Aslında, dilin diğer yönlerini derleyebilir/yorumlayabilirsiniz. Bu 'diğer yönlerini' yeterince yazıp bunları birbirine yapıştırın, Lisp için yazılmış bir derleyiciyi edinin.

Derleyici, Imp tarafından derlendiğinden, makineniz tarafından ve presto! Bitirdiniz.

+0

Sanırım noktayı kaçırıyorsun. Evet, eğer bir derleyici bir derleyici ise, sadece başka bir derleyiciyi derleyebilirim ve kullanıcı onu makinede çalıştırabilir (ancak, eğer derlenmiş programlar isterlerse, derleyici-çalışma arkadaşının bazı çalışma zamanı ortamlarını gerektirirler. . Bununla birlikte, imp ve circ tercümanları ise, circ-interpreter'ı kullanmak isteyen herkes önce imp interpörü kurmalı ve daha sonra lisp-uygulamalarını, uygulamayı yorumlamak için circ ve circ'i yorumlamak için imp kullanarak çalıştırmalıdır. Eğer rubinius için böyle olsaydı, kimse kullanmazdı. – sepp2k

+0

Oh, anlıyorum. OP'nin biraz farklı bir soru sorduğunu düşündüm. –

2

Rubinius söz konusu olduğunda, VM C++ dilinde yazılmıştır ve tüm lowlevel (işletim sistemi ile ilgili) malzeme ve temel işlemleri ele almaktadır. VM'nin kendi bytecode formatı vardır (JVM'nin de kendi başına olduğu gibi) ve Rubinius başlatıldığında bayt kodunu çalıştıran VM'yi başlatır. Rubinius'un standart kütüphanesinin çoğu (Ruby'nin dilinin bir parçası olan) Ruby'de C (MRI) veya Java (JRuby) ile karşılaştırılmıştır. Ayrıca, Rubinius bytecode derleyicisi de Ruby'de yazılmıştır. Evet, bir noktada, başlangıçta Rubinius'u önyüklemek için standart Ruby tercümanını (MRI) kullanmaları gerekiyordu. Ancak bu artık olmamalıdır (her ne kadar yapı sistemi kullandığı için hala ihtiyaç duyacağınızdan emin değilim).

4

Aradığın kavram derleyici bootting. dilin x dil x için bir derleyici (veya bir tercüman) yazma

Temelde işe koşulması demektir. Bu, ya temel bir derleyiciyi el ile daha düşük bir seviyede yazarak (yani, Derleme'de bir C derleyicisi yazarak) ya da farklı bir üst düzey dil kullanarak yapılır.

wikipedia adresindeki ön yükleme hakkında daha fazla bilgi edinin. Greg'in meta-dairesel değerlendiricilere ilişkin cevabı da, SICP'deki ilgili bölüm de dahil olmak üzere, şiddetle tavsiye edilmektedir.

İlgili konular