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