Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 12:11
Оценка:
Всем привет!

Есть некий модуль, написанный на C++. Будет портирован на Java и Python.
В модуле производятся вычисления на матрице и дёргается GUI через абстрактный интерфейс.
Динамическая память напрямую не используется.

Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..

Вызывать нативный код из управляемого категорически не хочется.
И тащить с собой библиотеку интерпретатора байт-кода тоже.

ЗЫ: Посмотрел llvvm+clang. Даже простая конструкция вида "return 42;" превращается в кучу монструзных библиотечных вызовов. Может я не умею его готовить...
Re: Синхронизация C++ исходника с Java и Python
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.15 12:12
Оценка: -1 :)
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Всем привет!


ROP>Есть некий модуль, написанный на C++. Будет портирован на Java и Python.


Boost.Python же
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Синхронизация C++ исходника с Java и Python
От: BulatZiganshin  
Дата: 12.10.15 12:25
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Есть некий модуль, написанный на C++. Будет портирован на Java и Python.

ROP>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..

а быстродействие пофиг?
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 12:30
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>а быстродействие пофиг?


угу
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 12:32
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Boost.Python же


Как я понял, это для линковки кусков C++ и питона.
Не подходит.
Re[3]: Синхронизация C++ исходника с Java и Python
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.15 12:33
Оценка: :))
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Здравствуйте, jazzer, Вы писали:


J>>Boost.Python же


ROP>Как я понял, это для линковки кусков C++ и питона.

ROP>Не подходит.

Я так понял, тебе надо вычисления на матрице, работающие на С++, вызывать из Питона же? А гуй каким-то образом прикрутить (к чему) на жабе?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 12:44
Оценка:
Здравствуйте, jazzer, Вы писали:

ROP>>Как я понял, это для линковки кусков C++ и питона.

ROP>>Не подходит.

J>Я так понял, тебе надо вычисления на матрице, работающие на С++, вызывать из Питона же? А гуй каким-то образом прикрутить (к чему) на жабе?


Неа. Я же четко написал. Хочу чтобы модуль был написан на одном из трех языков, на на двух остальных генерился из первого. Чисто для удобства синхронизации.

Быстродействие не критично. Более критична простота полученного кода и минимум зависимостей.
Re: Синхронизация C++ исходника с Java и Python
От: Кодт Россия  
Дата: 12.10.15 13:05
Оценка: 1 (1)
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..


Может, тогда в качестве исходного языка выбрать Cython?
Перекуём баги на фичи!
Re: Синхронизация C++ исходника с Java и Python
От: BulatZiganshin  
Дата: 12.10.15 13:07
Оценка: +2
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..


думаю, куда реалистичней найти 4-й язык, с которого моджно генерить проги на этих трёх. но даже в таком раскладе я ничго не припомню. попробуй обратиться в Философию, что ли
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Синхронизация C++ исходника с Java и Python
От: BulatZiganshin  
Дата: 12.10.15 13:13
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Может, тогда в качестве исходного языка выбрать Cython?


The Cython language is a superset of the Python language that additionally supports calling C functions and declaring C types on variables and class attributes. This allows the compiler to generate very efficient C code from Cython code.

т.е. исходники на C будут генериться, на этом всё. разве что есть cython->python трансляторы, вроде там достаточно указание типов убрать?

к слову, вроде была программа которая из кода на Lua генерила последовательность вызовов Lua C API. по идее вещей, такое же можно сварганить и для питона. хотя всё равно нужна будет runtime языка, мы избавимся только от транслирующей части
Люди, я люблю вас! Будьте бдительны!!!
Отредактировано 12.10.2015 13:14 BulatZiganshin . Предыдущая версия .
Re: Синхронизация C++ исходника с Java и Python
От: enji  
Дата: 12.10.15 13:27
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Всем привет!


ROP>Есть некий модуль, написанный на C++. Будет портирован на Java и Python.

ROP>В модуле производятся вычисления на матрице и дёргается GUI через абстрактный интерфейс.

C++ <-> Ява можно наверное один исходник использовать, с небольшим добавлением препроцессора

