unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* About CEDET, Completion, and compilers
@ 2014-03-13  3:04 Eric M. Ludlam
  2014-03-13 13:40 ` Andreas Röhler
  2014-03-23 14:57 ` Richard Stallman
  0 siblings, 2 replies; 19+ messages in thread
From: Eric M. Ludlam @ 2014-03-13  3:04 UTC (permalink / raw)
  To: Emacs Development

Hi all,

The long thread about "Emacs Contributions" that ended up being about 
Clang, CEDET, completion etc was interesting, and reveled problems 
people run into with CEDET, and possibly some misconceptions about what 
CEDET is with respect to the "completion" feature.  I thought I would 
try and help explain a couple things, and I'll wrap up with my thoughts 
on some TODO items that will help make CEDET better for anyone who wants 
to help out.

For those who don't know me, I wrote the first versions of CEDET and 
maintain it over in the SourceForge repository.  http://cedet.sf.net has 
lots of nifty explanations and pictures for anyone wanting to know more.

To start, CEDET is a group of very different tools, each of which covers 
a particular topic, and which work together to create a suite of 
features many associate with a modern IDE.  That includes project 
management, tagging, smart completion, and code-generation tooling.

Each of these elements is built on a framework where the raw data 
needed, such as project definitions, tag lists, and templates is 
represented in an Emacs friendly data structure.  One of CEDET's most 
important features is that data representation and the way it keeps it 
up to date.  It allows a wide range of back-ends or tools to be 
implemented in Emacs with minimal fuss.

When someone talks about using Clang or other external compiler for 
"smart completion", there is a layer in CEDET where that tool can be 
integrated in as a new smart-completion back-end, allowing any 
user-facing tool built using CEDET APIs to work with this new tool.  I 
don't really see using an external compiler as "competing" with CEDET. 
It is just a tool that fits into one corner of the big picture. 
External tools are likely to fail in many cases (ie - like when it isn't 
installed on a machine), and CEDET will simply revert back to the core 
mechanism.

Anyway, while using an external completion engine is nice for someone 
who just wants completion, it leaves out support for tagging, and the 
wide range of features you get with it.  Fortunately, it is also 
possible to integrate in a compiler (if desired) to produce tags as 
well.  In CEDET there is the tagging parser for C/C++ written in Emacs 
Lisp, plus an Exuberent CTags parser that can be used in its stead. 
Exuberent ctags is off by default simply because it isn't good enough, 
but it can be used for basic tagging for files not in buffers.  If a 
compiler such as gcc were to be extended to help support CEDET, 
preferably (from my point of view) by creating CEDET compatible tags, 
that would also allow CEDET to parse files not in buffers, but it may 
not be robust enough to handle incremental parsing as you type the way 
the Emacs parser does.  Fortunately, they do not need to be mutually 
exclusive.  Both can be used at the same time and work together because 
the underlying data structure is well defined.

This is all just basic modularization stuff applied to a particular 
problem.  Lets me discuss where CEDET tends to fall down.  My hope is 
that this could inspire someone interested in participating who just 
needs a starting point.

Detecting & Managing projects:

You can't do completion without knowing the bounds and shape of your 
sources.  One of the most common questions on the mailing list tends to 
be about setting up a "project" to get the tooling to work.  There are 
so many ways to compile code, and the Make systems are generally opaque 
making this a challenging support issue for EDE.  While I think the 
basic premise in EDE (the project management tool) is good, there is a 
diversity of support that is missing.  A good project here is making the 
task of creating a project for Emacs to describe your code a bit easier.

Quality of the C++ parser:

It was frequently noted that C++ is hard to write parsers for. 
Fortunately, the current parser that is written in Emacs Lisp covers the 
basics, and because it is by nature very forgiving, filling in the gaps 
has proven within the reach of a wide range of people.  Anyone who 
discovers a missing c++ feature should feel confident about being able 
to update the parser.

Quality of C++ completions:

The core completion engine here is also in pretty good shape, right up 
until you start playing around with templates and some other exciting 
c++ features.  David Engster has gotten quite a bit working here, but 
I'll defer to him to explain this in more detail for anyone who wants to 
help out.

Performance, and Really Large projects:

There is a core problem in the way CEDET manages tags, which is that it 
keeps them all in memory.  For large code bases, after working in them 
for a while, CEDET will make Emacs' memory use go up so much that a 
garbage collect spends more time swapping that collecting.

Fortunately, the entire system has been abstracted through some Emacs 
data structures that represent databases of tag tables.  I have done 
some work to create databases using external tools such as GNU Global 
which fit into the system transparently providing tag data.  One 
possible solution would be to develop a nice on-disk representation that 
is easy to search to move the bulk of the data out of the Emacs process.

Refactoring is non-existent:

