Транслятор из Java в MSIL

Download Report

Transcript Транслятор из Java в MSIL

Конвертор байт-кода java в CIL
Д. С. Возжаев, 544 группа
Научный руководитель: д. т. н. проф. В. О. Сафонов
Рецензент: асп. А. Н. Близнюк
Санкт-Петербургский Государственный Университет
Математико-механический факультет
Кафедра системного программирования
Постановка задачи
• Входные данные:
– Работающая программа на Java,
скомпилированная Sun javac или Eclipse
• Интерфейс командной строки
• Используется System.Reflection.Emit
• Выходные данные:
– CIL-сборка exe или dll аналогичная
входным данным
Обзор существующих решений
• Microsoft J#
• jilc.sourceforge.net
• Remotesoft Java.Net
Реализация
•
•
•
•
Конвертирование метаданных
Анализ потока данных
Анализ потока управления
Генерация кода
try
catch Throwable
catch *
try
catch *
try
catch Throwable
0: getstatic java/lang/System.out
3: ldc "Protected code "
5: invokevirtual println :(String)V
8: new java/lang /Object
11: dup
12: invokespecial Object ."<init>":()V
15: astore_2
16: jsr 50
19: aload_2
20: areturn
21: pop
22: getstatic java/lang/System.out
25: ldc "Catch block"
27: invokevirtual println :(String)V
30: new java/lang/Integer
33: dup
34: iconst_1
35: invokespecial Integer ."<init>":(I)V
38: astore_2
39: jsr 50
42: aload_2
43: areturn
44: astore_1
45: jsr 50
48: aload_1
49: athrow
50: astore_0
51: getstatic java/lang/System.out
54: ldc "Finally body "
56: invokevirtual println :(String)V
59: goto 63
62: pop
63: ret 0
try
catch Throwable
catch *
0: getstatic java/lang/System.out
3: ldc "Protected code "
5: invokevirtual println :(String)V
8: new java/lang /Object
11: dup
12: invokespecial Object ."<init>":()V
15: astore_2
16: jsr 50
19: aload_2
20: areturn
try
catch Throwable
21:
22:
25:
27:
30:
33:
34:
35:
38:
39:
pop
getstatic java/lang/System.out
ldc "Catch block"
invokevirtual println :(String)V
new java/lang/Integer
dup
iconst_1
invokespecial Integer ."<init>":(I)V
astore_2
jsr 50
42:
43:
44:
45:
48:
49:
50:
51:
54:
56:
59:
62:
63:
aload_2
areturn
astore_1
jsr 50
aload_1
athrow
astore_0
getstatic java/lang/System.out
ldc "Finally body "
invokevirtual println :(String)V
goto 63
pop
ret 0
try
catch *
0: getstatic java/lang/System.out
3: ldc "Protected code"
5: invokevirtual println:(String)V
8: new java/lang/Object
11: dup
12: invokespecial Object."<init>":()V
15: astore_2
16: jsr 50
goto 19
try
catch Throwable
catch Any
19: aload_2
20: areturn
try
catch Any
44:
45:
48:
49:
astore_1
jsr 50
aload_1
athrow
44:
45:
48:
49:
astore_1
jsr 50
aload_1
athrow
21:
22:
25:
27:
30:
33:
34:
35:
38:
39:
pop
getstatic java/lang/System.out
ldc "Catch block"
invokevirtual println:(String)V
new java/lang/Integer
dup
iconst_1
invokespecial Integer."<init>":(I)V
astore_2
jsr 50
goto 42
42: aload_2
43: areturn
50: astore_0
goto 51
try
catch Throwable
51: getstatic java/lang/System.out
54: ldc "Finally body"
56: invokevirtual println:(String)V
goto 59
59: goto 63
62: pop
goto 63
63: ret 0
0: getstatic java/lang/System.out
3: ldc "Protected code"
5: invokevirtual println:(String)V
8: new java/lang/Object
11: dup
12: invokespecial Object."<init>":()V
15: astore_2
Ldc_I4, 0
StLoc, Sub1_ReturnIndex
goto Sub_1
try
catch Throwable
catch Any
Sub_1_Return0:
goto 19
44: astore_1
19: aload_2
20: areturn
try
try
catch Any
catch Throwable
62: pop
goto 48
51: getstatic java/lang/System.out
54: ldc "Finally body"
56: invokevirtual println:(String)V
goto 48
21:
22:
25:
27:
30:
33:
34:
35:
38:
44: astore_1
48: aload_1
49: athrow
Sub_1_Return1:
goto 42
try
catch Throwable
62: pop
goto 48
pop
getstatic java/lang/System.out
ldc "Catch block"
invokevirtual println:(String)V
new java/lang/Integer
dup
iconst_1
invokespecial Integer."<init>":(I)V
astore_2
Ldc_I4, 1
StLoc, Sub1_ReturnIndex
goto Sub_1
51: getstatic java/lang/System.out
54: ldc "Finally body"
56: invokevirtual println:(String)V
goto 48
42: aload_2
43: areturn
Sub_1
try
48: aload_1
49: athrow
62: pop
goto 63
catch Throwable
51: getstatic java/lang/System.out
54: ldc "Finally body"
56: invokevirtual println:(String)V
goto 63
LdLoc, Sub1_ReturnIndex
Ldc_I4, 0
Breq Sub_1_Return0
Br Sub_1_Return1
Caffeine Mark
•
•
•
•
•
Решето Эратосфена
Сортировка и генерация
последовательностей
Сложные условные переходы
Рекурсивные вызовы методов
Арифметика с плавающей точкой
•
•
•
•
•
•
•
•
•
test>jconv.exe […] -name test -src cmkit/embed -main
CaffeineMarkEmbeddedApp
test>test.exe
Sieve score = 35699 (98)
Loop score = 147664 (2017)
Logic score = 112910 (0)
String score = 33793 (708)
Float score = 51015 (185)
Method score = 48378 (166650)
Overall score = 60623
•
•
•
•
•
•
•
•
test>java -cp cmkit/embed CaffeineMarkEmbeddedApp
Sieve score = 16959 (98)
Loop score = 118335 (2017)
Logic score = 65942 (0)
String score = 31140 (708)
Float score = 47125 (185)
Method score = 40733 (166650)
Overall score = 44637
Результаты и перспективы
• Реализовано:
– Конвертация метаданных, необходимых
для выполнения программы
– Конвертация байт-кода Java в СIL
• Пути развития:
– Конвертирование отладочной информации
– Улучшение диагностики ошибок
– Java Native Interface
Список литературы
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
Java VM, http://java.sun.com/
CLI, http://msdn2.microsoft.com/en-us/netframework/aa569283.aspx
jbimp, http://msdn2.microsoft.com/en-us/library/y9teabc2(VS.80).aspx
Remotesoft Java.Net, http://www.remotesoft.com/javanet/
jilc, http://jilc.sourceforge.net
IIT-Kanpur, http://www.iitk.ac.in/
Microsoft .Net Framework SDK, http://msdn.microsoft.com/netframework/
Microsoft Visual J++ 6.0, http://msdn2.microsoft.com/en-us/vjsharp/bb188636.aspx
Microsoft Java, http://www.microsoft.com/mscorp/java/
Tim Lindholm, Frank Yellin, “The JavaTM Virtual Machine Specification, Second Edition”, 1999, Prentice Hall PTR, ISBN: 9780201432947
Microsoft Phoenix, http://research.microsoft.com/phoenix/
Unmanaged Metadata API, http://msdn2.microsoft.com/en-us/library/ms404384.aspx
James Gosling, Bill Joy, Guy Steele, Gilad Bracha, “The Java(TM) Language Specification”, 2005, Prentice Hall PTR, ISBN:
978-0321246783
Ecma-335, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf
Dominator, http://en.wikipedia.org/wiki/Dominator
T. Lengauer and R. E. Tarjan, “A fast algorithm for finding dominators in a flow graph”, Transactions on Programming
Languages and Systems 1 (1979), 121-141.
Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy, “A Simple, Fast Dominance Algorithm”,
http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
Eclipse, http://www.eclipse.org
Sun Javac, http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javac.html
Никлаус Вирт, «Алгоритмы и структуры данных», 1997, Санкт-Петербург: «Невский Диалект»
Caffeine Mark, http://www.benchmarkhq.ru/cm30/
Java Native Interface, http://java.sun.com/j2se/1.4.2/docs/guide/jni/
PE and COFF File Format, http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
IEEE 754, http://standards.ieee.org/catalog/bus.html#754-1985