С питоном наверное тоже проканает, но препроцессора надо будет побольше
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 13:35
Оценка:
Здравствуйте, enji, Вы писали:

E>C++ <-> Ява можно наверное один исходник использовать, с небольшим добавлением препроцессора

E>С питоном наверное тоже проканает, но препроцессора надо будет побольше

В молодости увлекался подобными трюками.
http://rsdn.ru/forum/humour/590646.all
Автор: R.O. Prokopiev
Дата: 01.04.04


Но в рабочий код такие трюки тащить нельзя.
Re[5]: Синхронизация C++ исходника с Java и Python
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.15 13:36
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Неа. Я же четко написал. Хочу чтобы модуль был написан на одном из трех языков, на на двух остальных генерился из первого. Чисто для удобства синхронизации.


ROP>Быстродействие не критично. Более критична простота полученного кода и минимум зависимостей.


Т.е. тебе просто нужна трансляция из одного языка в два других? Я думаю, это можно из Питона сделать — там богатые возможности интроспекции и типов, и самого кода. Только надо будет изобрести что-то вроде венгерской нотации, чтоб типы в Java/C++ прописывать сообразно им.

https://docs.python.org/2/library/dis.html

там простая стек-машина, с которой легко сгенерить код на любом языке.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Отредактировано 12.10.2015 14:52 jazzer . Предыдущая версия .
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 13:39
Оценка:
Здравствуйте, Кодт, Вы писали:

ROP>>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..

К>Может, тогда в качестве исходного языка выбрать Cython?

Спасибо посмотрю.
Кстати есть такая штука Jython и вроде как умеет настоящие джавовские class-файлы выдавать
http://www.jython.org/archive/21/docs/jythonc.html
Re: Синхронизация C++ исходника с Java и Python
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 12.10.15 13:39
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Всем привет!


ROP>Есть некий модуль, написанный на C++. Будет портирован на Java и Python.

Зачем портируется? Какие платформы будут использоваться?
ROP>В модуле производятся вычисления на матрице и дёргается GUI через абстрактный интерфейс.
Что за ГУЙ библиотека?
ROP>Динамическая память напрямую не используется.
Не факт.
ROP>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..
Написать это на метаязыке каком-нибудь, но мне кажется что в С++ это не будет транслироваться, максимум С.
ROP>Вызывать нативный код из управляемого категорически не хочется.
Почему?
ROP>ЗЫ: Посмотрел llvvm+clang. Даже простая конструкция вида "return 42;" превращается в кучу монструзных библиотечных вызовов. Может я не умею его готовить...
Возможно, можно попробовать получить байткод llvm и использоваться бэкенд который компилит всё в байткод джавы/нэйтив. Я не знаю будет ли работать это или нет если что.
Sic luceat lux!
Re[2]: Синхронизация C++ исходника с Java и Python
От: Alexey F  
Дата: 12.10.15 13:56
Оценка: 39 (4)
Здравствуйте, BulatZiganshin, Вы писали:

BZ>думаю, куда реалистичней найти 4-й язык, с которого моджно генерить проги на этих трёх. но даже в таком раскладе я ничго не припомню. попробуй обратиться в Философию, что ли


Врать не буду — сам язык я почти не пробовал, но Haxe обещает что может генерировать Python начиная с 2015 года — правда, фича ещё в стадии beta:

This release introduces the new Python target which was developed by Heinz Hölzer and Dan Korostelev. As with any new target it should be considered to be in beta stage.


Поддержка Java, C++ и JavaScript у него есть довольно давно.
Re: Синхронизация C++ исходника с Java и Python
От: Evgeny.Panasyuk Россия  
Дата: 12.10.15 21:57
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>ЗЫ: Посмотрел llvvm+clang. Даже простая конструкция вида "return 42;" превращается в кучу монструзных библиотечных вызовов. Может я не умею его готовить...


Есть Emscripten на базе Clang+LLVM — он транслирует C++ в JS. Там получается вот такой JS код
Автор: Evgeny.Panasyuk
Дата: 06.06.15
.
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 12.10.15 22:07
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть Emscripten на базе Clang+LLVM — он транслирует C++ в JS. Там получается вот такой JS код
Автор: Evgeny.Panasyuk
Дата: 06.06.15
.


