Страница 1 из 6

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

Добавлено: 24 мар 2013, 17:21
Olej
Я уже объяснил вот здесь Инструменты Linux:
Olej писал(а):Есть у меня большое желание (и большой объём чернового материала) чтобы дописать большой такой раздел в рукопись этой книги "Инструменты Linux для Windows-программистов" примерно такого смысла: "Переносимость программных проектов (из Windows в Linux ... и наоборот)" ;-)

Потому, как, пока "самые борзые" занимались "Windows vs Linux" :lol: , сложилось (примерно с 2005г. и далее) весьма много инструментов, технологий, проектов... которые годятся как для Windows, так и для Linux ... а также, зачастую, и для Solaris, FreeBSD etc. :lol:
Из таких вот независимых от платформ проектов некоторые просто великолепные:
- всё что связано с графикой Qt (http://qt-project.org/) - язык С++;
- проекты софтверных телефонных станций: Asterisk (http://www.asterisk.org/) & FreeSWITCH (http://www.freeswitch.org/) - язык C;
- Java проекты ... их много, здесь независимость от платформы достигается легко ... один из самых показательных - Eclipse IDE (http://www.eclipse.org/);
- ... может кто ещё подскажет что любопытное? ;-)

Это лет 10 назад можно было быть "программистом для Windows", "программистом для Linux" ... а то ещё и "программистом на BASIC", или "программистом под 1С" :lol:
На сегодня с этим пора заканчивать. Тем более, что для того есть масса достойного инструментария!
И должно бы быть в таком обзоре переносимости 3, как минимум, главы-направления ... о которых здесь в форуме много писалось и обсуждалось:

1. Переносимость кода (статическая).
ARP: Apache Portable Runtime (APR)
Boost: Re: исполнение промышленных проектов под Wine
Qt: Создание графических приложений
... да и просто многие стороны программирования в C++ ...
Вот об этой части только будет эта тема: техника написания кода, компилирующегося и исполняемого на любой платформе.

Вопрос то, в общем, понятный ... а когда начинаешь это всё "причёсывать" и систематизировать - то оно сильно рассыпается ;-)

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

Добавлено: 24 мар 2013, 17:31
Olej
Olej писал(а):Вопрос то, в общем, понятный ... а когда начинаешь это всё "причёсывать" и систематизировать - то оно сильно рассыпается ;-)
Когда кому задашь такую тему, первое, что выкрикивают, даже не дослушав до конца фразы ;-) : "Boost!" (http://www.boost.org/).
А почему Boost? Кроме Boost есть (и было) ещё некоторое число подобных инструментов.
Каких?
(я вообще полагаю, что на создание Boost подвиг успех подобного проекта STL ... когда его ещё и не думали делать стандартом C++)

P.S. Я предположительно знаю ответ на вопрос "А почему Boost?" - а потому, что достаточно много и достаточно начинающих программистов нахватались по-быстрому и по верхам использовать Boost + впаривают это умение работодателю, который ещё меньше них понимает :lol:

Но Boost - это когда С++.
А когда не С++? ... вообще-то, для UNIX-like OS как-раз, С++ для многих вещей не есть органичный язык... ANSI C ему ближе будет ;-) .
А когда C - тогда есть Apache Portable Runtime, APR (http://apr.apache.org/).
И не он один ... нужно думать. А кто ещё?

Но начать можно вообще от другого:
- что в языке программирования C++ проблема кодовой совместимости выглядит гораздо мягче...
- потому, что многие понятия и инструменты стандартизованы на уровне языка C++ отображены в единых заголовочных файлах (таких как: <fstream>, <cstdlib>, <ctime>, <iostream>, <iterator>, <algorithm> и мн. др.)...
- а не на уровне API операционной системы (Win32 API для Windows, POSIX для Linux, Solaris или даже MacOS/iOS), как это выглядит в традиционном C;
- но и даже POSIX-совместимые API ведут себя по-разному в Linux и в Solaris ... и уж тем более в MacOS (по-разному, но очень похоже! ;-) ).

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

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

