независимый от платформы код

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 06 апр 2013, 21:26

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

1. PBX (софт телефонные станции, SoftSwitch):
- Asterisk (C, APR);
- FreeSWITCH (C, APR);
- YATE (C++);

2. Средства разработки, компиляторы, IDE и т.д. (IT технология, инструменты):
- LLVM, Clang (C++);
- Eclipse (Java);
- IntelliJ IDEA (Java);
- NetBeans (Java);
- NVIDIA CUDA (C++);
- Lua (C);
- MySQL;
- libxml / libxml2 (библиотека работы с XML-текстами);

3. Офисные и бизнес инструменты (12 кросс-платформенных инструментов для Windows, Macs и Linux):
- OpenOffice / LibreOffice (Java);
- Likewise Enterprise (кросс-платформенная совместимость Active Directory);
- xTuple (ERP - Система планирования ресурсов предприятия);
- Wimba Classroom (организация дистанционного обучения);
- SharePlan (управление проектами);
- Compiere 3.0 (ERP - Система планирования ресурсов предприятия);
- xTuple OpenRPT (администрирование и работа с большинством типов БД);
- Zimbra Collaboration Suite (интеграция внутрикорпоративной деятельности);
- Civil Neitzen (обмен файлами больших объёмов между различными ОС);

4. Средства сетевого управления, мониторинга, Интернет инструменты:
- Apache (Web-сервер, APR ... естественно ;-) );
- FreeNATS (тестирование и мониторинг сети, PHP);
- Mozilla FireFox (APR);
- Mozilla ThunderBird;
- Opera;
- Google Chrome;

5. Проекты прикладного назначения:
- sox, ogg, vorbis, speex (потоковая обработка аудио, контейнеры, компрессия);
- Mathematica (компьютерная алгебра);

Это то первое, что приходит на память ... Мало? ;-)
Позже я буду этот список дополнять.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 07 апр 2013, 18:52

