Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2011-08

New FPC target: JVM

46 messages · 15 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Jonas Maebe

Hi,

There is a new branch in svn (branches/jvmbackend) that contains support for compiling Pascal code into Java virtual machine bytecode. While it does not support all language constructs and while there are some differences in some features that are supported, in general the result is fairly close to "normal Pascal" you'd write.

Note however that this is a pure compiler port at this time. That means that while most of the language support is fairly complete, pretty much no standard Pascal units are available. For all practical intents and purposes there is only the system unit, and even that one misses many routines (including helpers required for basic functions such as read(ln)/write(ln), val, str, delete, pos, ...).

On the other hand, a unit that contains the entire public interface of the JDK 1.5 is available. Over time, it should be possible to provide most of the standard functionality of the system unit (and other units) implemented on top of that unit, or rewritten in Pascal code that does not depend on untyped pointer accesses.

Download information, usage information etc is available at http://wiki.freepascal.org/FPC_JVM

Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that.

Enjoy!

Jonas

PS: no, this does not mean that FPC development from now on will only, or even primarily, focus on managed language support. And the infrastructure added for JVM support will make an LLVM port a lot more feasible in the future, because there is now a code generator layer that uses high level type information.

Reply by email

Felipe Monteiro de Carvalho
to Jonas Maebe

Hello,

Does this port generate Java Bytecode directly or does it generate first Java Assembler and then feeds that into an internal assembler?

I ask because Android does not use Java Bytecode, it has it's own, completely different bytecode.

Felipe Monteiro de Carvalho

Reply by email

Jonas Maebe
to Felipe Monteiro de Carvalho
Felipe Monteiro de Carvalho wrote
Does this port generate Java Bytecode directly or does it generate first Java Assembler and then feeds that into an internal assembler?

It generates Java assembler and then feeds it into an external assembler (Jasmin).

I ask because Android does not use Java Bytecode, it has it's own, completely different bytecode.

I thought it was possible to convert Java class files into Dalvik class files?

Jonas

Reply by email

Graeme Geldenhuys
to Felipe Monteiro de Carvalho: Does this port generate Java Bytecode directly or does it generate first Java Assembler…
Felipe Monteiro de Carvalho wrote
I ask because Android does not use Java Bytecode, it has it's own, completely different bytecode.

Why did Google do that? Why not stay with the standardized Java and get the benefits of all existing Java and Mobile Java apps?

Sometimes these software vendors can be really brain dead! They just love proprietary or incompatible stuff. Java was designed to be compatible on all platforms, now Android calls it "java", but it's not compatible with Sun/Oracle's Java. This sounds just like what Microsoft did years ago - luckily Sun put a stop to that.

I don't know much about Android, but just when I thought it sounded great, I hear things like this. :-(

Regards,   - Graeme - _______________________________________________ fpGUI - a cross-platform Free Pascal GUI toolkit http://fpgui.sourceforge.net

Reply by email

Mattias Gaertner
to Graeme Geldenhuys
Show quoted text 6 lines
On 20 August 2011 13:30, Felipe Monteiro de Carvalho wrote: > > I ask because Android does not use Java Bytecode, it has it's own, > completely different bytecode. Why did Google do that?

Why don't you google yourself?

http://lmgtfy.com/?q=android+byte+code

Why not stay with the standardized Java and get the benefits of all existing Java and Mobile Java apps?

What benefits do you miss?

Sometimes these software vendors can be really brain dead!

Let's summarize. You

1. do not understand something
2. ask this list
3. do not wait for the answer
4. call it "brain dead"

That is not very clever, is it?
I guess some people would call this "brain dead".

Show quoted text 8 lines
They just love proprietary or incompatible stuff. Java was designed to be compatible on all platforms, now Android calls it "java", but it's not compatible with Sun/Oracle's Java. This sounds just like what Microsoft did years ago - luckily Sun put a stop to that. I don't know much about Android, but just when I thought it sounded great, I hear things like this. :-(

Java is just a language. Normally you need the jdk and some third party libs. And here you got the x-platform problems. I know some projects that had too many problems porting their java projects and switched to fpc.

