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

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

Модератор: Olej

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

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

Непрочитанное сообщение Виктория » 05 апр 2013, 11:39

Olej писал(а): 4. сетевые сервисы - здесь то же решение, что п.2: оберните их с помощью Boost ... но в отношении сетевых дел важнее другое (чем сокеты написать): отнесите всё относящеееся к конфигурации и настройке сетевых сервисов к компетенции ОС, не оставляйте следов этой конкретики в программном коде.

6. а ещё ;-) :
- отдайте языковую локализацию на откуп установкам ОС, не используйте явную локализацию в коде...
- C++ реализация будет более переносимой, чем C

и т.д.
Нас ещё в советские времена учили разделению функций между программной и аппаратной частью при проектировании автоматизированных систем. В рассматриваемой ситуации получается аналогично - необходимо разделение функций между прикладным ПО и системным (функциям ОС). Если нужна переносимость - всё, что можно сделать средствами ОС, этими средствами лучше и делать. А переносимость конечно нужна, так как она обеспечивает живучесть проекта.

С пятым пунктом (нестандартным оборудованием, платы АЦП там всякие...) стратегия для переносимости напрашивается аналогичная сетевым сервисам. Это если абстрактно подходить, а как реализуемость такой абстракции обеспечить... Надо бы ещё подумать.

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

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

Непрочитанное сообщение Olej » 05 апр 2013, 15:23

Виктория писал(а):А переносимость конечно нужна, так как она обеспечивает живучесть проекта.
И как показала жизнь, переносимость (независимость от платформ) нужна вдвойне: она обеспечивает независимость специалиста-разработчика от работодателя! :lol:

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

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

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

Виктория писал(а): 5. нестандартное оборудование для ввода/вывода информации с технического объекта
Мне тут совершенно непроизвольно напомнили замечательный пример (может быть самый показательный!) того, как грамотно решается эта вами названная проблема - NVIDIA & CUDA:
- API для загрузки десятков (или даже сотен) графических процессоров (GPU) и программирование их действий (куда уж может быть сложнее периферийное оборудование!)...
- вся специфическая часть ПО сделана в драйверах NVIDIA (в зависимости от группы моделей оборудования) и библиотеках поддержки операций с GPU...
- всё остальное ПО проектируется на С++ и код в неизменном виде компилируется хоть в Windows, хоть в Linux (и ещё что-то)...
- компилятор этого специфичного С++ (для GPU) в последних релизах переделан на том же движке LLVM (на котором уже обсуждался Clang).

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

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

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

Отдельный форум по вопросам кроссплатформенного программирования.
Изображение
Там же, на сайте (этажом выше ;-) ) - некоторые статьи и переводы в тему.

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

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

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

Olej писал(а):
Виктория писал(а): 5. нестандартное оборудование для ввода/вывода информации с технического объекта
Мне тут совершенно непроизвольно напомнили замечательный пример (может быть самый показательный!) того, как грамотно решается эта вами названная проблема - NVIDIA & CUDA:
- API для загрузки десятков (или даже сотен) графических процессоров (GPU) и программирование их действий (куда уж может быть сложнее периферийное оборудование!)...
- вся специфическая часть ПО сделана в драйверах NVIDIA (в зависимости от группы моделей оборудования) и библиотеках поддержки операций с GPU...
- всё остальное ПО проектируется на С++ и код в неизменном виде компилируется хоть в Windows, хоть в Linux (и ещё что-то)...
- компилятор этого специфичного С++ (для GPU) в последних релизах переделан на том же движке LLVM (на котором уже обсуждался Clang).
Эх, это очень сложный путь с оберткой С++ и LLVM :-?
А если используемое нестандартное оборудование попроще? Все-таки функции GPU - прежде всего, сложные вычисления, пусть и параллельные... Хотя, если используется что-то типа DSP/BIOS на втором процессоре, то может и не стоит отмахиваться

Нестандартное оборудование попроще - какое-нибудь фронт-енд устройство, осуществляющее сбор информации с объекта и/или управление им. Оно соединено с основным каналом связи, например по WiFi. Например - кардиограф, управление швейной машинкой или платформами координатного столика и т.п. Пусть пока это фронт-енд устройство с неизвестной ОС или без неё. Смотрим на задачу сверху вниз, со стороны основного - ПЭВМ в любом конструктиве с ОС.
В этом простом случае всё упирается в протоколы взаимодействия? вот тут нечто подобное обсуждают

Хотя может и честнее классифицировать сразу как фронт-енд с Linux и фронт-енд с каким-то подобием BIOS.

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

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

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

Виктория писал(а): Эх, это очень сложный путь с оберткой С++ и LLVM :-?
Там самый главный компонент - драйвер.
Нестандартное оборудование попроще - какое-нибудь фронт-енд устройство, осуществляющее сбор информации с объекта и/или управление им. Оно соединено с основным каналом связи, например по WiFi. Например - кардиограф, управление швейной машинкой или платформами координатного столика и т.п.
Так же как и во всех описываемых вами случаях главным компонентом есть драйвер.
И, конечно, драйвер пишется по законам той ОС, где ему предстоит функционировать ... и инструментом специфическим делается, и приёмами изготовления ... всё это только конкретика ОС.

