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

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

Модератор: Olej

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

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

Непрочитанное сообщение Olej » 09 дек 2016, 23:59

Поскольку в этой теме, как ни в какой другой, часто упоминается Boost, то "освежу" тему информацией по Boost.
Такой пример приложения: найти сколько дней между 2-мя введенными датами?

Самые убогие школяры начинают сразу писать массивы {31, 28, 31, 30, ...} и вспоминать (выдумывать) устройство календаря, как они его помнят и представляют.

Классически эта задача решается с POSIX API дата/время (struct tm, gmtime(), mktime(), asctime(), ctime() ... ), но это достаточно громоздко и не так просто.

В Boost это может выглядеть так (независимо от платформы!):

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

#include <iostream>
#include <locale>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace std;

int main() {
    cin.imbue( locale( cin.getloc(), new boost::gregorian::date_input_facet( "%d.%m.%Y" ) ) );
    boost::gregorian::date d1, d2;
    cin >> d1 >> d2;
    if( d1 > d2 )
        swap( d1, d2 );
    cout << d2 - d1 << endl;
}
И это выглядит так:

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

[olej@dell boost]$ ./difd
01.01.2016
01.01.2017
366

[olej@dell boost]$ ./difd
01.01.2015
01.01.2016
365

[olej@dell boost]$ ./difd
01.01.2000
01.01.2001
366

[olej@dell boost]$ ./difd
01.01.1900
01.01.1901
365
Подробнее здесь.

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

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

Непрочитанное сообщение Olej » 26 фев 2018, 16:37

Olej писал(а): 2. Такой же точно переносимостью обладают все интерпретирующие языки: Perl, Python и мн. др. Но призывать писать все прикладные проекты на Perl было бы с моей стороны ... как-то странно. Точно так же Java уместен в одних случаях (замечательный пример здесь: Eclipse) и совершенно не уместен в других.
Вопросы переносимости кода Python в разных описаниях ... несколько преувеличены.
Но под Python сделана такая вот кросс-платформенная среда: IPython + Jupyter.
Которая абсолютно прозрачна под разными ОС для выполнения кодов на Python.

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

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

Непрочитанное сообщение Olej » 28 фев 2018, 12:28

Olej писал(а): Итого, из тех инструментальных средств кросс-программирования, мы уже упомнили из тех, которые активно используются (не беря во внимание всякую экзотику):
- для C : APR, Glib;
- для C++ : Qt, Boost, Juce, Ultimate++;
- каждый из этих инструментов в своей группе (C или C++) - это полная альтернатива другим (т.е. Qt не заменяет Boost во многих аспектах, как и Boost не заменяет Qt в других аспектах ... но с точки зрения переносимости - они альтернативы).
Нужно сделать себе отметку о таком достаточно новом (Первый выпуск 7 июля 2008) средстве как Protocol Buffers:
Protocol Buffers — протокол сериализации (передачи) структурированных данных, предложенный Google как эффективная бинарная альтернатива текстовому формату XML. Разработчики сообщают, что Protocol Buffers проще, компактнее и быстрее, чем XML, поскольку осуществляется передача бинарных данных, оптимизированных под минимальный размер сообщения.

Только не надо впадать в истерику при слове Google :lol:
По заявлениям Google, Protocol Buffers по сравнению с XML:
  • проще;
  • от 3 до 10 раз меньше;
  • от 20 до 100 раз быстрее;
  • более однозначный;
  • позволяет создавать классы, которые в дальнейшем легче использовать программно.
Это многоязыковая альтернатива не только XML, но и его убогому суррогату JSON ... и идеи эти во многом витают ещё со времён RPC Sun Microsystems 30-летней давности ... да и другим подобным вещам.
Protocol Buffers не предназначен для чтения пользователем и представляет собой двоичный формат.
Для десериализации данных необходим отдельный .proto-файл, в котором определяется формат сообщения.
Простенькие и элементарные примеры того, как это должно происходить, достаточные для понимания, см. здесь:
Protocol Buffer Basics: C++
Protocol Buffer Basics: Python
Это в качестве образца для 2-х языков ... там же есть и про Java, Ruby, Go, PHP и др.
Страница открытого проекта: google/protobuf.

На использование этого инструмента наталкивает (и сейчас в связи с этим будет всплеск интереса) разборки в теме Машинное обучение (нейронные сети) с инструментом TensorFlow ... и также активно используется в IPython + Jupyter.

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

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

Непрочитанное сообщение Olej » 28 фев 2018, 12:45

Olej писал(а): Это многоязыковая альтернатива не только XML, но и его убогому суррогату JSON ... и идеи эти во многом витают ещё со времён RPC Sun Microsystems 30-летней давности ... да и другим подобным вещам.
Берётся всё это здесь... для своей платформы и языка (или для всех языков сразу):

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

[olej@dell protobuf]$ ls -l protoc-3.5.1-linux-x86_64.zip 
-rw-rw-r-- 1 olej olej 1379374 фев 28 10:30 protoc-3.5.1-linux-x86_64.zip
Разворачивается это в:

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

[olej@dell protobuf]$ tree protoc-3.5.1
protoc-3.5.1
├── bin
│   └── protoc
├── include
│   └── google
│       └── protobuf
│           ├── any.proto
│           ├── api.proto
│           ├── compiler
│           │   └── plugin.proto
│           ├── descriptor.proto
│           ├── duration.proto
│           ├── empty.proto
│           ├── field_mask.proto
│           ├── source_context.proto
│           ├── struct.proto
│           ├── timestamp.proto
│           ├── type.proto
│           └── wrappers.proto
└── readme.txt

5 directories, 14 files

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

[olej@dell bin]$ file protoc 
protoc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=158f1cb880a6c3df1ff4e198cb931a30fcd61857, stripped
Странно ... что этот файл не имеет флага исполнимости X:

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

[olej@dell bin]$ chmod a+x protoc
Дальше, как писано в readme.txt :

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

[root@dell protoc-3.5.1]# cp bin/protoc /usr/local/bin 

[root@dell protoc-3.5.1]# cp -R include/* /usr/local/include 

[root@dell protoc-3.5.1]# tree /usr/local/include/google/ 
/usr/local/include/google/
└── protobuf
    ├── any.proto
    ├── api.proto
    ├── compiler
    │   └── plugin.proto
    ├── descriptor.proto
    ├── duration.proto
    ├── empty.proto
    ├── field_mask.proto
    ├── source_context.proto
    ├── struct.proto
    ├── timestamp.proto
    ├── type.proto
    └── wrappers.proto

2 directories, 12 files
И ... вуаля :lol: :

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

[olej@dell protobuf]$ protoc --help
Usage: protoc [OPTION] PROTO_FILES
Parse PROTO_FILES and generate output based on the options given:
  -IPATH, --proto_path=PATH   Specify the directory in which to search for
                              imports.  May be specified multiple times;
                              directories will be searched in order.  If not
                              given, the current working directory is used.
  --version                   Show version info and exit.
...
Здесь всё описано.
А всё недостающее для использования - в примерах которые показаны (ссылки) выше.

Простенько и со вкусом! :lol:

Ответить

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

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

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