Это - копия документа, находившегося на http://dz.ru. Авторские права, если не указано иначе, принадлежат Дмитрию Завалишину и/или Евгении Завалишиной. Все изменения, внесенные мной, находятся в этой рамочке.Пожалуйста, прочитайте disclaimer. |
Поле "Subject" - самое сложное место в электронной почте. Не шучу. Умение сказать в двух словах, о чём же вы пишете характеризует автора более, чем весь остальной RFC-822-шный заголовок, сколько в него не напихай. Да, пожалуй, даже и более, чем текст письма.
Привет, Дмитрий. Прочитал вот о проекте Фантома, посмотрел дискуссию и решил что нечто подобное, в смысле изобретения компьютера (с языками, осами и прочими сетями), хотелось и мне придумать :-) Но как-то были только мысли, не оформлявшиеся никак. Твоя идея и дискуссия подогрела мой давний интерес к этой задаче. И это тем более приятно потому, что не надо выдумывать всю концнпцию от начала до конца одному - можно просто принять участие в обсуждаемом проекте - что само по себе значительно проще, но не менее увлекательно. Вообще, хотелось бы поделиться о многом, начиная с того, какой бы я хотел видеть архитектуру железа, заканчивая просто филосовскими размышлениями на тему C++. Если позволишь :-). Для затравки - вот первая мысль по поводу языка и эффективности в Фантоме. Итак. Язык и эффективность. Языков Phantom может быть много. Но для простоты будем сейчас говорить о неком базовом языке Phantom - интерпретируемом так или иначе - подземельем Фантома или непосредственно железом. Основная мысль заключается в следующем: Представляется разумным все-же держать наряду с интерпретатором некий язык (или языки) для вычислений, код которых является компилируемым. Примечание для случая аппаратной интерпретации: Если код базового языка интерпретируется аппаратно, то компилятор должен уметь генерировать некий микрокод (по сравнению, конечно, с кодом базового языка). Соответственно, процессор должен уметь переключатся в режим микрокода. Обоснование. Сколько бы ни было ГГЦ, все равно всегда будет мало :-) Даже при наличии 3D-акселераторов, задачи не ограничатся Quake-v.10, всегда надо будет что-то считать быстро. На пределе скорости процессора. Всегда. Например, тот же Photoshop, с его обработкой изображений, не говоря уже о настоящих наукоемких вычислениях. Допустим, ограничение интерпретатора позволяет реализовать нормально работающий Photoshop только на процессоре с частотой 2 ГГЦ. Это значит, что мы, при нынешнем положении вещей, сознательно тормозим Фотошопный научно-технический прогресс. А это - нехорошо. И вообще, жалко терять пусть даже 50% времени на интерпретацию. Можно, конечно, интерпретировать на современном технологическом уровне - с конвейрами, кэшами и т.д. - то есть, полу-компилировать на этапе интерпретации/исполнения. Но! Во-первых, это представляется сложным, во-вторых, не имеет (ну почти не имеет) отношения к идее, которой я хочу поделиться. Итак, речь идет о компиляторе. Однако, наличие полноценного компилирующего языка, такого как C++, губит всю идею Фантома на корню. И еще, прежде чем идти дальше, предлагаю подумать - а где конкретно нам нужна максимальная эффективность. Ответ первого приближения - только там, где надо вычислять и/или перелопачивать большие объемы данных. Числодробилка, так сказать. Всю, абсолютно всю остальную логику взаимодействия объектов можно и нужно оставить на уровне базового языка-интерпретатора. Ну, к примеру, я не думаю, чтобы обработчики событий в виндах сильно пострадали, если бы там был интерпретатор, а не C/C++. Да, собственно, они и есть сейчас интерпретаторы, Java, например. Но как же все-таки считать быстро? А надо просто встроить несложный, но достаточный язык, назовем его вычислительным. Свойства и требования.
Философия Не пахнет-ли все это столетней пылью? Возможно. Но, прочтите еще раз "обоснования". Нам не нужен мощный и универсальный язык с объектами и прочими там... операторами ввода-вывода. Нам нужно средство, чтобы посчитать что-либо с ураганной скоростью и интерпретировать дальше. Так можно будет и quake программироавть и все что угодно. Единственное взаимодействие, которое лично мне хотелось бы иметь - это иногда узнать из соседней нити, типа а сколько еще примерно считать осталось? Думаю, что это не проблема, да и то она возникает в особо специфических случаях. А то и вообше не возникает, поскольку я сейчас подумал и пришел к выводу, что не могу себе представить такой вычислительной задачи, в которой был бы один-единстваенный цикл на триллион итераций. Такие вещи всегда вложенные, а если и нет - то их можно вложить :-) А раз вложить - тогда внешние циклы реализуются базовым языком. Эффективность при этом практически не страдает. McSeem
|
Спасибо за письмо, Максим!
Спасибо и за идею. Хотя, сказать честно, такая степень проработанности называется уже не идея. Как-то иначе. Концепция?
Я думал о чём-то подобном в рамках Фантома, но размыто. А тут так всё аккуратно разложено - приятно посмотреть.
Комментарии.
Я не думаю, чтобы возможность разбиения на функции и возможность использования библиотек в таких модулях были практически проблемными. Это несложно сделать. Первое - просто не вопрос, второе, библиотеки, тоже, слава Богу, отработано на практике изрядно. DLL-и и shared libraries - есть, где сдуть домашнее задание.
Вопрос, конечно, концептуальный. Надо ли. Опасность лишь одна, на мой взгляд. Наличие развитых средств "плоского" программирования позволит приверженцам этого стиля "вывернуть" Фантом наизнанку, сделав "плоское" основным, а объектное - лишь тряпочкой для прикрытия стыда.
Кто-то скажет "ну и что, пусть его", но мы его не будем слушать. :-) Фантом для меня - полигон для обкатки парадигмы. Дополнить его выбивающимися из парадигмы фрагментами - можно и нужно, но не более.
Реклама | |||
|
Проблема, однако, в другом. Попробуем прикинуть, как бы мы писали Quake с таким механизмом. Понятно, что вычислительный язык берёт на себя рендеринг - преобразование информации из "модельной", векторно-объектной формы, которая очень естественно ложится на Фантом, в форму битмепа. (Мы же говорим о программном рендеринге, не так ли?) Последний же нужно не просто построить, но и эффективно передать в видеосистему. Плюс к тому, "строителю" нужен доступ ко всей объектной структуре, описывающей архитектуру, состояние объектов и т.п. Вопрос - не станет ли это узким местом. Не так уж сложно отдать "считалке" массив пикселей для заполнения, а потом "битблит"-нуть его в видеопамять. Можно даже построить механизм, в котором "считалка" получит видеопамять в своё адресное пространство - не проблема.
Но вот как быть с исходными данными? Я вижу лишь один путь. На объектном уровне выполняется просчёт видимостей, разбиение на треугольники и сопоставление их с текстурами и положением на экране, а "счётная" часть получает треугольники по одному и делает наложение текстур, освещение и т.п - всё то, что можно описать компактным набором параметров - геометрия, текстура, освещённость...
Хватит ли такой функциональности, чтобы получить нужную производительность? И ещё момент - сегодня эту часть работы делает акселератор, а ту, что он не делает не получится и запихать в "счётный" модуль - из-за необходимости доступа к большим объёмам информации о состоянии игры.
Впрочем, может быть, это проблема лишь Quake - в том же Фотошопе место и принцип применения "вычислительных" модулей вполне понятны и уместны.
Что интересно. Вероятно, ядро, подземелье Фантома, можно реализовать как класс, методы которого опираются на такие вот, вычислительные модули, содержащие реально низкоуровневый код подземелья.
Красивая схема, однако.
Читатель, которому пофиг Фантом, программирование и эффективность вообще. Спасибо, что ты ещё с нами. Этот выпуск уже закончен, но...
Есть у Коммерсанта такая статья. Называется она - "Экономический рост и общественная мораль". Почему-то оборванная в конце, но от того не менее интересная. Совсем не про компьютеры. Рекомендую.
Приношу извинения за существенную задержку с выходом dz online. Всё банально - моё подключение к Интернету из-за проблем с кабелем у телефонистов вырубилось, лишив меня основного рабочего инструмента. Увы. Но всё уже восстановлено, я тут. В онлайне.