QuakeC
Парадигма | императивный ( процессуальный ), структурированный |
---|---|
Разработано | Джон Кармак |
Разработчик | программное обеспечение id |
Впервые появился | 1996 |
Дисциплина набора текста | статический , сильный |
Основные реализации | |
Компилятор Quake C, FastQCC, FTEQCC, QCCx, GMQCC | |
Под влиянием | |
С |
QuakeC — компилируемый язык, разработанный в 1996 году Джоном Кармаком из id Software для программирования частей видеоигры Quake . Используя QuakeC, программист может в значительной степени настраивать Quake , добавляя оружие, изменяя игровую логику и физику, а также программируя сложные сценарии. Его можно использовать для управления многими аспектами самой игры, такими как части ИИ, триггеры или изменения на уровне. Движок Quake был единственным игровым движком , использующим QuakeC. Следующие движки использовали DLL игровые модули для настройки, написанные на C и C++ , начиная с id Tech 4 .
Обзор
[ редактировать ]Исходный код QuakeC оригинальной от id Software игровой логики Quake был опубликован в 1996 году и использовался в качестве основы для таких модификаций, как захват флага и других. [1] Исходный код QuakeC компилируется с помощью инструмента qcc в байт-код, хранящийся в файле с именем прогс.dat . Программисты модификаций Quake могли бы затем опубликовать свои байт-код progs.dat , не раскрывая их исходный код. Большинство модов Quake были опубликованы таким образом.
QuakeC позволил Quake движку доминировать в жанре шутеров от первого лица . [ нужна ссылка ] Благодаря идее Кармака о продлении жизни видеоигр путем добавления неограниченной расширяемости (расширяемость уже сыграла большую роль в Doom ), возникло огромное интернет-сообщество как геймеров, так и программистов, и многие современные многопользовательские игры в той или иной форме расширяемы. [ нужна ссылка ]
QuakeC известен как интерпретируемый, поскольку во время работы Quake он постоянно интерпретирует файл progs.dat. [2]
Ограничения и последующие решения
[ редактировать ]Синтаксис языка QuakeC основан на синтаксисе программирования C , что объясняет его название, но он не поддерживает реализацию новых типов, структур, массивов или каких-либо ссылок, кроме типа «entity» (который всегда является ссылка). QuakeC также страдает от того, что многие встроенные функции (функции, прототипы которых созданы в коде QuakeC, но на самом деле определены в игровом движке и написаны на C) возвращают строки во временный строковый буфер, который может содержать только одну строку в любой момент времени. Другими словами, такая конструкция, как
SomeFunction (ftos (num1), ftos (num2));
завершится неудачно, потому что второй вызов ftos
(который преобразует значение с плавающей запятой в строку) перезаписывает строку, возвращаемую первым вызовом, прежде чем SomeFunction сможет что-то с ней сделать. QuakeC не содержит никаких функций обработки строк или функций обработки файлов, которые просто не были нужны оригинальной игре.
Игровая логика большинства видеоигр того времени была написана на простом C/C++ и скомпилирована в исполняемый файл, что было быстрее. Однако это затрудняет создание модов для сообщества и делает процесс переноса игры на другую платформу (например, Linux ) более дорогостоящим.
Несмотря на свои преимущества, выбор реализации игровой логики с использованием специального языка сценариев и интерпретатора следующего поколения был исключен из движка Quake II в пользу скомпилированного кода C из-за общей негибкости QuakeC, все более сложной игровой логики и низкой производительности. получаемые за счет упаковки игровой логики в собственную динамическую библиотеку , а также преимущества использования уже существующего сообщества языков программирования, инструментов, учебных материалов и документации. [3]
Распространение собственного кода создало новые проблемы безопасности и переносимости. Байт-код QuakeC оставлял мало возможностей для вреда, в то время как собственный код имел доступ ко всей машине. Байт-код QuakeC также работал на любой машине, на которой можно было запустить Quake. Компиляция в нативный код добавляла дополнительный барьер для начинающих разработчиков модов, поскольку от них требовалось настроить более сложную среду программирования . Окончательное решение, реализованное с помощью движка Quake III , заключалось в том, чтобы объединить преимущества оригинального QuakeC с преимуществами компиляции C в собственный код. Компилятор lcc C был расширен для компиляции стандартного C в байт-код, который мог интерпретироваться виртуальной машиной аналогично QuakeC. Это решило проблемы безопасности, переносимости и цепочки инструментов, но потеряло преимущество в производительности собственного кода. Проблема была решена путем дальнейшей компиляции байт-кода в собственный код во время выполнения на поддерживаемых машинах. [4]
Модифицированные компиляторы и языковые расширения.
[ редактировать ]Декомпилятор и рекомпилятор были выпущены Армином Риго (называемым DEACC
и REACC
соответственно). Эти программы были созданы в процессе обратного проектирования и, скорее всего, были опубликованы до выпуска qcc
. [5]
id Software опубликовала исходный код qcc
, их компилятор QuakeC, вместе с оригинальным кодом QuakeC в 1996 году. Вскоре появились модифицированные версии, в том числе версия Джонатана Роя. fastqcc
Райана «FrikaC» Смита и FrikQCC . Это добавленная функциональность, оптимизация и повышение скорости компиляции.
В 1999 году, когда id Software выпустила код движка Quake под лицензией GNU General Public License (GPL), была изучена работа интерпретатора байт-кода и были выпущены новые компиляторы QuakeC, такие как компилятор Дж. П. Гроссмана. qccx
и новая версия FrikQCC. Эти компиляторы воспользовались преимуществами недавно обнаруженных функций с обратной совместимостью, так что байт-код по-прежнему мог правильно интерпретироваться немодифицированными движками Quake. Новые функции включают массивы, указатели, целые числа, циклы for и манипуляции со строками.
Теперь, когда исходный код движка Quake можно было изменять, в QuakeC были добавлены дополнительные функции в виде новых встроенных функций. Функции, к которым так долго стремились программисты QuakeC, наконец-то были реализованы, поскольку QuakeC теперь имел функции обработки файлов и строк, увеличенные строковые буферы, больше математических функций и так далее. Однако программисты, воспользовавшиеся этими изменениями, потеряли обратную совместимость с немодифицированным движком Quake.
Xonotic, начиная с версии 0.7, использует компилятор gmqcc . [6]
Клиентская часть QuakeC
[ редактировать ]Некоторые улучшенные Quake движки (особенно Darkplaces и FTEQW) [ нужны разъяснения ] иметь поддержку расширения обычного QuakeC (теперь обычно называемого QuakeC на стороне сервера), которое позволяет писать сценарии движка Quake только на стороне клиента , также сокращенно CSQC (QuakeC на стороне клиента). Это особенно полезно для графических интерфейсов и HUD. [ нужны разъяснения ] и любые визуально тяжелые эффекты, которые не нужно моделировать на сервере и передавать по сети. [7]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Лассе Лехтинен (25 июля 1996 г.). «QuakeC выпущен» . История Quake и QuakeWorld . Проверено 14 января 2011 г.
- ^ Эндрю Ву. «Основы Quake C» . Проверено 6 апреля 2013 г.
- ^ Кармак, Джон (13 марта 1997 г.). «Здесь необходимо обсудить технический вопрос, стр. 18» (PDF) . .план . программное обеспечение id . Проверено 5 ноября 2018 г.
- ^ Кармак, Джон (24 июля 1999 г.). «24 июля 1999 г., стр. 54» (PDF) . .план . программное обеспечение id . Проверено 5 ноября 2018 г.
- ^ «Интервью с Армином Риго – 12 февраля 1997 г.» . 30 апреля 1997 г. Архивировано из оригинала 30 апреля 1997 г.
- ^ «Выпуск Xonotic 0.7» .
- ^ «Клиентский QuakeC» . Квейквики . 30 сентября 2012 года . Проверено 16 ноября 2016 г.
Внешние ссылки
[ редактировать ]- Репозиторий id на GitHub, содержащий исходный код qcc на языке C (компилятор QuakeC).
- Репозиторий id на GitHub, содержащий исходный код QuakeC для игровой логики QuakeWorld.
- Неофициальные спецификации QuakeC
- Большая коллекция модов QC, включая их исходный код.
- Inside3d — хорошая коллекция руководств по контролю качества здесь.
- InsideQC — новый веб-сайт, унаследовавший наследие Inside3D после его закрытия