The OpenNET Project / Index page

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



"В JavaScript-платформе Bun добавлена поддержка вызова кода на языке Си"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"В JavaScript-платформе Bun добавлена поддержка вызова кода на языке Си"  +/
Сообщение от opennews (??), 23-Сен-24, 14:02 
В платформе Bun, развиваемой в качестве альтернативы Node.js и предназначенной для обособленного выполнения приложений, написанных на языках JavaScript, JSX и TypeScript, реализована экспериментальная возможность компиляции и выполнения обработчиков, написанных на языке Си. Ранее для вызова низкоуровневого кода требовалось либо создавать  N-API-плагины к движку V8, либо компилировать код в формат WebAssembly (WASM/WASI), что усложняло разработку и накладывало определённые ограничения. Теперь код на языке Си  можно напрямую встраивать в JavaScript и компилировать на лету с использованием компилятора TinyCC, а также подключать динамически связываемые библиотеки...

Подробнее: https://www.opennet.me/opennews/art.shtml?num=61915

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Аноним (1), 23-Сен-24, 14:02   +4 +/
В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #19

2. Сообщение от Аноним (2), 23-Сен-24, 14:05   +2 +/
Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #7, #20, #79

5. Сообщение от Аноним (1), 23-Сен-24, 14:06   +3 +/
Ты хотел сказать Майнер. В джаваскрипт и так без ограничений можно вставить что угодно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

6. Сообщение от Вы забыли заполнить поле Name (?), 23-Сен-24, 14:07   +/
Зуммеры или кто они там придумали ffi?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #13

7. Сообщение от Аноним (7), 23-Сен-24, 14:07   +5 +/
JavaScript сам большой зонд, загружаемый на компьютеры миллиарда пользователей.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #27

10. Сообщение от Аноним (-), 23-Сен-24, 14:13    Скрыто ботом-модератором+1 +/
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #16, #25, #28, #40

13. Сообщение от Аноним (13), 23-Сен-24, 14:17   +/
Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #21

16. Сообщение от Вы забыли заполнить поле Name (?), 23-Сен-24, 14:25   +3 +/
Это ансейф блоки, отнеситесь с пониманием.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10

17. Сообщение от YetAnotherOnanym (ok), 23-Сен-24, 14:53   +/
В целом - одобрям!
> а также подключать динамически связываемые библиотеки

А вот за это - отдельно тройное "ку!".

Ответить | Правка | Наверх | Cообщить модератору

18. Сообщение от Ilya Indigo (ok), 23-Сен-24, 15:13   +/
Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #24

19. Сообщение от Аноним (19), 23-Сен-24, 15:15   +/
> В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.

Вон то имхо как-то менее криво. Одно дело "писать модули для ноды" (как сишник я в душе не е...у что это за нахрен, и не то чтобы хочу левые ритуалы специфичные для очередной кривульки разучивать). И совсем другое - вызвать существующий сишный код. Как он есть. Вот это уже да, нормальный interop с сями.

Так что идейка скриптануть работу с мелкими мувиками - нормально смотрится. Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #26

20. Сообщение от Аноним (19), 23-Сен-24, 15:17   –2 +/
> Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.

Куда вы их встраивать собрались? И что раньше то мешало? Типа, хотите "obfuscated C contest" устроить?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

21. Сообщение от Аноним (19), 23-Сен-24, 15:19   –1 +/
> Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы

Ах ты черт, они услышали идею Fabrice Bellard'а на тему того что си можно сделать скриптовым движком :)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13 Ответы: #37

24. Сообщение от Аноним (-), 23-Сен-24, 15:28   –1 +/
> Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.

Учитывая в скольких ЯП есть FFI - тут можно разве что посоветовать держать синдром утенка под контролем.

FFI - "foreign function interface" и есть в дофига разных ЯП, внезапно.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #18 Ответы: #32

25. Сообщение от Ydro (?), 23-Сен-24, 15:35   –1 +/
Zig - классный, но его ещё пилить и пилить. На YouTube есть сравнение серверов на Zig и на Rast, пока Zig проигрывает по потреблению памяти и загрузки CPU
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10 Ответы: #31

26. Сообщение от pavlinux (ok), 23-Сен-24, 15:37   +1 +/
>  Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.

Ждите взломов ваших сайтиков с подстановками  source: "./heIIo.c", вместо "./hello.c",

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #19 Ответы: #29, #39, #60

27. Сообщение от pavlinux (ok), 23-Сен-24, 15:40   +1 +/
> JavaScript сам большой зонд, загружаемый на компьютеры

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7 Ответы: #30

28. Сообщение от Аноним (28), 23-Сен-24, 16:19   +/
> и портить память прям из сишки.
> Как диды завещали!

