LINUX.ORG.RU

А всё-же D рулит...


0

0

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

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

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

Всё оказалось проще, чем я думал (код в следующем посте).

★★

/*
 * $Id: hello.d,v 1.0 2007/08/07 00:35:12 eveel Exp $
 */

// import the gtkD
import gtkc.gtktypes;
import gtk.MainWindow;
import gtk.Button;
import gtk.MessageDialog;
import gtk.GtkD;

// import standard library (phobos, becuase of tango _sucks_)
import std.stdio;
import std.socket;

/**
 * SocketTestWindow, ancestor of gtkd.MainWindow.
 * Implements the Dialog, that performs the std.socket test.
 */
class SocketTestWindow: MainWindow
{
    this()
    {
        super("GtkD");
        setBorderWidth(20);
        add(new Button("Test the Socket", &testTheSocketButtonClick));
        showAll();
    }
    
    void testTheSocketButtonClick(Button button)
	{
        // create the Internet TCP Socket
        // this socket should connect to localhost:3310
        TcpSocket sock = new TcpSocket(AddressFamily.INET);
        try
        {
            sock.connect(new InternetAddress("localhost", 3310));
            sock.send("test\n");
            sock.close();
        }
        // if some error occured
        catch (SocketException ex)
        {
            // show error message
            MessageDialog errorMessage = new MessageDialog(
                this,
                GtkDialogFlags.MODAL,
                MessageType.ERROR,
                ButtonsType.OK,
                ex.toString()
                );
            errorMessage.run();
            errorMessage.destroy();
        }
	}
}

/**
 * main() function that initializes GTK, and creates our Socket Test Window.
 */
void main(char[][] args)
{
    Gtk.init(args);
    new SocketTestWindow();
    Gtk.main();
}

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

> на каком языке тебе её переписать строка в строку? :)

на brainfuck :)

а вообще, чото мне понравился этот D. вот такой "крик души"

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

кстати, задумал тут я дополнительную подсистему интеграции D и C-библиотек (header'ов). Пока что работающую по такому принципу:
1. Извлечение имен хедеров из D-файлов. Т.е., строка

import c.X11.Xlib;

будет преобразована в <X11/Xlib.h> (автоматически добавляется расширение .h). Если нужно импортировать нестандартный header, то рядом с директивой импорта размещается особого вида комментария, например:

import c.mypicture /+#from "mypicture.xpm"+/;

будет преобразована в "mypicture.xpm".
2. Запускать конвертор из C в D (bcd, или h2d или еще какой, см. dsource.org) для этих файлов во временной директории. (т.е., для
"<X11/Xlib.h> as c.X11.Xlib" будет создана директория с, в ней X11 и файл Xlib.d".

Пока не определился, как лучше: сканировать d-файлы на этапе конфигурирования и добавлять команды конвертации h в d в Makefile'ы, или использовать специальную программу - оболочку, которая будет вызывать другие программы (как gcc вызывает cpp, cc1 etc).

Кто заинтересуется, пишите - rodin dot alexander at gmail dot com.

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

давай прямо тут

на http://dsource.org/projects/ есть проекты, которые как-раз связаны с переносом кода заголовков с C на D.

h2d - .h to .d conversion tool
BCD - A collection of, and generator for, bindings to C/C++ in D.

Также глянь http://svn.dsource.org/projects/dui/trunk/wrap/ , там парни занимаются привязкой GTK-шных библиотек.

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

вообще, мне твоя затея кажется немного странной - не проще ли просто взять и один раз написать оболочку к какой-нибудь библиотеке (той же libX11), чем при каждой компиляции делать анализ кода?

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

а анализ кода, мне кажется, не будет очень долгим (сколько компилируется один c++-файл, например, из KDE - около секунды (в основном потому что происходит анализ всех вложенных хедеров)), к тому же если один раз хедер сконвертирован, то его в течение этой компиляции не обязательно перегенерировать опять (т.е., сравнивать дату последней модификации хедера и сгенерированного модуля, и только в случае необходимости перегенерировать)

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

> просто, что мне нравится в c++ - это то, что не надо никаких оболочек

зато в остальном он... мдя :) дело в том, что при создании c++ Страуструп и хотел совместимости C-кода с кодом на плюсах. она есть

а D можно назвать принципиально новым языком, и авторы не планировали полной совместимости с кодом на C, хотя большое спасибо им за extern (C) :)

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