I did start down a road with "semantic-symref" tools that can do 
primitive refactoring, but some of the key features, such as resolving 
polymorphism issues hasn't been implemented.  The data is there, the 
logic just hasn't been implemented.  At the moment it is mostly a fancy 
grep replacement.

Language X isn't supported:

The system that supports C++ has been generalized, and supports many 
languages.  C++, Java, and Emacs Lisp are perhaps the best supported so 
far.  There are a lot of opportunities to add support for new languages, 
or enhance an existing language support.


I hope this data is helpful.
Eric



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-13  3:04 About CEDET, Completion, and compilers Eric M. Ludlam
@ 2014-03-13 13:40 ` Andreas Röhler
  2014-03-13 14:04   ` João Távora
  2014-03-14  0:36   ` Eric M. Ludlam
  2014-03-23 14:57 ` Richard Stallman
  1 sibling, 2 replies; 19+ messages in thread
From: Andreas Röhler @ 2014-03-13 13:40 UTC (permalink / raw)
  To: emacs-devel; +Cc: Eric M. Ludlam

Am 13.03.2014 04:04, schrieb Eric M. Ludlam:
[ ... ]
Hi Eric,

yes, CEDET is a very interesting tool.

BTW just reading at SO an answer WRT to IDE's, which IMO also stresses the usefulness of further CEDET-development:

http://stackoverflow.com/questions/22372526/integrated-development-environments/22372626#22372626

There was a remark in the thread saying something like:
CEDET provides a toolset, but no-one uses it - beside CEDET itself.

Maybe it's an occasion to make that point up:

As for me, the maybe silly reason is EIEIO. Never understood what it's good for - and didn't want to learn something not understood...
WRT what's reported from other OO-tools, was not surprised to experience slowness.

The problem with OO-programming seems some hardly predictable multiplying of procedures.
In addition EIEIO is written in Emacs Lisp, which isn't known to be very fast itself.

So at some point got the idea CEDET will never be reliably fast...

Sorry for that.
Given that's true - what about dropping EIEIO and re-building everything in plain Emacs Lisp?

Cheers,

Andreas







^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-13 13:40 ` Andreas Röhler
@ 2014-03-13 14:04   ` João Távora
  2014-03-13 14:21     ` Andreas Röhler
  2014-03-14  0:36   ` Eric M. Ludlam
  1 sibling, 1 reply; 19+ messages in thread
From: João Távora @ 2014-03-13 14:04 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: Eric M. Ludlam, emacs-devel

Andreas Röhler <andreas.roehler@online.de> writes:

> Given that's true - what about dropping EIEIO and re-building
> everything in plain Emacs Lisp?

FWIW, Eric Schulte's web-server [1] uses EIEIO and has recently been
accepted in Emacs ELPA. Eric reports it to be an roughly an order of
magnitude faster than el-node [2], and it apparently creates an EIEIO
object for every request. The code looks clean enough, but I didn't see
any `defmethod's or complicated inheritance.

But I've also noticed that some dismiss EIEIO as some kind of overkill,
a cannon to kill a fly. That's sometimes true, though I frequently wish
later that I had started out with a cannon. That's why in CL I almost
always start with CLOS right off the bat.

So, I've read some of the EIEIO docs, and know it's not as powerful as
CLOS, but would like to hear some experience about when to use it,
actual downsides experienced, etc...

Using more EIEIO could possibly make some people (including me)
understand, approach, and accept CEDET better.

João

[1] https://github.com/eschulte/emacs-web-server
[2] http://eschulte.github.io/emacs-web-server/benchmark/



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-13 14:04   ` João Távora
@ 2014-03-13 14:21     ` Andreas Röhler
  0 siblings, 0 replies; 19+ messages in thread
From: Andreas Röhler @ 2014-03-13 14:21 UTC (permalink / raw)
  To: emacs-devel; +Cc: João Távora, Eric M. Ludlam

Am 13.03.2014 15:04, schrieb João Távora:
> Andreas Röhler <andreas.roehler@online.de> writes:
>
>> Given that's true - what about dropping EIEIO and re-building
>> everything in plain Emacs Lisp?
>
> FWIW, Eric Schulte's web-server [1] uses EIEIO and has recently been
> accepted in Emacs ELPA. Eric reports it to be an roughly an order of
> magnitude faster than el-node [2], and it apparently creates an EIEIO
> object for every request. The code looks clean enough, but I didn't see
> any `defmethod's or complicated inheritance.
>
>
[  ... ]

That's good news, thanks!




^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-13 13:40 ` Andreas Röhler
  2014-03-13 14:04   ` João Távora
