Як ми додали підтримку Apple Silicon до аналізатора (arm64)

pic

Вступ

У програмуванні ефективне використання пам'яті є ключовим, особливо коли мова йде про масиви. Двовимірні масиви, які часто називаються матрицями, використовуються для представлення даних у вигляді рядків і стовпців. Однак традиційне представлення матриць може призвести до значних витрат пам'яті. Ця стаття розглядає альтернативний підхід для створення двовимірних масивів на Java, який оптимізує використання пам'яті.

Розуміння двовимірних масивів

Двовимірні масиви, або матриці, — це по суті колекції рядків і стовпців. В таких мовах, як C або C++, їх легко реалізувати за допомогою стилю матриць. Однак цей метод може бути неефективним, якщо кількість елементів у кожному рядку змінюється. Наприклад, якщо потрібно представити оцінки за додаткові іспити для чотирьох студентів, де кожен студент має різну кількість предметів, використання матриці може призвести до невикористаної пам'яті.

Проблема витрат пам'яті

Припустимо, що є чотири студенти з різною кількістю предметів: перший студент має п'ять предметів, другий — два, третій — один, а четвертий — три. Використовуючи матрицю, вам доведеться виділити по п’ять елементів для кожного студента, що призведе до витрат пам'яті для студентів з меншою кількістю предметів. Ця неефективність є суттєвим недоліком традиційного представлення матриць.

Підхід "масив масивів"

Щоб вирішити цю проблему, Java пропонує більш гнучкий підхід: масив масивів. Замість фіксованої матриці ви створюєте масив, де кожен елемент є іншим масивом. Це дозволяє кожному студенту мати масив, розмір якого відповідає кількості їхніх предметів, що усуває витрати пам'яті. Наприклад, для першого студента буде масив розміру п'ять, для другого — два і так далі.

Реалізація підходу "масив масивів" на Java

Ось як можна реалізувати цей підхід у Java:

  1. Визначте розмір базового масиву: почніть з визначення розміру базового масиву, який відповідає кількості студентів.
  2. Створіть індивідуальні масиви: для кожного студента створіть масив, що відповідає кількості їхніх предметів. Це робиться динамічно, що дозволяє мати змінні розміри.
int[][] studentMarks = new int[4][];  
studentMarks[0] = new int[]{10, 12, 7, 9, 15}; // Перший студент  
studentMarks[1] = new int[]{28, 67}; // Другий студент  
studentMarks[2] = new int[]{80}; // Третій студент  
studentMarks[3] = new int[]{40, 50, 28}; // Четвертий студент

Переваги підходу "масив масивів"

Основною перевагою цього методу є покращене використання пам'яті. Виділяючи лише необхідний простір для предметів кожного студента, ви уникаєте неефективності фіксованих матриць. Цей підхід особливо корисний у сценаріях, коли структура даних повинна бути гнучкою і адаптивною до змінних розмірів даних.

Висновок

У Java підхід "масив масивів" є потужною альтернативою традиційному представленням матриць, оптимізуючи використання пам'яті та покращуючи ефективність. Використовуючи цей метод, розробники можуть створювати більш гнучкі та ефективні програми. Якщо ви продовжуєте працювати з масивами, розгляньте цей підхід для покращення продуктивності вашої програми.

Заклик до дії

Чи пробували ви використовувати підхід "масив масивів" у ваших проектах? Поділіться своїм досвідом у коментарях нижче, і не забудьте поділитися цією статтею з іншими розробниками, щоб поширити знання!
pic

Вступ

З випуском PVS-Studio 7.34, тепер доступні нативні збірки аналізатора для macOS на архітектурі Apple Silicon (ARM). У цьому записі ми хочемо зануритися в роботу, що була виконана для цієї реалізації, і поділитися порадами щодо портирования крос-платформних інструментів на нову, майбутньо-стійку архітектуру.

Коротке резюме

Як згадано вище, починаючи з версії 7.34, PVS-Studio підтримує macOS на архітектурі Apple Silicon (arm64). Пакети для архітектури Intel (x86_64) будуть продовжувати випускатися, як і раніше.

Мінімальні підтримувані версії macOS:

· Компоненти для Intel: 10.13.2 (High Sierra) та вище;

· Компоненти для Apple Silicon: 11.0 (Big Sur) та вище.

Ось які компоненти готові до випуску:

· аналізатори: C, C++, C#, Java;

· плагіни: CLion, IDEA, Rider, VS Code, Qt Creator (починаючи з 14.0);

· утиліти: blame-notifier (сповіщає розробників про помилки), plog-converter (конвертує звіти).

Тепер ви можете завантажити їх усі, перейшовши за посиланням, встановити та використовувати. Ваші відгуки завжди вітаються 🙂

А як щодо Windows ARM?

Підтримка Windows ARM була доступна в PVS-Studio починаючи з версії 7.28.

А як щодо Linux ARM?

Ми не отримували запитів щодо підтримки цієї платформи та архітектури, тому на даний момент у нас немає планів щодо цієї версії.

Особливості підтримки нової архітектури

Ого, офіційна частина закінчена, тепер можемо перейти до цікавої частини 🙂

Отже, PVS-Studio — це набір компонентів, утиліт і плагінів, написаних на C, C++, C# і Java. Просто глянувши на список мов, можна здогадатися, яка з них спричинила найбільше проблем…

pic

Якщо ви подумали про C і C++, я мушу вас засмутити — це був аналізатор Java, який мав найбільше проблем під час портирования. Хоча… цікаво, що проблема полягала не в самій мові Java, а в складних залежностях між спільними компонентами аналізаторів C++ і Java. Можливо, наша команда Java коли-небудь детальніше розгляне ці нюанси в окремому обговоренні. Я не буду псувати цікаві моменти 🙂

Ну, якщо не Java, то це точно C++? Так, тепер ви на правильному шляху. Дозвольте заощадити вам кілька годин на дослідження.

Насправді, якщо ваш проект вже зібраний під macOS, то ви не зіткнетеся з великими проблемами при портировании. Якщо ви використовуєте систему зборки CMake, просто додайте кілька рядків у ваш файл CMakeLists.txt, і ви готові до тестового збірки:

set(CMAKE_OSX_ARCHITECTURES "arm64") # цільова архітектура  
set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) # цільова версія SDK  
set(CMAKE_OSX_SYSROOT "/path/to/sdk") # шлях до SDK вказаної версії

Примітка: Версія SDK 11.0 потрібна, оскільки це мінімальна версія, яка підтримує архітектуру Apple Silicon. До речі, якщо вам потрібні пакети SDK для розгортання на серверах CI/CD, і з якихось причин ви не можете встановити SDK за допомогою XCode, ви можете отримати їх з цього репозиторію на GitHub.

Ще одна цікава функція — можливість створювати універсальні бінарні файли, які можуть працювати одночасно як на Intel (x86_64), так і на Apple Silicon (arm64). Для цього просто змініть згадану раніше змінну:

set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")

Ви можете перевірити результат, використовуючи команду file.

Перекладено з: How we added Apple Silicon support to analyzer (arm64)

Leave a Reply

Your email address will not be published. Required fields are marked *