Olej писал(а): А когда C - тогда есть Apache Portable Runtime, APR (http://apr.apache.org/).
И не он один ... нужно думать. А кто ещё?
Для C-проектов ещё один (кроме APR) "слой переносимости" - библиотека, которая присутствует во всех Linux изначально - Glib ... например, совместно с графическими средствами GTK+:
Glib — это достаточно большая кросс-платформенная библиотека, которая, кроме потоков, включает в себя поддержку интернационализации, работу со строками, массивами, файлами, таймерами, и много чего другого, вплоть до XML парсера и поддерки .ini конфигурационных файлов.
В тоже время эта библиотека достаточно маленькая и почти не имеет зависимостей, что позволяет без особых проблем включать её в Windows-проекты, а в unix-подобных системах Glib уже есть.
(цитата взята отсюда, там же кратко примеры и детали использования)

P.S. Glib - одна из первых, ранних попыток сделать кросс-платформенную "прослойку" для таких сущностей, как поток, мютекс, условная переменная, время и хронометрирование, ввод-вывод... То, что ранняя - не умаляет достоинств Glib: в репозитариях представлены реализации конца 2011г.

Опции для её подключения к компиляции в Linux общеизвестны (это взято их живой системы Fedora 17):

Код: Выделить всё

bash-4.2$ pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  
bash-4.2$ pkg-config --libs gthread-2.0
-pthread -lgthread-2.0 -lrt -lglib-2.0  
В то же время, доступны совместимые варианты Glib и для Windows:
- Win32
- Win64
MacOS - POSIX система, Glib там есть в составе родного ПО.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 07 апр 2013, 19:01

Olej писал(а):P.S. Glib - одна из первых, ранних попыток сделать кросс-платформенную "прослойку" для таких сущностей, как поток, мютекс, условная переменная, время и хронометрирование, ввод-вывод...
Вот как это выглядит в простейшем примере:

Код: Выделить всё

#include <locale.h>
#include <glib.h>
#include <glib/gprintf.h>

/* struct _GTimeVal {
  glong tv_sec;
  glong tv_usec;
}; */
static glong interval;

gpointer thread_func( gpointer data ) {     // потоковая функция;
   GTimeVal time;
   g_get_current_time( &time );             // время начала
   g_printf( "начало потока :\t%lu\n", interval = time.tv_sec );
   g_usleep( 1000000 );                     // ожидание 1 сек.
   g_get_current_time( &time );             // время завершения
   g_printf( "конец потока :\t%lu\n", time.tv_sec );
   interval = time.tv_sec - interval;
   return 0;
}

int main( int argc, char *argv[] ) {
   setlocale( LC_ALL, "" );      // по умолчанию, из $LANG
   g_thread_init( NULL );        // инициализация потоков
   GThread *thread_id = g_thread_create( thread_func, NULL, TRUE, NULL ); // создаём поток
   g_thread_join( thread_id );   // ожидание завершения потока
   g_printf( "время ожидание завершения потока = %lu\n", interval );
   return 0;
}

Код: Выделить всё

bash-4.2$ time ./gthre 
начало потока :   1365349418
конец потока :    1365349419
время ожидание завершения потока = 1

real	0m1.003s
user	0m0.000s
sys	0m0.002s
1. нет (не допустимо!) характерных include: <stdio.h>, <stdlib.h>, ...
2. API Glib очень похоже на POSIX ... с добавлением префикса g_...() ... это как в кабардино-балкарском говоре - ко всему русскому нужно добавить префикс "а": "амагазин", "ашкола" ... "аводка"(?) :lol:
3. но это будет равноценно работать что в Linux, что в Windows!
Вложения
glib.tgz
(1.04 КБ) 518 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 08 апр 2013, 01:40

Виктория писал(а):Этот интерфейсный слой обеспечивает независимость от платформы целевому проекту?
Обратите внимание - все средства кросс-программирования: Boost, Qt, APR, Glib, GTK+ ... - все они:
- это весьма тонкий слой обёртки над нативными API разных ОС,
- который вводит синонимы, заменители вызовам нативного API.
(P.S. Qt в этом ряду я вспоминаю не в той части, которая графический фреймворк, а в той, которая реализует свои заменители таким общесистемным вещам, как потоки, синхронизации и т.п.)

Это как-раз наилучшим образом видно на классическом C на Glib c GTK+ (на самых простых примерах всё лучше видно):
Olej писал(а):библиотека, которая присутствует во всех Linux изначально - Glib ... например, совместно с графическими средствами GTK+:
Вот добавлено в архив приложение GTK, в котором через Glib в отдельном потоке (параллельно) прорисовываются элементы GUI.

Код: Выделить всё

bash-4.2$ make
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng15   -pthread -lgthread-2.0 -lrt -lglib-2.0   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0   ggtk.c -o ggtk
bash-4.2$ ./ggtk 
^C
ggtk.png
ggtk.png (6.61 КБ) 8548 просмотров
P.S. Во всех GUI-системах (как мне кажется во всех что я видел) при работе из потоков с элементами GUI всегда приходится как-то синхронизировать доступ (из разных потоков) к элементам GUI. Это очень характерное место. В GTK оно делается через ограничители критической секции: gdk_threads_enter(); ... gdk_threads_leave();
Вложения
glib.tgz
(8.7 КБ) 513 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 08 апр 2013, 09:24

Olej писал(а): Обратите внимание - все средства кросс-программирования: Boost, Qt, APR, Glib, GTK+ ... - все они:
- это весьма тонкий слой обёртки над нативными API разных ОС,
- который вводит синонимы, заменители вызовам нативного API.
И ещё один пример с Glib (последний ;-) ) - мютекс... когда один и тот же фрагмент кода (функция critical_func()) "дёргается с 2-х рук":

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <glib.h>
#include <glib/gprintf.h>

int loop = 100;
GThread *tid;

void critical_func( GMutex *mutex ) {
   g_mutex_lock( mutex );
   // какие-то вычисления ...
   g_printf( "%c", tid == g_thread_self() ? '+' : '-' );
   g_mutex_unlock( mutex );
}

