LINUX.ORG.RU

языки без сборки мусора

 


2

7

Всем привет!

А какие есть годные языки без сборки мусора? Ну, т.е. кроме С, С++ и Rust.

Так, чтобы не просто опциональное ручное управление, а чтобы весь язык и стандартная либа были ориентированы на работу без gc

Не обязательно что-то из мейнстрима (таких, вроде как, и нет кроме той троицы). Можно и с гитхаба, но живое и активное развивающееся


Ответ на: комментарий от olelookoe

В жабе из xml только maven, и то опционально. И то это не жаба, а сборщик.

Я видел это жава говно - везде хмл. И я не про сборщик.

Рабочего, функционального и уникального на жабе овердофига.

Нет, на жаве нет нихрена.

Экосистема жабы - это кернел в мире бизнес-логики. Жаба без экосистемы тупа, уныла и никому не нужна.

Экосистема жавы - это не экосистема для разработки. Это экосистема для поддержания в рабочем состоянии легаси-говна, дырявого насквозь при учёте, что над ним работают сотни бездарных инвалидов. Бизнесу это действительно нужно - пусть рабы делают бесполезную на 99% работу - 1% хватит.

И это работает, когда ты ты бездарный галерный раб. Когда же всё не так, то быстро оказывается, что никакой экосистемы нет. Есть экосистема для всего, кроме написания уникальной логики.

Именно поэтому я предлагал написать что-то уникальное(и уникальное это не очередное нелепое веб-говно хелвордистое) самому. Не будучи галерным рабом, который кормиться за счёт просиживания жопы в офисе. А именно когда кормишься за счёт той самой логики.

Можно было вложиться в сишечку и запилить подобную экосистему? Можно, но фишка уже легла по-другому. Уже запилили жабу и вокруг жабы запилили. Все, поезд ушел. Кто раньше встал того и тапки.

Сишка не занимается мусорным говном и там нету миллиардов бездарных рабов. Здесь ничего этого ненужно. К тому же - жаба-мир мёртв уже давно. Это легаси-говно.

anonymous
()
Ответ на: комментарий от vertexua

За давностью лет вполне мог подзабыть. Однако суть тех, многолетней давности утверждений, вполне себе ощутима на практике, прямо сейчас. 5, 10, 3 или восемь с половиной мне лично как-то по барабану, настаивать не буду. Если в практической плоскости, то исходя из личных ощущений, я бы сказал что все это ГЦ-заточенное на порядок более жручее и тормозное.

Другое дело что это бывает не важно для задачи, не в том месте узкое место или не так формируется стоимость решения.

olelookoe ★★★
()
Ответ на: комментарий от anonymous

Бизнесу это действительно нужно

На том и порешили.

К тому же - жаба-мир мёртв уже давно.

Хоронили тещу - порвали три баяна.

Даже какой-нибудь там кобол еще жив.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

На том и порешили.

Молодец.

Хоронили тещу - порвали три баяна.

Важу из помойки поднял jb и гугл с его мобилой. До этого жава уже почти скончалась как что-то на чём можно писать не легаси говно. Но даже сами jb и гугл разочаровались в жава-говне и jb под шумок впарил гуглу говнотлин.

От жавы остаётся только jvm и какая-то совместимость с жава-дрситнёй. Вся экосистема жабы потихоньку идёт на помойку т.к. она целиком и полностью мусорна и не совместимо с требованиями тех людей, кто не кормится просиживанием жопы в офисе.

Так и живём.

Даже какой-нибудь там кобол еще жив.

У тебя странные представления. Жив - это не то на чём что-то написано. Жив это то на чём пишут, пишут новое в ситуации, когда ты не раб легаси-говна. И никто не выберет жаву, даже самый преданный жава-фанатик.

anonymous
()
Ответ на: комментарий от anonymous

даже сами jb и гугл разочаровались в жава-говне и jb под шумок впарил гуглу говнотлин.

Да сейчас просто тренд такой, запиливать ЯП улучшающие ЯП.

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

Жив - это не то на чём что-то написано. Жив это то на чём пишут, пишут новое в ситуации, когда ты не раб легаси-говна.

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

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Да сейчас просто тренд такой, запиливать ЯП улучшающие ЯП.

