Цитата(Rohoss @ 22.4.2011, 13:18 ) | | А по исходному IL-коду иногда можно догадываться на каком ЯП написано, потому как используются такие пространства имён как FSharp, VisualBasic и другие... |
Ну вообще-то не только. Как написал Sartorius, некоторые вещи можно определить по особенностям компиляции. Приведу простой пример: создаем цикл на шарпее и на бейсике| Код | for (int i = 0; i <= 10; i++) { Console.WriteLine("blablabla"); }
|
| Код | For i As Integer = 0 To 10 Step 1 Console.WriteLine("blablabla") Next
|
Вроде ожидается, что должен быть сгенерирован один IL, однако что мы видим: Для шарпа| Код | IL_0000: ldc.i4.0 IL_0001: stloc.0 IL_0002: br.s IL_0012 // loop start (head: IL_0012) IL_0004: ldstr "blablabla" IL_0009: call void [mscorlib]System.Console::WriteLine(string) IL_000e: ldloc.0 IL_000f: ldc.i4.1 IL_0010: add IL_0011: stloc.0 IL_0012: ldloc.0 IL_0013: ldc.i4.s 10 IL_0015: ble.s IL_0004 // end loop IL_0017: ret
|
А для бейсика| Код | IL_0000: ldc.i4.0 IL_0001: stloc.0 // loop start (head: IL_0002) IL_0002: ldstr "blablabla" IL_0007: call void [mscorlib]System.Console::WriteLine(string) IL_000c: ldloc.0 IL_000d: ldc.i4.1 IL_000e: add.ovf IL_000f: stloc.0 IL_0010: ldloc.0 IL_0011: ldc.i4.s 10 IL_0013: ble.s IL_0002 // end loop IL_0015: ret
|
То есть различия очевидны. Можно конечно для шарпа написать так| Код | int i = 0; while (true) { Console.WriteLine("blablabla"); i++; if (i > 10) { break; } }
|
Тогда получим такой IL| Код | IL_0000: ldc.i4.0 IL_0001: stloc.0 // loop start (head: IL_0002) IL_0002: ldstr "blablabla" IL_0007: call void [mscorlib]System.Console::WriteLine(string) IL_000c: ldloc.0 IL_000d: ldc.i4.1 IL_000e: add IL_000f: stloc.0 IL_0010: ldloc.0 IL_0011: ldc.i4.s 10 IL_0013: ble.s IL_0002 // end loop IL_0015: ret
|
В данном случае различия в том, как выполняется инкремент счетчика: в шарпе используется инструкция add, а в бейсике add.ovf ( с проверкой переполнения). На шарпе тоже можно выполнить проверку переполнения значений| Код | int i = 0; while (true) { Console.WriteLine("blablabla"); checked { i++; } if (i > 10) { break; } }
|
и получить код, идентичный тому, что генерируется для бейсика, вопрос только в том, кто будет этим заниматься. А подобные нюансы существуют для многих конструкций. |