ALGLIB FAQ

C++
Для чего служит пустой файл `stdafx.h`?
Как организована работа с массивами в С++?
Почему для обращения к массивам используются не квадратные скобки, а круглые?
Будет ли пакет ALGLIB работать в 64-битной среде?
Delphi
Почему везде вместо цикла for используется цикл while?
Для чего служит функция `DynamicArrayCopy`?
Вопросы по алгоритмам на Visual Basic
На какую именно версию языка Visual Basic транслируются алгоритмы?
Программы с сайта будут работать в VB.NET?
Почему в некоторых программах используется оператор goto?
Общие вопросы по исходным кодам
Что такое библиотека AP?
Что такое библиотека ABLAS?
Некоторые алгоритмы начинают нумерацию элементов массивов с единицы. Так уже никто не делает!
Язык программирования YYY не поддерживает массивы, нумерация которых начинается не с ноля. Что в этом случае?
Общие вопросы по проекту
В чем цель проекта ALGLIB?
Чем проект ALGLIB отличается от других аналогичных проектов?
Кто авторы проекта?
Какое отношение проект имеет к сайтам alglib.chat.ru и alglib.dore.ru?
Какое отношение проект имеет к проекту MANUAL.RU?
Что такое "алгоритмический Паскаль" (AlgoPascal)?
Что такое "редактор блок-схем"?
А где алгоритмы для шифрования, рисования графиков, картинок в OpenGL и т.д.?

# C++

## Для чего служит пустой файл `stdafx.h`?

MSVC и некоторые другие компиляторы требуют, чтобы в коде программы присутствовала директива `#include <stdafx.h>`, служащая для управления прекомпилированными заголовками, и автоматически создают файл `stfafx.h` при генерации нового проекта. Однако некоторые компиляторы (например, BCB) используют другие средства для управления прекомпилированными заголовками. При этом директива `#include <stdafx.h>` сама по себе не мешает их работе, однако отсутствие файла с таким именем приводит к ошибке компиляции. Пустой файл `stfafx.h` служит для того, чтобы избежать этой ошибки. Если вашей средой разработки уже создан файл с таким именем, оставьте его без изменений.

## Как организована работа с массивами в С++?

Поскольку поддержка динамических массивов со стороны языка С++ отсутствует (update: я знаю про указатели и динамическое выделение памяти, но это не совсем то, что необходимо), то были разработаны классы-шаблоны для работы с одномерными и двухмерными массивами. Необходимый исходный код и описание находятся в стандартной библиотеке AP, которая прилагается к каждому архиву с исходниками на C++. Обратите внимание, что массивы в этой библиотеке начинают нумерацию элементов не с 0, а с произвольного числа по выбору программиста.

## Почему для обращения к массивам используются не квадратные скобки, а круглые?

Представьте себе, что вы обращаетесь к элементу матрицы а в привычной нотации: `a[x][y]` вместо `a(x,y)`. На самом деле здесь спрятан не один вызов оператора индекса, а два. Первый из них - индексация матрицы `a` по `x`, которая возвращает ссылку на какую-то временную структуру, описывающую строку матрицы. Второй - индексация временной структуры по `y`, которая возвращает ссылку на требуемый элемент. Обращение через перегрузку круглых скобок существенно эффективнее, поскольку не требуется создание временных структур.

## Будет ли пакет ALGLIB работать в 64-битной среде?

Пакет ALGLIB не тестировался в 64-битной среде.

Вместе с тем, сам пакет и используемая им библиотека AP/C++ не содержат кода, в котором явно выдвигались бы какие-то предположения относительно характера среды, в которой осуществляется работа. Таким образом, компиляция и использование пакета ALGLIB в 64-битной среде теоретически не должны вызывать проблем, если не используются дополнительные библиотеки (такие, как ABLAS, которая на момент написания этих строк существует только в 32-битном варианте).

# Delphi

## Почему везде вместо цикла for используется цикл while?

