2013-08-13 12 views
7

Şu anda C derlemesinde bir derleme kod derlemesi üretmekte olan bir tasarım kanıtı JIT derleyicisi yazıyorum. C'deki satır içi derleme işlevi, yalnızca derleme zamanında bilinen dize değişmezleriyle ilgilenir, bu yüzden oluşturulmuş çalışma zamanı kodumu çalıştırmak için kullanamıyorum.Dinamik olarak oluşturulmuş derlemeyi C (GNU/Linux) olarak çalıştırın

Çalışma zamanında oluşturulan makine kodu'u çalıştırmak için mmap() işlevini kullanmayı okudum, ancak mümkünse makine koduyla çalışmaktan kaçınmak istiyorum.

Herhangi bir çözümü bilen var mı? Bir dosyaya yazmayı ve söz konusu dosyada & derleyicisini çağırmayı düşündüm, ancak bu karmaşık ve yavaş olurdu.

+1

Yani montaj kaynağı kodu oluşturduğunuzu söylüyorsunuz? Neden sadece makine kodunu oluşturmuyoruz? –

+0

@DrewMcGowen Daha az okunabilir, test edilmesi zor ve zamanın özü olmayı tercih edersem tercih ederim, eğer mümkünse yeniden yapılandırmayı önlemek isterim. Her ne kadar zorundaysam sanki. – AlexJ136

+0

Montaj yaymak için orada birçok kütüphane var. [gnu-yıldırım] (https://www.gnu.org/software/lightning/) [llvm] (http://llvm.org/), ... – mathk

cevap

2

Nihayetinde "JIT" olmanın bence zamana duyarlı olmanız gerekiyor ki bu da makine kodu oluşturmak anlamına geliyor. Doğrulamak için hem makine kodunu hem de montaj kodunu oluşturacak bazı hata ayıklama kodlarını girmeyi deneyebilirsiniz, bu nedenle derleyiciyi, makine kodunu montaj dilinden doğrudan oluşturduğunuz makine koduna göre karşılaştırın ve makine kodunu ayıklamak/doğrulamak için kullanın. mümkünse, bazen montajcılar kendi istediklerini yapmak isterler, ne yapmak istediklerini değil).

+0

Çalıştırmak için hem makine kodunu hem de debug için derleme oluşturma/Test karşı, harika bir fikir. Bence bu yapacağım şey. Çok teşekkürler. – AlexJ136

2

Yaptığım şey, C/C++/Fortran kodu oluşturmak, anında derlemek, bir DLL'ye bağlamak ve DLL'yi dinamik olarak yüklüyor, bunların tümü en fazla birkaç saniyelik sırayla alıyor. ASM oluşturmak dışında da aynısını yapabilirsiniz. Sonuçta ortaya çıkan kodun hızına ihtiyaç duyduğunuzda ve oluşturduğunuz dilin kodunun (ve çalışma zamanı kitaplıklarının) esnekliğine ihtiyaç duyduğunuzda çok etkili bir teknik.

+0

Makine kodu seçeneğine gitmeye karar verdim, ancak bunu çok ilginç bir fikir olarak görüyorum, gelecekteki projeler için düşüneceğim. İlgili makalelerin/öğreticilerin vb. Farkında mısınız? – AlexJ136

+0

@ AlexJ136: Makaleler? Öğrenmek için anahtar şeyler 1) nasıl bir DLL yazmak (herhangi bir örnek yapacağız), 2) nasıl programın kontrolü altında derleyici + linker çalıştırmak için "kabuk dışarı", ve 3) nasıl DLL yüklenir ve almak prosedür ihracat yaptığı adreslerdir. –

İlgili konular