Re[15]: C++0x начали урезать
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.07 07:35
Оценка:
Здравствуйте, ironwit, Вы писали:

I>VladD2 пишет:


>> Человек у которого в списке интересов Эрланг стоит сам кому хочешь

>> должен все рассказать.
I>так я с ним еще не все понял
I>только в последней версии добавили имитацию работы драйверов написанных
I>на сторонних языках так, как будто они сделаны в ерланге (если я верно
I>понял)
I>а у меня все драйвера на delphi

Речь про Эрланг? Если да, то непонятно откуда "имитация", а ports и erl_interface уже очень давненько наличествуют, если не с самого начала.
Думаю перевести сишные хэдэры на паскаль нет очень большой проблемы, другое дело, что драйвер "вообще" и эрланговый — очень разные вещи.
Re[15]: C++0x начали урезать
От: palm mute  
Дата: 14.12.07 09:45
Оценка: 20 (3)
Здравствуйте, FR, Вы писали:

FR>Я заглядывал и показалось что что-то не так

FR>Вот как бы выкусить оттуда комментарии незнаешь? Там вроде целый препроцессор на перле используется, так что в лоб скриптиком похоже не выйдет.
FR>А на глаз их оценить тяжело.

Запускаешь make -f Makefile.alone, и брюки превращаются в элегантные шорты.
Я вот помаялся дурью, чтобы таки определить длину и диаметр.

В исходниках lua-ml мы учитываем только *.ml, т.к. сигнатуры модулей в *.mli полностью дублируются в *.ml и генерируются из одного источника. Далее, мы удаляем автоматически сгенерированные лексер и парсер, вместо них мы будем учитывать только соответствующие *.mll и *.mly:
$ for i in luaparser.mli luaparser.ml luaparsex.mli luaparsex.ml luascanner.ml ; do mv $i $i.auto ; done


Считаем строки:
$  wc -l *.ml luascanner.mll luaparsex.mly
    25 bench.ml
    12 log.ml
    86 luaast.ml
   112 luabaselib.ml
    68 luacamllib.ml
   107 luaclient.ml
   142 luafloat.ml
   270 luahash.ml
   163 luaiolib.ml
   477 lualib.ml
    31 luamathlib.ml
    25 lua.ml
    49 luarun.ml
   266 luastrlib.ml
   525 luavalue.ml
    34 main.ml
   142 srcmap.ml
   361 luascanner.mll
   212 luaparsex.mly
  3107 total


Теперь оцениваем версию на C. Сгенерированный парсер тоже удаляем, заголовочные файлы тоже не рассматриваем (просто, чтобы никто не возмущался , по-хорошему надо бы их оставить, т.к. все определения типов находятся там, дублирования, как в случае Окамла, нет):
$ wc -l `find . -name *.c -or -name '*.stx'` # *.stx - это исходники парсера
   300 ./src/inout.c
   319 ./src/hash.c
   191 ./src/fallback.c
   796 ./src/lua.stx
   156 ./src/func.c
    58 ./src/mem.c
   341 ./src/lex.c
   333 ./src/undump.c
  1330 ./src/opcode.c
   145 ./src/tree.c
   278 ./src/table.c
   190 ./src/luac/print.c
   105 ./src/luac/luac.c
   248 ./src/luac/dump.c
    71 ./clients/lua/lua.c
   276 ./clients/lib/old/strlib.c
   230 ./clients/lib/old/mathlib.c
   618 ./clients/lib/old/iolib.c
   573 ./clients/lib/strlib.c
   230 ./clients/lib/mathlib.c
   295 ./clients/lib/iolib.c
  7083 total


Получаем разницу в 2 раза, что и требовалось доказать.
Re[16]: C++0x начали урезать
От: FR  
Дата: 14.12.07 10:05
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Получаем разницу в 2 раза, что и требовалось доказать.


