Forth - язык нового поколения :)

 
1 2 3 4
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
В топике про ДПЛА речь бурно зашла к вопросу о языках программирования для ни. Поскольку мне доводилось программировать различное железо, в т.ч. и военное, то дайте встрять со своими 5коп. :)

Может я и фанат, но для железа при ограниченных ресурсах я не знаю ничего лучше Форта (Forth). Спор что лучше C++ или Pascal, из серии, что лучше для гонок, автобус или грузовик ;) (При наличии, скажем, кроме них внедорожников или болидов F-1). Что мы имеем в Forth'е:

- Простоту транслятора. Под любую имеющуюся изученную архитектуру транслятор пишется за считанные дни.

- Эффективность по размеру кода (я знаю ядра Форта в 512байт размером :) , а компилятор SP-Forth под Win32 весит ~500к в дистрибутиве с исходниками, и ~27к сам компилятор)

- Чрезвычайно низкий уровень потенциальных скрытых ошибок.

- Высокая скорость разработки (собственно, Forth разрабатывался как язык 4-го поколения с целью увеличить скорость разработки на порядок в сравнении с классическими ЯВУ при том же уровне ошибок, либо уменьшить число ошибок на порядок при том же времени на разработку).

- Язык высокого уровня в плане идеологии программирования и синтакисиса (пресловутого GOTO в языке нет в принципе - его даже трудно встроить туда ;) ).

- Язык низкого уровня - удобно работать с железом и с низкоуровневыми конструкциями (на уровне компилятора).

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

- Наличие высокоэффективных Forth-процессоров.

В общем, наверняка ещё что-то упустил, плюсов у него много :)Минусы, впрочем, тоже есть.

- Скорость исполнения ниже, чем у компилирующих C/C++ (Понижение быстродействия от 5..10% до двукратного, в зависимости от реализации и архитектуры (интерпретатор или компилятор, процессор...), хотя на Forth-процессорах (кстати, даже советские выпускались, а буржуины и сейчас их выпускают, но уже как Java-процессоры) скорость может быть очень высокой.

- Эффективное программирование на Forth'е требует несколько иного подхода, чем на классических ЯВУ. На нём можно писать в стиле Алгола/Си/Паскаля/Бэйсика, но эффективность и надёжность таких программ будут на их же уровне, а надёжность даже ниже за счёт не очень удобного синтаксиса.

- Отсутствие визуальных средств разработки под Win-платформу (сейчас это сильно сдерживает развитие)

- Лёгкость расширения языка (собственно, Forth - это метаязык - язык для написания проблемно-ориентированных языков) плодит множество несовместимых между собой версий, что также тормозит его развитие. Последний общий стандарт был ANSI-Forth 94.

В общем, если интересно, можно поговорить на эту тему. :)
На нём спутники летают :biggrin:
 
DE <sparrow> #19.09.2001 20:21
+
-
edit
 
да интересно, только для меня интересно с точки зрения человека, который Форт не знает. Я писал для железа но на С, с Asm вставками т.к. процы (или контроллеры, кому как угодно) всегда были медленные , а компиляторы не всегда делали из С исходника оптимальный код. Но слышал я про Форт всякую всячину, и раз уж ты знаешь сей язык, то было бы интересно. Итак. Читал что Форт это двухстэковый язык. Как это?
 

Ch

втянувшийся
Я понял. Форт устроен, как советский программируемый калькулятор МК-51 (?). Это очень удобно для программирования вычислений.
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Ch>Я понял. Форт устроен, как советский программируемый калькулятор МК-51 (?). Это очень удобно для программирования вычислений.

Форт устроен не так, но арифметические выражения у него пишутся как на наших (и не только - у буржуев тоже есть такие) калькуляторах с обратной польской записью. (МК-51 - это был простой инженерный, а программируемые - МК-52, МК-61...)
 

Ch

