Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

Почему компилятор Делфи так быстро работает?   Найти похожие ветки 

 
DillerXX ©   (2006-07-15 14:28) [0]

Или точнее почему в С++ компилятор/линкер/Generation of Browse Information ТАК медленно работает? У Майкрософт был не один год, не понимаю почему не могли оптимизировать Студию до скорости хотя бы приближенной к Делфи... меня прям добивают ожидание по 10 секунд :( А в делфи F4 нажал и радуешься (дебажишь).. Вот


 
tesseract ©   (2006-07-15 14:33) [1]

Компилятор delphi - однопроходный,
С++ - многопроходный, вдобавко он не поддерживает "прекомпелированные" заголовочные файлы.


 
DrPass ©   (2006-07-15 15:33) [2]


> он не поддерживает "прекомпелированные" заголовочные файлы

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


 
Bill_Gates   (2006-07-15 15:39) [3]

А у тебя лецинзеонный Delphi ?...


 
GrayFace ©   (2006-07-15 16:47) [4]

При чем тут лецинзеонный Delphi?


 
MeF Dei Corvi ©   (2006-07-15 19:04) [5]

Такая специфика языка. Ничего тут не поделать...
> меня прям добивают ожидание по 10 секунд

Это ещё мало :) Вот когда прога компилируется 5-10 минут, то это уже вообще жесть :) Зато за это время можно чай попить, в инете посидеть...


 
BigBot   (2006-07-15 19:17) [6]

DillerXX ©   (15.07.06 14:28)

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


 
Desdechado ©   (2006-07-15 19:22) [7]

> поддерживать чистоту
оставлять пустыми?
:))


 
BigHumanoidBot ©   (2006-07-15 19:24) [8]

Desdechado ©   (15.07.06 19:22) [7]

Это как в саду камней - ничего лишнего.


 
DrPass ©   (2006-07-15 19:35) [9]


> MeF Dei Corvi ©   (15.07.06 19:04) [5]
> Это ещё мало :) Вот когда прога компилируется 5-10 минут,
>  то это уже вообще жесть :)

Когда в далеком 1997 вышел ВСВ 1.0, он именно столько и компилировал пустую форму на моей машине с 8МБ ОЗУ. Про непустую форму я уже не говорю :)


 
homm ©   (2006-07-15 19:37) [10]

> Компилятор delphi - однопроходный,
> С++ - многопроходный,

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

> поддерживает "прекомпелированные" заголовочные файлы.
Даже когда делаю ребилд проекта, и компилится можули по 70-80 тыш строк, это занимает около секунды на моем не молодом Сел563, а С простой проект компилится и линкуется около 20-30 сек. При чем большую часть времени именно линкуется. Так что вопрос наверное в том, почему сишные *.obj на столько труднее линковать, чем дельфийские *.dcu?


 
Ketmar ©   (2006-07-15 20:03) [11]

ответ в том, что dcu -- спецформат. а obj -- общий. %-)


 
BigHumanoidBot ©   (2006-07-15 20:10) [12]

Ketmar ©   (15.07.06 20:03) [11]

А каким образом общность формата отражается на продолжительности линковки?
Кстати, существует несколько разновидностей obj - coff (MS), omf (Borderland).


 
разводящий   (2006-07-15 20:19) [13]

Часто, чтобы что-то приобрести - нужно с чем-либо расстаться. Вот и на Си - за счёт скорости компиляции екзешник работает быстрее.


 
tesseract ©   (2006-07-15 20:24) [14]

> Сколько раз такое слышал, но до сих пор не могу вникнуть
> в суть. Даже если предположить что компилятор С делает 5
> (на пример) проходов, то не все они разбирают семантеку
> языка, и по идее наверное по сложности можно приравнять
> к 3-м дельфийским.


Гм а gcc - дело имел ? Сколько он проходов делает неясно, но компилирует оч долго.

Просто есть ещё и оптимизация, Pascal проще для оптимизации нежили С.
Также зависит и от количества методик оптимизации.
надоел MSVC переходи на intel :-)  Он для некоммерческого использования бесплатный, а код самый шустрый. Хотя MS Visual Toolkit и для коммерческого бесплатен.


> Даже когда делаю ребилд проекта, и компилится можули по
> 70-80 тыш строк, это занимает около секунды на моем не молодом
> Сел563,


Поудаляй dcu и потом rebuild - больше времени займёт.


 
Ketmar ©   (2006-07-15 20:27) [15]

для smart linking, например. %-)
а вообще-то причины несколько другие. ну примите это как факт. хотя, например, никто не мешает сделать быстрый си-компилятор (см. тот же tcc, например). тут "закавыка" из другого места растёт (нет, не из кривых рук программистов %-).


 
homm ©   (2006-07-15 20:34) [16]

> Поудаляй dcu и потом rebuild - больше времени займёт.

С какой стати? Столько же и займет.


 
Reindeer Moss Eater ©   (2006-07-16 12:13) [17]

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


 
Ketmar ©   (2006-07-16 12:58) [18]

ай. причина в том, что написано так. одно -- быстро, другое -- медленно. вот и всё. %-)


 
DillerXX ©   (2006-07-18 14:57) [19]


> Часто, чтобы что-то приобрести - нужно с чем-либо расстаться.
>  Вот и на Си - за счёт скорости компиляции екзешник работает
> быстрее.

Разве так? По-моему в скорости почти нет различий.

А на счёт многопроходности... никак не понимаю, где здесь можно сделать несколько проходов? Если уж в Делфи 1.. максимум 2 прохода - один собирает все объявленные переменные, второй интерпретирует вызовы функций...


 
DevilDevil ©   (2006-07-18 15:21) [20]

Мне вообще не понятно, почему до сих пор и в С++ и в Delphi не сделают 2 режима компиляции:
1) БЫСТРАЯ КОМПИЛЯЦИЯ (один проход, почти без оптимизации) [по-умолчанию]
2) МЕДЛЕННАЯ КОМПИЛЯЦИЯ (Оооочень медленно, офигенная оптимизация) [перед выпуском программы "в свет"]

НУУУУ ПОООЧЧЕЕЕМУУУУУУУУУУУ ?????????????


 
Reindeer Moss Eater ©   (2006-07-18 15:43) [21]

Двупроходность с оптимизацией никаким боком не связана.
Это же просто следствие наличия препроцессора.


 
MeF Dei Corvi ©   (2006-07-18 16:07) [22]


>  просто следствие наличия препроцессора.

и специфической семантики языка C++ :)


 
DillerXX ©   (2006-07-18 16:13) [23]


> и специфической семантики языка C++ :)

Можно об этом поподробнее?


 
Ketmar ©   (2006-07-18 20:29) [24]

"holy, holy war! we are fighting..." (ц)


 
Eraser ©   (2006-07-19 02:43) [25]

> [20] DevilDevil ©   (18.07.06 15:21)

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


 
Slym ©   (2006-07-19 05:11) [26]

DevilDevil ©   (18.07.06 15:21) [20]
1) БЫСТРАЯ КОМПИЛЯЦИЯ (один проход, почти без оптимизации) [по-умолчанию]
2) МЕДЛЕННАЯ КОМПИЛЯЦИЯ (Оооочень медленно, офигенная оптимизация) [перед выпуском программы "в свет"]


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


 
DillerXX ©   (2006-07-19 09:38) [27]

Вы лучше про специфическую семантику языка расскажите, которая требует 5 проходов


 
icWasya ©   (2006-07-19 11:05) [28]

про специфику http://www.pcmag.ru/archive/9705s/05s979.asp


 
аноним 3000   (2006-07-19 11:45) [29]

Cтудия (VC71), кстати, не так уж долго компилит даже относительно большие проекты. Yj не 10 минут. А если не весь проект, а только 1 или 2 С++ файла, то почти мгновеннно. Естественно, опция precompiled headers включена и всюду используется.
а 2005-ая еще быстрее. уже почти сравнимо с делфи.

и все-таки Делфи собирает проекты быстрее..
почему? С++ - "многопроходный компилятор"? что это значит? я это только на этом форуме слышал..

первый проход препроцессором? дык, препроцессинг и в делфи есть..
да и не может он много времени занимать..

мне кажется есть 2 основные причины:
1. это из-за заголовочных файлов. т.е компилятор должен обработать не только содержимое срр-файла, но и всех заголовочных файлов, что туда включены. Т.е. растет объем работы. Частично решается precompiled headers. но только частично
2. С++ как язык значительно сложнее чем паскаль. Например, нужно отследить и расставить неявные вызовы деструкторов для объектов на стеке..  Кроме того, там есть такие штуки как шаблоны. И еще, нам так нравится использовать STL и Boost.
Некоторы фичи С++ (например, раздельная компиляция шаблонов) настолько сложны, что не поддерживаются большинством компиляторов.


 
Verg ©   (2006-07-19 11:47) [30]


>  дык, препроцессинг и в делфи есть..


Интересно было бы послушать про препроцессор в Delphi...


 
Alien1769 ©   (2006-07-19 11:51) [31]

У ув. аноним 3000   своеобразный Дельфи ! :)


 
Nic ©   (2006-07-19 11:53) [32]