Нет. Этак не работает - сама жава это такой же тренд. Это убийцы С++ с помойки.

Го

Нет, го преследует цели такие же как и базовая жаба, но не за счёт экосистемы. Конкурирует он там с жабаскриптом.

раст

Это вообще мусор какой-то нелепый. Созданный для отмывания бабла и развода на бабки хомячков.

скала и котлин - улучшенная жаба

Жаба - говно и очевидно, что её нужно улучшать. Скала - дристня. Котлин однозначно лучше жабы.

дарт - улучшенный жабоскрипт

Был изначально жавой и он действительно улучшенный и единственный адекватный «язык» из скриптухи. Правда он перестал быть жабаскриптом и это его сломало. Ну и в целом он стал уже легаси.

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

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

Много всего нового. Это в сравнении с крестами всё это мусор, а между собою пусть конкурируют.

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

Дело не в отменить. Я говорю о том, что критерии сектанта несостоятельны. Он утверждает(и вроде как ты тоже), что жаву можно взять и на ней писать. Но - нет. Никто не хочет брать.

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

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

Но это хоть что-то.

anonymous
()
Ответ на: комментарий от olelookoe

Как будто они смогут в принципиально другой класс задач.

Как будто 30 дюймовый 4K HDR 60FPS монитор будет решать принципиально другой класс задач что обычный 17-ти дюймовый 10 летней давности. Потому нужно остаться на старом и ничего не менять

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

И поэтому критерием живости языка не те, кто обязан на нём писать. А те, кто хотят на нём писать

https://insights.stackoverflow.com/survey/2019

Шел четвертый год подряд когда Rust - the most loved language

Одновременно исследование показывает что 57% разработчиков на С, и 48% пишущих на С++ сейчас хотят с них убежать

Но как говорят некоторые

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

Кстати чуть не забыл, зарплата на Rust чего-то там повыше С и С++

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от anonymous

что жаву можно взять и на ней писать

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

Ракета это не повседневная необходимость. Для большинства людей ракета это вообще не про их жизнь. Теперь скажи мне кому не нужен скотч и клей в этой жизни. Хотя так то скотч - говно.

olelookoe ★★★
()
Ответ на: комментарий от vertexua

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

anonymous
()
Ответ на: комментарий от anonymous

Да вообще мне знают своего счастья, это ж божья роса на плюсах долбиться

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

А между тем Rust 3.2% в разделе Most Popular Technologies Rust 9.5% в разделе Most Loved, Dreaded, and Wanted - Wanted. Для сравнения Python 25.7%.

Python is the most wanted language for the third year in a row, meaning that developers who do not yet use it say they want to learn it.

Ссылка та же.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Python is the most wanted language for the third year in a row, meaning that developers who do not yet use it say they want to learn it.

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

anonymous
()
Ответ на: комментарий от vertexua

Сейчас о раст из каждого табурета. Но питончик все равно пободрей идет. ЦА другая, и класс задач другой, и рынок шире. Жабокапец просто какой-то. Не накосячили бы они с переходом на 3 версию так вообще порвали бы как тузик грелку.

Делайте ваши ставки!

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Это если интересоваться, то да, о Rust говорят, а по деревням все ещё все мечтают гибернейт освоить и грести на галере

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Шел четвертый год подряд когда Rust - the most loved language

Типичная жертва пропаганды. Голос биомусора не стоит ничего. Кто это отребье, что лайкало? Что оно из себя представляет? Опущенный биомусор, который бегает и тыкает кнопки. Это бездарное говно будет жрать что угодно, что впариват пропаганда.

Одновременно исследование показывает что 57% разработчиков на С, и 48% пишущих на С++ сейчас хотят с них убежать

Опять же нелепая херня. Это процент не от разработчиков, а процент от опущенных. Адекватные люди никаких кнопок не долбят и никуда им бежать рассказывать о своих проблемах ненужно.

Кстати, всё это отребье - это не разработчики на С/С++ - это опущенные сями/крестами. Как максимум это всякое кути-говно, которое жрало говно и накидывало кнопочки в делфятинке, а потом побежала накидывать в другом месте. Оно никак не растёт и в говне валяется. И пропаганда это то, что даёт им оправдание и даёт далее идти в офис и вылизывать жопу хозяину за еду, накидывая кнопочки в дизайнере.