Спасибо. JS не нужен.
Re[3]: Синхронизация C++ исходника с Java и Python
От: Evgeny.Panasyuk Россия  
Дата: 12.10.15 22:17
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>>>ЗЫ: Посмотрел llvvm+clang. Даже простая конструкция вида "return 42;" превращается в кучу монструзных библиотечных вызовов. Может я не умею его готовить...

EP>>Есть Emscripten на базе Clang+LLVM — он транслирует C++ в JS. Там получается вот такой JS код
Автор: Evgeny.Panasyuk
Дата: 06.06.15
.

ROP>Спасибо. JS не нужен.

Я понимаю. Но если дошло до LLVM — то как вариант можно посмотреть и на результирующий JS, может получится его перевести малыми усилиями в нужные языки, или может модифицировать Emscripten так, чтобы сразу генерировал необходимый код.
Re[3]: Синхронизация C++ исходника с Java и Python
От: enji  
Дата: 13.10.15 05:52
Оценка: 1 (1) +1
Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>Но в рабочий код такие трюки тащить нельзя.


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


FUNC(void, myFunc, (int, a)(float b)) {
  DECL(int) c = a + b;
  IF (a > b) {
    c = c - 2;
  }
  g(a, c);
}


Все это обрабатывается стандартным сишным препроцессором, плюс {} для питона убираются. Не так и страшно, на самом деле.

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

Т.е. получается, что надо сделать АПИ для каждого языка, которое одинаково выглядит и скрывает нюансы стандартной библиотеки (выделение памяти — для плюсов будет умный указатель, для питона и явы — пустышки, и т.п.). Плюс макросы, которые скрывают нюансы синтаксиса.

ЗЫ на твой изврат с комментариями по ссылке это все ж не похоже
Отредактировано 13.10.2015 6:01 enji . Предыдущая версия . Еще …
Отредактировано 13.10.2015 5:56 enji . Предыдущая версия .
Re[2]: Синхронизация C++ исходника с Java и Python
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 13.10.15 13:48
Оценка:
Здравствуйте, Кодт, Вы писали:

ROP>>Как бы сделать так чтобы модифицировать файл только на одном языке, а остальные генерились?..

К>Может, тогда в качестве исходного языка выбрать Cython?

Погонял немного. Cython предназначен прежде всего для компиляции питонового кода в натив (и последующего импорта из питона), C — это побочный продукт. Можно делать строгую compile-time типизацию при помощи cdef и пр.,
но совместимость с питоном при этом теряется. Как из cython исходника получить чисто питоновский так и не нашел.
Код без cdef компилится в лапшу, аналогичную llvm+clang. С использованием cdef код получается веселее, но питоновые хелперы всё равно генерятся, похоже они неотключаемые.

enji подсказал похоже самое практичное решение — использовать сишный макропроцессор.
Re[4]: Синхронизация C++ исходника с Java и Python
От: Evgeny.Panasyuk Россия  
Дата: 13.10.15 17:10
Оценка:
Здравствуйте, enji, Вы писали:

ROP>>Но в рабочий код такие трюки тащить нельзя.

E>Ява-плюсы проблем практически не вызывают, если писать на подмножестве обоих языков. Питон-плюсы — немного препроцессора понадобится, плюс соглашение об отступах
E>
E>FUNC(void, myFunc, (int, a)(float b)) {
E>  DECL(int) c = a + b;
E>  IF (a > b) {
E>    c = c - 2;
E>  }
E>  g(a, c);
E>}
E>

E>Все это обрабатывается стандартным сишным препроцессором, плюс {} для питона убираются. Не так и страшно, на самом деле.