gpointer thread_func( gpointer data ) {  // потоковая функция;
   int i;
   for( i = 0; i < loop; i++ )
      critical_func( (GMutex*)data );
   return 0;
}

int main( int argc, char *argv[] ) {
   int i;
   GMutex *mutex = g_mutex_new();
   if( argc > 1 && 0 != atoi( argv[ 1 ] ) ) {
      loop = atoi( argv[ 1 ] );
//    sscanf( argv[ 1 ], "%d", &loop );
   }
   tid = g_thread_new( "thread", thread_func, (gpointer)mutex );
   for( i = 0; i < loop; i++ )
      critical_func( mutex );
   g_thread_join( tid );                 // ожидание завершения потока
   g_printf( "\n" );
   return 0;
}
Такой код "слово в слово" знаком любому, кто минимально сталкивался с pthread_mutex_t. Это только заменители.

Код: Выделить всё

bash-4.2$ make
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -pthread -lgthread-2.0 -lrt -lglib-2.0   gthre.c -o gthre 
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -pthread -lgthread-2.0 -lrt -lglib-2.0   gmutx.c -o gmutx 
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng15   -pthread -lgthread-2.0 -lrt -lglib-2.0   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0   ggtk.c -o ggtk

Код: Выделить всё

bash-4.2$ ./gmutx 555
-------------------++++++++++++++++++++++++----------------------++++++++++++++++++++++++-------------
----------+++++++++++++++++++++----------------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+---------------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+-+-------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Код: Выделить всё

bash-4.2$ ./gmutx 555
-----------------------++++++++++++++++++++++++++++--------------------------+++++++++++++++++++++++++
--------------------------++++++++++++++++++++++++++-+-+-+--+-+-+--+-+-+-++-+-+-+-+--++-+-+-+-+--+-+-+
+-+-++-+-+-+-+-++-+-++-+-+-+-+-+-+--+-+-++-+-+-+-++-+-+-+-++-+-+-+-+-+--+-+--++-+-++-+-++-+-++--+-+--+
-+--+-+--++-+-++-+-+--+-+--+-+--+-+--+-+-+-+-+-+--+-+--+-+--+-+-+-+-+-++-+-++-+-+--+-+--+-+-+-+-+-++-+
-++--+-+-+-+-+--+-+-+-+-+--+-+-++-+-+-+-+-+-+-+-+-++-+-++-+-++--+-+--+-+-+-+-+-+-+-+-++-+-++-+-+-++-+-
++-+-++-+-+-+-++--+-+-+-+-++-+-++-+-+-+-+-++-+-+--+-+--+-+-+-++-+-+-+-++-+-++-+-++++++++++++++++++++++
+++++++++++++-+-++-+-++-+-++-+-+-+-+--+-+-+-+-++-+-+-+-+-+-+-+-+-+-++-+-+-+-+--+-+-+-+-+-++-+-+-+-+--+
-+--+-+-++-+-+-+-++-+-++-+-++-+-+-+-+--+-+--+-+-+-+-+-+-+-+-+-++-+-++-+-+--+-+-+-+-+-+-+--+-+-+-+--+-+
-++-+-++-+-+-+-+-++-+-+--+-+--+-+-+-+-+--+-+-++-+--+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+--+-+--+-+--+-+-+-+
-+--+-+-++-+-++--+-+-+-++-+-+-+-+--+-+-+-+-+-++-+-++-+-++-+-++-+-+-+-+-++-+-++-+-++-+-++-+-++-+-+-++-+
-++-+++++++++++++++-----------------------------------------------------------------------
Я специально показал 2 последовательных запуска программы (сразу друг за другом), которые различаются, т.е. поведение потоков (доступ к общему буферу вывода) - хаотическое, но они не сбивают друг друга.
Вложения
glib.tgz
(9.4 КБ) 662 скачивания

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Виктория » 08 апр 2013, 09:33

Olej писал(а):
Olej писал(а):P.S. Glib - одна из первых, ранних попыток сделать кросс-платформенную "прослойку" для таких сущностей, как поток, мютекс, условная переменная, время и хронометрирование, ввод-вывод...
По количеству кросс-платформенных сущностей (синонимов) Glib самая простая "прослойка"? А boost + новый стандарт языка С++ в лице libc - самая сложная?
В Glib синонимов меньше, чем в boost? Или это лишь разные механизмы абстрагирования?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 08 апр 2013, 09:37

Olej писал(а): Обратите внимание - все средства кросс-программирования: Boost, Qt, APR, Glib, GTK+ ... - все они:
- это весьма тонкий слой обёртки над нативными API разных ОС,
- который вводит синонимы, заменители вызовам нативного API.
Виктория писал(а):Этот интерфейсный слой обеспечивает независимость от платформы целевому проекту?
Так что, Виктория, при имеющемся обилии инструментальных средств создавать переносимый код, просто удивляет то, как редко программисты-разработчики код именно так и пишут. Я могу отнести это только:
- к нежеланию разработчиков;
- некомпетентности их руководства и неумению заставить, потребовать;
- и низкой квалификацией преподавателей (не поспевающих за тенденциями IT) которые не научили;

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

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Виктория » 08 апр 2013, 09:47

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 08 апр 2013, 09:50

Виктория писал(а):
Olej писал(а):
Olej писал(а):P.S. Glib - одна из первых, ранних попыток сделать кросс-платформенную "прослойку" для таких сущностей, как поток, мютекс, условная переменная, время и хронометрирование, ввод-вывод...
По количеству кросс-платформенных сущностей (синонимов) Glib самая простая "прослойка"? А boost + новый стандарт языка С++ в лице libc - самая сложная?
В Glib синонимов меньше, чем в boost? Или это лишь разные механизмы абстрагирования?
1. я не берусь судить насколько Glib самый простой пример ... это один из давних инструментов, на нём достаточно много сделано...

2. Glib относится к API классического C, так же, как, например APR, который Apache создали под себя, под разработку сервера ... им так было удобнее;

3. а Boost - инструмент в C++ ... так же, как во многих вещах ему может быть эквивалентным Qt;

4. так что (в части переносимости! в Boost ещё есть великое множество всего) Boost & Glib - они разные ... и по языку в котором используются, и по механизмам абстрагирования;

5. стандарт же языка С++ 2011 и реализация LLVM + Clang + libc - они никак не заменители многих механизмов ОС: управление памятью, параллельности, потоки-процессы ... во всех этих вещах вам всё равно придётся вовлекать какие-то "внешние" инструменты: Boost, Qt, ...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: независимый от платформы код

Непрочитанное сообщение Olej » 08 апр 2013, 10:09

Olej писал(а): Для C-проектов ещё один (кроме APR) "слой переносимости" - библиотека, которая присутствует во всех Linux изначально - Glib ... например, совместно с графическими средствами GTK+:
Примечание ;-) : по поводу примеров с Glib (я вижу, что уже начались скачивания ;-) ):

- не нужно думать, что "присутствует изначально" - это означает, сто эти средства у вас в системе есть! ;-)

- может понадобиться доустановить (из репозитариев своего дистрибутива) как пакеты разработки (заголовки) Glib, так и для GTK+

- что-то типа такого:

Код: Выделить всё

bash-4.2$ sudo yum install glib2*
...
Установлено:
  glib2-static.i686 0:2.32.4-2.fc17                                                                                                 

Обновлено:
  glib2.i686 0:2.32.4-2.fc17                                    glib2-devel.i686 0:2.32.4-2.fc17                                   

Выполнено!
New leaves:
  glib2-static.i686

Код: Выделить всё

bash-4.2$ sudo yum install gtk+*
...
Установлено:
  gtk+.i686 1:1.2.10-72.fc17                 gtk+-devel.i686 1:1.2.10-72.fc17        gtk+extra.i686 0:2.1.2-9.fc17
  gtk+extra-devel.i686 0:2.1.2-9.fc17
- вот те *-devel.* главным образом.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей