Соединение языков

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

15
задан Community 23 May 2017 в 12:16
поделиться

9 ответов

Повышение. Python обеспечивает простой способ превратить код C++ в модули Python. Это является довольно сформировавшимся и работает хорошо, по моему опыту.

, Например, неизбежность Привет Мир...

char const* greet()
{
  return "hello, world";
}

может быть выставлен Python путем записи Повышения. Обертка Python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
  using namespace boost::python;
  def("greet", greet);
}

Вот именно. Мы сделаны. Мы можем теперь создать это как общая библиотека. Получающийся DLL теперь видим к Python. Вот демонстрационная сессия Python:

>>> import hello_ext
>>> print hello.greet()
hello, world

(пример, взятый с boost.org)

14
ответ дан 1 December 2019 в 00:41
поделиться

Во-первых, комментарий meta: Я настоятельно рекомендовал бы кодирование всей вещи на высокоуровневом языке, профилировании как безумный, и оптимизация только там, где профилирование показывает, что это необходимо. Сначала оптимизируйте алгоритм, затем код, затем думайте о введении тяжелого железа. Наличие оптимального алгоритма и чистого кода сделает вещи намного легче, когда/если необходимо будет повторно реализовать на языке низшего уровня.

Выступание за Python, IronPython/C# является, вероятно, самым легким путем оптимизации.

CPython с C++ является выполнимым, но я нахожу C намного легче обработать (но не все что легкий, будучи C). Два инструмента, которые упрощают это, цитон / пирекс (для C) и shedskin (для C++). Они компилируют Python в C/C++, и оттуда можно получить доступ к библиотекам C/C++ без слишком большого количества суматохи.

я никогда не использовал jython, но я слышу, что jython/Java путь оптимизации не все настолько плохо.

9
ответ дан 1 December 2019 в 00:41
поделиться

Я соглашаюсь с Идеей кодировать сначала на высокоуровневом языке, таком как Python, Представляя и затем Реализовывая любой код, для которого нужно ускорение в C / C++ и обертывание его для использования на высокоуровневом языке.

Как альтернатива для повышения я хотел бы предложить БОЛЬШОЙ ГЛОТОК для создания Python вызываемый код от C. Его довольно безболезненное для использования, и скомпилирует вызываемые модули для широкого спектра языков. (Python, Ruby, Java, Lua. для именования некоторых) из кода C.

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

6
ответ дан 1 December 2019 в 00:41
поделиться

При выборе Perl существует много ресурсов для взаимодействия через интерфейс с другими языками.

Встроенный:: Встроенный C
:: Встроенный CPP
:: Java

От Встроенный:: C-поваренная-книга :

use Inline C => <<'END_C';

  void greet() {
    printf("Hello, world\n");
  }
END_C

greet;
<час>

С PerlВ 6 становится еще легче импортировать подпрограмму из собственного кода библиотеки с помощью NativeCall.

use v6.c;

sub c-print ( Str() $s ){
  use NativeCall;

  # restrict the function to inside of this subroutine because printf is
  # vararg based, and we only handle '%s' based inputs here

  # it should be possible to handle more but it requires generating
  # a Signature object based on the format string and then do a
  # nativecast with that Signature, and a pointer to printf

  sub printf ( str, str --> int32 ) is native('libc:6') {}

  printf '%s', $s
}

c-print 'Hello World';

Это - просто простой пример, можно создать класс, который имеет представление Указателя, и имейте некоторые методы быть кодом C из библиотеки, которой Вы пользуетесь. (только работы, если бы первым аргументом кода C является указатель, иначе необходимо было бы перенести его)

при необходимости в подпрограмме/имени метода PerlВ 6, чтобы отличаться, можно использовать is symbol модификатор черты.

существуют также Встроенные модули для PerlВ 6 также.

5
ответ дан 1 December 2019 в 00:41
поделиться