Причиной тому некоторые особенности реализации цикла for в Delphi. Если цикл не выполнялся не разу, то во многих языках программирования управляющая переменная цикла содержит стартовое значение. В Delphi если цикл не выполнялся не разу, то управляющая переменная цикла не изменяется. Однажды я встретил исходник, в котором эта разница играла большую роль, и решил заменить цикл for в программах на Delphi циклом while, который полностью совпадает по своему поведению с другими языками.

## Для чего служит функция `DynamicArrayCopy`?

В Delphi динамические массивы являются ссылочными типами, т.е. если параметр-массив передается по значению, то при этом не происходит копирования массива. Для эмуляции передачи параметра-массива по значению используется функция `DynamicArrayCopy`. Она принимает в качестве аргумента динамический массив и возвращает копию этого массива. Присваивание вида `A:=DynamicArrayCopy(A)` заменяет ссылку на оригинальный массив ссылкой на его копию.

# Вопросы по алгоритмам на Visual Basic

## На какую именно версию языка Visual Basic транслируются алгоритмы?

Алгоритмы транслируются на VBA, однако в целом совместимы с VB6.

## Программы с сайта будут работать в VB.NET?

Без портирования - нет.

## Почему в некоторых программах используется оператор goto?

Во многих языках программирования есть управляющий оператор continue, но в VB он отсутствует. Я не знаю, чем объяснить этот факт. Так вот, в программах на AlgoPascal этот оператор время от времени появляется. Оператор goto используется в качестве замены ему, осуществляя досрочный переход к очередной итерации цикла.

# Общие вопросы по исходным кодам

## Что такое библиотека AP?

Библиотека AP - это общее название набора библиотек на нескольких языках программирования, решающих низкоуровневые задачи, привязанные к специфике конкретного языка программирования. Библиотека решает такие задачи, как работа с динамическими одномерными и многомерными массивами в языках, не поддерживающих этот тип данных, содержит реализации базовых алгоритмов линейной алгебры и т.д. Библиотека распространяется в виде исходных кодов под лицензией BSD. Библиотека автоматически прикрепляется к каждому архиву с алгоритмами, доступному для скачивания с сайта. Последняя версия библиотеки доступна для скачивания по адресу http://alglib.sources.ru/translator/aplib.zip или http://www.alglib.net/translator/aplib.zip

## Что такое библиотека ABLAS?

ABLAS - это оптимизированная реализация базовых алгоритмов линейной алгебры, написанная на ассемблере. Чтобы использовать ABLAS, достаточно скопировать динамически загружаемый файл библиотеки в одну из системных папок или в папку с программой, а также включить поддержку ABLAS (как указано в интструкции к библиотеке). При запуске программы, использующей пакет ALGLIB, осуществляется автоматическое обнаружение и подключение библиотеки ABLAS. В случае отсутствия ABLAS используется стандартная реализация операций линейной алгебры, написанная на языке высокого уровня. На странице http://www.alglib.net/projects/ablas/ (или http://alglib.sources.ru/projects/ablas/ для русской версии сайта) находятся описание библиотеки, список поддерживаемых платформ и языков программирования, а также исходные коды и прекомпилированные двоичные файлы.

## Некоторые алгоритмы начинают нумерацию элементов массивов с единицы. Так уже никто не делает!

Делают. Скажем, библиотека netlib.org содержит мегабайты вполне работоспособного кода на Фортране, в котором принято начинать нумерацию с единицы. В современном мире принято начинать нумерацию с 0, но многие уникальные алгоритмы широко распространяются именно в старой редакции. На данный момент большинство алгоритмов приведено к современной, базирующейся на ноле системе нумерации, однако небольшое количество очень полезных алгоритмов использует старую систему. В перспективе все они будут приведены к новой системе, однако пока приходится использовать их, как есть.

## Язык программирования YYY не поддерживает массивы, нумерация которых начинается не с ноля. Что в этом случае?

