2010-07-11 15 views
14

Henüz llvm veya clang ile deneyimim yok. Ben clang okuduğumdan kolayca Wikipedia-Clang gömülebilir olduğu söylenir, ancak, bunun nasıl elde edileceği hakkında herhangi bir öğretici bulamadım. JIT, kullanıcı tarafından tanımlanan kodun çalışma zamanında derlenmesi ve yürütülmesi ile komut dosyası-güçleri ile bir C++ uygulamasının kullanıcıya sunulması mümkün mü? Uygulamaların kendi sınıflarını ve yöntemlerini çağırıp nesneleri paylaşması mümkün mü?Clang komut dosyasını yorumlayıcı olarak C++ Koduna gömmek için herhangi bir eğitim var mı?

düzenleme: Ben herhangi öğretici bilmiyorum bir C-benzeri komut-Dil Düzenleme için sözdizimi (hatta C++ kendisi)

cevap

10

tercih ediyorum, ama Clang kaynağında bir örnek C tercüman var Bu yararlı olabilir. Burada bulabilirsiniz: Eğer bu yol giderseniz Muhtemelen betik dili için sözdizimi fazla bir seçenek olmaz http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

. Clang yalnızca C, C++ ve Object C'yi ayrıştırır. Herhangi bir değişiklik istiyorsanız, işinizin sizin için kesilmiş olabilir.

+0

Teşekkür ederiz. Onu çalıştırmak ve çalıştırmak için epeyce zamanımı aldı - temelde yürütülebilir dosyayı bulamadım :) Şimdi baktıktan sonra, bunun yarı yolda olduğunu söyleyebilirim. Şimdi, jumper olmayan kısımda tanımlanan fonksiyonların nasıl çağrılacağını anlamaya ihtiyacım var. ... bunun hakkında bir fikrin var mı? – FFox

+0

Ne demek istediğinden emin değilim. Derlediğiniz herhangi bir işleve bir işaretçi gösterebilmeniz gerekir. Belki bu genel LLVM dersi faydalı olabilir: http://llvm.org/docs/tutorial/ (bölüm 4, özellikle). Bu tercümanı olduğu gibi kullanabileceğinizi beklemiyorum, ancak uygulamanıza bir C/C++ yorumlayıcısının nasıl yerleştirileceği hakkında bir fikir vermelisiniz. (Onu bile kullanmadım, sadece onu hatırladım.) –

+1

Tamam, yaptığım şey: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... ve aslında cfe-dev posta listesindeki güzel insanların yardımıyla işe yaradı. Neden bu tercüman bir uygulamada kullanılamaz? – FFox

0

Ben Clang bilmem ama Ch bakmak isteyebilirsiniz:

http://www.softintegration.com/

Bu gömülebilir olarak tarif edilir ya da tek başına ++ tercüman c/c. Orada burada gömme örneklerle Dr. Dobbs makale: Ben onunla oynamak daha yapmadıysanız

http://www.drdobbs.com/architecture-and-design/212201774

ama istikrarlı ve olgun bir ürün gibi görünüyor. Ticari, kapalı kaynaklıdır, ancak "standart" versiyon, kişisel ve ticari kullanım için ücretsiz olarak tanımlanmıştır. Ancak, lisansa bakıldığında, "ticari" nin sadece şirket içi kullanımı içerdiği, daha sonra satılan veya dağıtılan bir ürüne gömülmediği görülmektedir. (Ben avukat değilim, bu yüzden açıkça bir lisans koşullarının belli olmaya SoftIntegration ile kontrol etmelisiniz.) Diğer cevaplar da belirttiği gibi JIT derleme uygulamak için kitaplık olarak clang kullanabilirsiniz

5

. Sonra, derlenmiş modülü yüklemelisiniz (bir .so kitaplığı olsun).

Bunu yapmak için, standart dlopen (unix) veya LoadLibrary (windows) 'ı yüklemek için kullanabilirsiniz, sonra derlenmiş işlevleri dinamik olarak referanslamak için dlsym (unix) komutunu kullanın, "script" main() - like function adı biliniyor. C++ için karışık sembolleri kullanmanız gerektiğini unutmayın. Taşınabilir bir alternatif, örn. GNU'nun libltdl.

Alternatif olarak, "komut dosyası", modül init işlevlerini uygulayarak veya bazı statik kodları (C++ genel olarak tanımlanan bir nesnenin kurucusu hemen çağrılır) yükleyerek otomatik olarak yüklenebilir.

Yüklenen modül, ana uygulamada doğrudan herhangi bir şeyi arayabilir. Elbette, semboller, doğru ana uygulamanın başlık dosyalarını kullanarak derleme zamanında bilinir. Kolayca bileşeni programınıza C++ "eklentileri" ekleyin ve bilmek istiyorsanız

arayüzü önsel (modül belleğe yüklenen önce ana uygulama adını ve .h gelen yüklü bir sınıfın arayüzünü bilir demek), kütüphaneyi dinamik olarak yükledikten sonra, sınıf statik olarak bağlantılıymış gibi kullanılabilir. Sadece bir class 'nesnesini dlopen() modülünden önce oluşturmaya çalışmadığınızdan emin olun. Statik kodu kullanarak

çok güzel otomatik eklenti kayıt mekanizmalarını uygulamak için izin verir.

0

Bir C veya C++ derleyicisi gömme gibi Clang sizin durumunuzda iyi bir fikir olduğundan emin değilim. Çünkü "betik" yani (C veya C++) kodunun beslendiği (çalışma zamanında!), Bu nedenle tüm uygulamanın çökmesine neden olabilir. Genellikle uygulamanızın çökmesine neden olabilecek hatalı kullanıcı girdisi istemezsiniz.

Eğer bir tercüman gömmek Guile veya Lua gibi bu amaç için tasarlanmış bir şey, seçin ve komut hataları tüm uygulamanın çökmesine olmadığını dikkatli olmak istiyorum. Yorumlayıcı gömülme hakkında daha ayrıntılı bir tartışma için bkz. this answer.