Javascript-дружественная дилемма препроцессора - PullRequest
12 голосов
/ 15 января 2010

Я работаю над (почти законченным) проектом Javascript чуть более 14 месяцев. Проект начался как хак, который я ожидал закончить за одну ночь, но со временем часть Javascript выросла до 68 отдельных файлов и 10 314 непустых строк, к сожалению, в настоящее время зависящих от препроцессора C для сборки.

Трудно объяснить, как я в итоге использовал cpp для Javascript: это был всего лишь взлом, и мне нужно что-то, что давало мне расширение макроса, ifdef, define и включало без особых усилий. Примерно через 3 секунды я понял, что cpp "идеально" подходит для этой задачи:

  • Предоставьте макрос LOG (), который исчезает в режиме разблокировки.
  • Предоставляет макрос ASSERT (), который исчезает в режиме выпуска и генерирует исключения, помеченные исходным файлом и номером строки.
  • Перестановка реализаций LOG () и ASSERT () для кода, который позволяет создавать «проверенную» сборку, которая регистрирует события в компактной форме по мере их возникновения, которые возвращаются на сервер в случае сбоя.
  • Замена PROJECT_SOME_CONFIG_VAR_NAME на "1" на основе файла конфигурации, общего для серверной части Python.

Как и все настоящие хаки, этот хак сейчас настолько жестко запрограммирован в проекте, что я действительно ненавижу даже думать о работе, которая потребуется для его замены. Мой проект достигает стадии, когда я хочу переместить базу кода на свой собственный выделенный тестовый сервер (а не на свой ноутбук), однако при настройке экземпляра Linux я обнаружил, что версии GNU cpp после 4.1 больше не обрабатывают Javascript. с вылетом с ошибкой.

Вместо того, чтобы добавлять конкретную версию GCC в список требований к сборке, я подумал, что сейчас самое время по-настоящему исправить этот беспорядок. Однако моя проблема в том, что я не могу найти замещающий препроцессор с той же мощью и возможностями, что и в cpp! Я рассматривал m4, но m4 - это мир боли сам по себе. Другие обнаруженные мной Javascript-препроцессоры испытывают недостаток во всех функциях, от которых я в настоящее время зависел, например ::

  • __FILE__ & __LINE__
  • Variadic макросов
  • Включить охрану
  • Конкатенация токенов
  • Условная компиляция

Я серьезно подумываю о внедрении совершенно нового препроцессора только для Javascript, который полностью заимствует синтаксис препроцессора C, поскольку он работал так хорошо. Мне просто интересно, есть ли лучшие варианты, прежде чем сделать это. :) Может быть, есть уже cpp-подобный универсальный препроцессор, в котором я мог бы заменить? Работа, необходимая для замены всего синтаксиса препроцессора в этих 68 файлах, приближается к объему работы, необходимой для простого переопределения препроцессора.

Я весьма удивлен, что когда-либо делал это, полагаясь на препроцессор C; эта задача более эффективна для понимания, чем полезна для ума. Другой вариант, который мне открыт, - это статическая сборка версий cpp-4.1 для Linux, Darwin-i386, Win32 и сохранение этих двоичных файлов в репозитории проекта.

Помощь!

Ответы [ 2 ]

3 голосов
/ 15 января 2010

Вы уже пробовали mcpp ? Это «портативный препроцессор C»

Если это не удастся, вы можете попробовать использовать универсальный макропроцессор (например, gema ) и собрать достаточно cpp поверх него.

1 голос
/ 18 ноября 2017

Я посмотрел на cpp и нескольких других претендентов, основываясь на ответах на подобные вопросы.Затем нашел то, что я считаю лучшим ответом на сегодняшний день - PHP.Подумайте:

1) PHP действительно является препроцессором (в аббревиатуре).

2) PHP готов к работе на большинстве серверов.Все, что вам нужно сделать, это либо изменить расширение вашего файла с «.js» на «.php» или «.js.php», либо (мое предпочтение) сделать простое редактирование файла конфигурации сервера (подробности можно найти в другом месте).).

3) Многие разработчики JavaScript уже знакомы или разбираются в PHP.

4) PHP полон Тьюринга, в отличие от многих других препроцессоров.

5) Вынужны только базовые знания PHP.

6) Существует гораздо больше документации / учебных пособий / форумов по PHP, чем у других препроцессоров.

Но в основном это так странно, что это круто.Спасибо тому, кто дал мне идею - я не могу найти их пост в данный момент.

...