@ 2014-03-14  0:36   ` Eric M. Ludlam
  2014-03-14  2:26     ` EIEIO Daniel Colascione
  2014-03-14  6:47     ` About CEDET, Completion, and compilers Andreas Röhler
  1 sibling, 2 replies; 19+ messages in thread
From: Eric M. Ludlam @ 2014-03-14  0:36 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: emacs-devel

On 03/13/2014 09:40 AM, Andreas Röhler wrote:
> Am 13.03.2014 04:04, schrieb Eric M. Ludlam:
> [ ... ]
> Hi Eric,
>
> yes, CEDET is a very interesting tool.
>
> BTW just reading at SO an answer WRT to IDE's, which IMO also stresses
> the usefulness of further CEDET-development:
>
> http://stackoverflow.com/questions/22372526/integrated-development-environments/22372626#22372626
>
>
> There was a remark in the thread saying something like:
> CEDET provides a toolset, but no-one uses it - beside CEDET itself.

I am familiar with this sentiment.  I believe this may be true when it 
comes to the EDE project style that generates Makefiles.  While that is 
a nifty idea, it is hard to implement in a flexible and robust way.  As 
such, it is pretty good for simple projects, but is too aggressive an 
idea to claim as a general tool.  Folks who come at CEDET from the IDE 
mindset tend to start there and get disappointed.

There are many other tools in CEDET that many users do use and depend 
on.  There are 345 members on the cedet-devel mailing list.  Only 1 of 
them is me.  That seems like a pretty good user base.

> Maybe it's an occasion to make that point up:
>
> As for me, the maybe silly reason is EIEIO. Never understood what it's
> good for - and didn't want to learn something not understood...
> WRT what's reported from other OO-tools, was not surprised to experience
> slowness.
>
> The problem with OO-programming seems some hardly predictable
> multiplying of procedures.
> In addition EIEIO is written in Emacs Lisp, which isn't known to be very
> fast itself.
>
> So at some point got the idea CEDET will never be reliably fast...
>
> Sorry for that.
> Given that's true - what about dropping EIEIO and re-building everything
> in plain Emacs Lisp?

Before I wrote CEDET, I built a set of tools that did similar things and 
ran into some serious problems making it work.  I took a step back, and 
instead focused on infrastructure, such as a parser-generator instead of 
writing more parsers with regexp, and then an object system, instead of 
managing polymorphism by hand every time I called a function.  I don't 
think it is really possible to build something as flexible as CEDET 
without a CLOS like tool.

The key thing that EIEIO lets me do is define interfaces that allows 
modules to work together.  For example, there is a tag-table concept in 
the semantic system for managing lists of symbols found in the source 
code it parses.  The parser system all knows how to populate and 
maintain a table.  There is also code that searches tables so you can 
find a tag to jump to, for example.  By defining the core interface as a 
table class with EIEIO, I can also create other classes that manages tag 
tables from GNU Global, and just stick it in a list of other tables to 
search.  The code searching tables doesn't have to know  about GNU 
Global.  The Global person doesn't have to know about jumping to tags. 
And no-one has to write some weird bit of code that reaches into a plist 
to get a function symbol to call.  I was able to move the Java 
completion in CEDET from in-file only to surprisingly robust for Android 
in an afternoon just by writing a database that parses a few.jar files. 
  Nifty.

When I think of IDEs that are heavily OO, I tend to think that the UI is 
built that way, with more doo-dads to click on than you could possibly 
use.  There is no UI code (ie - widgets) in CEDET based on EIEIO.  In 
fact, I think COGRE is the most UI like thing I've built with EIEIO, 
mostly on a lark to see if it could be done.  It turned out ok.

As for performance, there was a time when EIEIO didn't compile.  That 
was pretty darn slow.  I've spent many hours in the profiler tuning it, 
and it is much better now, and EIEIO barely shows up when I profile 
high-level tools.

Does that help?
Eric



^ permalink raw reply	[flat|nested] 19+ messages in thread

* EIEIO
  2014-03-14  0:36   ` Eric M. Ludlam
@ 2014-03-14  2:26     ` Daniel Colascione
  2014-03-14  3:35       ` EIEIO Eric M. Ludlam
                         ` (3 more replies)
  2014-03-14  6:47     ` About CEDET, Completion, and compilers Andreas Röhler
  1 sibling, 4 replies; 19+ messages in thread
From: Daniel Colascione @ 2014-03-14  2:26 UTC (permalink / raw)
  To: Eric M. Ludlam, Andreas Röhler; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2297 bytes --]

