5

Estoy evaluando diferentes posibilidades para una VM personalizada, y dejé LLVM de otra pregunta. Dado que todavía estoy trabajando en la evaluación de las máquinas virtuales de lenguaje incrustado, no puedo probar/verificar esto por ahora. Me gustaría saber la siguiente información sobre LLVM/CLANG:¿Cuál es el tamaño de un programa que usa LLVM/CLANG para una máquina virtual personalizada de códigos de bytes?

  • ¿Es compatible con Windows? ¿O Solaris? (multiplataforma es una ventaja para mí)
  • Si quiero escribir mi máquina virtual personalizada/personalizada con un lenguaje tipo C, ¿qué debería incluir en el proyecto? (Secciones o componentes de LLVM/CLANG, etc.)
  • Mantendría el compilador separado de la máquina virtual por razones obvias (sin escribir un intérprete). ¿Cuál sería el tamaño de los componentes requeridos? ¿Podría construirlos 'en' el programa en lugar de vincularlos dinámicamente a ellos?
  • ¿Puedo evitar JIT? Me gustaría tener una máquina virtual de bytecode que no se traduzca necesariamente en código nativo. Esto ayudaría cuando no se admite JIT en la plataforma (por ejemplo, sistemas con permisos de memoria restrictivos que no permiten mapeos de memoria wx/rwx).

Sé que el antivirus clamav, por ejemplo, utiliza bytecode respaldado por LLVM/clang para admitir firmas dinámicas/en tiempo de ejecución. Sin embargo, no sé si hay una instalación existente para implementar esto y/o tutoriales o documentación que lo guíe a través del proceso de implementación de tal cosa.

Gracias! :)

Respuesta

5

Clang es un analizador sintáctico para lenguajes tipo C, incluido C++. Si su idioma es lo suficientemente parecido a C (es decir, Java no lo es), entonces podría agregar soporte para su idioma a clang, que sabe cómo producir LLVM IR.

LLVM no requiere JIT, y normalmente está vinculado estáticamente. LLVM proporciona bibliotecas que realizan optimización y generación de código de LLVM IR. Para JIT es solo generar código en la memoria en lugar de en el disco. El uso ordinario de Clang + LLVM es como un reemplazo directo para GCC, generando código para archivos .o.

El tamaño dependerá de lo que necesite. ¿Quieres todas las optimizaciones? ¿Quieres todos los objetivos (a diferencia de GCC, LLVM se puede construir con tantos backends en un binario como quieras). Como mencionaste incrustado, un ejemplo es Android usando LLVM en teléfonos celulares: http://android-developers.blogspot.com/2011/02/introducing-renderscript.html

Windows es compatible bastante bien, puedes construir LLVM con MSVC++ usando nuestro sistema de compilación CMake, o mingw32. El soporte de Solaris es más dudoso, utilizamos periódicamente parches para repararlo, pero no he visto ninguno por un tiempo.

Finalmente, es posible que desee leer el tutorial en http://llvm.org/docs/tutorial. Esto narra la construcción de un lenguaje JITted REPL, pero la base es la misma para un lenguaje compilado estáticamente. En lugar de usar un objeto llvm :: JIT, llama a Target.addPassesToEmitFile y le entrega el flujo de salida para escribir. Consulte llvm/tools/llc/llc.cpp para obtener un ejemplo completo (es largo, solo se necesita una pequeña fracción si no desea admitir todas las opciones que tiene llc).

+0

¡Gracias, no respondí antes que hoy ...! – soze

Cuestiones relacionadas