В этом случае элементы, содержащие ноль в одном из индексов, не будут использоваться. Например, если подпрограмма ожидает получить массив размером 2x2, нумерация которого начинается с 1 (т.е. индексы элементов имеют вид `[1..2,1..2]`), то в неё следует передать массив с нумерацией элементов `[0..2,0..2]`. Это не самое красивое решение, но оно работает.

# Общие вопросы по проекту

## В чем цель проекта ALGLIB?

Создать удобную в использовании многоязыковую коллекцию алгоритмов для решения проблем в области численного анализа (в основном) и некоторых других задач.

## Чем проект ALGLIB отличается от других аналогичных проектов?

Пакет ALGLIB:

- это многоязыковый проект. Особенность проекта - то, что каждый алгоритм представлен программами на нескольких языках, и список языков один и тот же для всех алгоритмов. Это главное преимущество сайта перед другими подобными коллекциями - один алгоритм, несколько языков, идентичная функциональность на каждом языке.
- это коллекция программ. Иногда посетители жалуются на то, что на сайте почти нет описаний используемых алгоритмов. Да, их почти нет - но потому что ALGLIB является коллекцией именно программ, а не описаний используемых алгоритмов. На всё сил не хватит, увы.
- специализируется на численном анализе. В рамках проекта представлены и некоторые другие направления (например, есть алгоритмы сортировки и работы с графикой), но приоритетом является именно численный анализ.
- легко использовать. Для использования пакета ALGLIB не надо изучать незнакомый язык программирования, подключать дополнительные внешние библиотеки, или работать через громоздкий и неудобный интерфейс к коду, написанному на другом языке программирования.

Теперь о том, чем ALGLIB не является и не старается быть. ALGLIB:

- не соревнуется со специализированными пакетами. Цель проекта не в этом. И как бы я ни старался, мне не обогнать по скорости MKL и не добиться той же широкой функциональности, что и в LAPACK.
- не выходит за рамки концепции проекта. Например, параллельные вычисления - это очень интересно, но решение этой проблемы обычно тесно привязано к какой-то конкретной платформе, программной среде и языку, что идет вразрез с главной идеей проекта.

## Кто авторы проекта?

Первая версия библиотеки алгоритмов была создана Владимиром Быстрицким, и на протяжении нескольких лет он в одиночку развивал сайт. Впоследствии он утратил интерес к сайту, и его развитием по общему согласию занялся я - Сергей Бочканов.

## Какое отношение проект имеет к сайтам alglib.chat.ru и alglib.dore.ru?

Это зеркала ранних версий проекта, которые сейчас закрыты.

## Какое отношение проект имеет к проекту MANUAL.RU?

Этот проект помог библиотеке алгоритмов на одном из ключевых этапов развития, предоставив качественный бесплатный хостинг и, что более ценно, PHP-код для нового движка сайта, а также помощь по ряду других вопросов.

## Что такое "алгоритмический Паскаль" (AlgoPascal)?

AlgoPascal - это разработанный специально для данного проекта язык программирования. Программы на этом языке обрабатываются программой-транслятором, и затем на их основе строятся исходники на требуемом посетителю языке программирования. Более подробном об этом можно узнать в разделе "О сайте".

## Что такое "редактор блок-схем"?

Это программа, которая служит для просмотра и редактирования блок-схем. Первоначально все алгоритмы на сайте хранились в виде блок-схем, но затем в качестве основного способа представления был выбран AlgoPascal, на который были переведены блок-схемы. Тем не менее, старые блок-схемы остались на русской версии сайта, хотя их поддержка была прекращена, да и сам редактор может оказаться полезным посетителям. Более подробном об этом можно узнать в разделе "О сайте" и на страничке редактора блок-схем.

## А где алгоритмы для шифрования, рисования графиков, картинок в OpenGL и т.д.?

Как уже говорилось, цель библиотеки алгоритмов - создать многоязыковую библиотеку алгоритмов в области численного анализа. Задачи вроде указанных в оглавлении под эту классификацию не попадают. Для некоторых задач делается исключение, но в целом у проекта ярко выраженная специализация.