В библиотеке TaskGraph (1, 2) видел интересный приём на эту тему:
int main( int argc, char *argv[] ) {
  TG_IntResIntArg T;
  int n = atoi( argv[1] );
  taskgraph( TG_IntResIntArg, T, tuple1(a) ) {
    tVar(int, i);
    tVar(int, j);
    tFor(i, 0, n-1) {
      tFor(j, 0, n-1) {
        tPrintf("Iteration i=%d, j=%d\n", i, j);
      }
    }
    tReturn(a + n);
  }
  InterchangeSettings inter;
  inter.firstLoop = LoopIdentifier ( 1 );
  inter.secondLoop = LoopIdentifier ( 1, 1 );
  T.applyOptimisation ( "interchange", &inter );
  T.compile( tg::GCC, true );
  printf( "T(%d) = %d\n", n, T(n) );
}

Макросы в середине функции (tVar, tFor и т.п.) описывают код вычислительного ядра. Это описание в конце концов переводится во время выполнения в код стороннего языка. (помимо этого там ещё производятся оптимизации циклов, через обработку полученного AST)

Основная фишка в том, то что эти макросы могут отличать начало/конец scope. То есть примирительно к задаче ТС можно автоматом расставлять отступы в Python, а для C++/Java расставлять скобки.
Вот дистиллированный пример:
#include <iostream>
#include <ostream>
#include <sstream>
#include <string>
 
using namespace std;
 
int level = 0;
void print_indent()
{
    cout << string(level*4,' ');
}
 
class Integer
{
    string name;
public:
    Integer()
    {
        static int counter = 0;
        stringstream ss;
        ss << "var" << (++counter);
        name = ss.str();
        print_indent();
        cout << "int " << name << "=0;" << endl;
    }
    Integer &operator++()
    {
        print_indent();
        cout << "++" << name << ";" << endl;
        return *this;
    }
    Integer &operator=(const Integer &rhs)
    {
        print_indent();
        cout << name << "=" << rhs.name << ";" << endl;
        return *this;
    }
};
class Block
{
    bool done;
public:
    Block()
        : done(false)
    {
        print_indent();
        cout << "{" << endl;
        ++level;
    }
    bool next()
    {
        return !done;
    }
    void after()
    {
        --level;
        print_indent();
        cout << "}" << endl;
        done = true;
    }
};
 
#define BLOCK for(Block b##__LINE__;b##__LINE__.next();b##__LINE__.after())
 
int main()
{
    BLOCK {
        Integer a,b;
        a=b;
        ++a;
        Integer c;
        BLOCK
            a=b=c;
        ++b;
        BLOCK {
            b=++a;
            c=++a;
        }
    }
}
stdout этого кода:
{
    int var1=0;
    int var2=0;
    var1=var2;
    ++var1;
    int var3=0;
    {
        var2=var3;
        var1=var2;
    }
    ++var2;
    {
        ++var1;
        var2=var1;
        ++var1;
        var3=var1;
    }
}

Получается эдакий runtime EDSL. Как видно таким способом легко получить и код Python, и C++, и Java.
Re: Синхронизация C++ исходника с Java и Python
От: novitk США  
Дата: 13.10.15 17:42
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

Для явы есть NestedVM, это транслятор какой-то целевого ассемблера gcc(MIPS?) в jvm байткод. Он вроде использовался(yется) для создания pure java sqlite. Вещь древняя и с Питоном облом.
Re[2]: Синхронизация C++ исходника с Java и Python
От: T4r4sB Россия  
Дата: 13.10.15 18:10
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>думаю, куда реалистичней найти 4-й язык, с которого моджно генерить проги на этих трёх. но даже в таком раскладе я ничго не припомню.


m4
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: Синхронизация C++ исходника с Java и Python
От: Erop Россия  
Дата: 16.10.15 09:59
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>ЗЫ: Посмотрел llvvm+clang. Даже простая конструкция вида "return 42;" превращается в кучу монструзных библиотечных вызовов. Может я не умею его готовить...


По идее можно взять какой-то язык с развитой макраснёй, и писать макросы так, что бы оно в 4-х режимах работало
1) Исполнение прямо на этом языке
2) вывод куда-то текста на С++
3) и 4) так же для двух других...

Ну и вперёд.

В связи с этим вопрос. А немерле у вас юзать можно?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.