Существуют ли какие-либо инструменты автоматического преобразования для переноса кода C ++ на 64-битные? - PullRequest
5 голосов
/ 08 июня 2011

Я исследую методы переноса большого (более 10 миллионов строк) кода C ++ на 64-битные.Я посмотрел на статические анализаторы кода и флаги компилятора, и теперь я смотрю на макросы или другие инструменты, которые могут вносить общие, повторяющиеся изменения.

Я написал несколько регулярных выражений, чтобы увидеть, насколько хорошо они работают впрактика, и, как и предсказывалось, они довольно эффективны.Тем не менее, сначала нужно построить выражения, поэтому я хотел бы посмотреть, есть ли какие-нибудь списки таких выражений или программных инструментов, которые могут автоматически вносить изменения.

Следующие строкипрототипные примеры кода для сопоставления и исправления.(Для пояснения, эти строки не предназначены для представления одного блока кода, но вместо этого это строки, извлеченные из разных мест.)

int i = 0;
long objcount;
int count = channels.count(ch);
for (int k = 0; k < n; k++) { /*...*/ }

Цель состоит не в том, чтобы полностью перенести код на 64-битную версию, авместо этого выполнить первый проход по коду, чтобы уменьшить объем кода, который необходимо проверять вручную.Это нормально, если некоторые необходимые изменения пропущены, и , вероятно, хорошо, если некоторые неправильные изменения будут сделаны, но их следует минимизировать.

Visual Studio - это IDE, которая будет использоваться дляконверсионная работа, так что то, что хорошо работает с VS, является плюсом.Стоимость не проблема.

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Rexexps страдают от высокого уровня ложных срабатываний; по определению, «регулярное выражение» не может анализировать свободный от контекста язык, такой как C ++. Кроме того, регулярные выражения не могут принять в информация о типе аккаунта; это

   fooT i=0;

хорошо, для некоторых typedef'd fooT? Наконец, регулярное выражение не может изменить код; Вы могли бы рассмотреть Perl или SED (используя регулярные выражения для изменения), но вы получите ошибочные изменения из-за ложных срабатываний регулярных выражений. В 10M SLOC это не может быть весело; 5% ошибок означает, возможно, 50000 строк кода, которые нужно исправить вручную.

Вы могли бы рассмотреть инструмент преобразования программы . Такие механизмы работают с языковыми структурами, а не с текстом, и более сложные версии знают объемы, типы и значение символа (например, что такое fooT, точно?). Они предлагают вам возможность писать специфичные для языка и контекста шаблоны и предлагать структурно корректные изменения кода, используя поверхностный синтаксис целевого языка. Это позволяет надежно применять изменения кода в масштабе.

Наш инструментарий реинжиниринга программного обеспечения DMS с его C ++ Front End был использован для проведения значительных изменений в больших системах C ++ с синтаксической и точной точностью. (См. Акерс Р., Бакстер И., Мелих М., Эллис Б., Люк К., Пример из практики: реинжиниринг моделей компонентов C ++ с помощью автоматического преобразования программ, информационно-программная технология 49 (3): 275-291 2007г.)

0 голосов
/ 09 июня 2011

Какую версию компилятора вы используете? Вы пытались запустить компилятор с флагом / Wp64 для определения переносимости в 64-битные проблемы?

С сайта MS: «/ Wp64 обнаруживает проблемы 64-разрядной переносимости для типов, которые также помечены ключевым словом __w64. / Wp64 отключен по умолчанию в 32-разрядном компиляторе Visual C ++ и включен по умолчанию в 64-разрядном компиляторе Visual C ++.»

http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=vs.71%29.aspx

...