2010-01-15 15 views
12

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!

+0

bien, simpatizo. Hiciste un verdadero lío, pero ¿por qué se bloquea el cpp? no debería. –

+0

@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

+0

por curiosidad: ¿qué construcciones de JS confunden al C PP? – Christoph

Respuesta

3

¿Has probado con mcpp?Es un "preprocesador portátil C"

En caso de que falle, podría intentar usar un macroprocesador genérico (como gema) y crear suficiente cpp en la parte superior.

+2

Gracias por el enlace a mcpp: llega bastante lejos en el modo "- @ old", pero parece estar fallando porque estoy usando caracteres de comillas simples para cadenas (literales de caracteres en C). Investigando gema momentáneamente. – dmw

+1

Otorgandole la respuesta a esta pregunta, ya que fue la más útil. Al final, decidí probar y convertir toda la base de código en Google Closure, ya que tiene casi todas las características que necesito en Javascript puro, y el compilador brinda los mismos beneficios en el momento de la implementación (vinculándolo y eliminando la depuración) código). – dmw

0

Miré cpp y algunos otros contendientes basados ​​en respuestas a preguntas similares. Luego encontré lo que creo que es la mejor respuesta con diferencia: PHP. Considere:

1) PHP es de hecho un preprocesador (es en el acrónimo).

2) PHP está listo para funcionar en la mayoría de los servidores. Todo lo que tienes que hacer es cambiar tus extensiones de archivo de ".js" a ".php" o ".js.php", o (mi preferencia) hacer una edición simple a un archivo de configuración del servidor (puedes encontrar los detalles en otra parte))

3) Muchos desarrolladores de JavaScript ya están familiarizados o son expertos en PHP.

4) PHP es Turing-completo, a diferencia de muchos otros preprocesadores.

5) Solo necesita conocimientos básicos de PHP para beneficiarse mucho.

6) Hay mucho más documentación/tutoriales/foros para PHP que otros preprocesadores.

Pero sobre todo, es tan raro que es genial. Gracias a quien me dio la idea, no puedo encontrar su publicación en este momento.

+0

¿Por qué PHP sería mejor que cualquier otro lenguaje de programación? ¿Puedes mostrar algunos ejemplos? ¿Cómo podría, por ejemplo, hacer una macro _LOG() que desaparece en el modo de lanzamiento_ o _Reladar PROJECT_SOME_CONFIG_VAR_NAME con "1" _ de una manera agradable? –