Добавлено: 24 мар 2013, 17:58
Olej
Olej писал(а):Поэтому С++ переносимый программный код (для некоторых целей?) можно писать, при некоторой дополнительной тщательности, и вообще не привлекая дополнительные платформенно-независимые "прослойки".
Беру чуть модифицированный простейший пример из книжки Б.Страуструпа ("чуть модифицированный" потому, что оригинальный пример Б.Страуструпа просто "не так" работает ;-) - я понимаю, мэтр пишет с головы, по памяти, ему некогда заморачиваться с проверками ;-) ):

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

#include <cstdlib>
#include <iostream>
#include <fstream>

int main( int argc, char* argv[] ) {
   using namespace std;
   locale::global( locale( "" ) );
   if( argc != 3 )
      cout << "Запуск:  " << argv[ 0 ] << " FROM-файл TO-файл" << endl, exit( EXIT_FAILURE );
   ifstream from( argv[ 1 ] );
   if( !from )
      cout << "Не открывается входной файл " << argv[ 1 ] << endl, exit( EXIT_FAILURE );
   ofstream to( argv[ 2 ] );
   if( !to )
      cout << "Не открывается выходной файл " << argv[ 2 ] << endl, exit( EXIT_FAILURE );
   char ch;
   while( from.get( ch ) ) to.put( ch );
   if( !from.eof() || !to )
      cout << "Получилось что-то странное!" << endl, exit( EXIT_FAILURE );
   to.close();
   exit( EXIT_SUCCESS );
}
Это, как легко видеть, простое копирование одного файла в другой:

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

bash-4.2$ make
c++ -Wall fcp.cpp -o fcp

bash-4.2$ ./fcp fcp.cpp fcp.data

bash-4.2$ ls -l fcp.*
-rw-r--r-- 1 olej olej 902 марта 24 16:01 fcp.cpp
-rw-rw-r-- 1 olej olej 902 марта 24 16:02 fcp.data


И понятно, что это будет компилироваться в Visual C и работать в Windows, или компилироваться GCC или Clang ... в Open Solaris ;-)
С классическим C так сильно не побалуешь. :lol:

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

Добавлено: 24 мар 2013, 18:05
Olej
Olej писал(а):С классическим C так сильно не побалуешь. :lol:
Потому, что базовый (низкоуровневый) Win32 API - очень и очень отличается от POSIX API ... см. вот эту знаменитую книгу Дж.Рихтера:
Изображение

И даже когда говорят о "стандартная библиотека С" в Windows, то она хоть и похожа (иногда), но сильно отличается от POSIX API и по виду, и по составу, и по поведению (ну пусть мне кто подскажет эквивалент getopt() POSIX из API ;-) ).

P.S. Тем, кто забыл как внешне выглядят вызовы Win32 API, чтобы напомнить, я достал специально наугад проект (http://trubetskoy1.narod.ru/prog/winapi/WinApi.html), написанный с VC 2005 для Win32 API (игра "крестики-нолики" ... но это всё неважно). Посмотрите там на вызовы типа drawBitmap(), MessageBox(), GetObject(), SelectObject(), CreateCompatibleDC() и другие подобные прелестные штучки. ;-)

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

Добавлено: 26 мар 2013, 14:27
Виктория
Olej писал(а):
Есть у меня большое желание (и большой объём чернового материала) чтобы дописать большой такой раздел в рукопись этой книги "Инструменты Linux для Windows-программистов" примерно такого смысла: "Переносимость программных проектов (из Windows в Linux ... и наоборот)" ;-)
Потому, как, пока "самые борзые" занимались "Windows vs Linux" :lol: , сложилось (примерно с 2005г. и далее) весьма много инструментов, технологий, проектов... которые годятся как для Windows, так и для Linux ... а также, зачастую, и для Solaris, FreeBSD etc. :lol:

