He estado trabajando en un proyecto Javascript (casi terminado) durante un poco más de 14 meses. El proyecto comenzó como un truco que esperaba terminar de la noche a la mañana, pero con el tiempo la parte Javascript ha crecido hasta convertirse en 68 archivos separados y 10,314 líneas no vacías, lamentablemente actualmente depende del preprocesador C para la construcción.dilema del preprocesador amistoso con Javascript
Es difícil explicar cómo terminé usando cpp para Javascript: esto era solo un truco, y necesitaba algo que me diera la expansión macro, ifdef, defina e incluye sin demasiado esfuerzo. Después de aproximadamente 3 segundos de consideración, me di cuenta de que cpp era "perfecto" para la tarea:
- Proporciona una macro LOG() que desaparece en el modo de lanzamiento.
- Proporciona una macro ASSERT() que desaparece en el modo de lanzamiento y genera excepciones etiquetadas con el archivo original y el número de línea.
- Intercambio de implementaciones de LOG() y ASSERT() para el código que permite producir una compilación "comprobada", que registra sucesos en una forma compacta a medida que ocurren, que se informan al servidor si se produce un bloqueo.
- Reemplazando a PROJECT_SOME_CONFIG_VAR_NAME con "1", basado en un archivo de configuración compartido con el back-end de Python.
Al igual que todos los cortes reales, este corte es ahora tan en forma fija en el proyecto que realmente me gusta pensar en el trabajo que se requiere para reemplazarlo. Mi proyecto está llegando a la etapa en la que quiero mover el código base a su propio servidor de prueba dedicado (en lugar de mi laptop), sin embargo, al configurar una instancia de Linux, descubrí que las versiones de GNU cpp después de 4.1 ya no preprocesan el Javascript con un error.
En lugar de agregar una versión específica de GCC a la lista de requisitos de compilación, calculé que ahora sería un buen momento para solucionar este desastre. Mi problema es, sin embargo, que no puedo encontrar un preprocesador de reemplazo con la misma potencia y funciones que cpp! He considerado m4, pero m4 es un mundo de dolor en sí mismo. Otros preprocesadores-específicas JavaScript he encontrado carecen de todas las características que actualmente estoy dependiendo de, por ejemplo:
__FILE__
&__LINE__
- macros variadic
- Incluir guardias
- concatenación de emergencia
- La compilación condicional
Estoy considerando seriamente implementando un nuevo preprocesador solo para Javascript, que toma prestada por completo la sintaxis del preprocesador C, ya que funcionó tan bien. Me pregunto si hay mejores opciones antes de hacerlo. :) Tal vez ya hay un preprocesador genérico cpp-like que podría intercambiar? El trabajo requerido para reemplazar toda la sintaxis del preprocesador en esos 68 archivos se acerca a la cantidad de trabajo requerido para simplemente volver a implementar el preprocesador.
Estoy bastante sorprendido de haber llegado tan lejos confiando en el preprocesador C; es más efectivo en esta tarea que saludable para la mente comprender. Otra opción que se me abre es construir estáticamente versiones de cpp-4.1 para Linux, Darwin-i386, Win32 y almacenar esos binarios en el repositorio del proyecto.
¡Ayuda!
bien, simpatizo. Hiciste un verdadero lío, pero ¿por qué se bloquea el cpp? no debería. –
@Stefano, no es una falla verdadera como una falla de segmentación. El analizador se confunde porque el conjunto de lexemas y la gramática de Javascript son obviamente diferentes a los de C. GCC 4.2+ parece tener analizadores mucho más estrictos. – dmw
por curiosidad: ¿qué construcciones de JS confunden al C PP? – Christoph