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

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

Jan 22, 2016

Download

Documents

aleda

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
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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