On 03/13/2014 05:36 PM, Eric M. Ludlam wrote:
> The key thing that EIEIO lets me do is define interfaces that allows
> modules to work together.  For example, there is a tag-table concept in
> the semantic system for managing lists of symbols found in the source
> code it parses.  The parser system all knows how to populate and
> maintain a table.  There is also code that searches tables so you can
> find a tag to jump to, for example.  By defining the core interface as a
> table class with EIEIO, I can also create other classes that manages tag
> tables from GNU Global, and just stick it in a list of other tables to
> search.  The code searching tables doesn't have to know  about GNU
> Global.  The Global person doesn't have to know about jumping to tags.
> And no-one has to write some weird bit of code that reaches into a plist
> to get a function symbol to call.  I was able to move the Java
> completion in CEDET from in-file only to surprisingly robust for Android
> in an afternoon just by writing a database that parses a few.jar files.
>  Nifty.

Thanks for putting work into CEDET. I expect to be writing some Java in
the near future, so I'll probably be taking a much closer look at it soon.

I agree that polymorphism is useful when implementing and extending a
system like CEDET. Emacs has traditionally used dispatch functions in
cases like this, though: look at file-name-handler-alist. Consequently,
EIEIO feels a bit foreign. What motivated the choice of EIEIO over
dispatch functions or defstructs with function slots?

A while ago, I considered using EIEIO for one of my projects; I decided
to use plain defstructs instead. I didn't like how EIEIO required each
object to have a name (requiring that EIEIO allocate a new string for
each object instance), and I had very simple interface requirements, and
found calling funcall on a struct slot more straightforward than a
generic function. I still don't know how method dispatch actually works
or what the performance characteristics of the various combination
methods are. It's also not clear what happens on method redefinition,
package unloading, and so on.

CLOS is a comprehensive OO system, but I'm not sure we're dealing with a
problem that actually requires its power.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 901 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14  2:26     ` EIEIO Daniel Colascione
@ 2014-03-14  3:35       ` Eric M. Ludlam
  2014-03-14  6:42       ` EIEIO David Engster
                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 19+ messages in thread
From: Eric M. Ludlam @ 2014-03-14  3:35 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: Andreas Röhler, emacs-devel

On 03/13/2014 10:26 PM, Daniel Colascione wrote:
> On 03/13/2014 05:36 PM, Eric M. Ludlam wrote:
>> The key thing that EIEIO lets me do is define interfaces that allows
>> modules to work together.  For example, there is a tag-table concept in
>> the semantic system for managing lists of symbols found in the source
>> code it parses.  The parser system all knows how to populate and
>> maintain a table.  There is also code that searches tables so you can
>> find a tag to jump to, for example.  By defining the core interface as a
>> table class with EIEIO, I can also create other classes that manages tag
>> tables from GNU Global, and just stick it in a list of other tables to
>> search.  The code searching tables doesn't have to know  about GNU
>> Global.  The Global person doesn't have to know about jumping to tags.
>> And no-one has to write some weird bit of code that reaches into a plist
>> to get a function symbol to call.  I was able to move the Java
>> completion in CEDET from in-file only to surprisingly robust for Android
>> in an afternoon just by writing a database that parses a few.jar files.
>>   Nifty.
>
> Thanks for putting work into CEDET. I expect to be writing some Java in
> the near future, so I'll probably be taking a much closer look at it soon.
>
> I agree that polymorphism is useful when implementing and extending a
> system like CEDET. Emacs has traditionally used dispatch functions in
> cases like this, though: look at file-name-handler-alist. Consequently,
> EIEIO feels a bit foreign. What motivated the choice of EIEIO over
> dispatch functions or defstructs with function slots?

I was taking a C++ class and learning about OO systems and ORBs back 
when ORBs were new.  It sounded like something useful for Emacs where I 
was having trouble building a precursor to CEDET, so I wrote EIEIO.  I 
never did create the ORB though.

I have vague recollections of trying to use defstructs back then, but 
they stymied me.

> A while ago, I considered using EIEIO for one of my projects; I decided
> to use plain defstructs instead. I didn't like how EIEIO required each
> object to have a name (requiring that EIEIO allocate a new string for
> each object instance), and I had very simple interface requirements, and
> found calling funcall on a struct slot more straightforward than a
> generic function. I still don't know how method dispatch actually works
> or what the performance characteristics of the various combination
> methods are. It's also not clear what happens on method redefinition,
> package unloading, and so on.
>
> CLOS is a comprehensive OO system, but I'm not sure we're dealing with a
> problem that actually requires its power.

EIEIO is not the best solution for all problems.  It sounds like you had 
a problem that could be solved in a self contained system, so it didn't 
need to be organized with an extra level of abstraction that EIEIO provides.

If you have a problem where you want to provide interfaces for external 
developers to code against, you will probably find EIEIO more useful. 
The learning curve is higher, sometimes debugging is more challenging if 
your have a lot methods overloading each other, but I've found it has 
served the goal of enabling several other developers to extend different 
parts of CEDET as intended, enabling them to implement complex behaviors 
(ie - wide interfaces) with no impact to the core.

As for method dispatch, that is a long topic.  Suffice it to say that 
EIEIO does not implement the CLOS pattern matching mechanism.  It only 
does first argument dispatching which simplified the implementation, and 
was sufficient for what I was doing in CEDET.  There are also 3 dispatch 
algorithms, so you can pick how you would like (call-next-method) to 
behave.  There are also fun things like :BEFORE and :AFTER methods which 
are nifty.  The more of those features you use, the longer it takes to 
execute those methods... naturally.  If you only have one method with a 
particular name, then it is quite fast, ie - about 5 extra lines of code 
to execute, mostly error checking.

Eric




^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14  2:26     ` EIEIO Daniel Colascione
  2014-03-14  3:35       ` EIEIO Eric M. Ludlam
@ 2014-03-14  6:42       ` David Engster
  2014-03-14  9:41       ` EIEIO Eric Abrahamsen
  2014-03-14 10:24       ` EIEIO João Távora
  3 siblings, 0 replies; 19+ messages in thread
From: David Engster @ 2014-03-14  6:42 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel, Andreas Röhler, Eric M. Ludlam

Daniel Colascione writes:
> A while ago, I considered using EIEIO for one of my projects; I decided
> to use plain defstructs instead. I didn't like how EIEIO required each
> object to have a name (requiring that EIEIO allocate a new string for
> each object instance), and I had very simple interface requirements, and
> found calling funcall on a struct slot more straightforward than a
> generic function.

For simple projects, I don't use EIEIO either. However, from my
experience, the defstruct/funcall thing soon becomes tedious and
confusing on bigger projects. I think the main problem is that those
things aren't "self-documenting", which makes understanding and
maintaining such a code base difficult. In EIEIO, you can provide
documentation for pretty much anything, and it is integrated in Emacs'
help system[1], allowing you to jump to the different implementations of
a method. I find this to be a big advantage, well worth the initial
learning time.

-David

[1] At least this was the case for EIEIO in CEDET upstream, where we did
this through defadvice. Unfortunately, it took until a few weeks ago to
properly integrate this in Emacs proper.



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-14  0:36   ` Eric M. Ludlam
  2014-03-14  2:26     ` EIEIO Daniel Colascione
@ 2014-03-14  6:47     ` Andreas Röhler
  1 sibling, 0 replies; 19+ messages in thread
From: Andreas Röhler @ 2014-03-14  6:47 UTC (permalink / raw)
  To: emacs-devel; +Cc: Eric M. Ludlam

Am 14.03.2014 01:36, schrieb Eric M. Ludlam:
> On 03/13/2014 09:40 AM, Andreas Röhler wrote:
>> Am 13.03.2014 04:04, schrieb Eric M. Ludlam:
>> [ ... ]
>> Hi Eric,
>>
>> yes, CEDET is a very interesting tool.
>>
>> BTW just reading at SO an answer WRT to IDE's, which IMO also stresses
>> the usefulness of further CEDET-development:
>>
>> http://stackoverflow.com/questions/22372526/integrated-development-environments/22372626#22372626
>>
>>
>> There was a remark in the thread saying something like:
>> CEDET provides a toolset, but no-one uses it - beside CEDET itself.
>
> I am familiar with this sentiment.  I believe this may be true when it comes to the EDE project style that generates Makefiles.  While that is a nifty idea, it is hard to
> implement in a flexible and robust way.  As such, it is pretty good for simple projects, but is too aggressive an idea to claim as a general tool.  Folks who come at CEDET
> from the IDE mindset tend to start there and get disappointed.
>
> There are many other tools in CEDET that many users do use and depend on.  There are 345 members on the cedet-devel mailing list.  Only 1 of them is me.  That seems like a
> pretty good user base.
>
>> Maybe it's an occasion to make that point up:
>>
>> As for me, the maybe silly reason is EIEIO. Never understood what it's
>> good for - and didn't want to learn something not understood...
>> WRT what's reported from other OO-tools, was not surprised to experience
>> slowness.
>>
>> The problem with OO-programming seems some hardly predictable
>> multiplying of procedures.
>> In addition EIEIO is written in Emacs Lisp, which isn't known to be very
>> fast itself.
>>
>> So at some point got the idea CEDET will never be reliably fast...
>>
>> Sorry for that.
>> Given that's true - what about dropping EIEIO and re-building everything
>> in plain Emacs Lisp?
>
> Before I wrote CEDET, I built a set of tools that did similar things and ran into some serious problems making it work.  I took a step back, and instead focused on
> infrastructure, such as a parser-generator instead of writing more parsers with regexp, and then an object system, instead of managing polymorphism by hand every time I
> called a function.  I don't think it is really possible to build something as flexible as CEDET without a CLOS like tool.
>
> The key thing that EIEIO lets me do is define interfaces that allows modules to work together.  For example, there is a tag-table concept in the semantic system for
> managing lists of symbols found in the source code it parses.  The parser system all knows how to populate and maintain a table.  There is also code that searches tables so
> you can find a tag to jump to, for example.  By defining the core interface as a table class with EIEIO, I can also create other classes that manages tag tables from GNU
> Global, and just stick it in a list of other tables to search.  The code searching tables doesn't have to know  about GNU Global.  The Global person doesn't have to know
> about jumping to tags. And no-one has to write some weird bit of code that reaches into a plist to get a function symbol to call.  I was able to move the Java completion in
> CEDET from in-file only to surprisingly robust for Android in an afternoon just by writing a database that parses a few.jar files.  Nifty.
>
> When I think of IDEs that are heavily OO, I tend to think that the UI is built that way, with more doo-dads to click on than you could possibly use.  There is no UI code
> (ie - widgets) in CEDET based on EIEIO.  In fact, I think COGRE is the most UI like thing I've built with EIEIO, mostly on a lark to see if it could be done.  It turned out
> ok.
>
> As for performance, there was a time when EIEIO didn't compile.  That was pretty darn slow.  I've spent many hours in the profiler tuning it, and it is much better now, and
> EIEIO barely shows up when I profile high-level tools.
>
> Does that help?
> Eric
>
>

Thanks a lot! Will have a closer look again ASAP.

Cheers,

Andreas




^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14  2:26     ` EIEIO Daniel Colascione
  2014-03-14  3:35       ` EIEIO Eric M. Ludlam
  2014-03-14  6:42       ` EIEIO David Engster
@ 2014-03-14  9:41       ` Eric Abrahamsen
  2014-03-14 20:13         ` EIEIO Eric Schulte
  2014-03-14 10:24       ` EIEIO João Távora
  3 siblings, 1 reply; 19+ messages in thread
From: Eric Abrahamsen @ 2014-03-14  9:41 UTC (permalink / raw)
  To: emacs-devel

Daniel Colascione <dancol@dancol.org> writes:

> On 03/13/2014 05:36 PM, Eric M. Ludlam wrote:
>> The key thing that EIEIO lets me do is define interfaces that allows
>> modules to work together.  For example, there is a tag-table concept in
>> the semantic system for managing lists of symbols found in the source
>> code it parses.  The parser system all knows how to populate and
>> maintain a table.  There is also code that searches tables so you can
>> find a tag to jump to, for example.  By defining the core interface as a
>> table class with EIEIO, I can also create other classes that manages tag
>> tables from GNU Global, and just stick it in a list of other tables to
>> search.  The code searching tables doesn't have to know  about GNU
>> Global.  The Global person doesn't have to know about jumping to tags.
>> And no-one has to write some weird bit of code that reaches into a plist
>> to get a function symbol to call.  I was able to move the Java
>> completion in CEDET from in-file only to surprisingly robust for Android
>> in an afternoon just by writing a database that parses a few.jar files.
>>  Nifty.
>
> Thanks for putting work into CEDET. I expect to be writing some Java in
> the near future, so I'll probably be taking a much closer look at it soon.
>
> I agree that polymorphism is useful when implementing and extending a
> system like CEDET. Emacs has traditionally used dispatch functions in
> cases like this, though: look at file-name-handler-alist. Consequently,
> EIEIO feels a bit foreign. What motivated the choice of EIEIO over
> dispatch functions or defstructs with function slots?
>
> A while ago, I considered using EIEIO for one of my projects; I decided
> to use plain defstructs instead. I didn't like how EIEIO required each
> object to have a name (requiring that EIEIO allocate a new string for
> each object instance), and I had very simple interface requirements, and
> found calling funcall on a struct slot more straightforward than a
> generic function. I still don't know how method dispatch actually works
> or what the performance characteristics of the various combination
> methods are. It's also not clear what happens on method redefinition,
> package unloading, and so on.
>
> CLOS is a comprehensive OO system, but I'm not sure we're dealing with a
> problem that actually requires its power.

FWIW, while debugging gnus, I have wished with great fervor that it was
written in an OO style. Half of the functions look like "(funcall (assoc
'current-context enormous-context-list)..." and it's murder trying to
figure out what context we're in. It seems like gnus is a perfect case
study for the benefits of object-oriented programming: encapsulation and
polymorphism. They should teach it in school!




^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14  2:26     ` EIEIO Daniel Colascione
                         ` (2 preceding siblings ...)
  2014-03-14  9:41       ` EIEIO Eric Abrahamsen
@ 2014-03-14 10:24       ` João Távora
  3 siblings, 0 replies; 19+ messages in thread
From: João Távora @ 2014-03-14 10:24 UTC (permalink / raw)
  To: emacs-devel

Daniel Colascione <dancol@dancol.org> writes:

> to use plain defstructs instead. I didn't like how EIEIO required each
> object to have a name (requiring that EIEIO allocate a new string for
> each object instance)

I can also see how something like this would scare me off, but those
would be the premature optimization voices-in-my-head speaking. Perhaps
you had case where that was indeed a problem.

Anyway, If I'm reading the docs and the code of `make-instance'
correctly, the implicit name slot is only used for printing an
object. In that case I see no reason why multiple instances of the same
class can't share the same string.

João








^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14  9:41       ` EIEIO Eric Abrahamsen
@ 2014-03-14 20:13         ` Eric Schulte
  2014-03-15  6:54           ` EIEIO Thien-Thi Nguyen
  0 siblings, 1 reply; 19+ messages in thread
From: Eric Schulte @ 2014-03-14 20:13 UTC (permalink / raw)
  To: Eric Abrahamsen; +Cc: emacs-devel

Eric Abrahamsen <eric@ericabrahamsen.net> writes:

> Daniel Colascione <dancol@dancol.org> writes:
>
>> On 03/13/2014 05:36 PM, Eric M. Ludlam wrote:
>>> The key thing that EIEIO lets me do is define interfaces that allows
>>> modules to work together.

One more experiential point in this thread.  I implemented an Emacs GO
mode recently and (thanks to EIEIO) I was able to transparently support
reading/writing of moves/game-state to/from multiple GO engines, network
protocols, game formats (sgf) and even the Emacs display and user, all
through a single API [1].

I would not have even attempted this without EIEIO, but with EIEIO it
was a pleasure.

Best,

Footnotes: 
[1]  https://raw.github.com/eschulte/el-go/master/go-api.el

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: EIEIO
  2014-03-14 20:13         ` EIEIO Eric Schulte
@ 2014-03-15  6:54           ` Thien-Thi Nguyen
  2014-03-16  1:06             ` ELPA Go integration Was: EIEIO Eric Schulte
  0 siblings, 1 reply; 19+ messages in thread
From: Thien-Thi Nguyen @ 2014-03-15  6:54 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 584 bytes --]

() Eric Schulte <schulte.eric@gmail.com>
() Fri, 14 Mar 2014 14:13:07 -0600

   [1]  https://raw.github.com/eschulte/el-go/master/go-api.el

Btw, IMHO you should add el-go to ELPA.  That way, i can more easily
snarf the fetching SVG-display design/implementation for gnugo.el, or
even rebase (thinking longer term :-D) gnugo.el on top of that API.

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* ELPA Go integration Was: EIEIO
  2014-03-15  6:54           ` EIEIO Thien-Thi Nguyen
@ 2014-03-16  1:06             ` Eric Schulte
  2014-03-16 10:36               ` Thien-Thi Nguyen
  2014-03-17 14:36               ` Stefan
  0 siblings, 2 replies; 19+ messages in thread
From: Eric Schulte @ 2014-03-16  1:06 UTC (permalink / raw)
  To: emacs-devel

Thien-Thi Nguyen <ttn@gnu.org> writes:

> () Eric Schulte <schulte.eric@gmail.com>
> () Fri, 14 Mar 2014 14:13:07 -0600
>
>    [1]  https://raw.github.com/eschulte/el-go/master/go-api.el
>
> Btw, IMHO you should add el-go to ELPA.  That way, i can more easily
> snarf the fetching SVG-display design/implementation for gnugo.el, or
> even rebase (thinking longer term :-D) gnugo.el on top of that API.

Done.

As the ELPA README suggests,

> ** Public incubation
> 
> If you want to develop a package publicly prior to its first release (to
> benefit from others' feedback, primarily), but not in an external repo,
> you can push to an "ephemeral" branch -- subject to rebase and eventual
> removal upon finishing merge -- for the duration of the incubation.

and I don't believe el-go is ready for a public release to users, I've
pushed it to a branch of the ELPA repo named "go".

I hope you find it useful.

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: ELPA Go integration Was: EIEIO
  2014-03-16  1:06             ` ELPA Go integration Was: EIEIO Eric Schulte
@ 2014-03-16 10:36               ` Thien-Thi Nguyen
  2014-03-24  8:33                 ` Thien-Thi Nguyen
  2014-03-17 14:36               ` Stefan
  1 sibling, 1 reply; 19+ messages in thread
From: Thien-Thi Nguyen @ 2014-03-16 10:36 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 687 bytes --]

() Eric Schulte <schulte.eric@gmail.com>
() Sat, 15 Mar 2014 19:06:00 -0600

   > [add el-go to ELPA]

   Done.

Cool.

   and I don't believe el-go is ready for a public release to users,
   I've pushed it to a branch of the ELPA repo named "go".

OK.  What are your plans to get to release?

   I hope you find it useful.

I think how useful i find it depends mostly on how stable it is/becomes,
as declared/determined at time of release.

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: ELPA Go integration Was: EIEIO
  2014-03-16  1:06             ` ELPA Go integration Was: EIEIO Eric Schulte
  2014-03-16 10:36               ` Thien-Thi Nguyen
@ 2014-03-17 14:36               ` Stefan
  2014-03-25  2:05                 ` Stefan
  1 sibling, 1 reply; 19+ messages in thread
From: Stefan @ 2014-03-17 14:36 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-devel

> As the ELPA README suggests,

>> ** Public incubation
>> 
>> If you want to develop a package publicly prior to its first release (to
>> benefit from others' feedback, primarily), but not in an external repo,
>> you can push to an "ephemeral" branch -- subject to rebase and eventual
>> removal upon finishing merge -- for the duration of the incubation.

Actually, better would be to change the elpa-archive building script so
that you can prevent it from making a release simply by setting
something like "Version: -1".


        Stefan



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: About CEDET, Completion, and compilers
  2014-03-13  3:04 About CEDET, Completion, and compilers Eric M. Ludlam
  2014-03-13 13:40 ` Andreas Röhler
@ 2014-03-23 14:57 ` Richard Stallman
  1 sibling, 0 replies; 19+ messages in thread
From: Richard Stallman @ 2014-03-23 14:57 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

    When someone talks about using Clang or other external compiler for 
    "smart completion", there is a layer in CEDET where that tool can be 
    integrated in as a new smart-completion back-end, allowing any 
    user-facing tool built using CEDET APIs to work with this new tool.  I 
    don't really see using an external compiler as "competing" with CEDET. 

I agree with you on this point: Clang is not competing with CEDET.
The problem with Clang is that it is competing with GCC.

-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use Ekiga or an ordinary phone call.




^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: ELPA Go integration Was: EIEIO
  2014-03-16 10:36               ` Thien-Thi Nguyen
@ 2014-03-24  8:33                 ` Thien-Thi Nguyen
  0 siblings, 0 replies; 19+ messages in thread
From: Thien-Thi Nguyen @ 2014-03-24  8:33 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 748 bytes --]

() Thien-Thi Nguyen <ttn@gnu.org>
() Sun, 16 Mar 2014 11:36:57 +0100

   () Eric Schulte <schulte.eric@gmail.com>
   () Sat, 15 Mar 2014 19:06:00 -0600

      I hope you find it useful.

   I think how useful i find it depends mostly on how stable it
   is/becomes, as declared/determined at time of release.

After some reflection (and off-list clue from helpful people), i
realize how haughty this remark may seem.  Better to simply and
sincerely say: Thanks; i look forward to learning how el-go works.

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: ELPA Go integration Was: EIEIO
  2014-03-17 14:36               ` Stefan
@ 2014-03-25  2:05                 ` Stefan
  0 siblings, 0 replies; 19+ messages in thread
From: Stefan @ 2014-03-25  2:05 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-devel

> Actually, better would be to change the elpa-archive building script so
> that you can prevent it from making a release simply by setting
> something like "Version: -1".

I just installed this change, so if you want you can now move your code
to elpa's main branch and just set "Version:" to "-1", which will tell
the elpa build scripts not to publish it in the GNU ELPA archive.


        Stefan



^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2014-03-25  2:05 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-13  3:04 About CEDET, Completion, and compilers Eric M. Ludlam
2014-03-13 13:40 ` Andreas Röhler
2014-03-13 14:04   ` João Távora
2014-03-13 14:21     ` Andreas Röhler
2014-03-14  0:36   ` Eric M. Ludlam
2014-03-14  2:26     ` EIEIO Daniel Colascione
2014-03-14  3:35       ` EIEIO Eric M. Ludlam
2014-03-14  6:42       ` EIEIO David Engster
2014-03-14  9:41       ` EIEIO Eric Abrahamsen
2014-03-14 20:13         ` EIEIO Eric Schulte
2014-03-15  6:54           ` EIEIO Thien-Thi Nguyen
2014-03-16  1:06             ` ELPA Go integration Was: EIEIO Eric Schulte
2014-03-16 10:36               ` Thien-Thi Nguyen
2014-03-24  8:33                 ` Thien-Thi Nguyen
2014-03-17 14:36               ` Stefan
2014-03-25  2:05                 ` Stefan
2014-03-14 10:24       ` EIEIO João Távora
2014-03-14  6:47     ` About CEDET, Completion, and compilers Andreas Röhler
2014-03-23 14:57 ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).