[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Bridging Lua to native C/C++ code automatically
- From: Don Hopkins <dhopkins@...>
- Date: Tue, 29 Aug 2006 09:30:40 -0700
That's amazing! I'm glad I asked -- thanks for the info and code snippets.
I agree about importance of playing nicely (and efficiently) with C and
C++.
In spite of JavaScript's popularity as a "consumer scripting language",
I've decided to use Lua instead of SpiderMonkey for my Windows CE
project, because it's so much easier to integrate, and vastly more
efficient.
This benchmark convinced me. (I know benchmarks are flawed and subject
to interpretation, but this really shows the difference is like night
and day. I wonder why Lua uses so much memory for fannkuch, but that's
the exception that proves the rule.)
Speed and memory usage of Lua -vs- SpiderMonkey:
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=lua&lang2=javascript
I'll definitely check out Elastos -- it looks like a nice solution to
some difficult problems.
Good luck with your release: I'm looking forward to seeing it!
-Don
Rong Chen wrote:
>> From: "Don Hopkins" <dhopkins@DonHopkins.com>
>>
>> I'd like to wrap a bunch of the Win32 telephony and other APIs that are
>> unique to pocket pc phones. I'd also like an ActiveX interface that lets
>> you easily integrate ActiveX / OLE Automation objects with Lua. The
>> "jsdb" project does that for JavaScript, so I'm sure it could be done
>> for Lua. The tricky part (that jsdb's ActiveX integration doesn't
>> support) is receiving ActiveX events and sending them to Lua
>> (IConnectionPointContainer et al). Python's win32com module does all
>> that stuff, and it's extremely useful. I'd love that for Lua on Windows
>> and Windows CE.
>>
>> -Don
>>
>>
>
> Hello Don,
>
> We are doing something along that line for a few years now, fast approaching
> its release deadline. The goal of this project, called Elastos, is to
> overcome the shortcomings of ActiveX/ OleAutomation/ IConnectionPoint/ etc.
> and to help C/C++ programmers to move to Web Service Age. There are
> currently Widgets running on Windows, Linux and a smart-phone using XML+
> Lua+ DLL (compiled C/C++ code). Of course, we also support JavaScript/ Ruby
> and so on. All of our native DLLs are automation/ reflection-enabled, i.e.,
> binary code packaged with meta-data, so Lua could script DLLs directly.
> Implemented classes/ interfaces/ methods/ arguments of a DLL automatically
> become XML tags, recursively. Dlls run on a distributed/ grid operating
> platform layer which has all bells and whistles wrapped in self-describing
> classes and interfaces, i.e., process, thread, mutex, file, RPC, window
> controls, 2D/3D-graphics, everything. Elastos also let programmers declare
> URL (assigned a URL to every DLL), module, class, interface, callback,
> aspect, domain, context, aggregate, synchronized, etc. in an ODL like
> language called CAR (Component Assembly Runtime). Everything fits in the
> footprint of an embedded system (PDA or Smart-phone or Windows/ Linux).
>
> In conclusion, we think of Elastos as "JAVA on steroids" -- lean, mean, and
> fast, for system programmers. Don't take me wrong, we support JAVA on our
> smart-phone, on top of Elastos, because so many cell phone games rely on
> J2ME. Seriously, however, how many desktops run on CPUs other than x86?
> Similarly, how many smart-phones run on non-ARM based CPUs? Virtually none,
> for both questions. Sure, byte-code has its advantages. But in the world
> of embedded and system programming, we can't simply leave C/C++ behind.
> Wouldn't it be wonderful if byte-code and native-code collaborate, all live
> in harmony?
>
> We are thinking about dual licensing Elastos, like QT, but no final words
> from our lawyers yet. Feel free to drop me questions.
>
> Best regards,
>
> Rong Chen (Ex-team member of ActiveX/ IConnectionPoint/ OleAutomation :-)
>
> Koretide Corp.
> -----------------------------------------------
> Addr: 2nd Floor, Bld.#17, 498 Guo Shoujing Road
> Pudong District, Shanghai 201203
> P.R.China
> Tel: + 86 21 5131-4260
> Fax: + 86 21 5131-4261
> Skype: chen.rong
> Email: chenrong@elastos.com
>
>
>
>
> Ps: Last, but not least, some code snippets...
>
> Lua example ------------------------------------------
>
> <?xml version="1.0" encoding="utf-8"?>
> <x:xmlglue xmlns:x="http://www.elastos.com/xml-glue" xmlns:w="elactrl.dll">
> <w:form x:id="MainForm" nControlStyle="FormStyle_DoubleBuffer,
> FormStyle_PixelAlphaChannel,
> ControlStyle_NoBackground" esCaption="sub" nLeft="20"
> nTop="120" nWidth="100" nHeight="120">
> <w:pictureBox x:id="picBox" nLeft="0" nTop="0" nWidth="100"
> nHeight="120" nControlStyle="ControlStyle_NoBackground"/>
> </w:form>
> <script language="lua">
>
> function OnMouseDown(st, x, y, b)
> MainForm:SetWindowLevel(1)
> end
>
> function OnKeyDown(src, id, d)
> if id == 141 or id == 144 or id == 137 then
> MainForm:KillTimer(1)
> MainForm:Close()
> end
> end
>
> j = 0;
> images = {}
> elagdi = Elastos.Using("elagdi.dll")
> for j = 1, 17 do
> filename = "dancer" .. j .. ".png"
> image = elagdi.CImage()
> image:InitFromFile(resource(filename))
> images[j] = image
> end
>
> function OnTimer()
> local i = 1
> return function(src, id)
> i = i % 17 + 1
> picBox:SetImage(images[i])
> src:Update()
> end
> end
>
> picBox:SetImage(images[1]);
> MainForm:SetStackingClass(2)
> MainForm:SetTimer(1, 80)
>
> MainForm.Timer = OnTimer()
> picBox.MouseDown = OnMouseDown
> MainForm.KeyDown = OnKeyDown
> MainForm.InActive = OnLostFocus;
> MainForm.Active = OnGotFocus;
> MainForm:Show()
>
> </script>
> </x:xglue>
>
> JavaScript ------------------------------------------
>
> function onButtonClick(src) {
> print(src.text + " clicked!");
> }
>
> elactrl = Elastos.Using("elactrl.dll");
> form = elactrl.Form.New(
> "JavaScriptDemo", 0, 0, 240, 320, 0);
> button = elactrl.Button.New(
> "Hello", 90, 60, 60, 25, 0, form);
> button.Click = onButtonClick;
> form.Show();
>
>
> C/C++ ------------------------------------------
>
> #include <stdio.h> // support mostly standard .h files
> #import <foobar.dll> // DLLs are used in design-time and run-time
>
> Boolean exitFlag = FALSE;
>
> ECode OnClick(IFoo sender) {
> exitFlag = TRUE;
> return NOERROR;
> }
>
> int main()
> {
> IBar* pBar;
> ECode ec = CFooBar::New("Hello", &pBar); // allow constructors. btw,
> CProcess::New(..), CThread::New(..) works as well.
> // ECode ec = CButton::NewInContext(pOuterSpace, "Hello", &pBar); //
> trying to contact aliens on a machine far, far away...
> if (FAILED(ec)) { … }
> pBar->Bar();
>
> IFoo* pFoo;
> ec = IFoo::Query(pBar, &pFoo); // does the object support IFoo?
> if (FAILED(ec)) { … }
> pFoo->Foo();
>
> CFooBar::AddClickCallback(pFoo, &OnClick); // bind a callback handler
> while (exitFlag == FALSE) sleep(1); // waiting for the callback handler
> to be called...
>
> pBar->Release(); // still use the good ol' reference counting,
> unfortunately.
> pFoo->Release();
> return 0;
> }
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>