Угу, похоже реально к этому и будет близко. Хотя код на ML все равно будет красивше и читабельней, он все таки во многом DSL для компиляторострения
Re[16]: C++0x начали урезать
От: ironwit Украина  
Дата: 14.12.07 10:13
Оценка:
Курилка пишет:
> Здравствуйте, ironwit, Вы писали:
>
> I>VladD2 пишет:
>
>> > Человек у которого в списке интересов Эрланг стоит сам кому хочешь
>> > должен все рассказать.
> I>так я с ним еще не все понял
> I>только в последней версии добавили имитацию работы драйверов написанных
> I>на сторонних языках так, как будто они сделаны в ерланге (если я верно
> I>понял)
> I>а у меня все драйвера на delphi
>
> Речь про Эрланг? Если да, то непонятно откуда "имитация", а ports и
> erl_interface уже очень давненько наличествуют, если не с самого начала.
> Думаю перевести сишные хэдэры на паскаль нет очень большой проблемы,
> другое дело, что драйвер "вообще" и эрланговый — очень разные вещи.

я говорил про это
The Erlang driver API has been extended with a portable POSIX thread 
like API for multi-threading. The Erlang driver thread API provides: 
threads, mutexes, condition variables, read/write locks, and 
thread-specific data. For more information see the erl_driver(3) 
documentation.

с http://www.erlang.org/doc/highlights.html
но если в чем то напутал то прошу извинить..., читал обьявление о релизе
на лету, и просто поставил в голове галочку что чтото в ерланге с
драйверами поменялось, надо бы почитать подробнее. вскользь проглянул
про erl_driver(3) documentation, понял что напутал.
Posted via RSDN NNTP Server 2.1 beta
Я не умею быть злым, и не хочу быть добрым.
Re[17]: C++0x начали урезать
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.07 10:20
Оценка:
Здравствуйте, ironwit, Вы писали:

I>я говорил про это

I>
I>The Erlang driver API has been extended with a portable POSIX thread 
I>like API for multi-threading. The Erlang driver thread API provides: 
I>threads, mutexes, condition variables, read/write locks, and 
I>thread-specific data. For more information see the erl_driver(3) 
I>documentation.
I>

I>с http://www.erlang.org/doc/highlights.html
I>но если в чем то напутал то прошу извинить..., читал обьявление о релизе
I>на лету, и просто поставил в голове галочку что чтото в ерланге с
I>драйверами поменялось, надо бы почитать подробнее. вскользь проглянул
I>про erl_driver(3) documentation, понял что напутал.

Ну изменения есть, факт, меня "сторонние языки" смутили
А про потоки есть инфа здесь
Кстати, может быть у меня тоже появятся задачи код дельфовый интегрить с Эрлангом в следующем году
Re[15]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 10:23
Оценка: 7 (2) +1 -2 :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, remark, Вы писали:


R>>А мне вот это
Автор: remark
Дата: 01.01.07
очень понравилось.

R>>Визуально вроде код на С на несколько вспомогательных строчек длиннее, но по сути один в один с Немерле.
WH>Влад на это еще тогда ответил...


Ну а что он там ответил?
То, что вот это супер пример-убийца, показывающий неописуемую принципиально неповторимую мега-мощь немерле:

| Call("max", [arg1, arg2]) => Math.Max(arg1.Eval(), arg2.Eval())
| Call("min", [arg1, arg2]) => Math.Min(arg1.Eval(), arg2.Eval())
| Call(_, _) => throw InvalidOperationException(this.ToString());


И то, что вот это аналогичный мега-убогий, на 2 порядка худший, принципиально неподдерживаемый код на С++:
 case expr::Call:
     if ("max" == e.name) Math.Max(e.arg1, e.arg2);
     else if ("min" == e.name) Math.Min(e.arg1, e.arg2);
     else throw InvalidOperationException(e);


Ты это имеешь в виду?

Кстати, у меня, например, возникают вопросы к некому ".Eval()" в примере на немерле? Уж не убица ли это типизации? И не замена union'ам? А что, если я опишусь и напишу "name.Eval()", при этом в name по счастливому стечению обстоятельств лежит нечто похожее на число?

Аналогичный код на С так никуда и не делся. Субьективные рассуждения про "марально устаревшие языки" не очень интересны.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[14]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 10:24
Оценка: -1 :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, FR, Вы писали:


FR>>С (*.с *.h) 194 kb

FR>>Ocaml (*.nw) 222 kb
FR>>(я еще не копался что там внутри так что если кто раскопает и разъяснит почему буду рад)

WH>На первый взгляд в коде на Ocaml очень сильно больше комментариев чем в сишном коде.


Это наталкивает на мысли...


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[16]: C++0x начали урезать
От: FR  
Дата: 14.12.07 10:37
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Получаем разницу в 2 раза, что и требовалось доказать.