Послушай, циркач. В ассемблере тоже легко можно портить память, а сишка - это "кроссплатформерный ассемблер".

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10 Ответы: #34, #35

29. Сообщение от Аноним (29), 23-Сен-24, 16:19   +12 +/
> Ждите взломов ваших сайтиков с подстановками  source: "./heIIo.c", вместо "./hello.c",

Если какой-то чудик может патчить файло бэкэнда, подставляя туда всякий крап, ему уже ничего ломать и не надо по идее?

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #26

30. Сообщение от Аноним (29), 23-Сен-24, 16:21   +1 +/
> Задача хацкера не раскрутить сайт на лям юзеров, чтоб пихать свои зонды, а
> пихнуть зонд на сайт, где бродят лямы юзеров, чтоб от имени сайта всунуть зонд.

А до этого то что мешало? Ты типа принципиальный и твой зонд должен быть - high performance, не то что какая-то там скриптота? А иначе тебе обидно и ты не будешь бяку делать чтоли? :)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #27

31. Сообщение от Фнон (-), 23-Сен-24, 16:25   +/
> Zig - классный, но его ещё пилить и пилить. На YouTube есть сравнение серверов на Zig и на Rast, пока Zig проигрывает по  потреблению памяти и загрузки CPU

Производительность думаю можно улучшить.
У него ИМХО проблемы с позиционированием.

Если посмотреть на сайт ziglang.org - то там цель ЯП robust, optimal and reusable.
Из преимуществ перечислены "No hidden control flow/memory allocations. No preprocessor, no macros."
Вроде неплохо.. но в СИ можно обхоиться и без макросов.
Фичи типа zero-dependency, drop-in C/C++ compiler и легкого добавления в существующий код, тоже не выглядит как что-то сверхъестественное.

Ничего про "большую безопасность" не сказано, для этого нужно лезть в подробное описание.
А сишные ошибки типа use-after-free никуда не делись.

Плюс тудушки на такие ʼненужныеʼ вещи как Out of Bounds Float to Integer Cast - не добавляют доверию

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #25 Ответы: #33, #36

32. Сообщение от Ilya Indigo (ok), 23-Сен-24, 16:26   +/
Я знаю что такое FFI, и знаю что он есть много где.
Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.
А в других языках он просто для галочки и не играет никакой роли.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #24 Ответы: #41, #46, #66, #67

33. Сообщение от Серб (ok), 23-Сен-24, 16:29   +/
> Ничего про "большую безопасность" не сказано, для этого нужно лезть в подробное описание.

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #31

34. Сообщение от Аноним (34), 23-Сен-24, 16:53   –1 +/
Настолько кроссплатформенный, что на нём даже нельзя написать эмулятор процессора для 4004. Какой-то поэт сказанул пятьдесят лет назад, а школота с тех пор повторяет.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #28 Ответы: #61

35. Сообщение от Фнон (-), 23-Сен-24, 17:03   –1 +/
> Послушай, циркач. В ассемблере тоже легко можно портить память, а сишка - это "кроссплатформерный ассемблер".

Да, неужели!
Разве в ассемблере может команда не сработать?
Или там есть UB и CMP там может давать рандомный результат?

Я помню анекдоты про "программист на ассемблере делает два JMP. Но зачем? А вдруг первый не сработает", но ни разу с такой дичь за 20 лет работы не сталкивался.

И кстати, если открыть стандарт, то там написано
This document specifies the form and establishes the interpretation of programs expressed in the
programming language C.

И ни про какой "кроссплатформерный ассемблер" там не говорится.
Так что хватит нести чушь и позориться.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #28 Ответы: #38, #42

36. Сообщение от Аноним (1), 23-Сен-24, 17:04   +/
В zig зато нормальные не нулевые указатели по умолчанию. И нулевые опциональные только для взаимодействия с си.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #31

37. Сообщение от Аноним (37), 23-Сен-24, 17:06   +/
И вот это вот всё выполнять в эмуляторе на 4004 :)
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #21

38. Сообщение от Аноним (1), 23-Сен-24, 17:08   +/
Конечно может быть. Чуть другой проц все твой корректный аси код выдает что угодно кроме того что надо и это не говоря про недокументированные возможности или доп команды.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #35 Ответы: #43

39. Сообщение от Аноним (-), 23-Сен-24, 17:13   –1 +/
Павлинукс ты вроде за Раст топишь? Так ведь?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #26

40. Сообщение от Bottle (?), 23-Сен-24, 17:19   +/
Жаббаскрипт небезопасный сам по себе, нестрогая типизация всё сводит нет.
В каком языке ещё можно сложить 2 + "2" и получить "22"? А baNaNa чего только стоит!
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10 Ответы: #45, #57

