Это - копия документа, находившегося на 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. Всё банально - моё подключение к Интернету из-за проблем с кабелем у телефонистов вырубилось, лишив меня основного рабочего инструмента. Увы. Но всё уже восстановлено, я тут. В онлайне.