Comparación de lenguajes integrados por tamaño en el archivo ejecutable

Como parte de uno de mis proyectos de SDK, necesitábamos agregar secuencias de comandos que tuvieran el menor efecto en el tamaño del archivo binario final, pero que aún proporcionaran una buena funcionalidad. Esto dio lugar al proyecto, que se describe en este artículo. Tenga en cuenta que desde en el SDK tenemos ciertos requisitos, fueron transferidos parcialmente al lenguaje de scripting, por lo que algunos lenguajes de programación embebidos bastante conocidos no participaron en el proyecto (pero Lua está incluido para comparación).



El sitio web del proyecto está disponible aquí . Diré de inmediato que en este momento, para mí personalmente, Chibi-Scheme es el ganador. Detalles para los interesados ​​bajo el corte.



Los requisitos fueron los siguientes:



  • Máxima portabilidad (solo C / C ++).
  • Tipeo suficientemente fuerte (que no permite agregar naranjas y manzanas), por lo que no se consideraron las implementaciones de ECMAScript.
  • La conveniencia de minimizar los scripts en sí mismos (por ejemplo, para que pueda eliminar de forma segura todos los saltos de línea), respectivamente, no se consideraron las implementaciones de Forth, Lua y Python.
  • Licencia amigable para proyecto comercial.


La lista inicial se tomó de un proyecto en el que están tratando de tener en cuenta todos los scripts incrustados posibles: https://github.com/dbohdan/embedded-scripting-languages Quizás la lista no esté completa y no contenga scripts adicionales que puedan satisfacer los requisitos anteriores ... Si sabe sobre esto, hágamelo saber a través de PM o por comentario.



El código de prueba para todos los lenguajes de programación incluyó la creación y llamada de una función que agrega "Hola" y el resultado de llamar a una función externa (C / C ++) que devuelve "mundo". El código de función se presenta en la tabla como una sintaxis de muestra. El ejecutable final se compila con optimización de tamaño y eliminando todos los símbolos innecesarios (GCC -s).



, , 8 (Lua ):



()
TinyScheme 86824 (define fn(lambda () (string-append "Hello, " (read))))
Lua 252880 function fn() return "Hello, " .. read() end
Chibi-Scheme 261480 (define fn(lambda () (string-append "Hello, " (read))))
Squirrel 277008 function fn() { return "Hello, " + read(); }
ArkScript 449792 (let fn(fun() (+ "Hello, " (read))))
Gravity 507896 extern var read; func fn() { return "Hello, " + read(); }
Janet 537560 (defn fn[] (string "Hello, " (read)))
ChaiScript 1374976 def fn() { return "Hello, " + read(); }
AngelScript 1923960 string fn() { return 'Hello, ' + read(); }


GitLab-, :



  • TinyScheme R5RS, GIMP. Chibi-Scheme R7RS, . SourceForge SVN trunk-.
  • ChaiScript — , . , , , ( Dell XPS 13 2-3 ). , .
  • Gravity Swift. , , . .
  • Squirrel , ( — ).


Chibi-Scheme , .. Scheme (R7RS) ( Scheme ). , , ( init-7.scm , string-append).



( , Chibi-Scheme C):



res = sexp_define_foreign(*ctx, sexp_context_env(*ctx), "read", 0,
                          [](sexp ctx, sexp self, sexp_sint_t n) -> sexp {
                            return sexp_c_string(ctx, "world", -1);
                          });


:





Desafortunadamente, la documentación no es rica, pero se compensa con el acceso a todo el código fuente. Además, Chibi-Scheme es bien conocido en sus propios círculos, y potencialmente no será abandonado o puesto en el mínimo apoyo como otros posibles candidatos.






Me complacería escuchar todos los comentarios y considerar otros YP en el marco de los requisitos anteriores. La investigación aún está en curso, y quizás el ganador cambie, pero eso ya dependerá de ti.




All Articles