31
S B ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal Peter Verhás 2002 március 26.

ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

  • Upload
    aleda

  • View
    30

  • Download
    0

Embed Size (px)

DESCRIPTION

ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal. Peter Verh á s 2002 március 26. Tartalom. Java programozás kiterjesztése JNI felülettel Perl XS modulok PHP külső modulok. JNI: Java Native Interface. - PowerPoint PPT Presentation

Citation preview

Page 1: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B

ScriptBasic külső modulok kezelése, összehasonlítás más

alkalmazásokkal

Peter Verhás2002 március 26.

Page 2: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Tartalom

• Java programozás kiterjesztése JNI felülettel

• Perl XS modulok• PHP külső modulok

Page 3: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B JNI: Java Native Interface

http://java.sun.com/docs/books/tutorial/native1.1/concepts/index.html

JRE

modul.dll

JNI

A Java nyelvhez lehet C nyelven programokat írni ennek a felületnek a felhasználásával.

Page 4: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B JNI modul írásának lépései

1. Java program írásával kell kezdeni. A Java osztályt kell létrehozni, amelyik deklarálja a natív függvényeket, és a main metódust, amelyik meghívja majd a natív függvényt.

2. Lefordítjuk a Java osztályt a javac fordítóval.3. A javah –jni programmal létrehozzuk a C

fejléc fájlt. Ebben benne van a függvények prototípusa.

4. Implementáljuk C-ben a függvényeket.5. Lefordítjuk a függvényeket DLL-be (vagy SO-

ba)6. Futtatjuk a Java programot.

Page 5: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Példa: halló világ

class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }

Page 6: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B javah -jni

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */

#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);

#ifdef __cplusplus}#endif#endif

Page 7: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Név dekoráció

Java_HelloWorld_displayHelloWorld

•Java prefix•HelloWorld osztály név•displayHelloWorld metódus név

Page 8: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Paraméterek

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld

(JNIEnv *, jobject);

• JNIEnv futtatási környezet• jobject az aktuális objektum

Page 9: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Implementált C kód

#include <jni.h>#include "HelloWorld.h"#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *env, jobject obj){ printf("Hello world!\n"); return;}

Page 10: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Második példa: getsLine

• Java kódclass Prompt {

private native String getLine(String prompt);

public static void main(String args[]) {

Prompt p = new Prompt();

String input = p.getLine("Type a line: ");

System.out.println("User typed: " + input);

}

static {

System.loadLibrary("MyImpOfPrompt");

}

}

Page 11: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B C kód

