Приложение A Внешний интерфейс кода
"Сумма человеческой мудрости не содержится ни в одном языке"
— Эзра Паунд
Octave — замечательный язык для решения многих задач в науке и технике. Однако это не единственный компьютерный язык, и бывают моменты, когда вам может понадобиться использовать код, написанный на других языках. Хорошие причины для этого включают: 1) не изобретать велосипед; существующие библиотеки функций, которые были тщательно протестированы и отлажены, или большие базы кода для моделирования — хороший пример, 2) доступ к уникальным возможностям другого языка; например, хорошо известные функции регулярных выражений Perl (но не делайте этого, потому что regexp уже существует в Octave).
Производительность, как правило, не должна быть причиной использования скомпилированных расширений. Хотя скомпилированные расширения могут работать быстрее, особенно если они заменяют цикл в коде Octave, это почти никогда не лучший путь. Во-первых, существует множество техник для ускорения производительности Octave, оставаясь в рамках языка. Во-вторых, Octave — язык высокого уровня, который упрощает выполнение общих математических задач. Отказавшись от этого, вы переключаетесь с решения реальной задачи на решение компьютерной программистской задачи. Это означает возврат к низкоуровневым конструкциям, таким как указатели, управление памятью, математический переполнение/потеря, и т. д. Из-за низкого уровня и того факта, что скомпилированный код выполняется вне Octave, существует очень реальная возможность аварийного завершения интерпретатора и потери работы.
Прежде чем продолжать, вы должны сначала определить, действительно ли вам нужно писать код за пределами Octave.
- Могу ли я получить ту же функциональность, используя только язык сценариев Octave?
Даже когда функция уже существует вне языка, может быть лучше просто воспроизвести поведение в файле m-файле, а не пытаться подключиться к внешнему коду.
- Код полностью оптимизирован для Octave?
Если производительность является проблемой, вы всегда должны начинать с методов внутри языка для повышения производительности. Среди них наиболее важна векторизация (см. Векторизация и более быстрое выполнение кода), которая не только делает код более лаконичным и понятным, но и повышает производительность (в 10-100 раз). Если необходимо использовать циклы, убедитесь, что выделение памяти для переменных происходит вне циклов с помощью присвоения матрицы нужного размера или нулевых матриц.
- Код максимально использует существующие встроенные библиотечные процедуры?
Эти процедуры высоко оптимизированы, и многие из них не несут издержки интерпретации.
- Является ли написание динамически связанной функции полезным вложением времени по сравнению с работой в Octave?
Для изучения интерфейса Octave для внешнего кода потребуется время, и неизбежно возникнут проблемы с инструментами, такими как компиляторы.
При этом Octave предлагает универсальный интерфейс для включения фрагментов скомпилированного кода в виде динамически связанных расширений. На эти динамически связанные функции можно ссылаться из интерпретатора так же, как и на любые обычные функции. Интерфейс является двунаправленным, и внешний код может вызывать функции Octave (например, plot), которые в противном случае могут быть очень сложны для разработки.
Интерфейс ориентирован на поддержку языков C++, C и Fortran. Сам Octave написан на C++ и может вызывать внешний код C++/C через свой родной интерфейс oct-файлов. Язык C также поддерживается через интерфейс mex-файлов для совместимости с MATLAB. Код Fortran проще всего достичь через интерфейс oct-файлов.
Поскольку многие другие языки предоставляют API C или C++, сравнительно просто создать мосты между Octave и другими языками. Это также способ подключиться к аппаратным ресурсам, для которых часто существуют драйверы устройств, написанные на C.
| • Oct-Файлы: |
| • Mex-Файлы: |
| • Программы автономного выполнения: |
| • Интерфейс Java: |
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/External-Code-Interface.html