кстати, кто-нибудь завел h2d на gcc4 (gentoo)? у меня выдает ошибку:

g++ -o h2d h2d.cc h2d_struct.h: In constructor ‘h2d::StructGrammar::definition<T>::definition(co nst h2d::StructGrammar&)’: h2d_struct.h:69: error: ‘space_p’ was not declared in this scope h2d_struct.h:71: error: ‘alnum_p’ was not declared in this scope h2d_struct.h:72: error: there are no arguments to ‘str_p’ that depend on a tem plate parameter, so a declaration of ‘str_p’ must be available h2d_struct.h:72: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated) h2d_struct.h:72: error: there are no arguments to ‘str_p’ that depend on a tem plate parameter, so a declaration of ‘str_p’ must be available h2d_struct.h:73: error: there are no arguments to ‘ch_p’ that depend on a temp late parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:77: error: ‘print_p’ was not declared in this scope h2d_struct.h:77: error: there are no arguments to ‘chset_p’ that depend on a t emplate parameter, so a declaration of ‘chset_p’ must be available h2d_struct.h:78: error: there are no arguments to ‘chset_p’ that depend on a t emplate parameter, so a declaration of ‘chset_p’ must be available h2d_struct.h:80: error: there are no arguments to ‘ch_p’ that depend on a temp late parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:86: error: there are no arguments to ‘ch_p’ that depend on a temp late parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:97: error: ‘anychar_p’ was not declared in this scope h2d_struct.h:97: error: there are no arguments to ‘ch_p’ that depend on a temp late parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:97: error: there are no arguments to ‘ch_p’ that depend on a temp late parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:104: error: there are no arguments to ‘chset_p’ that depend on a template parameter, so a declaration of ‘chset_p’ must be available h2d_struct.h:115: error: there are no arguments to ‘str_p’ that depend on a te mplate parameter, so a declaration of ‘str_p’ must be available h2d_struct.h:122: error: there are no arguments to ‘ch_p’ that depend on a tem plate parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:123: error: there are no arguments to ‘ch_p’ that depend on a tem plate parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:128: error: there are no arguments to ‘str_p’ that depend on a te mplate parameter, so a declaration of ‘str_p’ must be available h2d_struct.h:129: error: there are no arguments to ‘str_p’ that depend on a te mplate parameter, so a declaration of ‘str_p’ must be available h2d_struct.h:134: error: there are no arguments to ‘ch_p’ that depend on a tem plate parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:135: error: there are no arguments to ‘ch_p’ that depend on a tem plate parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:144: error: there are no arguments to ‘ch_p’ that depend on a tem plate parameter, so a declaration of ‘ch_p’ must be available h2d_struct.h:151: error: there are no arguments to ‘chset_p’ that depend on a template parameter, so a declaration of ‘chset_p’ must be available h2d_struct.h: In static member function ‘static void h2d::StructGrammar::defin ition<T>::emitNested(const boost::spirit::rule<T, boost::spirit::closure_conte xt<h2d::StructClosure>, boost::spirit::nil_t>&, typename T::iterator_t, typena me T::iterator_t)’: h2d_struct.h:265: error: invalid use of undefined type ‘struct std::ostringstr eam’ /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/include/g++-v4/iosfwd:80: error: declarat ion of ‘struct std::ostringstream’ h2d_d.h: In constructor ‘h2d::DTypesGrammar::definition<T>::definition(const h 2d::DTypesGrammar&)’: h2d_d.h:39: error: there are no arguments to ‘str_p’ that depend on a template parameter, so a declaration of ‘str_p’ must be available h2d_d.h:40: error: there are no arguments to ‘str_p’ that depend on a template parameter, so a declaration of ‘str_p’ must be available h2d_d.h:41: error: there are no arguments to ‘str_p’ that depend on a template parameter, so a declaration of ‘str_p’ must be available h2d_d.h:42: error: there are no arguments to ‘str_p’ that depend on a template parameter, so a declaration of ‘str_p’ must be available h2d_d.h:43: error: there are no arguments to ‘str_p’ that depend on a template parameter, so a declaration of ‘str_p’ must be available

...

make: *** [h2d] Error 1

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

извиняюсь...
кстати, кто-нибудь завел h2d на gcc4 (gentoo)?
у меня выдает ошибку:

