Re[3]: Языки/библиотеки для "числодробилок"?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.01.09 20:01
Оценка: 13 (3)
Здравствуйте, Курилка, Вы писали:

N>>Если опишете задачу — можно будет сказать что-то поконкретнее.


К>К сожалению пока что имевшийся вопрос остался теоретическим, так что врядли имеет смысл сильно залезать в конкретику.

К>А вопрос топика был скорей в "общей картинке": тут часто говорят, например что язык Х не подходит для "числодробилок", вот хотелось понять, а что гораздо больше подходит.

С точки зрения принципиальной возможности посчитать — годится, понятно, практически любой. Формулировка типа "не годится" относится к языкам, в которых численные расчёты типичного вида сопровождаются чрезмерными накладными расходами. Например, в большинстве ФЯ данные заранее непредсказуемого размера — это списки, и доступ к n-му элементу стоит O(n), в то время как в массиве языка типа Си это O(1); а модификация ещё дороже. Если в библиотеке такого языка нет реализации списка за O(1), а тем более при необходимости копировать вместо модификации — на нём операции с матрицами в традиционном стиле типа "ортогонализация на месте" будут давать безумные накладные расходы. Здесь сразу же надо объявить дисклеймер — да, возможно, надо на функциональном языке надо писать изначально иначе. Но эта тема "писать иначе" уже тут неоднократно раскрывалась, не хочу дублировать.

При рассмотрении полного цикла жизни софта, язык для численных расчётов должен позволять максимально прямолинейно отображать формулы в код и получать при этом достаточно эффективное решение. Собственно, Фортран так и был создан (FORmula TRANslation), множество признаков растёт прямо из математической практики. "The God is real, unless declared integer" — это следствие практики использовать i, j, k... под индексы, а остальные буквы — под значения. Массивы с нумерацией с единицы. Многомерные массивы. Отождествление через equivalence. Типы данных — целое и два вещественных... Никаких указателей (в версиях до 77-82). И, опять-таки — что делается в формулах, то и должно быть выражено в командах. А, возможно, самое существенное — это отсутствие необходимости заставлять авторов кода понимать специфические средства системщиков вроде указателей: мало того, что они сами по себе концептуально достаточно извращённы — им ещё мало где правильно учат (ой мало где). Сейчас это поколение у нас (но не в западном мире) отброшено в лучшем случае в 1С (а то и в админы или вообще на пенсию), но в 80-х было достаточное количество программистов, которые нормально работали с Фортраном и не понимали Си — из-за массы неприемлемых концепций вроде указателей.

Язык программирования среднего уровня (везде подразумевается — со средой исполнения) с ориентацией на численные расчёты должен предоставлять:
1. Базовые типы данных — целое разумного размера, вещественные как минимум двух размеров; обычно это IEEE754 float & double. Туда же — комплексные не дороже того, как с ними бы работали как с парой вещественных.
2. Одно- и многомерные массивы скалярных величин, статического и динамического распределения, с нумерацией с единицы или с заданного значения; фиксация на нумерации с 0 крайне неудобна для кодирования и потому недопустима. Доступ к элементам массива должен обеспечиваться максимально естественным образом (сишное a[x][y] уже на грани допустимого, а принуждение к одномерности недопустимо).
3. Дешёвую модификацию данных в скалярах и массивах — стоимостью O(1) (кроме случая тотального выверта логики, опять же)
4. Подпрограммы и функции (тонкости разделения в конкретном языке несущественны, но обязательна возможность передачи параметров по ссылке, включая скаляры и массивы; повторюсь — указатели являются сущностью "за гранью")
5. Базовые элементы логики кода (последовательное выполнение, ветвления, циклы)
6. Широкий комплект стандартных математических функций — от atan2() до бесселевых
7. Контроль переполнений и прочих исключительных ситуаций (деление на 0, обнуление значения...) на уровне среды, задание реакции на них (возможно, грубой — try/catch уже для этого уровня высший пилотаж)

Это примерно базовый комплект. В пределах популярных расширений можно также говорить о:
1. Арифметика (целочисленная и плавучая) произвольной точности
2. Стандартные библиотеки в поставке — для типичных операций (решение СЛАУ, ортогонализация...)

(Заметим, что даже понятие структуры уже не является обязательным! А тем более класса...)

Из описанных требований уже в общем-то видно, что адекватно задаче, что нет, и насколько будет дорого использовать конкретный язык. ФЯ массово отпадают — см. выше. C, C++ неплохи, но требуют подготовки программистов — которые умеют работать в их концепциях (указатели, структуры). C# явно поближе:) Питон — на грани, Перл — за гранью (осваивать его заморочки нафиг не сдалось для числовых задач), но оба как интерпретируемые и почти не компилируемые сильно теряют.

Думаю, понятно, хотя описал очень сумбурно:)

Ну и, разумеется, средства высокого уровня вроде того же MatLab — у которых видны уже не голые числа, а целые векторы и матрицы, и которые могут сами первообразную взять и так далее. Но так как это формально уже не языки, я их тут не рассматриваю. Практически же для лабораторного тестирования возможности и качества решения используются в первую очередь они, а переход на языки уровня Фортрана происходит тогда, когда надо задачу вынести на расчётный кластер.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.