> а 2005-ая еще быстрее. уже почти сравнимо с делфи.

Правда? D7 на Celeron 600 моментально компилирует весьма солидные проекты. Буквально 1-2-3 секунды, даже кофе не успеешь заварить :) VC7.1 компилирует даже небольшой проект ощутимо.


 
Nic ©   (2006-07-19 11:55) [33]


> Nic ©   (19.07.06 11:53) [32]

Да что уж там заварить, налить не успеешь, уже всё работает. Я уже умалчиваю про размешать.


 
StriderMan ©   (2006-07-19 12:12) [34]

на Делфи успеваю налить себе кофе только когда полностю компилю группу из 7 проектов общим объемом около 500К строк кода.


 
DillerXX ©   (2006-07-19 12:30) [35]

Делфи рулит :о)


 
Romkin ©   (2006-07-19 13:08) [36]

Ну что вы недоумеваете? Сравните хотя бы объем описаний языков, и все станет понятно. Ведь компилятор делает все, что написано в стандарте.


 
Romkin ©   (2006-07-19 13:15) [37]

А если вы уже прочитали описание С++, объясните же мне, что ЭТО за объявление?!
char (*(*x2 ())[]) ()
И сколько правил применяет компилятор при трансляции его вызовов?


 
Nic ©   (2006-07-19 13:19) [38]


> char (*(*x2 ())[]) ()

Ужас. Какие-то палочки/закорючки; машинные коды и то понятнее. Китайские иероглифы отдыхают :)


 
Nic ©   (2006-07-19 13:20) [39]


> char (*(*x2 ())[]) ()

А ещё, напоминает набор смайлов :)


 
Romkin ©   (2006-07-19 13:21) [40]

Nic ©   (19.07.06 13:19) [38] По некоторым данным, это функция, принимающая на вход массив функций и возвращающая char. Но не уверен :)


 
Verg ©   (2006-07-19 13:45) [41]

char (*(*x2 ())[]) ()

Это функция не принимающая параметров, возвращающая массив функций, каждая из которых не принимает параметров, а возвращает char.
Угадал ?:))


 
Romkin ©   (2006-07-19 13:49) [42]

Verg ©   (19.07.06 13:45) [41] Э. Тогда уж массив фукнций :)))


 
Verg ©   (2006-07-19 14:02) [43]


> Romkin ©   (19.07.06 13:49) [42]


Нет, именно ф-ция (одна).
Только там обманчик есть. Так как массив в сях функциям возвращать запрещено, то формально она возвращает указатель на массив. Что суть есть одно и то же. Можно было бы [] убрать и не морочить голову.


 
DevilDevil ©   (2006-07-19 14:10) [44]

Если выбирать при одинаковой [допустим] скорости C++ или Pascal, что вы выбирете? Несмотря на кучу недостатков С++, некоторых достоинств Паскаля, я бы выбрал С++. Ну есть там удобные фичи. Иными словами, мы [ну я и некоторые другие] выбираем Delphi больше из-за скорости компиляции. Так я к чему... Давайте подождём ещё пару десятков лет, когда скорость компьютеров будет стремиться к бесконечности, когда разница компиляции будет незаметна :). Всё равно не использовать мощный язык только из-за скорости компиляции - не есть прогресс!

P.S. Но я за объединение языков. Терпеть не могу #include политику, лучше uses. Отсутствие with раздражает. BuildWithRunTime... - УРОДСТВО


 
Nic ©   (2006-07-19 14:26) [45]

Просто области применения Delphi и MSVC++ разная, хотя кое-где и пересекаются.


 
Bless ©   (2006-07-19 15:02) [46]

мой вариант:

x2 - функция, возвращаются указатель на указатель на массив указателей на функции, возвращающие char

или иначе

x2 - функция, возвращаются массив указателей на массив указателей на функции, возвращающие char

или еще чуток расплывшись мыслею по древу

x2 - функция, возвращаются двумерный массив указателей на функции, возвращающие char

Я C++ почти не знаю, пусть сишники поправят :)


 
Verg ©   (2006-07-19 15:33) [47]


> Bless ©   (19.07.06 15:02) [46]


Было бы

char (*(*x2 ())[например,10]) ()

, мог бы быть двумерный


 
Romkin ©   (2006-07-19 15:47) [48]

Уточнил. Это действительно объявление функции x2 без параметров, которая возвращает указатель на массив указателей на функции без параметров, каждая из которых возвращает char :)))
ЫЫЫ!


 
Bless ©   (2006-07-19 16:22) [49]