Perl имеет несколько способов использовать другие языки. Посмотрите эти Встроенный:: семейство модулей на CPAN. Следуя совету от других в этом вопросе, я записал бы все это на единственном динамическом языке (Perl, Python, Ruby, и т.д.) и затем оптимизировал бы биты, которым нужен он. С Perl и Встроенный:: можно оптимизировать в C, C++ или Java. Или Вы могли посмотреть AI:: Пролог , который позволяет Вам встраивать Пролог к AI/логическому программированию.

4
ответ дан 1 December 2019 в 00:41
поделиться

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

, Например, вызов Java из рубинового сценария работает вполне хорошо.

require "java"
# The next line exposes Java's String as JString
include_class("java.lang.String") { |pkg, name| "J" + name }
s = JString.new("f")
2
ответ дан 1 December 2019 в 00:41
поделиться

Можно создать программу в одном из высокоуровневых языков, например, Python или Ruby и затем назвать модули, которые компилируются на более низком языке уровня для частей, Вам нужна производительность. Можно выбрать платформу в зависимости от более низкого языка уровня, который Вы хотите.

, Например, если Вы хотите сделать C++ для быстрого материала, можно просто использовать плоскость Python или Ruby и назвать DLLs скомпилированным в C++. Если Вы хотите использовать Java, можно использовать Jython, или один из других динамических языков на платформе Java для вызова Java кодируют, это легче, чем маршрут C++, потому что у Вас есть общая виртуальная машина, таким образом, объект Java может использоваться непосредственно в Jython или JRuby. То же может быть сделано на платформе .NET с Железными языками и C#, хотя у Вас, кажется, есть больше опыта с C++ и Java, таким образом, это были бы более оптимальные варианты.

2
ответ дан 1 December 2019 в 00:41
поделиться

У меня есть другая точка зрения, имея большую удачу с интеграцией C++ и Python для некоторой оперативной живой обработки видеоизображения.

я сказал бы, что необходимо соответствовать языку к задаче для каждого модуля. При ответе на сеть сделайте это в Python, Python может не отставать от сетевого трафика очень хорошо. UI: Python, Люди являются медленными, и Python является большим для UIs, использующего wxPython или PyObjC на Mac или PyGTK. Если Вы делаете математику на большом количестве данных или обработку сигналов, или обработка изображений... кодирует ее в C или C++ с модульными тестами, то использует БОЛЬШОЙ ГЛОТОК для создания привязки к любому высокоуровневому языку.

я использовал библиотеки изображений в wxWidgets в моем C++, которые уже выставляются Python через wxPython, таким образом, это было чрезвычайно мощно и быстро. SCONS является инструментом сборки (как, делают), который знает, что сделать с.i файлами большого глотка.

самый верхний уровень может быть в C или Python, Вы будете иметь больше контроля и меньше упаковки и проблем развертывания, если верхний уровень будет в C или C++..., но будет действительно требоваться много времени для дублирования то, что Py2EXE или Py2App дают Вам в Windows или Mac (или замораживание на Linux.)

Обладают питанием гибридного программирования! (Я называю использование нескольких языков сильно связанным способом 'гибридом', но это - просто моя причуда.)

1
ответ дан 1 December 2019 в 00:41
поделиться

Если бы проблемная область трудна (и проблемы AI могут часто быть трудными), то я выбрал бы язык, который выразителен или подходящий для домена сначала, и затем волнуйтесь об ускорении его второй. Например, Ruby имеет примитивы метапрограммирования (способность легко исследовать и изменить под управлением программу), который может сделать очень легким/интересным реализовать определенные типы алгоритмов.

при реализации его таким образом и затем более поздняя потребность ускорить его, затем можно использовать сравнительное тестирование/профилирование, чтобы определить местоположение узкого места и или ссылка на скомпилированный язык для этого или оптимизировать алгоритм. По моему опыту, самое большое увеличение производительности от тонкой настройки алгоритма, не от использования другого языка реализации.

1
ответ дан 1 December 2019 в 00:41
поделиться