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);
});
:
- (chibi crypto rsa) — RSA-
- (chibi json) — JSON
- (chibi net http-server) — HTTP-
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.