> Verg ©   (19.07.06 15:33) [47]
>
> Было бы
> char (*(*x2 ())[например,10]) ()
> , мог бы быть двумерный


Дык,указатель на массив тоже можно рассматривать как двумерный массив (при желании), что я и сделал.
Так что последняя трактовка из [46] - правильная, что подтверждается в [48].

Хотя справедливости ради надо отметить, что эта правильная третья трактовка получилась из неправильной второй (я ошибся, расшифровывая эту мантру, в результате чего получилась неправильная первая трактовка, а потом еще раз ошибся, преобразовывая вторую трактовку в третью, что привело к правильному результату) :)


 
Verg ©   (2006-07-19 16:38) [50]


> Дык,указатель на массив тоже можно рассматривать как двумерный
> массив (при желании),


Тебе можно. Да хоть как 100-мерный.
Но, компилятору для этого одного желания мало. Чтобы он смог рассматирвать тот массив как двумерный, ему нужно ту [циферку] все же сообщить :)


 
pasha_golub ©   (2006-07-19 16:57) [51]


> icWasya ©   (19.07.06 11:05) [28]
>
> про специфику http://www.pcmag.ru/archive/9705s/05s979.asp

ОГРОМНОЕ СПАСИБО ЗА СТАТЬЮ! Я оттуда почерпнул идею. И ведь, на самом-то деле, идея проста до безобразия. :0)


 
аноним 3000   (2006-07-19 17:05) [52]


> Интересно было бы послушать про препроцессор в Delphi...

Стоп! компилятору на вход поступает строка в том виде в котором вы ее написали?
со всеми отступами, избыточными пробелами, комментариями,  макросами условной компиляции?

Если это так, то да, в делфи нет препроцессора..


> Правда? D7 на Celeron 600 моментально компилирует весьма
> солидные проекты. Буквально 1-2-3 секунды, даже кофе не
> успеешь заварить :) VC7.1 компилирует даже небольшой проект
> ощутимо.


честно говоря, я за комп с процессором с частотой меньшей чем 2ГГц давно не садился 8-)
но не спорю, делфи работает быстрей..
но тем не менее в 2005-ой мелкомягким удалось значительно ускорить компиляцию..

по поводу
> char (*(*x2 ())[]) ()
имхо, ерунду написали.. это может быть только массивом указателей на функции, но это не так..

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

а если хотите тяжелого кода на С++, посмотрите исходники Loki или Boost.
я думаю, удивления будет гораздо больше:)


 
Bless ©   (2006-07-19 17:39) [53]


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

Гм...
MinGW скушал следующее определение
char (*(*x2 ())[]) (){};

Так что это все-таки функция.


 
Rouse_ ©   (2006-07-19 18:07) [54]

Ну #define еще никто не отменял - так что так прямо сказать функция это или нет без полного листинга нельзя :)


 
Romkin ©   (2006-07-19 18:17) [55]

Rouse_ ©   (19.07.06 18:07) [54] Да он издевается над нами! (с)


 
Verg ©   (2006-07-19 18:24) [56]


> аноним 3000   (19.07.06 17:05) [52]


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


а как?

"Истина где-то рядом"? (С) :))))


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


Попробуй.
Думаешь Н.Вирт от нече делать Pascal разрабатывал?


> а если хотите тяжелого кода на С++, посмотрите исходники
> Loki или Boost.
> я думаю, удивления будет гораздо больше:)


УЖЕ страшшно удивительно :))


 
Verg ©   (2006-07-19 18:32) [57]


> Гм...
> MinGW скушал следующее определение
> char (*(*x2 ())[]) (){};


А где же варнинг? Типа "функция обязана возвращать результат".


 
Lamer@fools.ua ©   (2006-07-19 18:46) [58]

>Типа "функция обязана возвращать результат".

Командир роты — обязян ©
:o)


 
spotter   (2006-07-19 18:51) [59]

Должно быть так:

typedef char (*(*x2 ())[]) ();


 
MeF Dei Corvi ©   (2006-07-19 19:03) [60]


> Попробуй.

Дурь написать можно везде ;)
Например:

