aboutsummaryrefslogtreecommitdiffstats
path: root/docs/developer/language.html
blob: e047dc87c9f08c2995fe2eadabaf3763a9fe156c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>AJDT Project Proposal</title>
<STYLE TYPE="text/css">
<!--
 
   /* FOR THE SDA PAGE */
 
	/*
	BODY {margin-top: 15px; margin-left: 15px; margin-right: 15px;}
	*/

	A:link {
		color:#4756AC;
	}
	A:visited {
		color:#60657B;
	}
	A:hover {
		color:red
	}
	
	INPUT {font:12px "Courier New", sans-serif;}
	
	H2 {
		font:18px/18px Verdana, Arial, Helvetica, sans-serif; 
		color:black; 
		font-weight:bold; 
		margin-left: 10px;
		line-height:110%; 
	}
	H3 {
		font:18px/18px Verdana, Arial, Helvetica, sans-serif; 
		color:black; 
		font-weight:bold; 
		margin-left: 10px;
		line-height:110%; 
	}
	H4 {
		font:15px/16px Verdana, Arial, Helvetica, sans-serif; 
		color:black; 
		font-weight:bold; 
		margin-left: 10px;
		line-height:140%;
	}
	P {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
		margin-right: 10px;
		margin-left: 10px;
		line-height:130%; 
	}
	.paragraph {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
		margin-right: 10px;
		margin-left: 10px;
		line-height:130%; 
	}
	.smallParagraph {
		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
		margin-right: 10px;
		margin-left: 10px;
		line-height:130%; 
	}
	LI {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
		text-align:justify; 
		margin-right: 10px;
		margin-left: 15px;
		line-height:120%; 
	}
	/*
	UL {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
		text-align:justify; 
		margin-right: 10px;
		margin-left: 15px;
		line-height:120%; 
	}*/
	
	DL {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
		text-align:justify; 
		margin-right: 10px;
		margin-left: 15px;
		line-height:120%; 
	}
	B { font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
		font-weight:bold; 
		line-height:140%;
	}
	.footer {
		font:10px/10px Verdana, Arial, Helvetica, sans-serif;  
		color:#888888; 
		text-align:left
	}
	.figureTitle {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
		text-align:justify; 
		text-align:center
	}
	.copyrightNotice {
		font:10px/10px Verdana, Arial, Helvetica, sans-serif; 
		color:#999999; 
		line-height:110%;
	}
	.smallHeading {
		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
		font-weight:bold;
		line-height:110%;
	}
	.tinyHeading {
		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
		font-weight:bold;
		line-height:120%;
	}
	.newsText {
		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
		line-height:130%;
	}
	.smallParagraph {
		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
		line-height:130%;
	}
	.fancyHeading {
		font:20px/20px Chantilly, Arial, Helvetica, sans-serif; 
		margin-right: 10px;
		color:#6f7a92;
		margin-left: 10px;
		line-height:130%;
	}
 
-->
</STYLE>
</head>

<BODY BGCOLOR="white">

<h3 align="center">AspectJ Language Design</h3>

<h4>User-suggested New Language Features</h4>
<ul>
	<li>&quot;-&quot; wildcard<ul>
	<li>
	<a href="http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00717.html">
	http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00717.html</a> </li>
	<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=34054#c2">
	https://bugs.eclipse.org/bugs/show_bug.cgi?id=34054#c2</a> </li>
</ul>
	</li>
	<li>Class cast pointcut<ul>
	<li>
	<a href="http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg01479.html">
	http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg01479.html</a> </li>
</ul>
	</li>
	<li>Extensible pointcuts, abstract pointcuts, and interfaces<ul>
		<li>
		<a href="http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00458.html">
		http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00458.html</a></li>
		<li>
		<a href="http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00467.html">
		http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00467.html</a> <br>&nbsp;</li>
	</ul>
	</li>
</ul>
<h4>Key Language Design Properties</h4>
<p>(1) Orthogonal join point model - the different kinds of join points, the 
different primitive pointcuts, and the different kinds of advice can be used in 
any combination.</p>
<p>This was one of the hardest parts of the design to get right, because of the 
&quot;constructor must call super&quot; rule in Java. But we finally got this in 1.0.<br>
<br>
(2) Pointcuts support composition and abstraction. Abelson and Sussman say that 
composition and abstraction are the key elements of a real language. Clearly the 
pointcut mechanism is the new thing in AspectJ, and so it was critical that it 
support composition and abstraction. The fact that someone can write:</p>
<blockquote>
	<p><font face="Courier">/* define an abstraction called stateChange */<br>
	pointcut stateChange(): call(void FigureElement+.set*(*));<br>
	<br>
	/* compose pointcuts to get other pointcuts */<br>
	pointcut topLevelStateChange(): stateChange() `<br>
	&amp;&amp; !cflowbelow(stateChange());</font></p>
</blockquote>
<p>is what makes it possible for people to really work with crosscutting 
structure and make their code more clear.<br>
<br>
(3) Statically type checked. The efficiency, code quality and programmer 
productivity arguments for this have been made elsewhere, so I won't repeat 
them. <br>
<br>
(4) Efficient. AspectJ code is as fast as the equivalent functionality, written 
by hand, in a scattered and tangled way.<br>
<br>
(5) Simple kernel. I've heard some people say that AspectJ is too big and too 
complex. In the most important sense of simple AspectJ is simple. I can reason 
about any AspectJ program with a simple model. The kernel of AspectJ is simple, 
and the orthogonality described above means that its easy to start with just the 
kernel and slowly add to that.</p>
<p>Its pretty clear to pull out this kernel of AspectJ. I would argue that the 
right idea for a standard AOP API<br>
is this kernel, packaged in a way that allows building more sophisticated tools 
on top of it.<br>
<br>
(6) Supports multiple weave times. AspectJ is neutral on whether weaving happens 
at pre-process, compile, post-process, load, JIT or runtime. This neutrality is 
critical. Its why there are serious JVM experts who are already thinking about 
JVM support for AspectJ.</p>
<p>There's more, but I think these are the most important ones. I think any 
functionality this group comes up with should also meet these criteria.<br>
&nbsp;</p>

</body>

</html>