И над драйвером может быть тонкий библиотечный слой, создающий малочисленный API, в несколько вызовов - единообразный API работы с драйвером и доступа к оборудованию. Например, какой-то вызов GetForMe( 1, &buf, ...) - чтения в буфер из 1-го канала, который (вызов GetForMe()) в этом тонком библиотечном слое будет реализован:
- через ioctl() в Windows варианте;
- через /proc в варианте FreeBSD и Solaris;
- через /sys в варианте Linux;
И этот интерфейсный слой (он минимальный) будет платформо-зависимый.

А вот всё что выше - весь крупный целевой проект, использующий этот API (вот эти вызовы GetForMe()) - он весь и целиком может быть сконструирован как независимый от платформы.

P.S. Я вам здесь в точности пересказал схему, по которой NVIDIA делает CUDA.

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

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

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

Olej писал(а): И над драйвером может быть тонкий библиотечный слой, создающий малочисленный API, в несколько вызовов - единообразный API работы с драйвером и доступа к оборудованию.
...
А вот всё что выше - весь крупный целевой проект, использующий этот API (вот эти вызовы GetForMe()) - он весь и целиком может быть сконструирован как независимый от платформы.
Этот интерфейсный слой обеспечивает независимость от платформы целевому проекту?
Последний раз редактировалось Виктория 06 апр 2013, 16:02, всего редактировалось 1 раз.

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

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

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

Olej писал(а): 1. модель GUI - используйте независимые Qt, wxWidgets ... не используйте MFC ;-) ... да и GTK+ (?)
Мне тут подсказали ;-) , что GTK/GTK+ тоже столь же кросс-платформенный, как и Qt: есть реализации под Windows (Компиляция GTK под Windows), ну, естественно, под Linux и другие POSIX (весь GNOME джентльменский набор).

Так что GTK я несправедливо обидел (давно я на GTK не смотрел).
Ту роль, которую Qt играет для C++, ту же GTK - для C (аналогично как Boost и Apache Portable Runtime, соответственно).

Вот реализация GTK+ для Windows для скачивания.

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

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

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

Виктория писал(а):
Olej писал(а): И над драйвером может быть тонкий библиотечный слой, создающий малочисленный API, в несколько вызовов - единообразный API работы с драйвером и доступа к оборудованию.
...
А вот всё что выше - весь крупный целевой проект, использующий этот API (вот эти вызовы GetForMe()) - он весь и целиком может быть сконструирован как независимый от платформы.
Этот интерфейсный слой обеспечивает независимость от платформы целевому проекту?
Если вы вложите в него весь набор возможностей работы с этим устройством, то обеспечит ... почему нет?

Для "идеологически близких" платформ и этого слоя можно бы не иметь, достаточно драйвера (пространства ядра) ... например, для Linux, Solaris, FreeBSD, MacOS драйвер для каждой из этих систем отобразит ваше устройство в /dev/xxx. Но у Windows совсем другая идеология использования драйвера, поэтому может и понадобится тонкий интерфейсный слой согласования пользовательского пространства, который для обеспечения вызовов обменного API:
- в варианте Linux, Solaris, FreeBSD, MacOS ... будет использовать операции прямых чтения-записи /dev/xxx;
- а в варианте Windows будет работать через ioctl() ... или другие какие-то проприетарные механизмы;

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

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

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

Olej писал(а):
Виктория писал(а):А переносимость конечно нужна, так как она обеспечивает живучесть проекта.
И как показала жизнь, переносимость (независимость от платформ) нужна вдвойне: она обеспечивает независимость специалиста-разработчика от работодателя! :lol:
Интересно, что в ходе обсуждений (здесь и не только здесь) кросс-платформенность распадается на 2 различных (а может и более?) независимых направления:

1. "кросс-платформенность для проекта" - как сделать проект максимально переносимым... со всеми вытекающими для проекта плюсами;

2. "кросс-платформенность для разработчика" - когда разработчику выгодно для себя пользоваться переносимым инструментом, чтобы не переквалифицироваться каждый раз, когда на следующем проекте изменяются спецификации среды: может, кросс-платформенность и не нужна вовсе конкретному проекту, но лучше его делать тем инструментарием, который в завтрашнем проекте будет использован совсем на другой платформе.

Пример того, что эти аспекты разные, по-разному выстраивающие решения:
- с точки зрения "кросс-платформенность для проекта" совершенно не важно в каком IDE разрабатывается проект ... после того, как его сделали, его перекомпилируют независимо для каждой нужной платформы;
- с точки зрения "кросс-платформенность для разработчика" - это одна из важнейших составляющих, чтобы не переучиваться и не подстраиваться каждый раз - лучше сразу ориентироваться на единую переносимую среду ... Eclipse ... или NetBeans ...

Ответить

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

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

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