if (a(.i] > Byte(^a)) or (a[i.) < a[i + 1]) then
(
 if (str1 = #10#13) and (str1 > str2) then
   str1 := ^(^П^Р^Е^В^Е^Д#32"МИР"^!^)
);

:)


 
MeF Dei Corvi ©   (2006-07-19 19:06) [61]

Кстати, компилятор C# работает довольно быстро ;)


 
cyborg ©   (2006-07-19 19:12) [62]

> [60] MeF Dei Corvi ©   (19.07.06 19:03)

Это не скомпилируется, даже если убрать опечатки.


 
MeF Dei Corvi ©   (2006-07-19 19:14) [63]


> Это не скомпилируется, даже если убрать опечатки.

На D7 вот это:
program Project1;

var a: Array[1..100] of Integer;
   str1: String;
   str2: String;
   i: Byte;

begin
 if (a(.i] > Byte(^a)) or (a[i.) < a[i + 1]) then
(
if (str1 = #10#13) and (str1 > str2) then
  str1 := ^(^П^Р^Е^В^Е^Д#32"МИР"^!^)
);
end.

успешно компилиться и даже выполняется ;)


 
Verg ©   (2006-07-19 19:17) [64]


> MeF Dei Corvi ©   (19.07.06 19:06) [61]
> Кстати, компилятор C# работает довольно быстро ;)


Компилятор PHP еще быстрее.


 
cyborg ©   (2006-07-19 19:18) [65]

Ничего себе, на шестёрке тоже компилируется :)


 
cyborg ©   (2006-07-19 19:21) [66]

Что зы бред, почему оно компилируется?


 
Verg ©   (2006-07-19 19:23) [67]


> MeF Dei Corvi ©   (19.07.06 19:14) [63]


Знатный прикол.


 
cyborg ©   (2006-07-19 19:25) [68]

Я догадался, что (. равноценна [, но вот это str1 := ^(^П^Р^Е^В^Е^Д#32"МИР"^!^) первый раз вижу.


 
аноним 3000   (2006-07-19 19:44) [69]

пардон, ща проверил в студии

> char (*(*x2 ())[]) ()

это кушается...
скорее всего это определение указателя на функцию без параметров, которая возвращает указатель (=массив) на указатель на функцию типа char (*f) ();

я пытался разбить на typedefы
совершенно точно это эквивалентно

typedef char (*F1)();
F1 (*х2())[];


вот


 
Piter ©   (2006-07-19 19:45) [70]

Verg ©   (19.07.06 19:17) [64]
Компилятор PHP еще быстрее


а разве PHP - это компилятор? :)


 
Verg ©   (2006-07-19 19:51) [71]


> аноним 3000   (19.07.06 19:44) [69]


Для начала очень неплохо.


 
homm ©   (2006-07-19 21:50) [72]

> ОГРОМНОЕ СПАСИБО ЗА СТАТЬЮ! Я оттуда почерпнул идею. И ведь,
> на самом-то деле, идея проста до безобразия. :0)

Хмм.. Еще один интузиаст взялся за написание компилятора? :)


 
Verg ©   (2006-07-19 21:56) [73]


> homm ©   (19.07.06 21:50) [72]


Слава Богу, этого никогда не переведется... наверно, ХОТЕЛОЬСБЫ ;)


 
Bless ©   (2006-07-20 09:29) [74]


> Verg ©   (19.07.06 18:32) [57]
> > Гм...
> > MinGW скушал следующее определение
> > char (*(*x2 ())[]) (){};
> А где же варнинг? Типа "функция обязана возвращать результат".


Я не в курсе дела, чукча пока только читатель c++, а не писатель:)
Варнинга не было. Но где-то в нете мне на глаза попадалось что-то по этом поводу. Кажись в какой-то статье со стонами по поводу низкого качества исходников, пришедших из Linux. Вроде как по умолчанию в gcc выключен вывод всех предупреждений. В смысле, выводятся не все, а только некоторые. Чтоб это отключить надо явно указать какой-то параметр компилятору в командной строке.
Может, поэтому?


 
Verg ©   (2006-07-20 09:34) [75]

-Wall


 
Bless ©   (2006-07-20 09:55) [76]


> Verg ©   (20.07.06 09:34) [75]
> -Wall
>


main.cpp:2: warning: control reaches end of non-void function


 
Verg ©   (2006-07-20 10:00) [77]


> Bless ©   (20.07.06 09:55) [76]
>
> > Verg ©   (20.07.06 09:34) [75]
> > -Wall
> >
>
>
> main.cpp:2: warning: control reaches end of non-void function


Да, это так gcc ругается.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.039 c
3-1149400043
VitGun
2006-06-04 09:47
2006.08.13
Выборка по неполному значению


6-1143726445
Trankvilizator
2006-03-30 17:47
2006.08.13
HTTP-код->Memo


15-1152965102
Андрей Пазик
2006-07-15 16:05
2006.08.13
Вот ТАК! нужно бороться с коррупцией


15-1152805009
Vlad
2006-07-13 19:36
2006.08.13
Модераторы


15-1153320537
k2
2006-07-19 18:48
2006.08.13
Такие люди работу ищут :) эх не ценят у нас молодежь :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский