Представь себе типичную реализацию контейнера на С++, только без шаблонов. Вот так же и выглядит. Шаблоны я пока не прикрутил и не знаю точно, нужны ли они.
Цитата:
AntiPlayer писал: У тебя JavaScript не получится на выходе?
Нет, у меня получится язык максимально близкий к С++ по синтаксису концепции и парадигме, но лишенный недостатков самого С++.
Цена за это - низкое быстродействие скриптовой машины.
Впрочем в дальнейшем можно будет прикрутить JIT, но это когда-нибудь потом.
По моим замерам быстродействие ниже С++ примерно в 9.5 раз.
Впрочем у Java без JIT оно наверное ниже раз в 100.
Добавлено 10-06-2022 в 22:02:
А то что я по языку мало новостей пишу - уж не обессудьте. На нашем форуме С++ знает только Xaerox, остальным навряд ли будет всё это интересно.
Дядя Миша писал: А то что я по языку мало новостей пишу - уж не обессудьте. На нашем форуме С++ знает только Xaerox, остальным навряд ли будет всё это интересно.
Так расжуй массам популярно, ты это умеешь, я знаю.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша я писал контейнеры на Яве, но там это выглядело так - заводим массив элементов на 10, при его заполнении создаём новый [n+10], делаем Arrays.copyOf и обнуляем старый массив
Дядя Миша писал: мы сперва должны узнать какой тип аргумента принимает bar
Кому была реально нужна эта фича, перегрузка? Это же зародыш современных Intellisense которые пытаются быть умнее пользователя и писать код за него.
Добавлено 11-06-2022 в 17:56:
Цитата:
Дядя Миша писал: Ну я вон выше про логические ловушки написал - никто даже не откомментил.
Ну я допустим прочитал. Наверное единственное что я не читал-это не простыни где ты описывал историю всех своих проектов.
Можно конечно ввести кнопку "я прочитал" но принципиально важно чтобы счетчик был виден только автору поста, иначе стадный эффект убьёт форум.
Добавлено 11-06-2022 в 17:57:
Цитата:
Дядя Миша писал: Цена за это - низкое быстродействие скриптовой машины.
Вообщем два миллиарда команд выполняется примерно за 21-секунду.
Цикл с условием INT_MAX. Для сравнения чистый С++ справляется за 4 секунды.
60 миллионов команд отнимает 0.7 секунды. Среднее кол-во инструкций для игрового кадра - ну может тысяч 20-30. Хотя это я так, навскидку.
Потом замерю, скажу точно.
Самое прожорливое как правило это поиск и перебор игровых объектов, а так же их параметров.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Образчик кода на делфи, низкий уровень, где-то в раёне базы для всех классов
C++ Source Code:
1
procedure TComponent.ReadLeft(Reader: TReader);
2
begin
3
LongRec(FDesignInfo).Lo := Reader.ReadInteger;
4
end;
5
6
procedure TComponent.ReadTop(Reader: TReader);
7
begin
8
LongRec(FDesignInfo).Hi := Reader.ReadInteger;
9
end;
Помоему тут прекрасно вообще всё. FDesignInfo - это целочисленная 32-битная переменная. Очевидно ReadLeft читает младшие 16 бит, а ReadTop - старшие 16 бит. Встаёт сразу вопрос - а почему такая странная пара left-top? Почему не right-bottom например? Опять же из названия функции ReadLeft никоим образом не следует, что мы совершаем операции с FDesignInfo. Интересно какая была мотивация у того, кто это писал?
Может я чего-то не догоняю?
Дядя Миша, насчёт виртуальной машины, а почему бы не взять wasm с уже готовым JIT и биндингами, в который к тому же умеют компилироваться всякие разные языки (C, C++, C# и т.д.). Или этот вариант уже рассматривался и был отвергнут?
PRoSToTeM@ я вообще стараюсь как можно меньше использовать чужой код. По крайней мере - в виде готовых библиотек. Потому что он всегда не годится под мои задачи, которые выходят за рамки стандартных применений в силу того, что у меня есть своё виденье, как всё это должно быть устроено. Есть конечно вещи, которые меня устраивают - например форматы OGG и Theora. Писать свои собственные форматы для сжатого аудио и видео я точно не планирую.
Добавлено 16-06-2022 в 09:51:
И вообще любая привязка к чужим библиотекам это очень порочная практика.
1. ты привязываешься и поначалу тебе всё нравится
2. потом ты что-то изменяешь под себя\исправляешь ошибки
3. потом выходит новая версия оригинальной либы с исправленными ошибками, о которых ты вообще ничего не знал
4. вместо того чтобы писать код дальше - начинаешь мержить либо вносить в новую либу уже сделанные изменения
5. если чужих либ много - то периодически в каждую
6. следишь чтобы после всех этих изменений у тебя самого ничего не испортилось
7. в конце-концов плюешь и перестаёшь вносить эти изменения
8. к моменту релиза твой софт использует устаревшие версии с критичными дырками (к примеру)
9. обновлять их нельзя, так уже создан пользовательский контент, неизвестно что сломается после обновления
10. Плюешь на пользователей пилишь новую версию, несовместимую, заставляешь всех перелезть туда.
11. За это время куча либ получает очередные обновления...
Вот в итоге чем занимается современный разработчик который просто хотел "сэкономить немного времени".
Добавлено 16-06-2022 в 09:57:
Для себя я выработал два чётких критерия, когда можно использовать сторонние библиотеки и один опциональный:
1. функционал библиотеки отвечает абсолютно всем моим требованиям, а если какие-то мелочи и не отвечают, то альтернативы нет всё равно.
2. библиотека не обновлялась в течении очень долгого времени - 10-15 лет и скорее всего не будет обновляться уже никогда, но при этом достаточно активно используется программистами. Или пусть не так активно, но была задействована в продакшене, что тоже показатель.
3. (опционально) библиотека берётся на время, в качестве заглушки, потом вместо нее будет написана собственная реализация.
Дядя Миша писал: 1. функционал библиотеки отвечает абсолютно всем моим требованиям, а если какие-то мелочи и не отвечают, то альтернативы нет всё равно.
Про функционал понятно, а что с кодом? Ты его полностью вычитываешь и разбираешь?
AntiPlayer писал: Ты его полностью вычитываешь и разбираешь?
Нет. Я просто стараюсь использовать только библиотеки, которые реализуют функционал чёрного ящика - подали данные на вход, получили данные на выходе. Этим требованиям отвечают тот же OGG, Theora, Zlib, Squish, Jpglib, т.е. просто какие-то распаковщики сжатого формата данных. Или наоборот упаковщики. Когда результат работы очень легко проконтролировать.
Если же библиотека начинает своими импортами экспортами расползаться во все части движка, подобно раковой опухоли, я просто такое не использую в принципе.
Т.е. стороняя реализация виртуальной машины или физики или рендерера моим требованиям отвечать не может, поэтому там всё самописное.
Если вам нужен обратный пример, где всё заимстованное - то вот Unity есть.
До пятой версии там почти всё было со стороны.
Добавлено 16-06-2022 в 10:42:
Если вам интересно, приведу список third_party на текущий момент в XashNT
1. ogg.lib (будет использоваться)
2. theora.lib (будет использоваться)
3. vorbis.lib (будет использоваться)
4. squish.lib (возможно будет переписана в дальнейшем)
5. NvTriStrip.lib (возможно будет удалена, на настоящий момент от нее мало толку)
6. Qslim.lib (скорее всего будет написана собственная реализация Progressive Mesh)
Чужие реализации в исходниках
1. bunnylod от Stan Melax (еще одна реализация Progressive Mesh, уже доработанная мной для ипользования режима Shortes Edge и преодтвращения деградации на швах)
2. Реализация progessive mesh от Tom Forsyth (оригинальная версия)
3. ZLib (без изменений, но отрезано всё ненужное, исходник весит всего 38 килобайт, меньше чем скомпиленная zlib1.dll)
Т.е. легко заметить что добрая треть библиотек - это различные вариации на тему Progressive Mesh, но своей реализации я еще не написал, потому что вслепую это очень неудобно делать, а вот когда у меня будет свой редактор, я этим конечно займусь. Можно было бы заморочиться и просто написать визуализатор для опытов, но это нерациональная трата времени. TriStrip как пятое колесо в телеге, ну нет от него толку на современных GPU. И на GD.ru это тоже подтвердили. Хотя я всё по феншую делал, с ремапом. ZLib я выброшу, просто потому что в игровых контейнерах сжатие вообще не нужно, оно только вредит. Но опять же, это не раньше чем будет написан игровой редактор и разработан собственный формат контейнеров хранения файлов.
Как-то так.
Добавлено 16-06-2022 в 10:47:
Ну и пару слов за форматы audio\video. Ни vorbis ни theora меняться уже не будут, они хорошо задокументированы и вполне предсказуемы.
К примеру, в то же римейке Quake от Night Dive идут видео в OGV, которые ксаш прекрасно воспроизводит, а у меня там стоят либы, скачанные с официального сайта, датируемые 2006-м кажется годом. Это полностью устаканившийся формат, от которого не ждёшь никаких неожиданностей.
А вот то, что делала Google для своих ютубов, это просто формат видео, который может идти в паре с форматом аудио (любым) и практически любым типом контейнера. То есть там полный зоопарк, с которым нет никакого желания связываться.