Еще здесь есть неплохие картинки показывающий размер кода (притом оптимизированного на скорость) для разных языков, правда там не компиляторы, а более общий код, что для меня интересней. Разница между ML образными и C++ как раз в полтора — два раза.
Re[15]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 12:38
Оценка:
Здравствуйте, remark, Вы писали:

WH>>На первый взгляд в коде на Ocaml очень сильно больше комментариев чем в сишном коде.

R>Это наталкивает на мысли...
О том что код писался как пример...
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 12:38
Оценка: +2 -1
Здравствуйте, remark, Вы писали:

R>И то, что вот это аналогичный мега-убогий, на 2 порядка худший, принципиально неподдерживаемый код на С++:

R>
R> case expr::Call:
R>     if ("max" == e.name) Math.Max(e.arg1, e.arg2);
R>     else if ("min" == e.name) Math.Min(e.arg1, e.arg2);
R>     else throw InvalidOperationException(e);
R>

Нет никаких arg1 и arg2. Вторым параметром идет список. Также нужно вычслить выражения перед тем как их скормить Min/Max
Те как минимум должно быть так:
    case expr::Call:
        if ("max" == e.name && e.args.size() == 2) Math.Max(eval(e.args[0]), eval(e.args[1]));
        else if ("min" == e.name && e.args.size() == 2) Math.Min(eval(e.args[0]), eval(e.args[1]));
        else throw InvalidOperationException(e);

И это весьма примитивный пример.
При попытке повторить это у тебя будет ужасное нагромаждение кода
| Call (OpCode ("=="), [nested_cond,
    Parm where (expr = TExpr.TypeConversion(TExpr.Literal(Literal.Bool(true)), _, _))], _) =>
    emit_branch(nested_cond.expr, else_label)


R>Кстати, у меня, например, возникают вопросы к некому ".Eval()" в примере на немерле? Уж не убица ли это типизации?

С какой это стати?

R>И не замена union'ам?

Нет. union'ы не типобезопасны.

R>А что, если я опишусь и напишу "name.Eval()", при этом в name по счастливому стечению обстоятельств лежит нечто похожее на число?

Что значит нечто похожее на число?
Nemerle статически типизированный язык.
Приведения типов в рантайме нужно указывать явно.

R>Аналогичный код на С так никуда и не делся. Субьективные рассуждения про "марально устаревшие языки" не очень интересны.

Они объективны нравится это тебе или нет.
Ибо код на на С сложен для поддержки и восприятия. Код на С практически не контролирует компилятор.
Что скажет компилятор если ты ошибешься с индексами или забудешь else throw ?
Да ничего он не скажет.
И на тестовых примерах вероятно все отработает.
А у клиента все свалится.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 13:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, remark, Вы писали:


R>>И то, что вот это аналогичный мега-убогий, на 2 порядка худший, принципиально неподдерживаемый код на С++:

R>>
R>> case expr::Call:
R>>     if ("max" == e.name) Math.Max(e.arg1, e.arg2);
R>>     else if ("min" == e.name) Math.Min(e.arg1, e.arg2);
R>>     else throw InvalidOperationException(e);
R>>

WH>Нет никаких arg1 и arg2. Вторым параметром идет список. Также нужно вычслить выражения перед тем как их скормить Min/Max
WH>Те как минимум должно быть так:
WH>
WH>    case expr::Call:
WH>        if ("max" == e.name && e.args.size() == 2) Math.Max(eval(e.args[0]), eval(e.args[1]));
WH>        else if ("min" == e.name && e.args.size() == 2) Math.Min(eval(e.args[0]), eval(e.args[1]));
WH>        else throw InvalidOperationException(e);
WH>



Ну это только в таких развитых языках как немерле. А на С++ достаточно и этого:
 case expr::Call:
     if ("max" == e.name) Math.Max(e.intArg1, e.intArg2);
     else if ("min" == e.name) Math.Min(e.intArg1, e.intArg2);
     else throw InvalidOperationException(e);




WH>И это весьма примитивный пример.

WH>При попытке повторить это у тебя будет ужасное нагромаждение кода
WH>
WH>| Call (OpCode ("=="), [nested_cond,
WH>    Parm where (expr = TExpr.TypeConversion(TExpr.Literal(Literal.Bool(true)), _, _))], _) =>
WH>    emit_branch(nested_cond.expr, else_label)
WH>