втянувшийся
Алгол рулез форевер! Я его знаю :) .
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Ок, значит, начнём с архитектуры (правда, я тут пивка принял, так что возможны глюки [img]biggrin.gif[/img])

Начну "с конца".
Два стека.

Определение: любой выполняемый токен Форта (оператор, функция, процедура, переменная...) называется словом. Т.е. программа состоит их слов.

1. Стек возвратов (классический стек) - при вызове слова из текущего слова адрес места исполнения кладётся в этот стек. Всё, как и в других языках.

2. Арифметический стек (или просто стек) - используется при выполнении арифметических операций и для передачи данных от слова к слову. Классический Форт использует обратную польскую (бесскобочную) запись для арифметических выражений.

Часто в конкретных реализациях добавляют ещё стеки (например, стек для чисел с плавающей точкой, стек для строк), а бывает, что всё хранят и в основном стеке.

Есть широкий спектр слов для работы с обеими стеками.

Дополнение: слова Форт-программы выполняются строго одно за другим (ветвления и циклы делаются также, но об этом, если интересно, попозже): каждое слово что-то берёт со стека данных, что-то с этими данными делает и кладёт снова эти данные на стек:

DROP - просто удалить число с вершины стека
DUP - продублировать число на вершине стека
+ - сложить число на вершине стека с числом, находящимся под ним и результат положить на вершину стека.
Т.е., например,
1 + - положить единицу на стек и добавить её к тому, что там было до этого. Т.е. фактически увеличить число на вершине стека на 1.
Или
DUP + - продублировать число и выполнить сложение - фактически тоже самое, что умножить его на два.

По поводу компактности.
Релизаций много (скажем, упомянутый мною SP-Forth - "чистый" компилятор - генерирует обычный машинный код под Win32). Но классический Форт имеет так называемый "шитый код" (чаще "прямой") - это когда программа в скомпилированном виде состоит не из машинных кодов, а из адресов слов, которые в свою очередь являются или Форт-словами, или уже чистым машинным кодом. Обычно размер записи под адрес слова равен разрядности шины адреса ЭВМ, так что для 16-битной ЭВМ вызов любого слова записывается в 16 бит (при вызове подпрограммы на ассемблере нужно уже минимум 24 бита - байт на код вызова, два байта на адрес) - уже выигрыш по компактности перед ассемблером. А если размер программ особенно критичен, то можно перейти и к байт-коду (как на Java). Есть ещё косвенный шитый код когда хранится не адрес процедуры, а адрес ячейки, где прописан адрес процедуры - он был очень эффективен на DEC-овской архитектуре, но сейчас практически не используется. Не смотря на кажущиеся большие затраты на вызов слов прямого шитого кода, на самом деле возможен даже прямой выигрыш перед ассемблером (блин, я четыре года не программил на асме, так что возможны ошибки):
mov ax,[bx]  ;предположим, что в [bp] у нас указатель
             ;на исполняемое слово
add bx,2     ;запомним адрес следующего слова
jmp [ax]     ;переход по этому адресу

По тактам это (не помню на счёт 8086 и 286, но с 386 - точно) выгоднее, чем call addr

На архитектурах, допускающих автоинкрементациию это делается вообще в одну команду:

jmp (r5)+;

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

К слову об ассемблере и эффективности Форта... Когда мне потребовался Форт-ассемблер под 32-х битный Форт (это был 1995-й год и готовых решений не было) я написал с нуля полноценный 32-х битный ASM для Форта за два дня. Кто-то может себе представить такое для другого языка? :)
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Ch>Алгол рулез форевер! Я его знаю :) .

Алгол хороший язык :)
Но старый :biggrin:
Но с этим лучше в Языческие разборки.
 
RU asoneofus #20.09.2001 15:20
+
-
edit
 

asoneofus