g++ -o h2d  h2d.cc
h2d_struct.h: In constructor ‘h2d::StructGrammar::definition<T>::definition(co
nst h2d::StructGrammar&)’:
h2d_struct.h:69: error: ‘space_p’ was not declared in this scope
h2d_struct.h:71: error: ‘alnum_p’ was not declared in this scope
h2d_struct.h:72: error: there are no arguments to ‘str_p’ that depend on a tem
plate parameter, so a declaration of ‘str_p’ must be available
h2d_struct.h:72: error: (if you use ‘-fpermissive’, G++ will accept your code,
 but allowing the use of an undeclared name is deprecated)
h2d_struct.h:72: error: there are no arguments to ‘str_p’ that depend on a tem
plate parameter, so a declaration of ‘str_p’ must be available
h2d_struct.h:73: error: there are no arguments to ‘ch_p’ that depend on a temp
late parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:77: error: ‘print_p’ was not declared in this scope
h2d_struct.h:77: error: there are no arguments to ‘chset_p’ that depend on a t
emplate parameter, so a declaration of ‘chset_p’ must be available
h2d_struct.h:78: error: there are no arguments to ‘chset_p’ that depend on a t
emplate parameter, so a declaration of ‘chset_p’ must be available
h2d_struct.h:80: error: there are no arguments to ‘ch_p’ that depend on a temp
late parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:86: error: there are no arguments to ‘ch_p’ that depend on a temp
late parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:97: error: ‘anychar_p’ was not declared in this scope
h2d_struct.h:97: error: there are no arguments to ‘ch_p’ that depend on a temp
late parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:97: error: there are no arguments to ‘ch_p’ that depend on a temp
late parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:104: error: there are no arguments to ‘chset_p’ that depend on a
template parameter, so a declaration of ‘chset_p’ must be available
h2d_struct.h:115: error: there are no arguments to ‘str_p’ that depend on a te
mplate parameter, so a declaration of ‘str_p’ must be available
h2d_struct.h:122: error: there are no arguments to ‘ch_p’ that depend on a tem
plate parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:123: error: there are no arguments to ‘ch_p’ that depend on a tem
plate parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:128: error: there are no arguments to ‘str_p’ that depend on a te
mplate parameter, so a declaration of ‘str_p’ must be available
h2d_struct.h:129: error: there are no arguments to ‘str_p’ that depend on a te
mplate parameter, so a declaration of ‘str_p’ must be available
h2d_struct.h:134: error: there are no arguments to ‘ch_p’ that depend on a tem
plate parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:135: error: there are no arguments to ‘ch_p’ that depend on a tem
plate parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:144: error: there are no arguments to ‘ch_p’ that depend on a tem
plate parameter, so a declaration of ‘ch_p’ must be available
h2d_struct.h:151: error: there are no arguments to ‘chset_p’ that depend on a
template parameter, so a declaration of ‘chset_p’ must be available
h2d_struct.h: In static member function ‘static void h2d::StructGrammar::defin
ition<T>::emitNested(const boost::spirit::rule<T, boost::spirit::closure_conte
xt<h2d::StructClosure>, boost::spirit::nil_t>&, typename T::iterator_t, typena
me T::iterator_t)’:
h2d_struct.h:265: error: invalid use of undefined type ‘struct std::ostringstr
eam’
/usr/lib/gcc/i486-pc-linux-gnu/4.1.2/include/g++-v4/iosfwd:80: error: declarat
ion of ‘struct std::ostringstream’
h2d_d.h: In constructor ‘h2d::DTypesGrammar::definition<T>::definition(const h
2d::DTypesGrammar&)’:
h2d_d.h:39: error: there are no arguments to ‘str_p’ that depend on a template
 parameter, so a declaration of ‘str_p’ must be available
h2d_d.h:40: error: there are no arguments to ‘str_p’ that depend on a template
 parameter, so a declaration of ‘str_p’ must be available
h2d_d.h:41: error: there are no arguments to ‘str_p’ that depend on a template
 parameter, so a declaration of ‘str_p’ must be available
h2d_d.h:42: error: there are no arguments to ‘str_p’ that depend on a template
 parameter, so a declaration of ‘str_p’ must be available
h2d_d.h:43: error: there are no arguments to ‘str_p’ that depend on a template
 parameter, so a declaration of ‘str_p’ must be available

