Автор | Сообщение | ||
gammaker бывалый Группа: Участники Сообщений: 49 |
Добавлено: 04-06-2011 11:08 | ||
Прочитав выпуски fps, я заинтересовался языком D. Я бы на него, не раздумывая, перешёл, если бы не недостатки, которые я обнаружил: отсутствие нормальной IDE для него (хотя вроде бы делают плагин для Visual Studio, и он пока не заброшен) и глюк с русским языком. Когда я пишу, например, MessageBoxA(null, "Что-нибудь по-русски", "", MB_OK);, то получаю какие-то непонятные символы, которых в 2 раза больше, чем должно быть русских букв. Похоже, что в MessageBoxA передаётся Юникод-строка, а он делит каждый символ на 2. Это что, баг компилятора? Я думал попробовать другой компилятор (у меня DMD), но не нашёл. Где его можно скачать? Только не исходный код, а готовый скомпилированный компилятор (для Windows). Ещё есть одна проблема, но менее важная: пустая программа, которая ничего не делает, но подключает std.stdio занимает около 500 КБ. По идее, компоновщик должен удалять всё, что не используется. Пробовал взять компоновщик от Visual Studio, но он не находит какие-то файлы. Ведь, для разных языков можно использовать один и тот же компоновщик. Кстати, почему на форуме и новостях сайта нет ничего про выпуски журнала 12, 13, 14? Я думал, что он уже заброшен и не выходит, и только потом, когда появилось сообщение о взломе, решил зайти на него и посмотреть. |
|||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 04-06-2011 15:40 | ||
По первой проблеме: возможно, у тебя исходник программы не в Юникоде. Или MessageBox не поддерживает Юникод - я точно не знаю, WinAPI не использую (кстати, это, скорее всего, и есть причина, если символов вдвое больше - строка передается в UTF-16 (два байта на символ), а выводится на экран по одному символу на байт). Вообще вопрос кириллицы действительно актуален: D работает только с Юникодом, а сторонние библиотеки используют каждая что хочет. Как вариант могу порекомендовать GtkD, там проблем с русским языком нет. Но я с ним работал только под линуксом, как он себя поведет в Windows - для меня загадка. |
|||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 04-06-2011 15:50 | ||
По второй проблеме: к любой программе, даже пустой, автоматически прилинковывается рантайм-библиотека D (сборщик мусора, функции Phobos и т.д.). Она весит немало, но это расплата за крутые встроенные возможности D, которых нет в C++ (кстати, если к программе на C++ прикрутить все, что есть в D, размер тоже будет не маленький). Размер исполняемых файлов можно уменьшить, во-первых, утилитой strip (входит в состав MinGW, удаляет из программы отладочную информацию), во-вторых компрессорами типа UPX (я проверял, сжимает до 30% от оригинала). |
|||
gammaker бывалый Группа: Участники Сообщений: 49 |
Добавлено: 04-06-2011 16:43 | ||
В том то и дело, что файл в кодировке UTF-8. В C++ было 2 варианта MessageBox: MessageBoxA и MessageBoxW. Первая принимает обычную строку (1 байт на символ), а вторая - юникод. В D есть только MessageBoxA. Я читал, что компилятор проводит преобразование строки в тот тип, который принимает функция. D работает не только с Юникодом. Там есть целых три типа символов - сhar, wсhar и dсhar. Я ещё пробовал передавать в фунцию char*, но та же проблема. printf и write(f)(ln) тоже не выводят текст по-русски. Хотя printf и на C++ русский текст неправильно выводил, но там не было увеличения числа символов в 2 раза. Пустая программа занимает 120 КБ, а та, в которой есть import std.stdio разрастается до 500 КБ. В C++ было по-другому: можно было подключить хоть 100 разных файлов, но если их не использовать, то размер программы не изменялся. Я думаю, это делал компоновщик. В D стандартный компоновщик устарел и, наверное, в нём не было удаления неиспользованного кода. Я пробовал сжимать UPX'ом, но происходила ошибка. Пробовал сжать PECompact'ом, он сжал до 109 КБ, но, непонятно почему, программа стала по-другому работать: функция writeln, выводящая на экран сразу целый массив стала писать не [23, 45, 67, 214], а просто 234567214. Вопросы: 1.Как прикрутить к D другой компоновщик? 2.Где найти скомпилированный под windows компилятор LDC иили GDC? |
|||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 04-06-2011 17:12 | ||
Так можно же самому объявить MessageBoxW: extern(Windows) int MessageBoxW(HWND, in wchar*, in wchar*, int); И пожалуйста: MessageBoxW(null, "Русский текст", "", MB_OK); Только что сам проверил, работает:
Под Linux DMD использует гну-линкер (ld). Так что, думаю, теоретически это возможно (только, наверное, придется пересобрать компилятор). Но раз под Windows используется их собственный DigitalMars'овский компоновщик, наверное, на то были какие-то веские причины.
Если честно, не искал и никогда не интересовался. Меня пока DMD устраивает. Скорее всего, официальных бинарных релизов у них нет пока (для Linux есть вроде какие-то самопальные deb-пакеты, но кривые и устаревшие). |
|||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 04-06-2011 17:30 | ||
По умолчанию это все Юникод. Согласно официальной документации D2, char = UTF-8, wchar = UTF-16, dchar = UTF-32. Правда, в фобосе есть std.encoding, там поддерживаются все основные кодировки. |
|||
gammaker бывалый Группа: Участники Сообщений: 49 |
Добавлено: 04-06-2011 17:35 | ||
Скачал новый UPX, там всё работает. Сжимает 480 до 120 КБ. Кстати, почему слово сhar здесь пишется через пробел? | |||
gammaker бывалый Группа: Участники Сообщений: 49 |
Добавлено: 04-06-2011 17:56 | ||
Я и не подумал, что его можно объявить. Проверил - всё работает! Если язык поддерживает только Юникод, то почему тогда все функции объявлены с A, а не W на конце? К другому компилятору наверняка будет прикручен другой компоновщик. |