2010-04-15 19 views
8

Tercümanı programlama dilim için uygularken, önce basit bir konsol penceresi düşünürdüm. Bu, kullanıcının daha sonra kabuk olarak bağımsız bir program olarak çalıştırılan bir kod girmesini sağlayan basit bir konsol penceresi olduğunu düşündüm.Ruby ve Python etkileşimli konsollarını nasıl uygular?

Ancak ciddi sorunlar var: Kullanıcının girdiği her kod satırı bağımsız bir program olarak ele alınırsa, belirtecin ve ayrıştırıcıdan geçmesi gerekir ve sonra sadece yorumlayıcı tarafından yürütülür - ne işleve ne olur?

  • Python/Ruby etkileşimli konsolları (IDLE, irb) kodu nasıl "paylaşır"? Kod nasıl ele geçirildi?

Örnek:

yine her an çağrılabilir, böylece fonksiyon saklanır
>> def x: 
>> print("Blah") 
>> 
>> x() 

?

Etkileşimli konsol, her şeyi tekrar tekrar yürütmeden bir program olarak girilen her şeyi açık bir şekilde nasıl alabilir?

cevap

5

Python için, tüm parantezler, parantezler vb. Eşleşene kadar bir ifade tamamlanmaz. Bu algılanması oldukça kolaydır. Tamamen boş bir satır girilene kadar bir işlev/sınıf tanımı tamamlanmadı. Derleyici daha sonra girilen ifadeyi veya tanımlamayı derler ve çalıştırır.

Normal bir işlev, sınıf, modül vb. Gibi, REPL kendi yerel kapsamına sahiptir. REPL'ye girilen değişkenler ve tanımlar için kullanılan bu kapsamdır.

3

Sen kod modülü için belgeleri okuyarak Python etkileşimli konsolu hakkında daha fazla bilgi edinebilirsiniz:

kod modülü okuma-eval-baskı Python döngüleri uygulamanın olanaklar sağlar. Etkileşimli bir tercüman istemi sağlayan uygulamalar oluşturmak için kullanılabilecek iki sınıf ve kolaylık fonksiyonu dahil edilmiştir. ayrıştırıcı girişten belirteçleri alarak (bir dize, sembol, operatörü, vs) tutar, yani -

http://docs.python.org/library/code.html

3

bu dillerin çoğu "belirteç akımının" bir tür olan bir ayrıştırıcı kullanmak Tam bir ifadeye sahip oluncaya kadar akar, daha sonra bu ayrıştırılmış ifadeyi baytkod olarak derlenecek veya başka bir şekilde yürütülebilecek şekilde döndürür. Bir REPL döngüsü, söz konusu yapıyı ele almak için nispeten basittir, çünkü çözümleyici temel olarak daha fazla girdi ister ve kullanıcıya bir komut istemi verir ve kullanıcı daha fazla girdi girer. Devam istekleri gibi şeyler yapmak için ayrıştırıcıdan okuyucuya biraz iletişim gerekebilir.

Python ve Ruby, her ikisi de sırasıyla, sırayla (bir işlev bildirimi bir deyimdir) ifadeleri yürütür. Bu nedenle, kaynak dosyadaki büyük ölçüde aynı etkiye sahip olmak için yorumlayıcıda kod deyimiyle ifade çalıştırabilirsiniz.

İlgili konular