И должно бы быть в таком обзоре переносимости 3, как минимум, главы-направления ... о которых здесь в форуме много писалось и обсуждалось:...
1. Переносимость кода (статическая). ...
2. Динамическая переносимость....
3. Русскоязычная локализация....

Можно уточнить?
Статическая переносимость - это переносимость исходных текстов программы с учетом того, что они используют правила переносимого кодирования (boost или) их APR, или ещё чего-нибудь. А трансляция в Windows осуществляется Visual Studio. Верно?
Динамическая переносимость - это собственно исполнение их в Linux, так?

И ещё можно ли такую программу считать кроссплатформенной? Скорее всего, да. Двухплатформенная? С точки зрения пользователя она функционирует одинакова в обеих ОС, с точки зрения разработчика или специалиста по сопровождению вроде как исходные тексты идентичны?

Пример из книжки слишком простой. Если придерживаться такого стиля создание кроссплатформенного ПО будет тяжеловесным.

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

Добавлено: 26 мар 2013, 14:39
Olej
Виктория писал(а): Можно уточнить?
Не только можно, но и нужно! ;-)

Я уже начал отвечать в старом разделе, где лежал ваш текст... и хотел даже посоветовать продолжать обсуждение именно здесь - это вы молодцом, что перенесли ;-) , сейчас и я перенесу подготовленный ответ. ;-)

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

Добавлено: 26 мар 2013, 14:39
Olej
Виктория писал(а): Можно уточнить?
Статическая переносимость - это переносимость исходных текстов программы с учетом того, что они используют правила переносимого кодирования (boost или) их APR, или ещё чего-нибудь. А трансляция в Windows осуществляется Visual Studio. Верно?
Я так это для себя понимаю:
- "статическая" - это то, что происходит в период компиляции, за счёт компиляции ... аналогия: макросы #define в C, или шаблоны (template) в C++ ...
- тогда статическая переносимость - это переносимость кода: код переносится в другую ОС, там компилируется по правилам этой ОС (разделяемые библиотеки, их пути нахождения, связывание, ...)
- главнейшее условие здесь: полная идентичность кода и там и там, т.е. никаких изменений в код...
- потому, что можно написать весь свой проект вот в такой манере:

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

#ifdef WIN32
   // здесь пишется код для Windows
#else
#ifdef linux
   // а пишется эквивалентный код для Linux
#endif
- но в этом случае говорить о переносимости не следует ;-) ... я так полагаю, что в идеальном случае переносимый код вообще не должен содержать нигде ни единого вот такого препроцессорного определения под систему.
P.S. Кстати, здесь на сайте есть старенький, но любопытный перевод в эту тему: Перенос прикладных программ в Linux.
Виктория писал(а):А трансляция в Windows осуществляется Visual Studio. Верно?
Трансляция - это вы имеете в виду компиляция + сборка? (и та и другая терминология верна, просто вторая мне ближе).
Компиляция проекта в целевой системе может (должна, вообще-то говоря) допускаться любым нативным способом для этой системы и любым инструментом, т.е. для Windows: Visual Studio, C++ Builder и любым другим. А вот сборка в Windows средствами CygWin - не будет нативной сборкой, и относиться к "переносимости" (по крайней мере, статической) не может.
Виктория писал(а): Динамическая переносимость - это собственно исполнение их в Linux, так?
Да. Именно так ... но "их" - это бинарных программ, собранных не под свою ОС.
- выполнение *.exe (Win32) под Wine в Linux (x86_64 в Wine только в начальном состоянии);
- выполнение исполнимых ELF-файлов Linux в CygWin;
- ... в конце концов, выполнение приложений в виртуальной машине под VirtualBox - это тоже динамическая переносимость ;-) (я иногда так прогоняю x86_64 Linux приложения на i386 Linux инсталляции ... помогает ;-) );
Виктория писал(а): И ещё можно ли такую программу считать кроссплатформенной? Скорее всего, да. Двухплатформенная? С точки зрения пользователя она функционирует одинакова в обеих ОС, с точки зрения разработчика или специалиста по сопровождению вроде как исходные тексты идентичны?
Какую "такую"?
Программу, написанную под статическую переносимость, конечно можно считать кроссплатформенной.
Только почему 2-х? ... скорее - многоплатформенной ... а ещё лучше считать - всеплатформенной ;-) .
Многие переносимые проекты (Asterisk, FreeSWITCH ... и это здоровенные проекты, сами по объёму соизмеримые с ядром Linux) прекрасно работают кроме Linux (родная для них система) и Windows ещё и под Sun Solaris (OpenSolaris) и FreeBSD.
Я сам многие проекты GNU собирал под MINIX 3 Э.Таненбаума ... а некоторые и не соберёшь (хотя здесь всё проще: перенос POSIX в POSIX).