A jvm backend for fpc is great. I hope it is not too much work to maintain.

Mattias

Reply by email

Max Vlasov
to Jonas Maebe: There is a new branch in svn (branches/jvmbackend) that contains support for compiling…
Jonas Maebe wrote 8 lines
There is a new branch in svn (branches/jvmbackend) that contains support for compiling Pascal code into Java virtual machine bytecode. While it does not support all language constructs and while there are some differences in some features that are supported, in general the result is fairly close to "normal Pascal" you'd write.

Great new indeed! Just curious, is there an example program in pascal for jvm that can be compiled and seen in action? I checked out tests, but looking at random ones, they looks like console mode ones testing different rtl aspects. I'm talking about maybe a simplest one for example drawing a rectangle at the center of the window.

Max

Reply by email

Jonas Maebe
to Max Vlasov
Max Vlasov wrote 5 lines
Great new indeed! Just curious, is there an example program in pascal for jvm that can be compiled and seen in action? I checked out tests, but looking at random ones, they looks like console mode ones testing different rtl aspects. I'm talking about maybe a simplest one for example drawing a rectangle at the center of the window.

No, I have not created any gui test programs.

Jonas

Reply by email

Nikolai Zhubr
to Graeme Geldenhuys: Why did Google do that? Why not stay with the standardized Java and get the benefits of…

20.08.2011 19:02, Graeme Geldenhuys:

Show quoted text 7 lines
On 20 August 2011 13:30, Felipe Monteiro de Carvalho wrote: > > I ask because Android does not use Java Bytecode, it has it's own, > completely different bytecode. Why did Google do that? Why not stay with the standardized Java and get the benefits of all existing Java and Mobile Java apps?

IIRC Google was unhappy with java's licensing and/or management and did not happen to arrange it all with Sun in peacefull and mutually acceptable manner so they (Google) then opted to step away and create a separate new product formally unrelated of java and not bearing Sun's copyrights (which still didn't prevent subsequent patent harassment from Oracle however)

Now, regarding mobile java, you might notice that while you still can do a /svn/phoneme~svn (and it will still mostly
work), the project looks and feels like essentially abandoned (no bugfixes/cleanups around, links bringing you to 404 pages etc etc) Of course there might be some development going on at Oracle internally, but there is no visible sign of it AFAICS.

Nikolai

Reply by email

Jonas Maebe
to Jonas Maebe: No, I have not created any gui test programs. Jonas
Jonas Maebe wrote
No, I have not created any gui test programs.

There's also the problem mentioned at http://wiki.freepascal.org/FPC_JVM/Language#Using_JDK_functionality :

"The javapp utility cannot handle circular references involving nested classes, because they cannot be expressed in Pascal. There is one such circular reference in the standard JDK, between java.awt.Window and java.awt.Dialog. This is currently worked around declaring java.awt.Dialog as a formal class, which means that none of its methods, fields or nested classes are available."

Dialogs are generally fairly common in GUI programs...

The problem is that the following circular dependency: java.awt.Dialog is a subclass of java.awt.Window and hence java.awt.Window has to be declared first. However, java.awt.Window has a field (modalExclusionType) whose type is java.awt.Dialog.ModalExclusionType (i.e., a nested class of java.awt.Dialog, so java.awt.Dialog has to be declared first).

Normally, issues of this second kind are resolved by creating a forward declaration of the involed class (type JADialog.ModalExclusionType = class;), but you can't do that for nested classes outside their enclosing class. I could extend the javapp utility to enable specifying also nested classes as formal classes so that you'd only lose the definition for java.awt.Dialog.ModalExclusionType rather than for all of java.awt.Dialog, but that still would only partially work around the basic problem.

Jonas

Reply by email

Joost van der Sluis
to Hans-Peter Diettrich: A .NET or Dalvik backend is feasable as easy as a JVM backend. Question is the use of…
Hans-Peter Diettrich wrote
A .NET or Dalvik backend is feasable as easy as a JVM backend. Question is the use of such an code generator, without an RTL, FCL, debugger etc.

As 'easy'? Do you have any idea how much work Jonas, one of the most experienced developers who are working on fpc, has done to accomplish this?

I've seen a lot of mails on this mailing list about all sort of features, including a JVM target. But no-one who actually started to work seriously on it.

I know that you did not mean to degrade Jonas' work with this comment. But please think about that before you send emails. I think you could expressed yourself differently without the unmentioned negative tone.

I'm really happy with Jonas hard work on this target, and want to thank him for all this (and other) work he did and does for fpc.

Reply by email

Jonas Maebe
to Joost van der Sluis: As 'easy'? Do you have any idea how much work Jonas, one of the most experienced…
Joost van der Sluis wrote
On Sun, 2011-08-21 at 00:11 +0200, Hans-Peter Diettrich wrote: > A .NET or Dalvik backend is feasable as easy as a JVM backend. Question > is the use of such an code generator, without an RTL, FCL, debugger etc.

Debuggers exist (any debugger that can deal with Java byte code should work). It's true that the usefulness will largely depend on people interested in fleshing out the RTL, and possibly also an FCL. A lot of functionality can be replicated by wrapping JDK classes though.

I think you could expressed yourself differently without the unmentioned negative tone.

No harm done.

I'm really happy with Jonas hard work on this target, and want to thank him for all this (and other) work he did and does for fpc.

To make sure that credit is given where credit is due: I want to especially thank Paul Ishenin for his work on implementing Delphi-style "advanced records" and extending the class support with nested classes, class constants, final classes etc, because without him I would have had to implement all of that myself for this port :) And Florian/Peter for the code generator design, that made it possible to gradually add a high level code generator on top of it rather than having to completely rewrite it.

Jonas

Reply by email

dmitry boyarintsev
to Jonas Maebe
Jonas Maebe wrote
And Florian/Peter for the code generator design, that made it possible to gradually add a high level code generator on top of it rather than having to completely rewrite it.

So there're actually 2 code generators right now. One is used for JVM and another is used for native machine code?

thanks,
Dmitry

Reply by email

Paul Ishenin
to Jonas Maebe: Debuggers exist (any debugger that can deal with Java byte code should work). It's true…
Jonas Maebe wrote 8 lines
To make sure that credit is given where credit is due: I want to especially thank Paul Ishenin for his work on implementing Delphi-style "advanced records" and extending the class support with nested classes, class constants, final classes etc, because without him I would have had to implement all of that myself for this port :) And Florian/Peter for the code generator design, that made it possible to gradually add a high level code generator on top of it rather than having to completely rewrite it.

Sad that "units with dots" feature was blocked previosly - it would allow you to write java classes as is with namespace prefix instead of use abbrevations.

Best regards,
Paul Ishenin

Reply by email

Alex Shishkin
to Paul Ishenin: Sad that "units with dots" feature was blocked previosly - it would allow you to write…

21.08.2011 7:03, Paul Ishenin пишет:

Show quoted text 16 lines
21.08.2011 6:28, Jonas Maebe wrote: > To make sure that credit is given where credit is due: I want to > especially thank Paul Ishenin for his work on implementing > Delphi-style "advanced records" and extending the class support with > nested classes, class constants, final classes etc, because without > him I would have had to implement all of that myself for this port :) > And Florian/Peter for the code generator design, that made it > possible to gradually add a high level code generator on top of it > rather than having to completely rewrite it. Sad that "units with dots" feature was blocked previosly - it would allow you to write java classes as is with namespace prefix instead of use abbrevations. Best regards, Paul Ishenin

