The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск виртуальной машины HHVM 4.0 с прекращением поддержки PHP

12.02.2019 11:41

Спустя пять лет с момента формирования ветки 3.0 компания Facebook представила выпуск виртуальной машины HHVM 4.0 (HipHop Virtual Machine), поддерживающей выполнение программ на языке Hack (вариант PHP со статической типизацией). С оговорками поддерживается синтаксис PHP 5 и большинство возможностей PHP 7. Код проекта написан на C++ и распространяется под открытыми лицензиями PHP и Zend.

Отличительной чертой HHVM является применение JIT-компиляции и динамических оптимизаций, учитывающих особенности выполнения скрипта. В процессе выполнения кода производится определение типов данных и генерация на лету эффективных наборов машинных инструкций, оптимизированных специально для используемых типов. Перед выполнением PHP-скрипты преобразуются в специальное промежуточное абстрактное представление AST (Abstract Syntax Tree), которое затем транслируется в байткод HHBC (HipHop bytecode), который выполняется внутри высокоуровневой виртуальной машины.

Проект активно используется в инфраструктуре Facebook. Ранее HHVM использовался проектами WordPress и Wikipedia. После намерений Facebook отказаться от полной поддержки PHP данные проекты перешли на ветку PHP 7, которая начиная с PHP 7.2 в некоторых тестах опережает по производительности HHVM.