JNIEXPORT jstring JNICALLJava_Prompt_getLine(JNIEnv *env, jobject obj, jstring

prompt){ char buf[128]; const char *str = (*env)->GetStringUTFChars(env, prompt, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, prompt, str); ...

Page 12: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Második példa: getLine, getLine2

• Java kód:class Prompt2 {

private native String getLine(String prompt);

private native String getLine(String prompt, int length);

public static void main(String args[]) {

Prompt2 p = new Prompt2();

String input = p.getLine("Type a line: ");

System.out.println("User typed: " + input);

}

static {

System.loadLibrary("MyImpOfPrompt2");

}

}

Page 13: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Név dekoráció

/* * Class: Prompt2 * Method: getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL

Java_Prompt2_getLine__Ljava_lang_String_2 (JNIEnv *, jobject, jstring);

/* * Class: Prompt2 * Method: getLine * Signature: (Ljava/lang/String;I)Ljava/lang/String; */JNIEXPORT jstring JNICALL

Java_Prompt2_getLine__Ljava_lang_String_2I (JNIEnv *, jobject, jstring, jint);

Page 14: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Mit tehet egy JNI függvény?

• Java füzér kezelés• Java tömb kezelés• Java metódusok meghívása• Java változó kezelése (név

dekoráció)• Kivételkezelés• ...

Page 15: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B JNI összefoglaló

• Függvény név kötött, függ a többi függvénytől (overload)

• Nincs boot/finish függvény (legyen Java szinten kezelve)

• Nincs statikus linkelés

Page 16: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Perl külső függvények írása

• Speciális XS nyelven, ami C kiterjesztés

• XS -> C fordító

Page 17: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Demó XS készítése

• h2xs -A -n Mytest– Elkészít minden szükséges alap fájlt– Mytest.xs– Makefile.PL– Mytest.pm

Page 18: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Mytest.xs

#include "EXTERN.h"#include "perl.h"#include "XSUB.h"

MODULE = Mytest PACKAGE = Mytest

voidhello() CODE: printf("hello");

Page 19: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Az XS-ből generált C fájl 1/3

/* * This file was generated automatically by xsubpp version

1.9508 from the * contents of Mytest.xs. Do not edit this file, edit

Mytest.xs instead. * * ANY CHANGES MADE HERE WILL BE LOST! * */

#line 1 "Mytest.xs"#include "EXTERN.h"#include "perl.h"#include "XSUB.h"

#line 16 "Mytest.c"

Page 20: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Az XS-ből generált C fájl 2/3

XS(XS_Mytest_hello){ dXSARGS; if (items != 0)

Perl_croak(aTHX_ "Usage: Mytest::hello()"); {#line 11 "Mytest.xs" printf("hello");#line 25 "Mytest.c" } XSRETURN_EMPTY;}

Page 21: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Az XS-ből generált C fájl 3/3

#ifdef __cplusplusextern "C"#endifXS(boot_Mytest){ dXSARGS; char* file = __FILE__;

XS_VERSION_BOOTCHECK ;

newXS("Mytest::hello", XS_Mytest_hello, file);

XSRETURN_YES;}

Page 22: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Mytest.pm

package Mytest;use 5.006;use strict;use warnings;require Exporter;require DynaLoader;our @ISA = qw(Exporter DynaLoader);our %EXPORT_TAGS = ( 'all' => [ qw( ) ] );our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );our @EXPORT = qw();our $VERSION = '0.01';bootstrap Mytest $VERSION;1;__END__

Page 23: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Php architektúra

Page 24: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP kiterjesztés minta 1/3

/* include standard header */#include "php.h"

/* declaration of functions to be exported */ZEND_FUNCTION(first_module);

/* compiled function list so Zend knows what's in this module */zend_function_entry firstmod_functions[] ={ ZEND_FE(first_module, NULL) {NULL, NULL, NULL}};

Page 25: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP kiterjesztés minta 2/3

/* compiled module information */zend_module_entry firstmod_module_entry ={ STANDARD_MODULE_HEADER, "First Module", firstmod_functions, NULL, NULL, NULL, NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};

Page 26: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP kiterjesztés minta 3/3

/* implement standard "stub" routine to introduce ourselves to Zend */#if COMPILE_DL_FIRST_MODULEZEND_GET_MODULE(firstmod)#endif

/* implement function that is meant to be made available to PHP */ZEND_FUNCTION(first_module){ long parameter;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &parameter) == FAILURE) {

return; }

RETURN_LONG(parameter);}

Page 27: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP kód amit ezt használja

<?php dl("first_module.so");

$param = 2;$return = first_module($param);

print("We sent '$param' and got '$return'");

?>

Page 28: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP függvény prototípus

ZEND_FUNCTION ( my_function );

Kifejtve:

void zif_my_function( int ht, argumentumok száma

zval * return_value, zval * this_ptr, objektum pointer

int return_value_used, a hívónak kell a visszatérési érték?

zend_executor_globals * executor_globals );

Page 29: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B PHP kiterjesztés

http://www.zend.com/apidoc/zend.php

• Multi-process, single-thread• emalloc a memóriavesztés ellen,

de nem többszálú• Van processz és szál

startup/shutdown, de ezek a szálak nem konkurrensek

Page 30: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B Összehasonlítás

Java• DLL• dekorált név• multi-thread

PHP• static/DLL• nem

dekorált név• single-

thread

Perl• DLL/static• dekorált név• multi-

thread?

ScriptBasic• DLL/static• nem dekorált név• multi-thread

Page 31: ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal

S B

Köszönöm a figyelmet