Так это и тут выглядит как "ужасное нагромаждение кода". То, что это удалось запихнуть в 3 строчки, не является показателем хорошести кода. Вполне возможно, что я предпочёл запись этого кода в 10 строк.



R>>Кстати, у меня, например, возникают вопросы к некому ".Eval()" в примере на немерле? Уж не убица ли это типизации?

R>>И не замена union'ам?
R>>А что, если я опишусь и напишу "name.Eval()", при этом в name по счастливому стечению обстоятельств лежит нечто похожее на число?

Тут беру слова обратно — не разобрался, что такое Eval()


R>>Аналогичный код на С так никуда и не делся. Субьективные рассуждения про "марально устаревшие языки" не очень интересны.

WH>Они объективны нравится это тебе или нет.
WH>Ибо код на на С сложен для поддержки и восприятия. Код на С практически не контролирует компилятор.
WH>Что скажет компилятор если ты ошибешься с индексами или забудешь else throw ?
WH>Да ничего он не скажет.
WH>И на тестовых примерах вероятно все отработает.
WH>А у клиента все свалится.


Писать на С я не призываю. Я лично пишу на С++ и мне нравится. Компилятор контролирует код не меньше, чем в других современных языках, а учитывая распространённость С++, возможно, что и больше.
Индексы я использую редко. Что будет, если ошибусь? Исключение или ассёрт скорее всего. Вообще индексы я использую редко. Они сами по себе провоцируют ошибки. Обнаружение большинства ошибок я стараюсь переносить на фазы компиляции/линковки/стартапа. Имхо смысл иметь исключение, где по сути должен быть ассёрт не много.
Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.
Код на немерле не падает "у клиента"? Даже если неправильно указать индекс?



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[15]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 13:25
Оценка:
Здравствуйте, Константин Л., Вы писали:

VD>>Ну, не мучительнее чем бустовский, првада?


КЛ>А я его не читаю. Только хэдэра. От имплементации иногда не по себе, но это случается раз в полгода.


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

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

К тому же, если тебе нужно ты можешь уточнять типы вручную. Считашь что это повысит читабельность? Вперед...

Лично я когда разбираюсь с нетривиальными кусками даже не поддержкой IDE пользуюсь, а отладчиком. Там все типы известны. Более того там известны реальные данные и можно протросировать неясные участки. Это урощает понимание кода на любом языке.

VD>>А вывод типов из инициализации и в С++ введут. Они вроде его как в Ди "auto" хотят назвать. Чтобы ключевое слово повторно использовать.


КЛ>Введут, и я от этой фичи не в восторге. Разве что для foreach полезна


Зря. Привыкнешь немного и поймешь, что это удбобно.

КЛ>Я не в курсе что такое обобщенные реализации функций.


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

КЛ>Если бы решало, то я бы не бегал Рефлектором.


А вот Рефлектор на Немерле падает.
Ну, и очень советую не Рефлектор использовать, а отладчик. Рефлекто он иногда помогает при отладке не тривиальных макросов. И то это от убогости родных тулзов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 13:25
Оценка: 1 (1)
Здравствуйте, FR, Вы писали:

FR>Еще здесь есть неплохие картинки показывающий размер кода (притом оптимизированного на скорость) для разных языков, правда там не компиляторы, а более общий код, что для меня интересней. Разница между ML образными и C++ как раз в полтора — два раза.


1.5 — это если очень тупить на ML-еподобном языке и если очень окуратно писать на С. С++ обычно еще больший оверхэд добавляет, так как классы для компиляторов это перебор.
А вот если задача сложная (настоящий компилятор) и все наоборот (тупят на С++ и акуратно пришут на клонах ML), то разрыв может достигать и 10 раз.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 13:25
Оценка:
Здравствуйте, remark, Вы писали:

R>Это наталкивает на мысли...


Мысли — это полезно .
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: C++0x начали урезать
От: ironwit Украина  
Дата: 14.12.07 13:31
Оценка:
Курилка пишет:
>
> Ну изменения есть, факт, меня "сторонние языки" смутили
> А про потоки есть инфа здесь
> <http://www.erlang.org/doc/man/erl_driver.html#ErlDrvTid&gt;
> Кстати, может быть у меня тоже появятся задачи код дельфовый интегрить с
> Эрлангом в следующем году
во. класс
порассказываешь много страшного?
Posted via RSDN NNTP Server 2.1 beta
Я не умею быть злым, и не хочу быть добрым.
Re[19]: C++0x начали урезать
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.07 13:33
Оценка:
Здравствуйте, ironwit, Вы писали:

