2014-04-09 31 views
12

C++ gömülü LLVM gelen ikili kod (paylaşımlı kütüphane) oluşturur. Süreç, bu uygulama için geliştirilmiş basit bir dilde yazılmış çalışma zamanında bazı karmaşık mantığı (kuralları) anlayabilmelidir.C++ ile yazılmış yüksek performanslı sistem üzerinde çalışıyorum

  • içine mantığı derleme bir gömülü tercüman çalıştırmak ve veriler üzerinde dinamik bir fonksiyon yorumlanır mantığına göre verileri alır aramayı işleri üretmek -

    1. mantığı yorumlayın: İki seçeneğimiz var bir plugin.so dinamik paylaşılan dosya, çok daha hızlı gömülü daha aday olacağını,

    Seçenek 2 makinenin kodu optimize edilecek şekilde gerçekten çekici olarak görünüyor eklentiyi yüklemek ve zamanında mantık işlevi çağırmak için, dlsym dlopen kullanmak t tercüman o işlemek. Ben keşfetmek am

    seçenekleri şunlardır:

      • bir derleme yöntemi dize derlemek (string mantık, liste & hataları, liste & uyarılar)
      • burada
      • girdi mantık bir dize içeren mantık yazma bizim özel dilinde kodlanmış o LLVM ir, derleme yönteminin dönüş değeri ir dize döndürür oluşturur
      • bağlantı yöntemi bool link (dize ir, dize dosya adı, liste & hataları, liste & uyarılar)
      • bağlantı yöntemi için ben llvm belgelerini aradım ama böyle bir yazma olasılığının olup olmadığını öğrenemedim yöntem

      Doğruysa LLVM IR LLVM Bayt Kodu'na veya Assembly koduna dönüştürülür. Daha sonra LLVM JIT, JIT modunda çalışmak için kullanılır veya GNU Assembler, yerel kodu oluşturmak için kullanılır.

      o bunu yapmaz LLVM bir fonksiyonu bulmak mümkün mü? Hepsi benim gereksinimi için plugin.so dosyası oluşturmak için "olarak" yerine çağırmak için C++ bir sistem komutu kullanılarak daha kodu içinde yapılırsa çok daha güzel olurdu.

      Lütfen çalışma zamanımdaki işlemimden paylaşılan bir kütüphane yerel ikili kodu oluşturabileceğim herhangi bir yol biliyorsanız bildirin. İkili kod çeviri LLVM-IR yapan bir LLVM aracı

    • +0

      belki http://llvm.org/docs/tutorial/LangImpl4 bu konuda hiç uzman değilim, ama.html # add-a-jit-derleyici yardımcı olur. – godfatherofpolka

      +0

      Bağlantı için teşekkürler. Evet, gömülü bir jit başka bir seçenek olduğunu düşünüyorum. JIT kodunda bir C++ arabirimini uygulayıp JIT'den çağıran C++ uygulamasına türetilmiş sınıf uygulamasına bir işaretçi döndürüp döndüremeyeceğimizi merak ediyordum? – Sanjit

      +0

      AngelScript veya Lua gibi betik dilleri (özellikle de LuaJit) amaçlarınız için yeterince hızlı değilse, OpenCL'yi aramanızı öneririz. Çalışma zamanında C/C++ ile yazılmış hesaplama kodunu derlemenizi sağlar. Hesaplama çekirdeğinizi kolayca C önişlemcisi kullanarak yapılandırabilirsiniz. OpenCL derleyicilerin çoğu LLVM'yi dahili olarak kullanır, bu sayede tüm teknik detaylarla uğraşmak zorunda kalmadan tam gücünü elde edersiniz. Son bir bonus olarak, kodunuzu GPU üzerinde kolayca çalıştırabilirsiniz, ancak isterseniz kendinizi CPU'ya kısıtlayabilirsiniz. – stgatilov

      cevap

      3

      llc. Bence ihtiyacın olan her şey bu.

      Temel olarak LLVM IR'nizi istediğiniz şekilde üretebilir ve ardından IR'niz üzerinden llc'yi arayabilirsiniz.

      Komut satırından bunu çağırabilir veya llc uygulamasına gidebilir ve bunu kendi programlarınızda nasıl yapılacağını öğrenebilirsiniz. Ben yardımcı olur umarım

      http://llvm.org/docs/CommandGuide/llc.html

      : Burada

      faydalı bir bağlantıdır.

      +2

      llc bir birleştirici/derleyici değil, bir bağlayıcıdır. .asm veya .obj çıkışı üretir. Yüklenebilir kütüphaneler (.dll veya .so) üretmez. – Sean

      +1

      Yorum için teşekkürler Sean, sorumu temizler. Gömülü JIT, şu ana kadar bulduğum en iyi seçenek. – Sanjit

      İlgili konular