А вот динамическую переносимость никак нельзя соотносить с кроссплатформенностью. Это "жизнь в чужом окружении".
Это как тётя Фира у Сергея Довлатова на Брайтон, которая жалуется на местные магазины: "Мы здесь уже 10 лет, а они нифига по-русски не понимают!" :lol: .
Но вопрос ведь не в том каким способом достигается результат, а в том, что он вообще достигается и какими затратами.

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

Добавлено: 26 мар 2013, 15:04
Виктория
А гибрид статической и динамической переносимости возможен? Я извиняюсь за неточные термины.
Если проект с нуля. Могу ли я использовать какой-нибудь ограниченный набор правил статической переносимости, руководствуясь основными критериями проекта?
Тогда может быть под wine будет все корректно и не будет этой ситуации
Это как тётя Фира у Сергея Довлатова на Брайтон, которая жалуется на местные магазины: "Мы здесь уже 10 лет, а они нифига по-русски не понимают!" :lol:
А вот сборка в Windows средствами CygWin - не будет нативной сборкой, и относиться к "переносимости" (по крайней мере, статической) не может.
Тоже не очень понятно... в смысле что это некий обман, потому что Cygwin уже кроссплатформенный?

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

Добавлено: 26 мар 2013, 15:11
Olej
Виктория писал(а):Пример из книжки слишком простой.
Пример из книжки, конечно, очень простой.
Но большинство фундаментальных вещей, обычно, можно разобрать и понять на самых простых примерах ... и если этого не происходит (понимания на простом), то тут что-то неправильно в предположениях. ;-)
Виктория писал(а):Если придерживаться такого стиля создание кроссплатформенного ПО будет тяжеловесным.
Это нельзя называть стилем.
Это просто естественное проявление того, что уровень абстракций С++ выше С:
- вместо примитивов понятий С: файл, файловый дескриптор, open(), close()...
- ... вводятся замещающие понятия (другая система примитивов): буферизированные потоки, >>, <<, и т.д.
- эта укрупнённая система понятий уже может быть сделана независимой от платформы.

Примером такого крупнейшего расширения базовых понятий была, например, STL, которая почти вся сделана с использованием template, препроцессорно, и независимо от платформы. STL первоначально сделали HP как свой совершенно частный проект... никто не собирался ним расширять C++.
P.S. Кстати, разработчики C могли изобрести что-то похожее на STL на пару десятилетий раньше, используя макросы (#define ...), но они просто не пошли так далеко: они дали инструмент (макросов), но не развили реализацию ... а HP расширили механизм template в реализацию STL.

Такое программирование не делает код, или работу "тяжеловесными"...
Просто он не позволяет выйти ещё дальше за рамки тех расширений, которые делает стандарт языка С++ (которые делает Б.Страуструп ;-) ). Давайте посмотрим чем расширяют возможности кроссплатформенности крупнейшие пакеты такого сорта:

1. Qt или менее известный wxWidgets (в девичестве wxWindow): создание модели GUI, которая отображается в радикально отличающиеся нативные графические реализации: в Win32 под Windows, в X11 под Linux ... но и (более того!) в такую совершенно эксклюзивную GUI систему, как Photon под OS QNX.

2. Boost ... Огромный пакет (и постоянно расширяющийся своими "разделами").
Но если посмотреть текущее состояние дел: Boost 1.53.0 Library Documentation - то обаружим, что:
- в составе большое число прикладных разделов, безусловно полезных и безусловно нужных, таких как: большое число разделов Math (включающих матстатистику, линейную алгебру и др.), механизмы функционального (LISP) программирования (Lambda) ... таких разделов в Boost большинство...
- а из собственно машинных, IT механизмов Boost расширяет функциональность С++ только в тех разделах, которые а). радикально отличаются по реализации в разных ОС и б). которые не покрываются стандартами C++ ... и их совсем не так много, и это те немногие разделы Boost, которые используют когда стремятся к кроссплатформенности: потоки, управление памятью, службы времени и хронометрирования...

3. То же самое делает, в принципе, и ARP для C: пулы памяти, пулы потоков, ...

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

Добавлено: 26 мар 2013, 15:31
Olej
Виктория писал(а):А гибрид статической и динамической переносимости возможен? Я извиняюсь за неточные термины. Если проект с нуля. Могу ли я использовать какой-нибудь ограниченный набор правил статической переносимости, руководствуясь основными критериями проекта?
С терминами всё в порядке - в этой области нет внятной терминологии, мы её с вами изобретаем ;-)

А про "гибрид"?
... А зачем?

- Если проект создаётся "с нуля" - вы закладываете изначально требования кроссплатформенности, и всё у вас будет ОК. Сейчас для этого уже существует достаточно инструментов, и такая разработка не более трудоёмкая, чем моноплатформенная (во! "термин" дал ;-) ).
Ещё лет 10 назад никто не стал бы это обсуждать всерьёз, считая все эти дела идиотизмом и экзотикой (wxWindow, Wine, ... оно всё как-раз тогда и появлялось как "экзотика"). Ещё лет 5 назад никто не стал бы это применять широко и практически - слишком оно ещё было сырое и недоделанное. А сегодня это должно стать хорошим стилем.

- Но если проект уже завершён, на него затрачены время, усилия и ресурсы... Тогда нужно искать пути динамической переносимости и дать ему 2-ю жизнь. Так, например, весь xUSSR эксплуатирует 1С:Бухгалтерия : и тратиться на покупки не надо, и налоговая инспекция с проверками лицензионной чистоты не нагрянет ... ну, почти ;-)
Виктория писал(а): Тогда может быть под wine будет все корректно и не будет этой ситуации
Чаще всего и бывает...
Но иногда нужно повозиться, чтобы заставить работать.
И это "повозиться" хорошо бы формализовать до набора правил и действий ... а не плясать каждый раз с бубном. :-o
Виктория писал(а):Тоже не очень понятно... в смысле что это некий обман, потому что Cygwin уже кроссплатформенный?
Обмана никакого нет...
Никто никого не обманывает: ни Wine, ни CygWin, ... ни VirtualBox ;-)

Но CygWin при исполнении под Windows использует свои библиотеки .so (формата Linux и похожие на Linux-овые) ... которые являются на самом деле ретранслятором в системные вызовы через родные DLL Windows.
Так и Wine при исполнении под Linux использует свои библиотеки .dll (формата Windows и похожие на Windows-овые ... а иногда и просто скопированные из Windows) ... которые являются на самом деле ретранслятором в системные вызовы через родные .so Linux.
P.S. Посмотрите, какие симметричные фразы получились :lol: ... я их копи-паст-ом писал ;-) . Хотя картина в CygWin и отличается внутренностями от того, что в Wine (хотя я CygWin последний раз плотно в руках держал лет 6-7 назад).