Очевидно - это отребье хочет верить в то, что оно что-то из себя представляет и жрёт говно лишь потому, что кто-то не дал. Это общее свойство малоразвитого быдла. Идёшь в любую помойку и спрашиваешь «почему живёшь в говне и точишь боты хренова?» - тебе ответят той же самой херни. «не дают, станок говно, а вот дадут нормальный - сразу всё будет».

Кстати чуть не забыл, зарплата на Rust чего-то там повыше С и С++

Остаётся только один вопрос - почему все раст-отребье, включая тебе, вылизывает жопы в жаве/маняС++ за еду? Где же твой раст, где же ты?

anonymous
()
Ответ на: комментарий от vertexua

Повторю ещё раз, клоун. Мнение имеют только те, кто могут его иметь. Выбор имеют те, кто может его иметь. Опущенные рабы, школота, бездарное мусорное отребье с помойки - ничего из себя не представляет и его «мнение», «выбор» никому не интересен. Его «мнение» - ретрансляция пропаганды. Его «выбор» - сапог хозяина. Все его потуги - оправдания пребывания в вечном говне.

anonymous
()
Ответ на: комментарий от vertexua

А, дак это ещё и говно с СО - там концентрация адекватных людей почти нулевая. Это помойка бездарных плебеев с хозяйским сапогом в жопе, которые вылизывают друг другу жопы доказывая хозяину свою лояльность и полезность.

За пруфами далеко ходить ненужно - я доскролил почти до середины и не увидел ни одной адекватной инфы. В целом - ЦА этого говна очевидна. Кому ещё, кроме бездарного биомусора, интересно кол-во небинарных гендеров, уровень фентейзиного опыта, распределения полов и прочей херни.

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

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

anonymous
()
Ответ на: комментарий от anonymous

А помоему ты подходишь под все 3 наименования сразу)) Ибо с таким рвением начал мазаться))

anonymous
()
Ответ на: комментарий от anonymous

А помоему ты подходишь под все 3 наименования сразу)) Ибо с таким рвением начал мазаться))

«Бегом побежал показывать.» ©

anonymous
()
Ответ на: комментарий от vertexua

Кстати чуть не забыл, зарплата на Rust чего-то там повыше С и С++

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

anonymous
()
Ответ на: комментарий от anonymous

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

crutch_master ★★★★★
()
Ответ на: комментарий от vertexua

Кстати чуть не забыл, зарплата на Rust чего-то там повыше С и С++

А на Closure зп как хороша! Питон - отказать.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

В жабе из xml только maven

GUI различные тоже часто на xml. В Android там или JavaFX...

fsb4000 ★★★★★
()
Ответ на: комментарий от anonymous

Экосистема жавы - это не экосистема для разработки.

Очередной кукаретик, ну давай расскажи нам про нормальную экосистему для разработки. Я даже не прошу тебя про реально хорошую экосистему рассказать (ибо их нет), просто расскажи мне про меньшее из зол. Или как все прочие кукаретики тихо сольёшься, когда я задавал им этот же вопрос?

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от olelookoe

Python is the most wanted language

Наследник бейсика/паскаля. Все его в бурсе учили кое-как (типа знают лол), и не хотят больше ничего учить, а хотят уже бабла. Можно понять такие устремления. А вот феномен любви к расту это какая-то аномалия либо фейк. Это как кресты любить, такой же изврат, только там хоть работа есть.

bread
()
Ответ на: комментарий от anonymous

Можно плиз на идиоматичном хаскеле?

Можно

import System.Environment (getArgs)
import System.Exit (exitWith, ExitCode (ExitFailure))
import Control.Monad
import Data.Time.Clock

transpose :: Int -> [[Double]] -> [Double]
transpose 0 l = []
transpose n x = map head x ++ transpose (n-1) (map tail x)

index n [] = []
index n l  = l : index n (drop n l)

matMult :: Int -> [Double] -> [Double] -> [Double]
matMult n a b =
    let ax = index n a
        bx = index n b
        t = transpose n bx
        tx = index n t
        inner ai tj k
              | n == k = 0
              | otherwise = head ai * head tj + inner (tail ai) (tail tj) (k+1)
        outer i j axi txj
              | n == i    = []
              | n == j    = outer (i+1) 0 (tail axi) tx
              | otherwise = inner (head axi) (head txj) 0:
                              outer i (j+1) axi (tail txj)
    in outer 0 0 ax tx

matFill :: Int -> [Double]
matFill n =
    let tmp = 1 / fromIntegral n / fromIntegral n :: Double
        val i j = let i1 = fromIntegral i
                      j1 = fromIntegral j
                  in tmp * (i1-j1) * (i1+j1)
        outer i j
              | n == i    = []
              | n == j    = outer (i+1) 0
              | otherwise =  val i j:outer i (j+1)
    in outer 0 0

printMat a n =
  forM (zip [0..n*n-1] a) $ \(i,c) -> do
    putStr $ show $ c
    putStr " "
    when ((i + 1) `mod` n == 0) $ putStrLn ""

main = do
  args <- getArgs
  when (args == []) $ exitWith $ ExitFailure 1
  let n = read $ head args
  when (n < 1) $ exitWith $ ExitFailure 1
  let a = matFill n
  -- printMat a n
  let b = matFill n
  t1 <- getCurrentTime
  let c = matMult n a b
  t2 <- getCurrentTime
  putStrLn $ show $ diffUTCTime t2 t1
  putStrLn $ show $ c !! (div n 2 * n + div n 2)

Вот тесты:

$ time ./mult-haskell 1000
0.000001676s
-95.58358333330017

real    0m0,656s
user    0m0,464s
sys     0m0,192s
$ time ./mult-c 1000
1.740243
-95.583583

real    0m1,756s
user    0m1,715s
sys     0m0,040s

Версии:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.4.4
$ gcc --version
gcc (Debian 8.3.0-6) 8.3.0

собирал

ghc -O3
gcc -Ofast -fwhole-program mult.c

monk ★★★★★
()
Ответ на: комментарий от monk

$ time ./mult-haskell 1000
0.000001676s

Короче хаскель рулит, педалит и разрывает на куски. Ну, и зачем тогда раст? Растоведы, ваш выход.

В живых останется только один.

olelookoe ★★★
()
Ответ на: комментарий от monk

хаскель не знаю, но видимо на gcc написана какая-то х**та.

Вот код царя, и я помню запускал там были наносекунды, а тут секунды.

$ git clone https://github.com/ericniebler/range-v3.git
$ g++ main.cpp -std=gnu++2a -march=native -Ofast -fwhole-program -funroll-all-loops -fconcepts -Irange-v3/include -o cpp
#include <range/v3/view.hpp>
#include <range/v3/numeric/inner_product.hpp>
#include <chrono>

using namespace ranges::view;

int main(int argc, char * argv[]) {
  size_t N = 3000;
  if(argc > 1) N = std::atol(argv[1]);  

  auto matrix = [](size_t n) {
    return iota(0ul, n * n) | transform([n, tmp = 1. / n / n](auto x) {
      ssize_t i = x / n, j = x % n;
      return tmp * (i - j) * (i + j);
    });
  };
  
  auto a = matrix(N), b = matrix(N);
  
  auto column = [N](const auto & m, size_t n) {
    return slice(m, n, m.size()) | stride(N); 
  };
  
  auto row = [N](const auto & m, size_t n) {
    return slice(m, n * N, n * N + N);
  };
  
  auto mul = [=](const auto & a, const auto & b) {
    return iota(0ul, N) | transform([=](auto i) {
      return iota(0ul, N) | transform([=](auto j) {
        return ranges::inner_product(row(a, i), column(b, j), 0.);
      });
    });
  };
  
  
  auto start = std::chrono::high_resolution_clock::now();
  auto c = mul(a, b);
  auto time = std::chrono::high_resolution_clock::now() - start;
  
  fprintf(stderr, "%luns\n", size_t(std::chrono::duration_cast<std::chrono::nanoseconds>(time).count()));
  fprintf(stderr, "%f\n", c[N/2][N/2]);  
}
fsb4000 ★★★★★
()
Ответ на: комментарий от olelookoe

Короче хаскель рулит, педалит и разрывает на куски. Ну, и зачем тогда раст? Растоведы, ваш выход.

Потому что вычисление происходит в последней строке ```haskell putStrLn $ show $ c !! (div n 2 * n + div n 2) ```

А что измеряется здесь ```haskell t1 <- getCurrentTime let c = matMult n a b t2 <- getCurrentTime ``` надеюсь, что автор знает. Интересно будет послушать автора этих «гениальных» строк :)

anonymous
()
Ответ на: комментарий от anonymous

Короче хаскель рулит, педалит и разрывает на куски. Ну, и зачем тогда раст? Растоведы, ваш выход.

Потому что вычисление происходит в последней строке

  putStrLn $ show $ c !! (div n 2 * n + div n 2)

Надеюсь, что автор знает, что измеряется здесь:

  t1 <- getCurrentTime
  let c = matMult n a b
  t2 <- getCurrentTime

Интересно будет послушать автора этих «гениальных» строк

anonymous
()
Ответ на: комментарий от anonymous

А что измеряется здесь ```haskell t1 <- getCurrentTime let c = matMult n a b t2 <- getCurrentTime ``` надеюсь, что автор знает. Интересно будет послушать автора этих «гениальных» строк :)

Время создания переменной с произведением. Для демонстрации, что вычисление ленивое

monk ★★★★★
()
Ответ на: комментарий от fsb4000
$ C g++ -Ofast -fwhole-program mult.cpp
mult.cpp:1:10: fatal error: range/v3/view.hpp: No such file or directory
 #include <range/v3/view.hpp>
          ^~~~~~~~~~~~~~~~~~~

Что поставить надо?

monk ★★★★★
()
Ответ на: комментарий от monk
$ git clone https://github.com/ericniebler/range-v3.git
$ g++ main.cpp -std=gnu++2a -march=native -Ofast -fwhole-program -funroll-all-loops -fconcepts -Irange-v3/include -o cpp
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

хаскель не знаю, но видимо на gcc написана какая-то х**та.

На gcc взято то, что предоставлено: https://gitlab.com/andalevor/mat_mul_test/blob/master/c_v1.c

На C++ реально быстрее:

$ time ./mult-cpp 1000
1676ns
-95.583583

real    0m0,028s
user    0m0,002s
sys     0m0,000s

monk ★★★★★
()
Ответ на: комментарий от monk

haskell
Время создания переменной с произведением.

Ты всерьез или играешь роль?

anonymous
()
Ответ на: комментарий от fsb4000

Ага... Ладно, сейчас подумаю, как такое на Haskell сварганить. Так-то там ленивость всегда на хвосте последовательности. То есть чтобы получить ту ячейку, половина матрицы рассчитывается.

monk ★★★★★
()
Ответ на: комментарий от monk

Не, это даже близко не производительность С++. Это я просто гнул понты со slice/stride. В снесённое теме уже были более очевидные/простые версии - в том числе эта:

#include <range/v3/view.hpp>
#include <range/v3/numeric/inner_product.hpp>

using namespace ranges::views;

int main(int argc, char * argv[]) {
  size_t N = 3000;
  if(argc > 1) N = std::atol(argv[1]);
  
  auto for_ = [=](auto && f) {
    return iota(0ul, N) | transform([=](auto i) {
      return iota(0ul, N) | transform([=](auto j) {
        return f(i, j);
      });
    });
  };
  
  auto matrix = [=](size_t n) {
    return for_([tmp = 1. / n / n](ssize_t i, ssize_t j) {
      return tmp * (i - j) * (i + j);
    });
  };
  
  auto a = matrix(N), b = matrix(N);  
  
  auto transpose = [=](const auto & m) {
    return for_([=](size_t i, size_t j) { return m[j][i]; });
  };  
  
  auto mul = [=](const auto & a, const auto & b) {
    return for_([=](size_t i, size_t j) {
      return ranges::inner_product(a[i], b[j], 0.);
    });
  };
  

  auto c = mul(a, transpose(b));
  
  fprintf(stderr, "%f\n", c[N/2][N/2]);
}

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

anonymous
()
Ответ на: комментарий от monk

Сливает где-то минимум в 120 тысяч раз. Дальше ждать не стал - мне лень.

$ time ./cpp 1000000
-95833.083334

real    0m0,002s
user    0m0,001s
sys     0m0,001s


Хаскель я отрубил где-то после 2-3 минут и он ещё ничего не родил.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.