I>порассказываешь много страшного?


см. почту.
Re[18]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 13:52
Оценка:
Здравствуйте, remark, Вы писали:

R>Ну это только в таких развитых языках как немерле. А на С++ достаточно и этого:

R>
R> case expr::Call:
R>     if ("max" == e.name) Math.Max(e.intArg1, e.intArg2);
R>     else if ("min" == e.name) Math.Min(e.intArg1, e.intArg2);
R>     else throw InvalidOperationException(e);
R>

Нет никаких intArg1 и intArg2. Call содержит список ибо функции бывают с разным колличеством ургуметов.

R>Так это и тут выглядит как "ужасное нагромаждение кода". То, что это удалось запихнуть в 3 строчки, не является показателем хорошести кода. Вполне возможно, что я предпочёл запись этого кода в 10 строк.

Вот так и получается в 3 раза больше кода на ровном месте... Да и твой код будет куда мение читаемым.

R>Писать на С я не призываю. Я лично пишу на С++ и мне нравится. Компилятор контролирует код не меньше, чем в других современных языках, а учитывая распространённость С++, возможно, что и больше.


Бред.
А выделеное полный бред.
Ибо распростаненность языка никак не влияет на его систему типов.

R>Индексы я использую редко. Что будет, если ошибусь? Исключение или ассёрт скорее всего. Вообще индексы я использую редко. Они сами по себе провоцируют ошибки. Обнаружение большинства ошибок я стараюсь переносить на фазы компиляции/линковки/стартапа. Имхо смысл иметь исключение, где по сути должен быть ассёрт не много.

В данном случае тебе придется их использовать ибо Call содержит несколько аргументов.

R>Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.

Ну-ну. В данном случае никаких предупреждений не будет ибо в С++ не редко пишут код в котором намеренно пропускают выполнение за приделы case.

R>Код на немерле не падает "у клиента"? Даже если неправильно указать индекс?

Там небудет индексов на ровном месте.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: C++0x начали урезать
От: FR  
Дата: 14.12.07 13:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Константин Л., Вы писали:


VD>>>Ну, не мучительнее чем бустовский, првада?


КЛ>>А я его не читаю. Только хэдэра. От имплементации иногда не по себе, но это случается раз в полгода.


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


Boost большой, там есть вполне сопоставимые по сложности с ядром компилятора вещи. Да и занимается во многом тем же самым эмуляцией высокоуровневых фич
Re[16]: C++0x начали урезать
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.12.07 14:14
Оценка: +1
Здравствуйте, palm mute, Вы писали:

PM>Считаем строки:

PM>
PM>$  wc -l *.ml luascanner.mll luaparsex.mly
PM>  3107 total 
PM>


PM>Теперь оцениваем версию на C. Сгенерированный парсер тоже удаляем, заголовочные файлы тоже не рассматриваем (просто, чтобы никто не возмущался , по-хорошему надо бы их оставить, т.к. все определения типов находятся там, дублирования, как в случае Окамла, нет):

PM>
PM>$ wc -l `find . -name *.c -or -name '*.stx'` # *.stx - это исходники парсера
PM>  7083 total
PM>


PM>Получаем разницу в 2 раза, что и требовалось доказать.


По-хорошему, из тех и других исходников нужно выкосить комментарии и пустые строки. В OCaml-е нужно выбросить строки, содержащие только end, а из C -- строки с единственными { и }.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[17]: C++0x начали урезать
От: Дьяченко Александр Россия  
Дата: 14.12.07 14:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>При попытке повторить это у тебя будет ужасное нагромаждение кода

WH>
WH>| Call (OpCode ("=="), [nested_cond,
WH>    Parm where (expr = TExpr.TypeConversion(TExpr.Literal(Literal.Bool(true)), _, _))], _) =>
WH>    emit_branch(nested_cond.expr, else_label)
WH>


Можно вопрос немного в сторону выделенное нельзя разве записать покороче с использованием квазицитирования?
Хотя бы
TExpr.Literal(Literal.Bool(true))
замениить на
<[ true ]>

?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.