старожил
★☆
Форт... Форт... я даже процессор форт-а видел (где-то в столе пара штук валяется) Минчаки (Интрегаловцы :) ) в 1993-6 годах "бацали"... :)
ИМХО (и не только моё) Компактней чем в машкоде не сделаешь... Я вон, накатал 512 байт для контроллера - припух маненько :) ..
Далее идёт ассемблер, ну, это уже кайф (после машкодов :)
Потом Си... На Си с ассемблерными вставками - можно написать как угодно компактно и сколь угодно кучеряво :biggrin: ... А классы, прально прикрученные, - это уже кайф... :) Единственное - для поддержки классов ещё никто не придумал поддержки, аппаратной :) ...
А форт, он может быть и хорош, но куда его засунуть? Компилятор под него кто оптимальненький напишет? Тады йой!...
И что делать с 4Гбайтами исходных текстов-наработок?... :)
(прально, заархивировать - и грохнуть [img]biggrin.gif[/img])
Тут дело в промышленном плане (с фортом) не выгодное. Сейчас мы пишем для проца имени Билли (Гейтса) Завтра для проца имени Васи Пупыркина... А наработки тянутся от Ваньки Грозного...
Да и спец. (только маленький) приходит из института с базовыми знаниями: асм + си.. (разве что из МалойПырловки - со знанием Паскаля :) ).. - а ему уже через месячишко нужно продукцию начинать гнать, не до изучалок...
А вообще - пофигу на чём писАть, главное - это итог: получил компактный и быстрый код - ты герой, цветы и девочек в машину.. А нет - гуляй по сырым улицам один... А в этом процессе участие принимают твои навыки + компилятор, который не ты писал... Вот и думай, как взять дело в "свои руки", и чем выше уровень (паскаль форт... джава [img]biggrin.gif[/img]) - тем больше зависит от "дяди"...

Алгол фореве? неее, алгол - рулёз, а вот Кобол фореве! :biggrin:
"... аще где в книге сей грубостию моей пропись или небрежением писано, молю Вас: не зазрите моему окаянству, не кляните, но поправьте, писал бо не ангел Божий, но человек грешен и зело исполнен неведения ..."  
RU Юрий Кузьмин #20.09.2001 15:39
+
-
edit
 

Юрий Кузьмин

новичок
У Форта замечательная целочисленная математика. Мы в 1990г решали задачку для одной алмазной фабрики: как оптимальным образом вычленить из алмаза бриллиант или несколько бриллиантов. Оптимальным - в смысле, максимальной стоимости. Ситуация усложняется тем, что в алмазах есть дефекты. И цена бриллианта очень сильно зависит от положения дефекта: если у основания - ничего, а если у вершины - блеск тускнет и стоимость снижается в десятки раз.
Исходники: фотографии алмаза (автоматическая камера, кристалл на держалке, с разных сторон).
Компьютеры - 286е.

Справились, и кристалл обсчитывался около минуты.
Вывод: целочисленная математика в Форте - это класс.
 
RU asoneofus #20.09.2001 17:25
+
-
edit
 

asoneofus

старожил
★☆
Новое поколение выбирает пепси :) а не форт... :biggrin:
"... аще где в книге сей грубостию моей пропись или небрежением писано, молю Вас: не зазрите моему окаянству, не кляните, но поправьте, писал бо не ангел Божий, но человек грешен и зело исполнен неведения ..."  
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
asoneofus>ИМХО (и не только моё) Компактней чем в машкоде не сделаешь... Я вон, накатал 512 байт для контроллера - припух маненько :) ..

Невнимательно читаешь :)
Шитый код Форта для большинства реальных программ компактней машкода :)

asoneofus>Далее идёт ассемблер, ну, это уже кайф (после машкодов :)

На DEC'ах в машкодах славно было работать... Дизасм никому нафиг не нужен был, всё в восмеричном виде отлично понималось и правилось... Эх, сказка... А вот всё, что от i8080 и выше - такой отстой... :(

asoneofus>Потом Си... На Си с ассемблерными вставками - можно написать как угодно компактно и сколь угодно кучеряво

