Приложение 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.
© 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/v7.2.0/External-Code-Interface.html