Перейти до вмісту
cd /languages
  • Наукова спадщина
  • Програмування
  • Підтримка AST і символів

Fortran у Maguyva: графи коду для наукових кодових баз

Maguyva підтримує Fortran з AST, символами та графом, щоб ШІ-агенти відстежували підпрограми, модулі й похідні типи до зміни чисельного коду.

Чому Fortran потрібна структура, а не пошук за рядками

Кодові бази на Fortran зазвичай старі, великі й написані фахівцями предметної області, а не командами розробників. Процедури з назвами SOLVE, Solve і solve — це та сама процедура. Модулі спільні для сотень файлів, а бібліотека вбудованих процедур така велика, що наївний список викликів здебільшого складається з SQRT, SUM і WRITE.

Агент, який уміє лише grep, тоне в цьому шумі. Maguyva спершу дає йому структуру: які програмні одиниці існують, які модулі вони використовують і які власні процедури викликають одна одну.

Що Maguyva витягує з Fortran

Maguyva охоплює вихідний код у фіксованій і вільній формі (.f, .for, .ftn, .f90, .f95, .f03, .f08). Функції та підпрограми витягуються як символи, що викликаються, а похідні типи можна вибрати як визначення типів у структурному пошуку.

Зіставлення символів не враховує регістр — як і сам Fortran. Зв’язки імпорту будуються з use та include; ключове слово вилучається, і в графі зберігається назва модуля. Виклики, читання, присвоєння, посилання на типи та успадкування розширених похідних типів теж входять до графа.

Фільтр зв’язків відкидає близько 165 вбудованих процедур (оператори введення-виведення, математичні процедури, процедури для масивів, рядків, перетворення типів і роботи з бітами), тож решта ребер вказує на ваш власний код.

Приклади промптів для агентів

  • «Які підпрограми викликають compute_flux і які модулі вони використовують?» (find_symbol, потім dependency_search incoming)
  • «Простеж, як у циклі розв’язувача застосовуються граничні умови.» (get_task_context)
  • «Знайди всі програмні одиниці, що використовують модуль constants.» (text_pattern_search за use constants, потім find_symbol)

Відомі обмеження

  • У Fortran немає декораторів і обробки винятків, тому такі типи зв’язків позначено як незастосовні.
  • Процедури, прив’язані до типів, мають ті самі вузли, що й звичайні функції та підпрограми. У structural_search використовуйте пресет functions; пресет methods не вибирає вузлів Fortran.
  • Виклики відфільтрованих вбудованих процедур не з’являються як ребра графа. Якщо потрібен кожен WRITE чи OPEN, використовуйте text_pattern_search.

Наступні кроки

Під’єднайте репозиторій за швидким стартом, потім перегляньте повну матрицю підтримки на сторінці сумісності. Якщо ваш Fortran сусідить зі сполучним кодом на C, прочитайте також посібник із C.

Найкраще підходить

  • > Дослідницькі, інженерні та HPC-команди, що супроводжують розв'язувачі, симуляції чи чисельні бібліотеки на Fortran, старші за нинішню команду.
  • > Репозиторії, де файли `.f` у фіксованій формі сусідять із модулями `.f90` і новішими у вільній формі, часто поруч з обгортками на C або Python.
  • > Рев'ю за участі агентів, де спершу треба з'ясувати, які підпрограми зачіпають спільний модуль, перш ніж змінювати чисельну логіку.

Робочі процеси агента

  • > Знайти підпрограми та функції, що викликають процедуру розв'язувача, перш ніж змінювати її аргументи чи одиниці.
  • > Перелічити модулі, які програмна одиниця підключає через `use`, і перейти до їхніх визначень.
  • > Знайти, де оголошено похідний тип і які процедури з ним працюють.

Деталі рушія

  • > Підтримка Fortran охоплює вихідний код у фіксованій і вільній формі: `.f`, `.for`, `.ftn`, `.f90`, `.f95`, `.f03` і `.f08`.
  • > Функції та підпрограми — символи, що викликаються, зіставлення символів не враховує регістр, а `use` та `include` стають зв'язками імпорту.
  • > Близько 165 вбудованих процедур (введення-виведення, математика, масиви, рядки, перетворення типів і біти) відфільтровуються зі зв'язків. Зв'язки декораторів і винятків позначено як незастосовні.

Корисні точки входу MCP

  • find_symbol

    Почніть із назви підпрограми, функції чи модуля; зіставлення, як і у Fortran, не враховує регістр.

  • dependency_search

    Використовуйте обхід incoming для процедури розв'язувача чи спільного модуля, щоб побачити всіх, хто викликає, до чисельної зміни.

  • get_task_context

    Використовуйте для промптів на кшталт «простеж, як у циклі розв'язувача застосовуються граничні умови».