It`s a time to unblock it, I think.

Reply by email

Jonas Maebe
to Paul Ishenin: Sad that "units with dots" feature was blocked previosly - it would allow you to write…
Paul Ishenin wrote
Sad that "units with dots" feature was blocked previosly - it would allow you to write java classes as is with namespace prefix instead of use abbrevations.

I don't think that would be usable, unless we'd also allow something like Java's "import java.xml.*" or propagating uses. There are classes from 216 different packages in the jdk15 unit, so you could easily get enormous uses clauses without such a feature. I'm also not sure how it would work for the classes that are required in the system unit, since the system unit cannot depend on other units (even if it could for one special unit, that other unit would require system unit types such as "jint" or even "longint"). Even importing them under a different name wouldn't work, since e.g. TObject is derived from java.lang.Object and the compiler should allow you to typecast these types to each other. But if you have a type called "Object" in a unit called "java.lang" and a separate type "JLObject" from which TObject derives in the system unit, that wouldn't work.

And dotted unit names would still introduce the ambiguities that caused the feature to be blocked.

Jonas

Reply by email

Graeme Geldenhuys
to Mattias Gaertner: On Sat, 20 Aug 2011 17:02:17 +0200 Why don't you google yourself?…
Mattias Gaertner wrote
> > Why did Google do that? Why don't you google yourself?

Lets see if I understand this correctly. Dalvik was designed to be suitable for systems that are constrained in terms of memory and processor speed. (Quoted from Wikipedia) Yet today's smart phones and tablets are more powerful than the desktops of just a few years ago, or even the computers that first sent man to the moon. Now lets not even talk amount of memory. Most mobile devices have 512-1GB memory these days - again more than most desktops had just a few years ago.

So Google creating a incompatible Java for this supposed limitation of processor speed and low memory. Yeah Sun's Java ran fine on desktops of 10-15 years ago, and even on PDA's of that time.

Google is doing with Android just the opposite of what Sun's Java stands for - compile once, run everywhere.
If Google wanted something different for their Android platform, they should not have called it Java then.

What benefits do you miss?

Compile Java (SE, ME etc) apps once, run everywhere.

Java is just a language.

No, Java is also known as a platform (like Java Virtual Machine). Google (like Microsoft before it) is now tainting the Java platform by making it incompatible with existing Java. Like I said, if they wanted something different, they should have named it differently too.

Anyway, I never said I'm an expert in Android. I'll research the subject further to get a clearer picture.

A jvm backend for fpc is great. I hope it is not too much work to maintain.

I have no issues with FPC supporting the Java platform as a target - I think this is great news indeed.

Regards,   - Graeme - _______________________________________________ fpGUI - a cross-platform Free Pascal GUI toolkit http://fpgui.sourceforge.net

Reply by email

Jonas Maebe
to Graeme Geldenhuys
Graeme Geldenhuys wrote 5 lines
Lets see if I understand this correctly. Dalvik was designed to be suitable for systems that are constrained in terms of memory and processor speed. (Quoted from Wikipedia) Yet today's smart phones and tablets are more powerful than the desktops of just a few years ago, or even the computers that first sent man to the moon.

Mobile platforms are all about power consumption in order to make batteries last as long as possible. Generally: faster = less power usage.

No, Java is also known as a platform (like Java Virtual Machine).

There are three separate things:
* Java the programming language
* the JVM platform/specification
* the JDK

There are indeed commonly called together "the Java platform", but they are not indivisible. That's why it's possible to e.g. compile Pascal code into JVM byte code that makes use of the JDK.

Google (like Microsoft before it) is now tainting the Java platform by making it incompatible with existing Java.

Google is doing several things:
* they kept the Java programming language
* they replaced the JVM with Dalvik, to make it faster/more power efficient (by doing a bunch of analyses and transformations that are normally done at run time at compile time). This by itself does not introduce incompatibilities, since Java class files can be translated into Dalvik class files
* they replaced the JDK with their own class library, the Android SDK

Do you think it would have been better if they had said "you program in the Android language, which is identical to the Java language"?

Jonas

Reply by email

Felipe Monteiro de Carvalho
to Jonas Maebe

One thing which I am curious: What is the main use case which led to this work?

I can imagine it would be useful for example to have a work focused on j2me in order to target phones which run only Java and nothing else (although in reality j2me is each time more obsolete with the spread of smartphones), but for desktop platforms which can already run native applications without any fuss I wonder what the use case of a Pascal to Java compiler is.

Even for Android, I'm not sure such a Java port is much better then JNI.

I'm not saying it isn't great to have this new option, because it clearly is, I'm just curious.

Felipe Monteiro de Carvalho

Reply by email

Graeme Geldenhuys
to Jonas Maebe: Mobile platforms are all about power consumption in order to make batteries last as long…
Jonas Maebe <jonas. wrote
Google is doing several things: * they kept the Java programming language * they replaced the JVM with Dalvik, to make it faster/more power

efficient (by doing a bunch of analyses and transformations that are normally done at run time at compile time). This by itself does not introduce incompatibilities, since Java class files can be translated into Dalvik class files

* they replaced the JDK with their own class library, the Android SDK

Ok, thanks for explaining (without the hostile tone like Mattias). From the Dalvik Wikipedia page, converting Sun Java class files to Google Java is not always possible. It seems to be a hit and miss case. But I guess recompiling the source code might have better sucsess.

Do you think it would have been better if they had said "you program in

the Android language, which is identical to the Java language"?

Yes, not identical though, just similar syntax.

Graeme.

Regards, - Graeme - _______________________________________________ fpGUI - a cross-platform Free Pascal GUI toolkit http://fpgui.sourceforge.net

Reply by email

Ludo Brands
to Jonas Maebe: Mobile platforms are all about power consumption in order to make batteries last as long…
Show quoted text 12 lines
> No, Java is also known as a platform (like Java Virtual Machine). There are three separate things: * Java the programming language * the JVM platform/specification * the JDK There are indeed commonly called together "the Java platform", but they are not indivisible. That's why it's possible to e.g. compile Pascal code into JVM byte code that makes use of the JDK.

And for gnu gcj to compile java into native machine code. No bytecode involved.

Ludo

Reply by email

Felipe Monteiro de Carvalho
to Graeme Geldenhuys: Why did Google do that? Why not stay with the standardized Java and get the benefits of…
Graeme Geldenhuys wrote
Why did Google do that? Why not stay with the standardized Java and get the benefits of all existing Java and Mobile Java apps?

Java mobile (j2me) is almost completely different from usual Java APIs, even more then the Android API is different from JDK I'd say, and the j2me APIs are horrible, very slow, and they also work widely different across various phones. If anyone beliaves that j2me is write once and run everywhere without debugging in the hundreds of available phones, he clearly never wrote software on it =D I am happy j2me is getting obsolete.

I don't know much about Android, but just when I thought it sounded great, I hear things like this. :-(

I don't think this makes any difference, my main problem with Android is that they do not allow users to run purely native executables. If native apps work fine for the iPhone, they should have worked fine in Android too, no need for Java. Their current architecture really isn't the best IMHO, but it also not that bad either, compared to the competition, it is reasonably workable.

Android is much better then BlackBerry or Windows Phone. You can actually run native Pascal code in Android, which means that you can use all those libraries which we have without any code changes, while in those other 2 the answer is just: no, no, no

Felipe Monteiro de Carvalho

Reply by email

Jonas Maebe
to Felipe Monteiro de Carvalho: One thing which I am curious: What is the main use case which led to this work? I can…
Felipe Monteiro de Carvalho wrote
One thing which I am curious: What is the main use case which led to this work?

Application servers (usually web server backends). And the fact that it prepares the compiler for an LLVM backend: Java byte code is less strict about types than LLVM byte code (e.g. Java byte code does not specify full type information for temporary values, while LLVM byte code does), so it was a good first step to finally get things moving.

Jonas

Reply by email

Paul Ishenin
to Jonas Maebe: There is a new branch in svn (branches/jvmbackend) that contains support for compiling…
Jonas Maebe wrote 5 lines
Download information, usage information etc is available at http://wiki.freepascal.org/FPC_JVM Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that. Enjoy!

Some people from Russian community tried to start to enjoy but failed :) http://www.freepascal.ru/forum/viewtopic.php?t=7325#p55875

<http://www.freepascal.ru/forum/viewtopic.php?t=7325&view=unread#unread>Best regards,
Paul Ishenin

Reply by email

Jonas Maebe
to Paul Ishenin
Paul Ishenin wrote 7 lines
20.08.2011 16:49, Jonas Maebe wrote: > Download information, usage information etc is available at http://wiki.freepascal.org/FPC_JVM > > Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that. > > Enjoy! Some people from Russian community tried to start to enjoy but failed :) http://www.freepascal.ru/forum/viewtopic.php?t=7325#p55875

The problems are
a) he is adding the '.class' extension when trying to run the program. You have to specify the name of the class to run, not the name of the class file (so leave out the '.class') b) he should specify the base path to the FPC rtl classes via the -cp parameter, as explained at http://wiki.freepascal.org/FPC_JVM/Usage#Running_compiled_programs

I've added a quick start example at http://wiki.freepascal.org/FPC_JVM#Quick_start

Jonas

Reply by email

dmitry boyarintsev
to Jonas Maebe
Jonas Maebe wrote 7 lines
On 21 Aug 2011, at 02:37, dmitry boyarintsev wrote: > So there're actually 2 code generators right now. One is used for JVM > and another is used for native machine code? The JVM target only uses the high level code generator. The other targets use a combination of both.

Are there a plans to merge branches (trunk and jvm branch) together? or is it actually the next planned step?
What about changing the native code generator to become more "high level" as JVM?

Jonas Maebe wrote
> Some people from Russian community tried to start to enjoy but failed :) http://www.freepascal.ru/forum/viewtopic.php?t=7325#p55875

sorry, didn't get to translation of Usage page yet.

thanks,
Dmitry

Reply by email

dmitry boyarintsev
to Jonas Maebe: The problems are a) he is adding the '.class' extension when trying to run the program.…
Jonas Maebe wrote 6 lines
The problems are a) he is adding the '.class' extension when trying to run the program. You have to specify the name of the class to run, not the name of the class file (so leave out the '.class') b) he should specify the base path to the FPC rtl classes via the -cp parameter, as explained at http://wiki.freepascal.org/FPC_JVM/Usage#Running_compiled_programs I've added a quick start example at http://wiki.freepascal.org/FPC_JVM#Quick_start

I followed the instruction and again it failed to run the application. However, it's unsaid that location of the ".class" file should also be listed in "-cp" option. At least it worked fine for me. I tried it in Windows, so I'm not sure if it's required for Unix OSes, but it appears that working directory isn't used by "java" for classpath searching.
Jonas, I'd suspect you have environment variable CLASSPATH setup in your system or something like that, that doesn't require you specify the path to .class file.

In the end, it has nothing to do with ppcvmj, but rather than usage of "java" application :)
I added a small note to Quick Start feel free to delete it anyway.

thanks,
Dmitry

Reply by email

Zaher Dirkey
to Jonas Maebe: There is a new branch in svn (branches/jvmbackend) that contains support for compiling…
Jonas Maebe wrote 32 lines
Hi, There is a new branch in svn (branches/jvmbackend) that contains support for compiling Pascal code into Java virtual machine bytecode. While it does not support all language constructs and while there are some differences in some features that are supported, in general the result is fairly close to "normal Pascal" you'd write. Note however that this is a pure compiler port at this time. That means that while most of the language support is fairly complete, pretty much no standard Pascal units are available. For all practical intents and purposes there is only the system unit, and even that one misses many routines (including helpers required for basic functions such as read(ln)/write(ln), val, str, delete, pos, ...). On the other hand, a unit that contains the entire public interface of the JDK 1.5 is available. Over time, it should be possible to provide most of the standard functionality of the system unit (and other units) implemented on top of that unit, or rewritten in Pascal code that does not depend on untyped pointer accesses. Download information, usage information etc is available at http://wiki.freepascal.org/FPC_JVM Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that. Enjoy!

Is it good idea to write client application work on internet browser?

Zaher Dirkey

Reply by email

Jonas Maebe
to dmitry boyarintsev: Are there a plans to merge branches (trunk and jvm branch) together? or is it actually…
dmitry boyarintsev wrote 10 lines
On Sun, Aug 21, 2011 at 3:45 AM, Jonas Maebe wrote: > > On 21 Aug 2011, at 02:37, dmitry boyarintsev wrote: > >> So there're actually 2 code generators right now. One is used for JVM >> and another is used for native machine code? > > The JVM target only uses the high level code generator. The other targets use a combination of both. Are there a plans to merge branches (trunk and jvm branch) together?

Yes, once other developers have had the chance to review the jvm branch and comment about it. Other requirements are that there are no regressions for non-JVM targets anymore (although I think I fixed all of those today) and that all new memory leaks are fixed (there are a few in the new symcreat unit).

What about changing the native code generator to become more "high level" as JVM?

That doesn't really offer any advantages, so I'm not sure whether it's worth the trouble. Code generation has two parts in the compiler:
* all parse tree nodes have a method called pass_generate_code that calls general code generator routines
* the code generator returns emit assembler statements

In svn trunk, all pass_generate_code routines called the low level code generation routines. In the jvm branch, several of those pass_generate_code routines have been converted to call the high level code generator. For native targets, there is a special high level code generator implementation that generally just calls through to the low level code generator.

As long as new implementations of pass_generate_code methods use the high level code generator (which has almost the same interface as the low level code generator, only the "size" parameters are high level definitions instead of only things like "4 byte unsigned value"), and if new code generator methods are added to the high level instead of low level code generator classes, there should be no problem keeping everything in sync without duplicating any work (and without making things harder for anyone).

Jonas

Reply by email

Jonas Maebe
to dmitry boyarintsev: I followed the instruction and again it failed to run the application. However, it's…
dmitry boyarintsev wrote 9 lines
I followed the instruction and again it failed to run the application. However, it's unsaid that location of the ".class" file should also be listed in "-cp" option. At least it worked fine for me. I tried it in Windows, so I'm not sure if it's required for Unix OSes, but it appears that working directory isn't used by "java" for classpath searching. Jonas, I'd suspect you have environment variable CLASSPATH setup in your system or something like that, that doesn't require you specify the path to .class file.

No, but my test scripts did have "." in the -cp path.

In the end, it has nothing to do with ppcvmj, but rather than usage of "java" application :) I added a small note to Quick Start feel free to delete it anyway.

Thanks, I've updated it to use "." (that's easier to type).

Jonas

Reply by email

Hans-Peter Diettrich
to Graeme Geldenhuys: Lets see if I understand this correctly. Dalvik was designed to be suitable for systems…
Lets see if I understand this correctly. Dalvik was designed to be suitable for systems that are constrained in terms of memory and processor speed.

IMO more important is avoiding the US patents on Java. For the curious: the Java patents typically claim "Method And Apparatus For ...", where the Apparatus is obviously aimed to outwit the restriction, that most countries do not accept pure software patents.

DoDi

Reply by email

Michael Schnell
to Felipe Monteiro de Carvalho: Does this port generate Java Bytecode directly or does it generate first Java Assembler…
Felipe Monteiro de Carvalho wrote
I ask because Android does not use Java Bytecode, it has it's own, completely different bytecode.

Ooops. Dalvik in fact completely off-standard on that behalf !

Wikipedia sais:

Standard Java bytecode <http://en.wikipedia.org/wiki/Java_bytecode> executes 8-bit stack instructions. Local variables must be copied to or from the operand stack by separate instructions. Dalvik instead uses its own 16-bit instruction set that works directly on local variables. The local variable is commonly picked by a 4-bit 'virtual register' field. This lowers Dalvik's instruction count and raises its interpreter speed.

-Michael

Reply by email

Michael Schnell
to Jonas Maebe: There is a new branch in svn (branches/jvmbackend) that contains support for compiling…
Jonas Maebe wrote
...

GREAT !!!

Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that.

I suppose the Android add-on will make this _really_ interesting indeed !

-Michael

Reply by email

Michael Schnell
to Graeme Geldenhuys: Lets see if I understand this correctly. Dalvik was designed to be suitable for systems…
Graeme Geldenhuys wrote
So Google creating a incompatible Java for this supposed limitation of processor speed and low memory.

Modern ARM processors (used for by far most Android devices) provide Jazelle DBX (Direct Byte code eXecution). Supposedly this does not help any more with Dalvik Java code. Funny that the 16 Bit version is supposed to be faster, though...

-Michael

Reply by email

Felipe Monteiro de Carvalho
to Michael Schnell
Michael Schnell wrote
> my main problem with Android > is that they do not allow users to run purely native executables. AFAIK, this has been overcome with the latest versions of Android..

Not true. What 2.3 added is not really useful for Lazarus. It still requires native code to be inside a library and the only way to call Android APIs is still to call some Java code which will do the real call. 2.3 just adds some extra stuff for people writing native OpenGL games, not really useful for normal GUI applications.

Felipe Monteiro de Carvalho

Reply by email

Sven Barth
to Jonas Maebe: There is a new branch in svn (branches/jvmbackend) that contains support for compiling…
Jonas Maebe wrote
Regarding Android: the compiler and the system unit both use a bunch of standard functionality from the JDK to implement various features. So Android support would probably require quite a bit of extra work. I have not looked into that. Enjoy!

I've taken a look at the Android SDK: it seems the java.lang and java.util namespaces and their classes are available so it might be rather simple to get an Android application compiling and running.

But for now I have the problem to convert the class files provided by the SDK into Pascal units using javapp. I have unpacked the android.jar to $somedir/android and also copied javapp.jar there (just to be sure that there are no path problems ^^). I cd'd into that directory and issued the following command to convert the android.app namespace:

java -jar javapp.jar -protected javapp.jar android.app.

The output is the following:

default charset: UTF-8
Determining short Pascal class names...
Indexing classes under android/app/Activity...
Indexing classes under javapp/jar...
Printing classes...
Done!

The result is a "java.pas" and a "java.inc". The first includes the latter and the latter is empty.

So what am I doing wrong? (The same happens if I try to use the android.jar instead)

Regards,
Sven

Reply by email

Jonas Maebe
to Sven Barth
Sven Barth wrote 16 lines
But for now I have the problem to convert the class files provided by the SDK into Pascal units using javapp. I have unpacked the android.jar to $somedir/android and also copied javapp.jar there (just to be sure that there are no path problems ^^). I cd'd into that directory and issued the following command to convert the android.app namespace: java -jar javapp.jar -protected javapp.jar android.app. The output is the following: default charset: UTF-8 Determining short Pascal class names... Indexing classes under android/app/Activity... Indexing classes under javapp/jar... Printing classes... Done! The result is a "java.pas" and a "java.inc". The first includes the latter and the latter is empty. So what am I doing wrong? (The same happens if I try to use the android.jar instead)

You have to pass "-classpath path/to/android.jar" (or "-classpath ." if you extracted android.jar in the current directory) as parameter to javapp (not as parameter to java!). I've added this fact to http://wiki.freepascal.org/FPC_JVM/Building#Building_javapp

So:
java -jar javapp.jar -classpath android.jar -protected javapp.jar android.app.

Jonas

Reply by email

Jonas Maebe
to Jonas Maebe
Jonas Maebe wrote
So: java -jar javapp.jar -classpath android.jar -protected javapp.jar android.app.

Without the extra javapp.jar, obviously:
java -jar javapp.jar -classpath android.jar -protected android.app.

Jonas

Reply by email

Sven Barth
to Jonas Maebe
Jonas Maebe wrote 9 lines
On 25 Aug 2011, at 23:06, Jonas Maebe wrote: > So: > java -jar javapp.jar -classpath android.jar -protected javapp.jar > android.app. Without the extra javapp.jar, obviously: java -jar javapp.jar -classpath android.jar -protected android.app.

Ok, I needed to test it quite a few times (perhaps I had some paths or something wrong each time), but now I've managed to generate the file for android.app. Yeah! ^^

Now I just need to convert all other necessary classes for an Android hello world and then we'll see :D

Regards,
Sven

Reply by email