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

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

Модератор: Olej

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

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

Непрочитанное сообщение Olej » 24 мар 2013, 17:21

Я уже объяснил вот здесь Инструменты 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++ ...
Вот об этой части только будет эта тема: техника написания кода, компилирующегося и исполняемого на любой платформе.

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

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

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

Непрочитанное сообщение Olej » 24 мар 2013, 17:31

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 (по-разному, но очень похоже! ;-) ).

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

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

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

Непрочитанное сообщение Olej » 24 мар 2013, 17:58

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:
Вложения
fcp.tgz
(855 байт) 673 скачивания

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

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

Непрочитанное сообщение Olej » 24 мар 2013, 18:05

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() и другие подобные прелестные штучки. ;-)
Вложения
CrossNull.rar
(153.94 КБ) 691 скачивание

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

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, так?

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

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

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

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

Непрочитанное сообщение Olej » 26 мар 2013, 14:39

Виктория писал(а): Можно уточнить?
Не только можно, но и нужно! ;-)

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

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

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

Непрочитанное сообщение Olej » 26 мар 2013, 14:39

Виктория писал(а): Можно уточнить?
Статическая переносимость - это переносимость исходных текстов программы с учетом того, что они используют правила переносимого кодирования (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: .
Но вопрос ведь не в том каким способом достигается результат, а в том, что он вообще достигается и какими затратами.

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

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

Непрочитанное сообщение Виктория » 26 мар 2013, 15:04

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

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

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

Непрочитанное сообщение Olej » 26 мар 2013, 15:11

Виктория писал(а):Пример из книжки слишком простой.
Пример из книжки, конечно, очень простой.
Но большинство фундаментальных вещей, обычно, можно разобрать и понять на самых простых примерах ... и если этого не происходит (понимания на простом), то тут что-то неправильно в предположениях. ;-)
Виктория писал(а):Если придерживаться такого стиля создание кроссплатформенного ПО будет тяжеловесным.
Это нельзя называть стилем.
Это просто естественное проявление того, что уровень абстракций С++ выше С:
- вместо примитивов понятий С: файл, файловый дескриптор, 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: пулы памяти, пулы потоков, ...

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

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

Непрочитанное сообщение Olej » 26 мар 2013, 15:31

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

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

- Если проект создаётся "с нуля" - вы закладываете изначально требования кроссплатформенности, и всё у вас будет ОК. Сейчас для этого уже существует достаточно инструментов, и такая разработка не более трудоёмкая, чем моноплатформенная (во! "термин" дал ;-) ).
Ещё лет 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 назад).

Ответить

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

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

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