Напиши на Си или Асме компилятор же Си или Асма, с основными библиотеками (ввод/вывод, в т.ч. и файловый, арифметика, полный набор управляющих конструкций, интеграция вызовов win32-функций, многопоточность, исключения и проч. и проч.) под Win32 размером в 27кб! А вот SP-Forth 3.1x столько весит :) К сожалению, под рукой его нет, но есть 4.x - весит 61к, кроме вышеперечисленного содержит встроенный ассемблер, плавающую точку, строки, Web/CGI функции и т.д. и т.п. - всего ~800 слов).

Ну что, слабО? :)

spf4.exe 60928 байт

Можешь скачать по ссылочке и запустить по приколу с командной строки ;)

spf4.exe WINAPI: MessageBoxA user32.dll 0 S" Тест" DROP S" Привет! Это просто тест" DROP 0 MessageBoxA BYE

asoneofus> :biggrin: ... А классы, прально прикрученные, - это уже кайф... :) Единственное - для поддержки классов ещё никто не придумал поддержки, аппаратной :) ...

Под SP-Forth я делал классный ООП, гибкий как в Смолтоке (т.е. динамический, нежёсткий) и быстрый как при компиляции (всего 20..30% проигрышь по сравнению с теми же методами без ООП).

Но не приживаются ООП под Фортом. Не те это костыли :)

asoneofus>А форт, он может быть и хорош, но куда его засунуть? Компилятор под него кто оптимальненький напишет? Тады йой!...

Дык, наверное, под все платформы есть.
А под то, под что нет, при некотором опыте, пишется за неделю :)

asoneofus>И что делать с 4Гбайтами исходных текстов-наработок?... :)

Гм. Форт обычно используется в тех областях, где наработки только противопоказаны. Вспомни от чего Арианы взрывались...
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Юрий Кузьмин>У Форта замечательная целочисленная математика. Мы в 1990г решали задачку для одной алмазной фабрики:

Хех... Надо же.
Традиционно арифметика считается ахилесовой пятой Форта :)
 

Ch

втянувшийся
=KRoN=>Вспомни, от чего Арианы взрывались...

А от чего? Я не в курсе, к сожалению.
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Ch>А от чего? Я не в курсе, к сожалению.

Если коротко - то вследствии переноса отлаженного и проверенного модуля на Аде от предыдущих модификаций на новую.

Подробности - http://win.www.osp.ru/os/1998/06/21.htm
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Кстати, попалась тут интересная ссылочка у NASA - Space-Related Applications of Forth - http://forth.gsfc.nasa.gov/
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
адмирал v. Krebs>на ВИФ2 НЕ порекомендовали к вам обратится, сударь Крон :smile: Гм. НЕ порекомендовали, говоришь? :biggrin: адмирал v. Krebs>благо обратная польская запись страха не вызывала ещё со времен БЗ-34 и МК-61.

Это не самая непривычная вещь Форта :smile: Во-первых, арифметикой, обычно, мало приходится пользоваться, во-вторых, это итак привычно для многих программистов, скажем, на асме или Лиспе...

адмирал v. Krebs>но когда попытался состряпать симулятор "морского боя" :smile: на ПС 486 - запарился на первых же синусах с косинусами. :smile: Для этого лучше тот же C++ :smile: адмирал v. Krebs>Хотелось бы узнать ваше авторитетное мнение, где располагается ниша этого сверхкомпактного и гибкого языка 4-го поколения.

Основная ниша Форта - управляющие системы. Особенно те, где желательна динамическая отладка программ ("на лету") и возможность влезать в уже работающую программу.
 
RU <адмирал v. Krebs> #01.10.2001 15:14
+
-
edit
 
