Перепробовав D, Rust и C на одном и том же коде, реализовав один из алгоритмов на Cuda и найдя крайне геморным перенос его на OpenCL, я до сих не чувствую себя удовлетворённым.
Захотелось языка, в котором можно, написав один код, скомпилировать его как для CPU, так и для Cuda, так и для OpenCL. При этом платформа и устройство запуска управлялось бы переменными окружения.
Помимо этого хотелось бы таких свойств языка:
-
Имя переменной = её тип. Т.е. если есть переменная image, то это однозначно некоторая структура описывающая изображение, а не скажем имя файла с картинкой.
-
Имя функции = её входящие и исходящие переменные. Т.е. например вызов
scaled_down_image(image)
означает что на вход функции подаётся изображение, а на выходе мы получаем уменьшенное изображение в переменной scaled_down_image (если нет присваивания) -
Язык является полностью шаблонным и все типы уточняются в отдельном месте программы
-
Отсутствие как класс в языке такого понятия как «указатель». Компилятор сам решает передать структуру по значению или по указателю. Явно указатели могут быть указаны только в отдельном разделе для связи с другими ЯП.
-
Автоматическая сериализация данных. Из-за пункта 4 одна и та же структура легко может быть перекомпилирована в структуру без указателей и таким образом сериализована. Если же речь идёт о циклических структурах, то будет использована относительная адресация.
-
Явное указание в заголовке функции на используемые системные вызовы. Сбалансированные вызовы такие как open/close не указываются. Например если функция считывает файл в переменную, то указывается не open, read, close, а только read. Примерно так:
file_data(filename; read);
А вопрос мой состоит в том, нет ли этого всего уже где-нибудь?