Для оценки эффективности результатов трансляции с различных языков программирования выбран фрагмент программы часто применяемый для обработки символьной строки на языке Си.

Выбранный фрагмент для иллюстрации различий в эффективности трансляции с различных языков является примером изящного оператора языка Си

while(*ptra++=*ptrb++);

который применяется в языке Си для копирования строки символов.

Фрагмент программы на Си, приведенный ниже:

char stra[256],strb[256],*ptra,*ptrb;
main() { ptra=stra; ptrb=strb; while(*ptra++=*ptrb++); }

приводится в виде соответствующего фрагмента на языке ассемблера для процессора Intel 8086 и Pentium.

   0000043C: C7 06 8A 04 8A 02 mov [048A],028A
   00000442: C7 06 8C 04 8A 03 mov [048C],038A
   00000448: 8B 1E 8C 04 mov bx,[048C]
   0000044C: FF 06 8C 04 inc [048C]
   00000450: 8A 07 mov al,[bx]
   00000452: 8B 1E 8A 04 mov bx,[048A]
   00000456: FF 06 8A 04 inc [048A]
   0000045A: 88 07 mov [bx],al
   0000045C: 0A C0 or al,al
   0000045E: 75 E8 jne 00000448

   00001153: C70534B6400034B44000 mov d,[00040B634],00040B434
   0000115D: C70538B6400034B54000 mov d,[00040B638],00040B534
   00001167: A138B64000 mov eax,[00040B638]
   0000116C: FF0538B64000 inc d,[00040B638]
   00001172: 8A10 mov dl,[eax]
   00001174: 8B0D34B64000 mov ecx,[00040B634]
   0000117A: FF0534B64000 inc d,[00040B634]
   00001180: 8811 mov [ecx],dl
   00001182: 84D2 test dl,dl
   00001184: 75E1 jne .000001167

Это самый оптимальный вариант данного фрагмента, без использования регистровых переменных, содержит 10 команд, из них 8 в цикле, занимает 36 байт для MS DOS и 51 байт для Windows-32.

Варианты получены оптимизирующими трансляторами Турбо Си для MS DOS и C-Builder для Windows-32.

Сравнение вариантов программ полученных трансляторами Турбо Си для MS DOS и C-Builder для Windows-32 явно опровергают аргументы оппонентов, что более современные трансляторы так уж намного больше оптимизируют программу, что делают её более оптимальной, чем может разработать программу квалифицированный программист на языке Люкс, и точно также на языке ассемблера.

Другие варианты занимают от 12 команд, из них 8 в цикле, длиной 38 байт до 29 команд, из них 18 в цикле, длиной 105 байт.

Различия определяются уровнем оптимизации компилятора и выбранной односегментной или многосегментной моделью памяти.

Различия также показывают, что эффективность результата трансляции - вопрос далеко не праздный, поскольку различия в результатах трансляции могут быть весьма существенными.

При использовании регистровых переменных в языке Си, фрагмент программы приобретает следующий вид:

char stra[256],strb[256];
main() { register char *ptra,*ptrb;
ptra=stra; ptrb=strb; while(*ptra++=*ptrb++); }

После компиляции оптимизирующим компилятором Micrоsoft Си, версии 5.1, программа приводится в виде соответствующего фрагмента на языке ассемблера для процессора Intel 8086.

   00000209: 57 push di
   0000020A: 56 push si
   0000020B: BE 10 00 mov si,0010
   0000020E: BF 10 01 mov di,0110
   00000211: 8A 05 mov al,[di]
   00000213: 47 inc di
   00000214: 88 04 mov [si],al
   00000216: 46 inc si
   00000217: 0A C0 or al,al
   00000219: 75 F6 jne 00000211
   0000021B: 5E pop si
   0000021C: 5F pop di

Этот фрагмент программы, длиной в 20 байт, содержит 12 команд, из них 6 в цикле.

Для сравнения, аналогичный фрагмент на языке LUX:

F,strb T,stra [ . : .]<>0  \к тому же - более компактный, чем на Си\

приводится в виде соответствующего фрагмента на языке ассемблера для процессора Intel 8086.

   00000A2F: BE 06 01 mov si,0100
   00000A32: BF 06 00 mov di,0000
   00000A35: AC lodsb
   00000A36: AA stosb
   00000A37: 3C 0D cmp al,00
   00000A39: 75 FA jne 00000A35

Этот фрагмент программы, длиной в 12 байт, содержит 6 команд, из них 4 в цикле.

Резюме результатов трансляции показывает, что даже при использовании регистровых переменных в языке Си, даже после компиляции оптимизирующим компилятором Micrоsoft Си, версии 5.1, порождается фрагмент программы, длиной в 20 байт, который содержит 12 команд, из них 6 в цикле.

Полное подмножество языка LUX, порождает фрагмент программы, длиной 12 байтов, содержащий 2 команды в заголовке цикла и 4 команды в теле цикла, что почти в два раза эффективнее по занимаемой памяти и, по меньшей мере в полтора раза эффективнее по числу обращений к главной памяти и, вследствие того, по времени выполнения фрагмента программы.

Программистам, не представляющим в деталях языка ассемблера, нет необходимости изучать в деталях приведенные здесь фрагменты на языке ассемблера, поскольку они приводятся, в основном, для оценки объема этих фрагментов.

Детальное же исследование и сопоставление фрагментов, транслируемых с различных языков программирования, только и показывает, что только программы, транслируемые с языка LUX, имеют эффективность эквивалентную эффективности программ, транслируемых с языка ассемблера.

Приведенные примеры показывают, что, даже при использовании регистровых переменных в языках высокого уровня, и даже после компиляции оптимизирующими компиляторами, при использовании традиционных языков высокого уровня, не представляется возможным быстро и эффективно разрабатывать программы по уровню качества и быстродействия, приближающиеся к эффективности, которую имеют ассемблерные программы.

Это же - прямо подтверждают и исследования других разработчиков:

"Версии Паскаля, выдающие машинный код, позволяют приблизиться к эффективности выполнения, которую имеют ассемблерные программы, но не более, чем приблизиться: следует учесть изначальную неэффективность программ, полученных с помощью компилятора с любого языка высокого уровня" [2].

Л И Т Е Р А Т У Р А

   2. Р.Фаулджер. Программирование встроенных микропроцессоров. Москва "Мир" 1985 год.

Я вовсе не призываю себя или кого-либо бросать программировать на любых существующих языках, но программирование на языке Люкс может существенно расширить каждому свой диапазон возможностей и инструментов программирования, поскольку язык Люкс очень эффективен в разработке инструментальных программ.

При конструктивном подходе и взаимном интересе я буду рад помочь любому, действительно - желающему того, в практическом освоении системы программирования на языке Люкс.

Это помогло бы Вам в более глубоком освоении самого искусства программирования, и у Вас был бы больший диапазон выбора языков и инструментов программирования.

Удачи Вам!

E-mail: pancov@mail.ru

Copyright (c) 1995
Victor M. Pancov. Obninsk, Russia.
В.М.Паньков,249020 Обнинск, Россия.

Free Web Hosting