Ключевые изменения:

  • HHVM отныне не нацелен на обеспечение полной совместимости с PHP. Начиная с HHVM 4.0 прекращена поддержка некоторых специфичных для PHP особенностей, без которых будет нарушена совместимость с большинством PHP-проектов. Например, больше не поддерживаются особенности обработки массивов, не свойственные массивам и коллекциям языка Hack, прекращена поддержка ссылок на переменные, удалены функции, требующие доступа к памяти вызывающего, такие как compact(), extract(), get_declared_variables(), func_get_args() и parse_str() с одним аргументом. Прекращена поддержка менеджера зависимостей Composer. В следующем выпуске планируется прекратить поддержку тега "‹?php";
  • Добавлена поддержка файлов с расширением ".hack" для скриптов на языке Hack. В отличие от расширения ".hh" скрипты в файлах ".hack" автоматически запускаются в режиме "strict" (жёсткая проверка типов) и не требуют обрамления в тег "‹?" (как в скриптах на других языках теперь используется заголовок "#!/usr/bin/env hhvm");
  • Стабилизирована библиотека HH/lib/Regex, входящая в состав HSL (Hack Standard Library) и предоставляющая поддержку регулярных выражений, определяемых при помощи префиксов (например, $pattern = re"/foo(bar)?/").

  1. Главная ссылка к новости (https://hhvm.com/blog/2019/02/...)
  2. OpenNews: Релиз языка программирования PHP 7.3
  3. OpenNews: Facebook представил Hack, вариант языка PHP со статической типизацией
  4. OpenNews: Facebook анонсировал виртуальную машину HipHop и JIT-компилятор для языка PHP
  5. OpenNews: Проект Wikipedia перешёл на использование HHVM для выполнения PHP-кода
  6. OpenNews: Сравнение производительности PHP 7.0, PHP 5.6.16 и HHVM 3.10.1
Лицензия: CC-BY
Тип: Программы
Ключевые слова: hhvm, php
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (63) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, terryfilch (ok), 11:53, 12/02/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Зачем еще один PHP?
     
     
  • 2.4, Вася (??), 11:55, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А зачем так много разных марок легковесных авто?
     
     
  • 3.10, Аноним (10), 12:29, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Спроси у немцев и других французев. У нас в стране одна марка.
     
     
     
    Часть нити удалена модератором

  • 5.24, нах (?), 15:58, 12/02/2019 [ответить]  
  • –2 +/
    > Интересно, что сцукерберги являясь богатой технологической компанией,

    это сцукенберг богатый технолог - а компания бедная, он (судя по просачивающейся информации) на конкурсе паталогической жадности победил бы даже Безоса.

    поэтому и неасилили - умные и грамотные оттуда сбегают при первой возможности, остаются пехепе кодеры.
    заметь, случаев человеков добровольно и без принуждения сбежавших из sun или даже ужасного microsoft мне совершенно не известно.

    > Лучше бы карму починил себе, скоро как у Биллигейца станет.

    это ему поперерождаться неприкасаемым раз этак с триста, чтоб как у блингейца стала, придется. Тот иностранным шпионам личную информацию своих пользователей как-то ни разу вроде не слил.


     
  • 3.15, swine (ok), 13:14, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чтоб потребитель мог выбрать нравящийся ему шильдик.
     
  • 2.35, Аноним (35), 19:55, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Уперлись они в его производительность/сопровождаемость. Сначала компиляли в С++ (проект назывался hiphop), а теперь свою vm написали: скорость выполнения подняли, типов добавили в язык (привет любителям динамической типизации). Когда дофига написанного кода - так проще.
     
  • 2.42, Аноним (42), 00:57, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Видимо, им проще и дешевле чинить PHP, чем переходить на нормальный язык.
     
     
  • 3.48, Онаним (?), 09:34, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну и какой язык в манямирке сегодня нормальный? В реальности же - PHP и есть самый нормальный язык для своих задач. Как по статистике, так и по факту. Просто не стоит забывать, что каждый инструмент имеет своё назначение.
     
     
  • 4.62, Аноним (62), 17:06, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Раскройте секрет для каких задач  pho
     
     
  • 5.80, Hello (?), 17:28, 17/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Для мейнстримных. Мейнстрим тоже приносит бабло (люди покупают машины - компании имеют деньги). А пхп мейнстримный - его просто понять, есть в любой дыре за копейки, шишки все набиты. Что еще нужно для "поднять сайт за вечер" или "поднять проект чувакам, которым нужна куча взаимозаменяемых разрабов"?
     
  • 3.61, сцукенберг (?), 15:36, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    конечно дешевле - так я двух нормальных разработчиков нанял, они подпиливают это хевеэм, 24/7, сдохнут новых найму.
    А саму мордокнигу пишут на этом дешевые макаки, в Хайдерабаде на рынке если в шесть утра зайти, то на рупь пучок продают.

    Причем, в отличие от этих первых умных, те слаще морковки не едали, и щасливы горбатиться на меня за три копейки, никуда не убегают.

     

  • 1.7, Ilya Indigo (ok), 12:10, 12/02/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Надеюсь, следом за Hack, PHP8 будет тоже двигаться в сторону статической типизации и выкинет несовместимые с этим особенности, функции и языковые конструкции.
     
     
  • 2.8, тоже Аноним (ok), 12:17, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Вы так говорите, как будто это что-то плохое.
     
     
  • 3.9, Аноним (9), 12:21, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Динамическая типизация?
     
     
  • 4.14, тоже Аноним (ok), 13:12, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    На практике - вредная и ненужная вещь. Достаточно простых переводов в строку и обратно на уровне языка, и статика наведет порядок там, где сейчас его можно упустить просто по небрежности.
    Пока РНР был языком тяп-ляп функций, как JS, динамика была критичной.
    Сейчас, когда все всерьез и через ООП, она больше мешает.
     
     
  • 5.21, Junior frontend developer (?), 15:12, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Проблема не в том, что она не нужна, а в том, что это куда больше выразительной силы, чем обычно нужно пользователю, что создает дополнительную сложность и когнитивную нагрузку. Да тот же ООП в большинстве случаев предоставляет куда больше динамизма, чем нужно.
    Использовать конструкции языка, предоставляющие минимально нужную выразительную силу — хорошая практика.
     
     
  • 6.22, Аноним (22), 15:31, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Проблема пыха не динамическая типизация, а легаси и слабая типизация.
     
     
  • 7.23, тоже Аноним (ok), 15:45, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Проблема еще и в том, что тем, кто продолжает писать это легаси, не подается 220В на клавиатуру.
     
  • 5.50, Онаним (?), 09:47, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Угу. Лепим ООП к месту и не к месту, получая на выходе одноразовый тормозной говнокод.

    Была тут ситуация - нужно было разобрать список телефонных префиксов в дерево, навесить на проходные узлы ветвей несколько параметров, и просчитывать потом параметры листьев по запросу.

    Сначала сделал рабочий PoC "легаси" - на хэшах и просто массивах. Потом вспомнил, что сейчас модно ООП, сконвертил префиксы в объекты, объявил проперти параметров, геттеры-сеттеры, методы прохода к ветвям и расчёта, "всё как надо". Накладные расходы по памяти на формирование дерева оказались таковы, что пришлось всё это счастье выкинуть, и вернуться к ассоциативным массивам.

    Мораль: забивать гвозди отвёрткой - вредно.

     
     
  • 6.52, тоже Аноним (ok), 10:39, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Внезапно, именно статическая типизация могла уменьшить потребление памяти в вашем случае.
    Если, конечно, не дурить и не строить деревья из объектов без всякой на то необходимости.
     
     
  • 7.67, Онаним (?), 22:54, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Необходимость в деревьях там 100%, в процессе обработки нужно выхватывать произвольные субдеревья с наследованием параметров и перечислением индексов как наличествующих, так и отсутствующих листьев. Листьев - семь с половиной миллионов. Параметров в дереве не много, но они ближе к началу-середине, и реже - на листьях. Там вариантов банально нет.
     
  • 6.65, KonstantinB (??), 22:40, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А, геттеры-сеттеры это у нас ООП, понятно. Сдуру можно и буй сломать. Бегом читать Фаулера и Эванса, в частности про антипаттерн anemic model.
     
     
  • 7.66, Онаним (?), 22:52, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Дурак выхватил из рассказа два малозначительных слова, и на основании них начал делать свои далеко идущие выводы. Впрочем, на то он и дурак.
     
     
  • 8.75, KonstantinB (ok), 14:33, 14/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    См правило тринадцатого удара Если часы пробили 13 раз, то следует усомнитьс... текст свёрнут, показать
     
  • 2.12, vitalif (ok), 13:09, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Надеюсь, что нет. Идите на хрен со своей типизацией "пока в вилларибо настраивают сборку, в виллабаджо уже сделали MVP"
     
     
  • 3.16, тоже Аноним (ok), 13:15, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    ... на Ноде, которой ничего такого - вроде статической типизации или широкого использования в серьезных проектах - не грозит.
     
     
  • 4.20, Junior frontend developer (?), 15:06, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –6 +/
    Все серьезные проекты давно на TS
     
     
  • 5.25, сцукенберг (?), 16:00, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    ну оооок, у меня, значит, несирьозный, понял-понял...
     
     
  • 6.26, KonstantinB (ok), 17:06, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Серьезный или несерьезный, а типизация очень хорошо помогает не накосячить тупейшим образом. У меня есть что сравнивать: вот под рукой два проекта (оба одинаково серьезные), старый написан на чистом ES5, а новый на Typescript. Если с Typescript почти все ошибки вида "забыл обязательное поле или опечатался в имени ключа в цепочке map/filter/reduce" ловятся уже на этапе компиляции, то с чистым ES5 такая же ошибка приводит к получасу мучительной отладки.
     
     
  • 7.31, Аноним (31), 19:09, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Если с Typescript почти все ошибки [...] на этапе компиляции

    Сколько раз вам нужно запустить компиляцию, чтобы исправить реально все обнаруженные ошибки? Сколько это по времени, помноженное на время компиляции?

    Ничего не имею против строгой типизации, но вся это маята с компиляциями из одного языка в другой, потом ещё 10 раз, потом ещё интерпретатор с jit... не проще ли сразу взять нормальный язык типа c++? Компилироваться будет столько же, но хоть при выполнении не будет жрать как не в себя.

     
     
  • 8.36, Антон (??), 20:52, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    чтобы отлавливать ошибки не нужно запускать компиляцию, это делает IDE Компиля... текст свёрнут, показать
     
  • 8.39, KonstantinB (ok), 00:22, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Вручную - 0 раз, все ошибки видно сразу в IDE ... текст свёрнут, показать
     
     
  • 9.44, Онаним (?), 07:37, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А, ну то есть синтаксис верный - можно и в продакшн Ферштейн ... текст свёрнут, показать
     
     
  • 10.56, KonstantinB (ok), 10:58, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Типичный аноним Опеннета не в состоянии удержать контекст обсуждения глубиной бо... текст свёрнут, показать
     
  • 7.43, Онаним (?), 07:36, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > типизация очень хорошо помогает _криворучкам_ не накосячить тупейшим образом

    Fixed

     
     
  • 8.79, Junior frontend developer (?), 19:24, 15/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А хорошим программистам позволяет форсировать так же и логическую корректность к... текст свёрнут, показать
     
  • 7.63, Аноним (62), 17:16, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Дорогой друг. Я понимаю что ты ахринеть разработчик. Но у меня за плечами, 7 лет си, 5 лет php, 2 года js, 5 лет ruby и 3года golang. И если ты говоришь что тебе статическая типизация нужна что бы не косячить то ты даун. Твои проблемы от нестрогой типизация. А статическая типизация добавляет проблем при нереиспользовании кода. Конечно если ты веб макака пишущая круды на готовом фреймворке то тебе это мало о чем скажет.
     
     
  • 8.68, Онаним (?), 22:55, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Поддерживаю ... текст свёрнут, показать
     
  • 8.73, KonstantinB (ok), 14:17, 14/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Дорогой друг Во-первых, если уж меряться, то у меня за плечами опыта в 3 раза б... текст свёрнут, показать
     
  • 2.27, KonstantinB (ok), 17:18, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    На подмножестве PHP уже сейчас можно писать строго. Выкидывать там ничего не будут хотя бы потому, что тогда придется переписать примерно весь Wordpress, но самому себе никто не мешает запретить использовать "опасное" подмножество PHP. Есть линтеры, есть настройки анализатора кода в IDE, есть, в конце концов, code review.
     
     
  • 3.33, Ilya Indigo (ok), 19:42, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > На подмножестве PHP уже сейчас можно писать строго.

    Строго - это когда ты определяешь в любом месте кода:
    int a;
    и теперь a можно присвоить только число в определённом диапазоне.
    А когда ты можешь это указать только в параметрах ф-ий и м-ов - то это вообще ничто!

    > ...тогда придется переписать примерно весь Wordpress,

    И чё!?

     
     
  • 4.40, KonstantinB (ok), 00:23, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > А когда ты можешь это указать только в параметрах ф-ий и м-ов - то это вообще ничто!

    На самом деле, при должной декомпозиции (когда нет простыней по сто строк кода) на практике получается почти то же самое.

    > И чё!?

    То, что никто это делать не будет.

     
     
  • 5.49, Онаним (?), 09:38, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Вот сразу видно, когда "классики" лезут в язык с динамической сборкой. В итоге при попытке притащить свои паттерны и "декомпозицию" по 5 строчек кода на класс / функцию, размазанных по 100500 отдельным файлам, у них внезапно начинаются проблемы, потому что динамическая сборка не дружит с подходами кодэ-макак, неспособных удерживать в голове более трёх строк одновременно (оставшиеся две - название функции с агрументами и закрывающая скобка).
     
     
  • 6.55, KonstantinB (ok), 10:54, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это вы лихо всех авторов общепризнанных паттернов проектирования ПО в кодомакак записали. :-)

    Нет, кодомакаки это как раз писатели простынок с цикломатической сложностью over 100500 методом копипаста со stack overflow.

    Проблем с декомпозицией нет никаких вообще, динамика ей не мешает никак, с чего бы?

     
     
  • 7.69, Онаним (?), 22:57, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    С того бы, что PHP вынужден каждый раз всю эту портянку подгружать и парсить. На каждый, сцуко, запуск. Сейчас opcache слегка спасает, но и он не всесилен.

    А мозговой стэк оверфлоу при чтении кода - это как раз у горе-декомпостеров ради декомпоста, без цели и смысла.

     
     
  • 8.74, KonstantinB (ok), 14:29, 14/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В php времен 4 5 opcache из коробки не было по одной простой причине - чтобы Zen... текст свёрнут, показать
     
  • 7.77, Онаним (?), 22:28, 14/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Когда у кодомакак ломается паттерн - это хорошо. Потому, что учиться думать самостоятельно - хорошо безусловно.
     
  • 5.54, RNZ (ok), 10:51, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    https://github.com/lakwarus/wordpresshhvm

    Никогда не говори...

     
     
  • 6.57, KonstantinB (ok), 10:59, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    3 commits, 6 years ago. Сразу видно, проект живет и развивается!
     
  • 2.32, Coocos (?), 19:36, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Какой смысл в ПХП со статической типизацией если есть Java с отлаженным JIT, богатым выбором библиотек и отсутствием геммороя со сборкой расширений.
     
     
  • 3.34, Ilya Indigo (ok), 19:46, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Какой смысл в ПХП со статической типизацией если есть Java с отлаженным
    > JIT, богатым выбором библиотек и отсутствием геммороя со сборкой расширений.

    Какой смысл в жабе с её виртуальной машиной, если есть C++ с отлаженной кросплатформенной компиляцией, богатым выбором библиотек и отсутствием геморроя с докупкой оперативной памяти?

     
     
  • 4.53, coocos (?), 10:40, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Такой что требуется значительно больше времени тратить на разработку вместо того чтобы купить память.
     
  • 4.64, Аноним (62), 17:23, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Отсутствие ручного выделения памяти для вас уже недостаточно? Или вы по причине своей не компетентности не понимаете что для каждого яп свои задачи?
     

  • 1.29, Аноним (29), 19:05, 12/02/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Поместил php8 с jit компилятором, на бенчмарках показывает 40% прирост производительности и 26% на реальном проекте, жаль в прод его пока рано.
     
     
  • 2.30, Аноним (29), 19:06, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Потестировал*
     
  • 2.37, SubGun (ok), 23:55, 12/02/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это проект из разряда "допили сам". За 3 года так и не дошел до прода с поддержкой php.
    Но работает и правда шустро. Не вижу кому он без пхп может понадобиться, кроме самого фейсбука?!
     

  • 1.41, Аноним (41), 00:51, 13/02/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В чем смысл убрать <?php ?
     
     
  • 2.45, Онаним (?), 07:38, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В том, что это больше не PHP, а скорее самостоятельная поделка для внутренних нужд фейсбука.
     
     
  • 3.51, Аноним (51), 10:26, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > В том, что это больше не PHP, а скорее самостоятельная поделка для внутренних нужд фейсбука.

    Как Go для Гугла?

     
     
  • 4.70, Онаним (?), 22:58, 13/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну не совсем, но типа того. За пределами оных они бессмысленны.
     
     
  • 5.76, bentall (ok), 20:59, 14/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну не совсем, но типа того. За пределами оных они бессмысленны.

    К Go это уже определённо не относится. А вот Hack/HVVM скорее всего так и останется языком одной фирмы, виртуальная машина которого одно время использовалась для ускорения PHP.

     

  • 1.60, bentall (ok), 14:47, 13/02/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Логично, HHVM как альтернативный JIT для PHP с выходом семёрки уже как-то и не нужен (вот и Wikipedia.ORG в процессе перехода с HHVM на PHP 7.0). Поэтому фейсбуковцы и сконцентрировались на поддержке своего языка. Нужен ли такой брат-2 PHP — вопрос другой. На фоне того что PHP начал терять популярность — далеко не факт, очень сильно сомневаюсь, что за пределами FB кто-то станет переписывать большой проект с PHP на Hack (хотя это, наверняка и проще, чем на что бы то ни было другое).
     
     
  • 2.78, bentall (ok), 17:32, 15/02/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А между тем язык Hack в TIOBE вытеснил с 50-го места TypeScript. Наверняка в связи с этим самым новым HHVM, но мало ли, чем чёрт не шутит, ввдруг кому-то вне FB да пригодится.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру