<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Reducing_Eifgen_Size</id>
		<title>Reducing Eifgen Size - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Reducing_Eifgen_Size"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reducing_Eifgen_Size&amp;action=history"/>
		<updated>2026-05-20T07:08:04Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reducing_Eifgen_Size&amp;diff=4821&amp;oldid=prev</id>
		<title>Gmc444: /* Technical Overview */</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reducing_Eifgen_Size&amp;diff=4821&amp;oldid=prev"/>
				<updated>2006-09-29T23:53:52Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Technical Overview&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 23:53, 29 September 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;## Debug files from the C compiler (at least for MSC)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;## Debug files from the C compiler (at least for MSC)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I also found &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;an empty &lt;/del&gt;PARTIALS directory, but it was empty.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I also found &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;a &lt;/ins&gt;PARTIALS directory, but it was empty.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Right away, several ideas occur to me for reducing the size of the EIFGEN. First, there is almost certainly a HUGE amount of replication from project to project. Unless someone is radically modifying ANY, the majority of the code generated by one project is going to be identical to another project that's referencing the same libraries (or universe). With the current implementation, applications pay an enormous penalty for having to recompile all their libraries. A partial solution &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;along these lines &lt;/del&gt;already exists with precompiled libraries, but historically these have been a pain to set up, and in my experience they can be difficult to port from one machine to another (especially for Eiffel .Net). There's also a major drawback to precompiles: your project can only reference one. So either you can reference a relatively small commmon subset, or you can reference a larger set that tries to engulf everything outside of your application. Neither solution is optimal. A better approach would allow precompiles to work more like traditional libraries, and for applications to be able to reference multiple precompiled libraries.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Right away, several ideas occur to me for reducing the size of the EIFGEN. First, there is almost certainly a HUGE amount of replication from project to project. Unless someone is radically modifying ANY, the majority of the code generated by one project is going to be identical to another project that's referencing the same libraries (or universe). With the current implementation, applications pay an enormous penalty for having to recompile all their libraries. A partial solution already exists with precompiled libraries, but historically these have been a pain to set up, and in my experience they can be difficult to port from one machine to another (especially for Eiffel .Net). There's also a major drawback to precompiles: your project can only reference one. So either you can reference a relatively small commmon subset, or you can reference a larger set that tries to engulf everything outside of your application. Neither solution is optimal. A better approach would allow precompiles to work more like traditional libraries, and for applications to be able to reference multiple precompiled libraries.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Second, if I understand what's going on there can be five separate representations for each class in the EIFGEN (three representations in the COMP directory and a C representation in both the F_CODE and W_CODE directories). I'm not counting the additional representations that are the C compiler's binary output.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Second, if I understand what's going on there can be five separate representations for each class in the EIFGEN (three representations in the COMP directory and a C representation in both the F_CODE and W_CODE directories). I'm not counting the additional representations that are the C compiler's binary output. &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This sounds excessive on the surface of it, and there may be opportunities for combining some of these representations. For example, what if only one C code representation was generated, and C macros were used to control which type of binary was produced? Or could a single version of the AST serve &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;both &lt;/del&gt;purposes?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This sounds excessive on the surface of it, and there may be opportunities for combining some of these representations. For example, what if only one C code representation was generated, and C macros &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;or ifdefs &lt;/ins&gt;were used to control which type of binary was produced? Or could a single version of the AST serve &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;all &lt;/ins&gt;purposes?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Gmc444</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reducing_Eifgen_Size&amp;diff=4120&amp;oldid=prev</id>
		<title>Gmc444 at 01:13, 5 August 2006</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reducing_Eifgen_Size&amp;diff=4120&amp;oldid=prev"/>
				<updated>2006-08-05T01:13:00Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Projects]]&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
To reduce the size of EIFGENs to 10% of their levels as of version 5.7.62110&lt;br /&gt;
&lt;br /&gt;
== Motivation for reducing the size of EIFGENs ==&lt;br /&gt;
&lt;br /&gt;
I recently benchmarked a &amp;quot;Hello World&amp;quot; project at taking over 40 Mb of storage (with both workbench and finalized version compiled). Many of my production applications consume hundreds of megabytes, or even more than 1 Gb. This high level of consumption has several negative effects. It puts off potential customers when they see the high costs of storage and time involved in using the compiler, and it inhibits automated compilation and testing of a large number of Eiffel applications.&lt;br /&gt;
&lt;br /&gt;
Reducing the size of Eifgens could have numerous benefits. Significantly reducing the size could be reflected by a corresponding improvement in performance. It would make the compiler more competitive and more attractive to cost-conscious potential customers. &lt;br /&gt;
 &lt;br /&gt;
Manus told me that recently the size of the EIFGEN that's generated when compiling the compiler has gone from 1.8 Gb to 1 Gb. This is good, but I would like to set the goal of reducing EIFGENs by another 90%.&lt;br /&gt;
&lt;br /&gt;
== Technical Overview ==&lt;br /&gt;
&lt;br /&gt;
In a recent posting on comp.lang.eiffel, Manus explained the bulky content of the EIFGEN directory as follows:&lt;br /&gt;
&lt;br /&gt;
# The COMP directory contains &lt;br /&gt;
## one representation of the Abstract Syntax Tree of the source code in a format that's larger than the original source. &lt;br /&gt;
## a modifed second copy for code generation. &lt;br /&gt;
## A description of the classes in a compact format&lt;br /&gt;
## Dependencies for incremental recompilation&lt;br /&gt;
# The F_CODE directory contains &lt;br /&gt;
## C code for the finalized mode&lt;br /&gt;
## The C compiler output (Object files, static libraries, shared libraries, assemblies and executables.)&lt;br /&gt;
# The W_CODE directory contains&lt;br /&gt;
## C code for the Workbench mode&lt;br /&gt;
## The C compiler output (Object files, static libraries, shared libraries, assemblies and executables.&lt;br /&gt;
## Debug files from the C compiler (at least for MSC)&lt;br /&gt;
&lt;br /&gt;
I also found an empty PARTIALS directory, but it was empty.&lt;br /&gt;
&lt;br /&gt;
Right away, several ideas occur to me for reducing the size of the EIFGEN. First, there is almost certainly a HUGE amount of replication from project to project. Unless someone is radically modifying ANY, the majority of the code generated by one project is going to be identical to another project that's referencing the same libraries (or universe). With the current implementation, applications pay an enormous penalty for having to recompile all their libraries. A partial solution along these lines already exists with precompiled libraries, but historically these have been a pain to set up, and in my experience they can be difficult to port from one machine to another (especially for Eiffel .Net). There's also a major drawback to precompiles: your project can only reference one. So either you can reference a relatively small commmon subset, or you can reference a larger set that tries to engulf everything outside of your application. Neither solution is optimal. A better approach would allow precompiles to work more like traditional libraries, and for applications to be able to reference multiple precompiled libraries.&lt;br /&gt;
&lt;br /&gt;
Second, if I understand what's going on there can be five separate representations for each class in the EIFGEN (three representations in the COMP directory and a C representation in both the F_CODE and W_CODE directories). I'm not counting the additional representations that are the C compiler's binary output.&lt;br /&gt;
This sounds excessive on the surface of it, and there may be opportunities for combining some of these representations. For example, what if only one C code representation was generated, and C macros were used to control which type of binary was produced? Or could a single version of the AST serve both purposes?&lt;/div&gt;</summary>
		<author><name>Gmc444</name></author>	</entry>

	</feed>