41. Сообщение от _ (??), 23-Сен-24, 17:34   +3 +/
> Я знаю что такое FFI, и знаю что он есть много где.

Настолько много где, что если в ЯП такого нет - ты сразу думаешь "а понятно, студенты развлекаются" :)

> Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.

Это - да, чертовски верно подмечено! ;-)

> А в других языках он просто для галочки и не играет никакой роли.

А вот зря ты так. Почти все серьёзные робяты умеют. Пистон к примеру даже ffi и ctypes.
Да даже из Go дергаются win32 коллы легко и непринуждённо 8-) Мне тут наш толковый Гошник показал как - я чуть шляпой не подавился :)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #32

42. Сообщение от BeLord (ok), 23-Сен-24, 17:39   +/
На асм в мультизадачном режиме команда может не сработать, если код полезет туда, куда не положено.-)
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #35 Ответы: #47

43. Сообщение от Фнон (-), 23-Сен-24, 17:39   +1 +/
> Конечно может быть. Чуть другой проц все твой корректный аси код выдает что угодно кроме того что надо и это не говоря про недокументированные возможности или доп команды.

Ненене, девид блейн! У нас ассемблер пишется под процессор.
Именно поэтому надо делать всякие хитрые штуки для кроссплатформенности.
Для чуть "другого проца" у тебя будет другой ассемблерый код.


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #38

45. Сообщение от Аноним (2), 23-Сен-24, 17:53   +2 +/
А не фиг складывать разные типы. Или ты через 5 минут забываешь что у тебя хранится в переменной?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #40

46. Сообщение от YetAnotherOnanym (ok), 23-Сен-24, 17:55   +2 +/
> А в других языках он просто для галочки и не играет никакой роли.

Это, мягко говоря, неверно.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #32

47. Сообщение от Аноним (-), 23-Сен-24, 18:14   +/
> команда может не сработать

Именно не сработает? Или вернет ошибку?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #42

49. Сообщение от Аноним (49), 23-Сен-24, 18:24   +2 +/
> что позволяет вызывать из JavaScript-кода предоставляемые данными библиотеками функции

Самый большой вопрос это обработка событий. Ведь JavaScript это язык событийно ориентированный. Так вот вызов API в целом дело хорошее, но что делать когда у тебя несколько потоков со своими событиями в классичейсокй Node нужно городить контексты и хватать какие-то там блокировки, а что в Bun есть общий механизм или пока нет ничего и нужно дергать (pull) функцию для обработки очередей?

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #52

50. Сообщение от 12yoexpert (ok), 23-Сен-24, 18:31   –1 +/
запускаем браузер на с++ с интерфейсом на java, в нём запускаем java, в которой запускаем си

что вообще происходит?

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #55, #56, #62

51. Сообщение от Аноним (51), 23-Сен-24, 18:51   –2 +/
почему C? нужны вызовы rust
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #58

52. Сообщение от Tyrr (?), 23-Сен-24, 19:10   +/
Интересно как они отрабатывают время жизни ресурсов, конкурентный доступ и многопоточность при вызове кода на С - который в общем случае может себя ни в чём не ограничивать. Опять же почему компилятор внутри, а не линковка с dll?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #49

55. Сообщение от Аноним (55), 23-Сен-24, 19:18   +1 +/
Java и JavaScript разные языки, прикинь.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #50

56. Сообщение от Аноним (56), 23-Сен-24, 19:56   +/
Браузер здесь ни при чём, bun это отдельный JS-рантайм
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #50

57. Сообщение от Аноним (57), 23-Сен-24, 20:10   +1 +/
т.е. ты пытаешься "безопасно" сложить число со строкой и ругаешься, что язык не тот?:) лол. для тебя любой автомобиль "небезопасный" - вдруг тебе захочется на красный поехать? не нуачё - огоньки-то они ж светятся
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #40

58. Сообщение от Аноним (-), 23-Сен-24, 20:27   +/
> почему C? нужны вызовы rust

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #51 Ответы: #63

60. Сообщение от Аноним (60), 23-Сен-24, 21:18   +2 +/
Взломы сайтиков с подстановками, например "./heIIo.rs" вместо "./hello.rs", это конечно совсем другое.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #26

61. Сообщение от Аноним (60), 23-Сен-24, 21:26   +/
А как тогда на Intel 4004 запустили Linux? Запуск системы занимает 8 часов, но она работает.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #34 Ответы: #64

62. Сообщение от Аноним (60), 23-Сен-24, 21:36   +/
Происходит непонимание базовых вещей.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #50