...

make: *** [h2d] Error 1

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

видимо он криво писан :)

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

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

>> D - игрушка красноглазых.

> обоснуй

Я не тот анонимуз, но приведу свое imho: D -- язык может и красивый, но ничем особым не выделяющийся. Можно сказать та-же java только в профиль, отсюда вывод, что практической пользы из D извлечь неудастся, ввиду того что он "не успел", и более никогда уже не станет массовым языком. Учитывая тот факт, что принципиально нового по сравнению с такими языками как C# или Java язык D ничего не вносит, можно сделать вывод: все те кто используют D используют это лишь из желания поигратся, а с языками играются в большинстве своем только красноглазые.

Играйтесь лучше в тот-же хаскель, полезнее будет и глаза не будут так болеть от километров кода D-шного ;)

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

D просто лучше Java/C#/C++, вот и всё. Ничего нового он не принёс, он просто делает всё красивее, быстрее, лаконичнее.

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

Я тот анонимус, но тов. >fmj (*) (07.08.2007 17:32:51) меня опередил.

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

у D есть шанс, и если этот язык сейчас как-нибудь раскрутят, то всё получится

да, у него есть куча недостатков:
1) немного перегруженный фичами синтаксис (на самом деле, пофиг, там всё логично)
2) нет адекватных компиляторов (dmd и gdc немного по-разному парсят код, а также генерируют огромные бинарники)
3) есть стандартная библиотека phobos, а есть tango, причём половина софта пользует одну, а половина другую, причём эти библиотеки несовместимы
4) нет единой системы сборки: есть dool, есть bud, есть dsss, есть ещё куча всего, даже расширение к CMake. но чего-то одного нет
5) нет нормального отладчика (вроде есть патч к gdb, но он сырой)
6) etc

Как видно, недостатки в основном в окружении, а не в самом языке, так что всё нормально.

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

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

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

> у D есть шанс, и если этот язык сейчас как-нибудь раскрутят, то всё получится

Он не настолько лучше Java, чтобы был смысл переучиваться. И не способен занять ту нишу ("пишем-все--на-свете-на-одном-языке"), в которой живет С++. И не имеет мегамаркетинга, как .NET/C#.

Нету у него шансов. Вот покажи мне хоть одну сколько-нибудь популярную прогу на D в дебиане, скажем?

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

> Нету у него шансов.

Как ни странно, в рейтингах TIOBE он уже довольно высоко o_O

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

> Он не настолько лучше Java, чтобы был смысл переучиваться.

Даже сравнивать смысла нет. В джаве кроме рефлекшена нет никаких вариантов метапрограммирования. Даже плюсы лучше джавы.

> И не способен занять ту нишу ("пишем-все--на-свете-на-одном-языке"), в которой живет С++. И не имеет мегамаркетинга, как .NET/C#.

Ага, про кобол тоже что то подобное говорили, мол язык на века, все на нём будут писать. И про аду говорили, и про pl/1.

> Вот покажи мне хоть одну сколько-нибудь популярную прогу на D в дебиане, скажем?

Вообще не аргумент. Сколько джавовских программ в дебиане? По пальцам пересчитать.

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

> В джаве кроме рефлекшена нет никаких вариантов метапрограммирования.

А конкретно в джаве метапрограммирование и не нужно. Там все за тебя сгенерирует IDE :)

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

> > Он не настолько лучше Java, чтобы был смысл переучиваться.

> Даже сравнивать смысла нет. В джаве кроме рефлекшена нет никаких вариантов метапрограммирования. Даже плюсы лучше джавы.

Дык не нужно оно в Яве. Оно вообще не так уж сильно нужно, сколько бы об этом не кричали фоннатеги.

> > И не способен занять ту нишу ("пишем-все--на-свете-на-одном-языке"), в которой живет С++. И не имеет мегамаркетинга, как .NET/C#.

> Ага, про кобол тоже что то подобное говорили, мол язык на века, все на нём будут писать. И про аду говорили, и про pl/1.

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

> > Вот покажи мне хоть одну сколько-нибудь популярную прогу на D в дебиане, скажем?

> Вообще не аргумент. Сколько джавовских программ в дебиане? По пальцам пересчитать.

Ну я знаю навскидку несколько очень популярных - Eclipse там, Tomcat, Azureus. А на D?

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