Dinamik bir dil geliştirme


11

Çok basit diller için birkaç elle yazılmış derleyici oluşturdum, ancak şimdi basitleştirilmiş bir Python veya Ruby'ye benzer bir dinamik dil geliştirme konusunda elimi denemek istiyorum. Ancak, derleyicilerin nasıl çalıştığına kafamı sarmak kolay oldu. İlkel derleyiciler çevirir. Ama eğer dil dinamikse bunu yapamam. Çalışma zamanında bilgileri takip eden ve bana çok daha fazla iş veren bir tercüman veya VM yazmam gerekiyor.

Kısacası, derleyicilerin nasıl çalıştığını bildiğim, ancak bir tercüman oluşturmak için göç etmek istediğimi düşünerek kontrol etmem gereken kaynaklar var mı? Dinamik diller için birkaç sanal makine var, ancak kendi dilimi döndürmekle ilgili bir sorunum yok. Bu sadece benim kişisel deneyimim için.

Bir derleyiciden tercümana nasıl geçileceği hakkında bilgi arıyorum. X dili için zaten bir derleyici yaptım, ancak şimdi ne bir tercüman yazacaksam, ne yapılması gerekiyor ve sürecin üzerinden geçen kaynaklar var mı?

Derleyicilerin veya sanal makinelerin nasıl çalıştığına dair geniş veya soyut kaynaklar istemiyorum. Konuyla ilgili çok sayıda ders kitabım var. Çevrimiçi bulduğum tüm kaynaklar ya 0 deneyime sahip olduğunuzu varsayar ve böylece sözlü ya da sözdizimsel analizle başlatırsınız ya da son derece soyutturlar. Çalışan bir derleyicim var, ama şimdi bunu bir tercümana dönüştürmek ve dile dinamik özellikler eklemek istiyorum.

Bu süreçte kaynak bulamadım, kapsamı çok sınırlı olabilir veya çok teorik olmadan bir tercümanın "arka ucundaki" kaynaklar bu yüzden burada yayınladım.


1
Bunun gibi tonlarca kaynak var. Derleyici ve yorumlayıcı arasındaki çizginin düşündüğünüzden daha bulanık olduğunu unutmayın; C # 4.0 derleyicisi, diğer derleyiciler gibi dinamik programlamayı da destekler.
Robert Harvey

@RobertHarvey Evet, istediğim kaynaklar için kendi çalışma zamanımı / tercümanımı / sanal makinemi yapmam. Net tercümanı benimkini temel almam için çok karmaşık!
Austin Henley


1
Ve bu SO sorusuna göz
yannis

Yanıtlar:


4

İlk önce tercüman uygulama hakkında bilgi edinin. PLAI'yi öneririm (Programlama Dilleri: Uygulama ve Yorumlama) . Sözdizimi üzerinde uzun süre kalmadan yorumlama etine çabucak ulaşır.

Diliniz için, derleyicinin ön ucunu (çoğunlukla ayrıştırıcı) ve çalışma zamanı kitaplığını (GC, veri yapıları, ilkel işlemler, vb.) Yeniden kullanabilirsiniz.

Tabii ki, bir yorumlayıcıda kullanacağınız aynı veri yapılarını işleyen (bazılarını) kod üreten bir derleyici ile dinamik bir dil de uygulayabilirsiniz. Örneğin, bir yorumlayıcıda genel değişkenleri dize dizinli bir karma tablosu olarak uygulayabilirsiniz. Bir derleyicide, global değişken referanslarını aynı tabloyu kullanarak aramayı yapan koda derlersiniz. Bunun aksine, sözlük değişkenlerini daha verimli bir temsilde ("yerel" argümanlar ve kapatma yapısı referansları) derleyebilirsiniz.


5

Dinamik bir dil için bir tercüman uygulamanın temellerini öğrenmek istiyorsanız, ilk dinamik, yorumlanmış programlama dilinin kökenlerinden daha iyi bir yer düşünemiyorum: Lisp.

Orijinal 1960 makalesinde John McCarthy, bir Lisp için gerekli 5 ilkel işlevi tanımladı. Elbette, McCarthy Lisp üzerine yazdığı makaleyi sadece akademik bir alıştırma olarak tasarladı; evalMecliste görev yapan ve ilk Lisp tercümanını yaratan bir yüksek lisans öğrencisiydi . Paul Graham yedi ilkel tanımlar : alıntı, atom, eşdeğer, eksiler, araba, cdr ve koşul.

Mesele şu ki, Lisp'i gerçekten herhangi bir dilde uygulayabilirsiniz; Bir kez uyguladığınızda eval, bir REPL kurmak kolaydır ve interaktif bir tercümanınız vardır. İnsanlar Lisps'i C, Java, Ruby, Python ve diğer birçok dilde uygulayacak kadar sıkılmış veya meraklanmıştır. Ve her zaman bilerek değil; Greenspun'un Onuncu Kuralını hatırlamak önemlidir :

Yeterince karmaşık olan herhangi bir C veya Fortran programı, Common Lisp'in yarısının ad hoc, gayri resmi olarak belirtilmiş, hata basmış, yavaş bir uygulamasını içerir.

Son hedefinizin bir Lisp uygulaması olması gerektiğini söylemiyorum; ancak dinamik bir dil uygulamayı öğrenirken homoikonikliğin faydaları vardır; deyimsel sözdiziminin özdeş olduğu bir dil hakkında bir sözcük / ayrıştırıcı kullanan bir dilin AST'sini öğrenebildiğinizde neden sözdizimi sorunları ile başa çıkalım?

Her neyse ... sadece bir öneri. Ancak, C'den beri en büyük programlama dillerinin çoğunun Lisp-doğasının en azından bir kısmına sahip olması iyi bir nedendir.


1
Keşke iki cevabı kabul edebilseydim. Teşekkürler, gerçekten bir Lisp tercümanı uygulayacağımı düşünüyorum. Ayrıştırmak kolaydır, tonlarca belge ve mevcut kod vardır ve bana çalışmak için bir temel sağlamalıdır. Ne yazık ki Scheme kullanılan bir lisans dersi aldım ve saçımı çekmemi sağladı;)
Austin Henley

1
Şimdi kendi dilimi kendi Lisp lehçemde derlemeye başladım!
Austin Henley

1
Ayrıca bkz Lisp Küçük Lisp
coredump

0

Bu (~ 600 satır C #), alıntı / liste / uygula / eval / test / vb.

https://repl.it/CdjV/3

Örneğin:

        var factorial = (Lambda)language.
            Evaluate
            (@"
                ( => ( n ) (
                        ? ( != n 0 )
                        ( * n ( this ( - n 1 ) ) )
                        1
                    )
                )
            ");

        var sw = new System.Diagnostics.Stopwatch();
        var n = 12;
        var r = 0;
        int k;
        sw.Start();
        for (k = 0; k < 10000; k++)
        {
            r = (int)factorial.Invoke(null, n);
        }
        sw.Stop();
        Console.WriteLine("{0}! = {1}", n, r);
        Console.WriteLine();
        Console.WriteLine("in {0} ms (for {1} times)", sw.ElapsedMilliseconds, k.ToString("0,0"));

'HTH,


0

Biraz Şema (örneğin SICP okumuş ) veya Lisp bildiğinizi varsayarsak , Queinnec'in Lisp In Small Pieces kitabını tavsiye ederim . Lisp benzeri tercümanların ve derleyicilerin çeşitli varyantlarını açıklar (bayt koduna veya C'ye dahil).

Ayrıca, Scott'ın Programlama Dili Pragmatiği , en son Dragon Kitabı , GC el kitabı , Pierce Türleri ve programlama dillerini okuyun .

Bir derleyiciden tercümana nasıl geçileceği hakkında bilgi arıyorum.

Daha sonra, kısmi değerlendirme (& Futamura projeksiyonları) ve devam etme tarzı ilgili olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.