63. Сообщение от Аноним (60), 23-Сен-24, 21:46   +/
Еще какие инсайды из чертогов воображения? Зиггеры и растеры это зачастую одни и те же люди и отношения между сообществами теплые и дружественные. Многие учат Zig как второй язык после Раста и выбирают для работы тот инструмент, который лучше подходит для их целей. Понимаю, фанатикам такое трудно принять, но что есть то есть.

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

Ну надо же какие признания пошли хоть и в завуалированной форме.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #58 Ответы: #65, #76

64. Сообщение от Аноним (60), 23-Сен-24, 21:51   +/
А все, видел пояснения к статье. Стека нет и по ресурсам ограничен, но все же подмножество Си реализовать можно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #61

65. Сообщение от errandrunner (?), 23-Сен-24, 23:02   +/
местный контингент просто живет первобытно-общинным строем и не представляет возможности кооперации и даже пересечений между двумя группами людей
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #63 Ответы: #77

66. Сообщение от Аноним (66), 23-Сен-24, 23:17   +/
> Я знаю что такое FFI, и знаю что он есть много где.
> Но в lua он раскрывается по полной, можно сказать lua был специально
> написан чтобы вызывать C/C++ ф-ии.

Как махровый сишник я скажу так: если что-то пишется "чтобы вызывать сишные функции", тогда, бжад, сделайте синтаксис похожий на сишный! Не, паскакальобразное при этом втулить - это вообще совсем не то! Так что этот тезис, имхо, не доказан и жестко отдает синдромом утенка. В этом смысле JS и то - лучше, увы и ах.

> А в других языках он просто для галочки и не играет никакой роли.

А я то думал - что там тоже сишные/плюсатые, а порой и еще какие функции вызывают.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #32

67. Сообщение от mos87 (ok), 24-Сен-24, 07:00   +/
>А в других языках он просто для галочки и не играет никакой роли.

это настолько толсто что автор даже не Д.Б., а не знаю что.

Perl, Tcl, Пестон или прастихоспаде Жаба-кодеры щас померли со смеху.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #32

69. Сообщение от Бывалый Смузихлёб (ok), 24-Сен-24, 10:20   +/
> По производительности Bun заметно обгоняет Deno и Node.js
> (в тестах на базе фреймворка React платформа
> Bun в 2 раза опережает Deno и почти в 5 раз Node.js)
> React

А... какое вообще отношение имеет Реакт к тесту производительности подобия ноды которое вообще про сервер а не браузер ?

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #71

70. Сообщение от ОШИБКА Отсутствуют данные в поле Name (?), 24-Сен-24, 11:10   +/
А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #74

71. Сообщение от Аноним (71), 24-Сен-24, 11:58   +1 +/
Странно человеку с ником "Бывалый Смузихлёб" не знать что react можно рендерить на сервере.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #69 Ответы: #72

72. Сообщение от Бывалый Смузихлёб (ok), 24-Сен-24, 14:02   +/
Можно-то можно, но это далеко не типовое и основное применение серваков вроде ноды
Причём, последние годы от подобного стараются уйти подальше, т.к сильно много жрёт ресурсов и особенно сильно грузится при DDoS-атаках

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #71

74. Сообщение от Вы забыли заполнить поле Name (?), 24-Сен-24, 15:14   +/
> А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?

NAPI в ноде придумали, чтобы не надо было расширение на С++ перекомпилировать под каждую версию ноды. Вообще расширение (addon) и ffi - не одно и тоже.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #70

75. Сообщение от Аноним (75), 24-Сен-24, 15:41   +/
В свете последних нововведений складывается впечатление, что делаются глобальные дырки. Чтобы страны опирающиеся на опенсорс решения имели дырявую инфраструктуру или выпали из мейнстрим.  
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #80

76. Сообщение от Аноним (37), 24-Сен-24, 18:13   +/
>Многие учат Zig как второй язык после Раста

Не фан, но понял. Нужно учить Дотракийский, как второй язык после Клингонского и выбирать для общения тот язык, которых лучше подходит для их понимания.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #63

77. Сообщение от Аноним (37), 24-Сен-24, 18:15   +/
А чем мы здесь все заняты, как не пересечением?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #65

78. Сообщение от InuYasha (??), 25-Сен-24, 13:20   +/
Так глядишь - и постепенно, постепенно, количество JS в коде будет уменьшаться... :D
Ответить | Правка | Наверх | Cообщить модератору

79. Сообщение от myster (ok), 25-Сен-24, 17:25   +/
> легко встраивать любые зонды

Речь же про серверную часть кода. Bun не для client-side

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

80. Сообщение от Вы забыли заполнить поле Name (?), 25-Сен-24, 18:04   +/
always has been
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #75


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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