на ВИФ2 НЕ порекомендовали к вам обратится, сударь Крон :smile: на Форт я запал ещё лет так 10 назад, будучи в институте, книжки почитал разные, и наши и переводные. Сам попробовал мало-мало пописать, благо обратная польская запись страха не вызывала ещё со времен БЗ-34 и МК-61. Вот для коротких задач, системного программирования, обработки текстов, "железа" и прочего - Форт очень даже неплох в руках подготовленного человека, но когда попытался состряпать симулятор "морского боя" :smile: на ПС 486 - запарился на первых же синусах с косинусами. :smile: Для серьёзной математики нужны библиотки, и желательно быстрые и разнобразные - применить Ф. тяжело :frown: Хотелось бы узнать ваше авторитетное мнение, где располагается ниша этого сверхкомпактного и гибкого языка 4-го поколения.
 
ну откуда же мне знать, что у вас тут Виф2 на лету узнают и ссылку ставят ! :smile: >Это не самая непривычная вещь Форта

зато самая в глаза бросающаяся. Асм и Лисп не трогаем - первый по причине низости, второй - по редкости и далёкости от темы

адмирал v. Krebs>но когда попытался состряпать симулятор "морского боя" на ПС 486 - запарился на первых же синусах с косинусами.

Для этого лучше тот же C++

согласен, но хотелось на тривиальной игрушке попробовать новую систему и почувствовать силу расширяемости и приспосабливаемости - результат неудачный. :frown: адмирал v. Krebs>Хотелось бы узнать ваше авторитетное мнение, где располагается ниша этого сверхкомпактного и гибкого языка 4-го поколения.

Основная ниша Форта - управляющие системы. Особенно те, где желательна динамическая отладка программ ("на лету") и возможность влезать в уже работающую программу.

Гут. если не трогать военно-спутниковые применения, то где конкретно вы используете его ? Или всё же, не смотря на многочисленную рекламу создателей и фанатиков языка, он по сути своей не универсальный язык программирования, но очень-очень ориентированный на определенный круг проблем, своего рода софт автоматизированных систем управления технологическими процессами (АСУ ТП)? Лично мне приходилось встречать факты его применения в системе управления аэропортом Эр-Рияда и в системе мониторинга одной клиники в Штатах, больше - увы. Да, собственно, еще его создатель телескопом управлял посредством Форта. А распространяемые для Виндов пакеты, ну увы, не будешь на нём окошки расписывать, утомишься. Да и стоит ли ?

с уважением, ф. К.
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
адмирал v. Krebs>Гут. если не трогать военно-спутниковые применения, то где конкретно вы используете его ?

В принципе, я уже упоминал, но повторюсь:
- В интерфейсах станции спутниковой связи (тип уже не помню) - работал с ней в 1995-м.
- Загрузчик OS FreeBSD
- Intranet-server E-Serv, в т.ч. сервер ПОЧТОВЫЙ СЕРВЕР, ПРОКСИ СЕРВЕР, антивирус, антиспам и другие программы для подключения предприятия к Сети (для Windows)
- Вторая версия HTS (языка генерации страниц на Авиабазе) была фактически диалектом Форта и обрабатывалась (а точнее - исполнялась) Фортом.

адмирал v. Krebs>Или всё же, не смотря на многочисленную рекламу создателей и фанатиков языка, он по сути своей не универсальный язык программирования, но очень-очень ориентированный на определенный круг проблем

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

адмирал v. Krebs>Лично мне приходилось встречать факты его применения в системе управления аэропортом Эр-Рияда и в системе мониторинга одной клиники в Штатах, больше - увы.

http://forth.gsfc.nasa.gov/

адмирал v. Krebs>А распространяемые для Виндов пакеты, ну увы, не будешь на нём окошки расписывать, утомишься. Да и стоит ли ?

Угу. Для быстрого программирования под винды есть Дельфи и C++Builder. Для толстых проектов под них же инструментарий Форта, мягко говоря, беден.

Вот и получается, что ниша у Форта весьма узкая.
 
RU <адмирал v. Krebs> #03.10.2001 10:58
+
-
edit
 
>По своей идеологии, структуре и синтаксису это именно универсальный язык высокого уровня. Но вследствии своей непривычности он находится сильно в стороне от основного потока программирования.

>Вот и получается, что ниша у Форта весьма узкая.

вот так вот всё у нас. Всё, как в Париже, только асфальт пожиже, да дома пониже. :smile: И универсальный ЯВУ поужеориентированней ! :smile: Благодарю за информацию, приятно пообщаться с грамотным человеком.

ф. К.
 
+
-
edit
 
>>Форт обычно используется в тех областях, где ...

Кстати да. Наверное это ключевой вопрос. Какова область применеия форта? Ведь ясно, что ты не будешь писать на форте rich gui под Win. Насколько я вижу область применения форта - исключительно для embedded. Я не прав?
 
+
-
edit
 
И, кстати, пример GUI c MessageBox, просто pathetic. Это сейчас позволяет практически любой язык программирования. Другое дело любое мало-мальски сложное окно. В ручную писать все Win32 вызовы, подписывать на callbackи и процессить message pump, я думаю очень мало приятно средствами форта. Я бы кстати с удовольствием посмотрел на пример реализации окна на форте, с регистрацией WindowClass, собственное оконной процедурой и десятком, другим визуальных элементов.
 
+
-
edit
 

Balancer

администратор
★★★★★
Ну, здрасьте. Как раз реализовать callback'и и обработку событий на Форте можно всегда очень красиво и нересурсоёмко, с дефолтовыми обработчиками и т.п. Просто не писал на этом уровне под Win32 уже лет семь-восемь и всё позабыл, а разбираться снова - лень. У меня было немало такой фигни в духе (за точность синтаксиса не ручаюсь)
code forth
  1. simple classWindow new: hwnd
  2. WM_CREATE hwnd on_message:   " Arial" font new    this    set_font ;
  3. WM_CLOSE hwnd on_message:   this delete   BYE ;
  4. WM_REDRAW hwnd on_message:   " Hello!" this set_text   " Test" this set_title ;
 
+
-
edit
 
Так возвращаясь к области примения. Форт меня интересует, но мне никак ни найти повода им заняться. Потому что embedded я не занимаюсь, а как то подругому тоже повода не находится. Скажем я и так и так в уме прикидывал как пожружить форт и дот нет. Подружить то можно, но вот смысл? Будет очень медлнно, и самые классные фичи форта будут эмулироваться. Как ни как дотнет без строгой типизации никуда, поэтому все эти замечательные cell'ы и стеки могут быть реализованы только как абстракции и никакого вам lea ebp, -4 [ebp] =)
 
+
-
edit
 

Balancer

администратор
★★★★★
У Форта хорошая ниша в области вспомогательного скриптования. Язык шаблонов, активного контента и т.п. Точнее даже не сам Форт, понятно, а его идеология.

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

Ну, от балды, примеры:
code text
  1. updateregions,14
  2. offset,offset_-1,offset_-1
  3. offsetadd,0,2  
  4. time,2,20,-1,5,ls,"d MMMM",
  5. addvar,var20,1
  6. image,100,11,none.png,t


Или
code text
  1. <b>{$Name|upper}</b>
  2.  
  3.  
  4. An example of a section loop:
  5.  
  6. {section name=outer loop=$FirstName}
  7. {if %outer.index% is odd by 2}
  8.     {%outer.rownum%} . {$FirstName[outer]} {$LastName[outer]}
  9. {else}
  10.     {%outer.rownum%} * {$FirstName[outer]} {$LastName[outer]}
  11. {/if}
  12. {sectionelse}
  13.     none
  14. {/section}


Последний пример ещё весьма хорош, почти образец в своём роде. Но там возможны такие уродцы, типа:

{load_data|strftime:"%Y-$m-%d" page="page.htm" key="create_time"}

вместо чего-нить в духе
{ create_time page.htm load_data   %Y-$m-%d strftime . }

А, главное, интерпретировать такую запись енсравненно проще и быстрее.
 
1 2 3 4

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru