|
|
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
ПХПGluk (Kazan)ПХП Неужели так приятен для восприятия второй код!? Дело привычки Видимо). Сродни мазохизму чтоль. Знаешь, недавно написал пару плагинов для Yasca. Пришлось в спешном порядке освоить PHP. Вот это был мазохизм :) А Lisp - это зарядка для ума - удовольствие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 15:21:27 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик .... 1. спорный вопрос компиляторы, которые производят оптимизацию, пишет сам человек, следствие оставляю вам. соглашусь лишь с тем, что на сегодняшний момент компиляторы достигли высокого уровня кодогенерации, но лишь некоторые ... 5 . опять же спорно как и 1 пункт компиляторы пишут люди, которые описывают этот самый процесс компиляции оптимизации, а не машина сама себе его придумывает. Плюс машины в простейших оптимизациях к примеру отслеживание повторноиспользуемого кода или значений и прочее, что физически трудно для человека, но это далеко не самые критичные моменты Оптимизаторы для баз данных тоже пишут люди, но скорость выполнения на порядок быстрее, чем вы будете это делать даже в ассемблере. Учтите, что за лиспом закрепилась слава медленного языка в 60х годах, тогда и были предприняты многие меры по улучшению производительности компиляторов. С тех пор производительность ПК выросла на порядки, так что "медленный"-это очень относительно студентик 3. тут я вас не понимаю, вы случаем не про нет?? если да то нету пофиг на чем писано приложение , если вы про натив код то неверю как может байт код машина обогнать натив код, хотя программы криво написаные на ассемблере спокойно проиграют С++ Я про то, что программы на .нете и джаве были быстрее чем на нативном с++. Курить в сторону JIT-компиляции. Они уже давно не интерпритаторы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 15:25:28 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Ммихалычzloy denПри написании в низкоуровневых языках будет 1. Время разработки стремящее к бесконечности 2. Быстродействие хуже чем у высокоуровневых языков я имел в виду время исполнения :) Я тоже, во втором случае про него и говорю-не оптимально написанная программа на высокоуровневом языке (имхо) будет медленнее не оптимально написанной низкоуровневой программы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 15:28:19 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Практический вопрос- у кого получалось прикрутить хоть одну графическую библиотеку для CLISP под виндовсом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 17:40:42 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Не проверял пока под SBCL - lisp-cffi-qt4 и RDNZL(с огрничениями) - работают проверял и немного побаловался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 17:56:07 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
lisp-cffi-qt4 вроде как должна и с clisp работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 17:59:00 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
ПХП пишет: > Вот это на ПХП > > $mas = array(*76*.*0*, *84*.*5*, *92*.*5*, *88*.*0*, *96*.*0*); > echo 'тра-та-та1: ', array_sum($mas) / count($mas), ' тра-та-та2: ', $mas[*4*], ' тра-та-та3: ', count($mas); Тоже неплохо. Ну и что ? Вроде бы как про Java и С речь была. Что PHP высокоуровневый язык = я вроде бы не спорил (я его не знаю, так что не мог бы спорить). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 18:06:50 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
zloy den Оптимизаторы для баз данных тоже пишут люди, но скорость выполнения на порядок быстрее, чем вы будете это делать даже в ассемблере. Учтите, что за лиспом закрепилась слава медленного языка в 60х годах, тогда и были предприняты многие меры по улучшению производительности компиляторов. С тех пор производительность ПК выросла на порядки, так что "медленный"-это очень относительно Я про то, что программы на .нете и джаве были быстрее чем на нативном с++. Курить в сторону JIT-компиляции. Они уже давно не интерпритаторы для однородных данных с простой обрабокой да оптимизатор может общеголять человека в силу своей безупречной "внимательности" и "трудолюбии"... хотя это всеравно не аргумент сикъюл выполяется в ядре базы, которое высокопотимизировано... еще человек может недостаточно хорошо понимать струтктуру БД, использование индексов и все прочее, чем оптимизатор, который написан больше под "внутренний формат" БД в отличии от сикъюла... про Компиляцию времени выполнения я наслышан ведь это революционный шаг в виртуальных машинах рассчитанный на быстродействие, но минус данного хода лично для меня в бесконтрольности данной операции все зависит от дядек из майкрософт и насколько хорошо они реализовали свой JIT компилятор, но опять же повторюсь, если человек плохо напишет программу то она будет медленнне работать и чем ниже уровень, тем ниже у человека шанс на ошибку, поэтому я слабо вре заявлением о быстроте джит кода по сравнению с С++ аналогом, значит второй был плохо написан... вобще вся эта нет фигня финт ушами майкрософт ушла от компилирования чтобы дать переносимость, но ОПЯТЬ перешла на компиляцию во имя скорости... подобные ухищрения вызывают улыбку рядовым программситам конечно проще, за них все сделает майкрософт, но для меня лично это ограничение моей свободы... понимайте это как хотите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 21:01:54 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентикzloy den Оптимизаторы для баз данных тоже пишут люди, но скорость выполнения на порядок быстрее, чем вы будете это делать даже в ассемблере. Учтите, что за лиспом закрепилась слава медленного языка в 60х годах, тогда и были предприняты многие меры по улучшению производительности компиляторов. С тех пор производительность ПК выросла на порядки, так что "медленный"-это очень относительно Я про то, что программы на .нете и джаве были быстрее чем на нативном с++. Курить в сторону JIT-компиляции. Они уже давно не интерпритаторы для однородных данных с простой обрабокой да оптимизатор может общеголять человека в силу своей безупречной "внимательности" и "трудолюбии"... хотя это всеравно не аргумент сикъюл выполяется в ядре базы, которое высокопотимизировано... еще человек может недостаточно хорошо понимать струтктуру БД, использование индексов и все прочее, чем оптимизатор, который написан больше под "внутренний формат" БД в отличии от сикъюла... про Компиляцию времени выполнения я наслышан ведь это революционный шаг в виртуальных машинах рассчитанный на быстродействие, но минус данного хода лично для меня в бесконтрольности данной операции все зависит от дядек из майкрософт и насколько хорошо они реализовали свой JIT компилятор, но опять же повторюсь, если человек плохо напишет программу то она будет медленнне работать и чем ниже уровень, тем ниже у человека шанс на ошибку, поэтому я слабо вре заявлением о быстроте джит кода по сравнению с С++ аналогом, значит второй был плохо написан... вобще вся эта нет фигня финт ушами майкрософт ушла от компилирования чтобы дать переносимость, но ОПЯТЬ перешла на компиляцию во имя скорости... подобные ухищрения вызывают улыбку рядовым программситам конечно проще, за них все сделает майкрософт, но для меня лично это ограничение моей свободы... понимайте это как хотите БРАХМА ВЫДЫХАЙ !!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2009, 23:09:38 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
[quot ПХПМощнее Си? Если нет богатого АПИ, библиотек - это уже не конкурент ПХП, так как в этом вся соль этого аля шаблонизатора. А скобки и остальную хрень оставьте для теорий и бла-бла-бла. Если он может, то примеры сайтов можно или готовых решений в студию?[/quot] Ого! Адепты Personal Home Page наезжают на великий и могучий CL! Посмотрим как ты на Си или Пыхе напишешь что-то вроде Common Lisp Hypermedia Server. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 06:49:22 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)Знаешь, недавно написал пару плагинов для Yasca. Пришлось в спешном порядке освоить PHP. Вот это был мазохизм :) А Lisp - это зарядка для ума - удовольствие нормальный язык, вот тока нафуфа его так раздули, ведь он узкоспециализированный, пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 09:22:13 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
zloy denМмихалычzloy denПри написании в низкоуровневых языках будет 1. Время разработки стремящее к бесконечности 2. Быстродействие хуже чем у высокоуровневых языков я имел в виду время исполнения :) Я тоже, во втором случае про него и говорю-не оптимально написанная программа на высокоуровневом языке (имхо) будет медленнее не оптимально написанной низкоуровневой программы сам себе противоречишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 09:23:55 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
МмихалычGluk (Kazan)Знаешь, недавно написал пару плагинов для Yasca. Пришлось в спешном порядке освоить PHP. Вот это был мазохизм :) А Lisp - это зарядка для ума - удовольствие нормальный язык, вот тока нафуфа его так раздули, ведь он узкоспециализированный, пока. Жалкое подобие левой руки (тьфу ты Perl-а) А количество способов прострелить ногу никак не уравновешено с его изобразительными возможностями (все это IMHO разумеется, чтобы не ранить адептов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 09:43:56 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик для однородных данных с простой обрабокой да оптимизатор может общеголять человека в силу своей безупречной "внимательности" и "трудолюбии"... хотя это всеравно не аргумент сикъюл выполяется в ядре базы, которое высокопотимизировано... еще человек может недостаточно хорошо понимать струтктуру БД, использование индексов и все прочее, чем оптимизатор, который написан больше под "внутренний формат" БД в отличии от сикъюла... про Компиляцию времени выполнения я наслышан ведь это революционный шаг в виртуальных машинах рассчитанный на быстродействие, но минус данного хода лично для меня в бесконтрольности данной операции все зависит от дядек из майкрософт и насколько хорошо они реализовали свой JIT компилятор, но опять же повторюсь, если человек плохо напишет программу то она будет медленнне работать и чем ниже уровень, тем ниже у человека шанс на ошибку, поэтому я слабо вре заявлением о быстроте джит кода по сравнению с С++ аналогом, значит второй был плохо написан... вобще вся эта нет фигня финт ушами майкрософт ушла от компилирования чтобы дать переносимость, но ОПЯТЬ перешла на компиляцию во имя скорости... подобные ухищрения вызывают улыбку рядовым программситам конечно проще, за них все сделает майкрософт, но для меня лично это ограничение моей свободы... понимайте это как хотите Уже ближе. А теперь представьте, что программа очень большая и очень сложная. Слышали про фразу "преждевременная оптимизация-корень всех зол" (или примерно так). Вот с++ и заставляет вас всегда делать преждевременную оптимизацию. На лиспе можно делать код, который будет не медленнее чем код на с++., Просто нет необходимости делать это сразу Например, рассмотрим простую функцию: (defun add (x y) (+ x y)) Как я упоминал в главе 10, если вы сравните производительность этой LISP-функции с вроде бы эквивалентной функцией на языке C, int add (int x, int y) { return x + y; } вы возможно обнаружите, что LISP-функция заметно медленнее, даже если ваша реализация Common Lisp обладает высококачественным компилятором в машинный код. Это происходит потому, что версия функции на Common Lisp выполняет гораздо больше всего – компилятор Common LISP даже не знает, что значения x и y являются числами, и таким образом вынужден сгенерирвать код для проверки типов во время выполнения. И как только он определил, что это - числа, он должен также определить, какого типа эти числа - целые, рациональные, с плавающей точкой или комплексные, и перенаправить вызов соответствующей вспомогательной процедуре, обрабатывающей соответствующие типы. И даже если x и y являются целыми числами, то процедура сложения должна позаботиться о том, что результат сложения может быть слишком большим для представления в FIXNUM-числе, числе, которое может быть представлено в одном машинном слове, и, таким образом, должна выделить число типа BIGNUM. В языке C, с другой стороны, поскольку типы всех переменных объявлены, компилятор знает точно, какой тип значений будет храниться в x и y. И, поскольку арифметика языка C просто вызывает переполнение, когда результат сложения слишком большой, чтобы быть представленным в возвращаемом типе, в функции нет ни проверки на переполнение, ни выделения длинного целого значения, если результат не вмещается в машинное слово Таким образом, поскольку поведение кода на Common Lisp гораздо более близко к математической корректности, версия на языке C, возможно, может быть скомпилирована в одну или две машинных инструкции. Но если вы пожелаете дать компилятору Common Lisp ту же информацию, которую имеет компилятор языка C о типах аргументов и возвращаемом значении, и принять некоторые компромисы, подобные используемым в языке C, относительно общности кода и проверки ошибок, функция на Common Lisp также может компилироваться в пару машинных инструкций. Именно для этого и служат объявления. Главная польза объявлений в том, чтобы сказать компилятору о типах переменных и других выражений. Например, вы можете указать компилятору, что складываемые аргументы являются FIXNUM-значениями, написав функцию следующим образом: (defun add (x y) (declare (fixnum x y)) (+ x y)) Выражение DECLARE не является формой языка Common LISP, это – часть синтаксиса макроса DEFUN, где оно должно быть указано до тела функции, если оно используется5). Данное объявление объявляет, что аргументы функции x и y будут всегда FIXNUM-значениями. Другими словами, это обещание компилятору, и компилятору разрешено генерировать код в предположении, что все, что вы пообещали ему, будет истинным. Чтобы объявить тип возвращаемого значения, вы можете обернуть основное выражение функции (+ x y) в специальный оператор THE. Этот оператор принимает спецификатор типа, такой как FIXNUM, и какую-то форму, и говорит компилятору, что эта форма будет возвращать значение указанного типа. Таким образом, чтобы дать компилятору Common Lisp всю ту же информацию, которую имеет компилятор языка C, вы можете написать следующее: (defun add (x y) (declare (fixnum x y)) (the fixnum (+ x y))) Однако даже эта версия нуждается в еще одном объявлении, чтоб дать компилятору Common Lisp те же разрешения, что есть и у компилятора языка C, генерировать быстрый, но опасный код. Объявление OPTIMIZE используется для того, чтобы указать компилятору как распределить свое внимание между пятью целями: скоростью генерируемого кода количеством проверок времени выполнения использованием памяти, как в терминах размера кода, так и в терминах размера памяти данных количеством отладочной информации, хранимой вместе с кодом скоростью процесса компиляции. Объявление OPTIMIZE содержит один или более списков, каждый из которых содержит один из символов: SPEED, SAFETY, SPACE, DEBUG или COMPILATION-SPEED и число от нуля до трех включительно. Число указывает относительный вес, который компилятор должен дать соответствующему параметру, причем 3 означает наиболее важное направление, а 0 - что это не имеет значения вообще. Таким образом, чтобы заставить компилятор Common Lisp компилировать функцию add более-менее так же, как это бы делал компилятор языка C, вы можете переписать ее так: (defun add (x y) (declare (optimize (speed 3) (safety 0))) (declare (fixnum x y)) (the fixnum (+ x y))) Конечно, теперь LISP-версия функции страдает многими из слабостей C-версии: если переданные аргументы не FIXNUM-значения или если сложение вызывает переполнение, результаты будут математически некорректны или даже хуже. Также если кто-то вызовет функцию add с неправильным количеством параметров, будет мало хорошего. Таким образом, вам следует использовать объявления этого вида только после того, как ваша программа стала работать правильно, и вы должны добавлять их только в местах, где профилирование показывает необходимость этого. Если вы имеете достаточную производительность без этих объявлений, пропускайте их. Но если профайлер показывает вам какое-то проблемное место в вашем коде и вам нужно оптимизировать его - вперёд. Поскольку вы можете использовать объявления таким образом, редко когда нужно переписывать код на языке C только из соображений производительности. Для доступа к существующему коду на C используется FFI, но когда нужна производительность, подобная языку C, используют объявления. И конечно, то, как близко вы захотите приблизить производительность данной части кода на языке Common Lisp к коду на C или C++, зависит главным образом от вашего желания. Другое средство оптимизации, встроенное в язык Lisp, – это функция DISASSEMBLE. Точное поведение этой функции зависит от реализации, потому что оно зависит от того, как реализация компилирует код: в машинный код, байт-код или какую-то другую форму. Но основная идея в том, что она показывает вам код, сгенерированный компилятором, когда он компилировал данную функцию. Таким образом, вы можете использовать DISASSEMBLE, чтобы увидеть, возымели ли ваши объявления какой-то эффект на генерируемый код. Если ваша реализация языка LISP использует компиляцию в машинный код, и если вы знаете язык ассемблера вашей платформы, вы сможете достаточно хорошо представить себе, что реально происходит, когда вы вызываете одну из ваших функций. Например, вы можете использовать DISASSEMBLE, чтобы понять, в чем различия между нашей первой версией add и окончательной версией. Сначала определите и скомпилируйте исходную версию (defun add (x y) (+ x y)) Затем, в сессии REPL вызовите DISASSEMBLE с именем этой функции. В Allegro это выведет следующий ассемблероподобный листинг сгенерированного компилятором кода: CL-USER> (disassemble 'add) ;; disassembly of #<Function ADD> ;; formals: X Y ;; code start: #x737496f4: 0: 55 pushl ebp 1: 8b ec movl ebp,esp 3: 56 pushl esi 4: 83 ec 24 subl esp,$36 7: 83 f9 02 cmpl ecx,$2 10: 74 02 jz 14 12: cd 61 int $97 ; SYS::TRAP-ARGERR 14: 80 7f cb 00 cmpb [edi-53],$0 ; SYS::C_INTERRUPT-PENDING 18: 74 02 jz 22 20: cd 64 int $100 ; SYS::TRAP-SIGNAL-HIT 22: 8b d8 movl ebx,eax 24: 0b da orl ebx,edx 26: f6 c3 03 testb bl,$3 29: 75 0e jnz 45 31: 8b d8 movl ebx,eax 33: 03 da addl ebx,edx 35: 70 08 jo 45 37: 8b c3 movl eax,ebx 39: f8 clc 40: c9 leave 41: 8b 75 fc movl esi,[ebp-4] 44: c3 ret 45: 8b 5f 8f movl ebx,[edi-113] ; EXCL::+_2OP 48: ff 57 27 call *[edi+39] ; SYS::TRAMP-TWO 51: eb f3 jmp 40 53: 90 nop ; No value Очевидно, что здесь полно всякой всячины. Если вы знакомы с ассемблером процессоров архитектуры x86, вы может быть это поймете. Теперь скомпилируйте версию функции add со всеми объявлениями: (defun add (x y) (declare (optimize (speed 3) (safety 0))) (declare (fixnum x y)) (the fixnum (+ x y))) Теперь дизассемблируйте функцию add снова, и посмотрите, был ли какой-то толк от этих объявлений. CL-USER> (disassemble 'add) ;; disassembly of #<Function ADD> ;; formals: X Y ;; code start: #x7374dc34: 0: 03 c2 addl eax,edx 2: f8 clc 3: 8b 75 fc movl esi,[ebp-4] 6: c3 ret 7: 90 nop ; No value Похоже, что был. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 09:57:26 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
zloy denстудентик для однородных данных с простой обрабокой да оптимизатор может общеголять человека в силу своей безупречной "внимательности" и "трудолюбии"... хотя это всеравно не аргумент сикъюл выполяется в ядре базы, которое высокопотимизировано... еще человек может недостаточно хорошо понимать струтктуру БД, использование индексов и все прочее, чем оптимизатор, который написан больше под "внутренний формат" БД в отличии от сикъюла... про Компиляцию времени выполнения я наслышан ведь это революционный шаг в виртуальных машинах рассчитанный на быстродействие, но минус данного хода лично для меня в бесконтрольности данной операции все зависит от дядек из майкрософт и насколько хорошо они реализовали свой JIT компилятор, но опять же повторюсь, если человек плохо напишет программу то она будет медленнне работать и чем ниже уровень, тем ниже у человека шанс на ошибку, поэтому я слабо вре заявлением о быстроте джит кода по сравнению с С++ аналогом, значит второй был плохо написан... вобще вся эта нет фигня финт ушами майкрософт ушла от компилирования чтобы дать переносимость, но ОПЯТЬ перешла на компиляцию во имя скорости... подобные ухищрения вызывают улыбку рядовым программситам конечно проще, за них все сделает майкрософт, но для меня лично это ограничение моей свободы... понимайте это как хотите Уже ближе. А теперь представьте, что программа очень большая и очень сложная. Слышали про фразу "преждевременная оптимизация-корень всех зол" (или примерно так). Вот с++ и заставляет вас всегда делать преждевременную оптимизацию. На лиспе можно делать код, который будет не медленнее чем код на с++., Просто нет необходимости делать это сразу + Например, рассмотрим простую функцию: (defun add (x y) (+ x y)) Как я упоминал в главе 10, если вы сравните производительность этой LISP-функции с вроде бы эквивалентной функцией на языке C, int add (int x, int y) { return x + y; } вы возможно обнаружите, что LISP-функция заметно медленнее, даже если ваша реализация Common Lisp обладает высококачественным компилятором в машинный код. Это происходит потому, что версия функции на Common Lisp выполняет гораздо больше всего – компилятор Common LISP даже не знает, что значения x и y являются числами, и таким образом вынужден сгенерирвать код для проверки типов во время выполнения. И как только он определил, что это - числа, он должен также определить, какого типа эти числа - целые, рациональные, с плавающей точкой или комплексные, и перенаправить вызов соответствующей вспомогательной процедуре, обрабатывающей соответствующие типы. И даже если x и y являются целыми числами, то процедура сложения должна позаботиться о том, что результат сложения может быть слишком большим для представления в FIXNUM-числе, числе, которое может быть представлено в одном машинном слове, и, таким образом, должна выделить число типа BIGNUM. В языке C, с другой стороны, поскольку типы всех переменных объявлены, компилятор знает точно, какой тип значений будет храниться в x и y. И, поскольку арифметика языка C просто вызывает переполнение, когда результат сложения слишком большой, чтобы быть представленным в возвращаемом типе, в функции нет ни проверки на переполнение, ни выделения длинного целого значения, если результат не вмещается в машинное слово Таким образом, поскольку поведение кода на Common Lisp гораздо более близко к математической корректности, версия на языке C, возможно, может быть скомпилирована в одну или две машинных инструкции. Но если вы пожелаете дать компилятору Common Lisp ту же информацию, которую имеет компилятор языка C о типах аргументов и возвращаемом значении, и принять некоторые компромисы, подобные используемым в языке C, относительно общности кода и проверки ошибок, функция на Common Lisp также может компилироваться в пару машинных инструкций. Именно для этого и служат объявления. Главная польза объявлений в том, чтобы сказать компилятору о типах переменных и других выражений. Например, вы можете указать компилятору, что складываемые аргументы являются FIXNUM-значениями, написав функцию следующим образом: (defun add (x y) (declare (fixnum x y)) (+ x y)) Выражение DECLARE не является формой языка Common LISP, это – часть синтаксиса макроса DEFUN, где оно должно быть указано до тела функции, если оно используется5). Данное объявление объявляет, что аргументы функции x и y будут всегда FIXNUM-значениями. Другими словами, это обещание компилятору, и компилятору разрешено генерировать код в предположении, что все, что вы пообещали ему, будет истинным. Чтобы объявить тип возвращаемого значения, вы можете обернуть основное выражение функции (+ x y) в специальный оператор THE. Этот оператор принимает спецификатор типа, такой как FIXNUM, и какую-то форму, и говорит компилятору, что эта форма будет возвращать значение указанного типа. Таким образом, чтобы дать компилятору Common Lisp всю ту же информацию, которую имеет компилятор языка C, вы можете написать следующее: (defun add (x y) (declare (fixnum x y)) (the fixnum (+ x y))) Однако даже эта версия нуждается в еще одном объявлении, чтоб дать компилятору Common Lisp те же разрешения, что есть и у компилятора языка C, генерировать быстрый, но опасный код. Объявление OPTIMIZE используется для того, чтобы указать компилятору как распределить свое внимание между пятью целями: скоростью генерируемого кода количеством проверок времени выполнения использованием памяти, как в терминах размера кода, так и в терминах размера памяти данных количеством отладочной информации, хранимой вместе с кодом скоростью процесса компиляции. Объявление OPTIMIZE содержит один или более списков, каждый из которых содержит один из символов: SPEED, SAFETY, SPACE, DEBUG или COMPILATION-SPEED и число от нуля до трех включительно. Число указывает относительный вес, который компилятор должен дать соответствующему параметру, причем 3 означает наиболее важное направление, а 0 - что это не имеет значения вообще. Таким образом, чтобы заставить компилятор Common Lisp компилировать функцию add более-менее так же, как это бы делал компилятор языка C, вы можете переписать ее так: (defun add (x y) (declare (optimize (speed 3) (safety 0))) (declare (fixnum x y)) (the fixnum (+ x y))) Конечно, теперь LISP-версия функции страдает многими из слабостей C-версии: если переданные аргументы не FIXNUM-значения или если сложение вызывает переполнение, результаты будут математически некорректны или даже хуже. Также если кто-то вызовет функцию add с неправильным количеством параметров, будет мало хорошего. Таким образом, вам следует использовать объявления этого вида только после того, как ваша программа стала работать правильно, и вы должны добавлять их только в местах, где профилирование показывает необходимость этого. Если вы имеете достаточную производительность без этих объявлений, пропускайте их. Но если профайлер показывает вам какое-то проблемное место в вашем коде и вам нужно оптимизировать его - вперёд. Поскольку вы можете использовать объявления таким образом, редко когда нужно переписывать код на языке C только из соображений производительности. Для доступа к существующему коду на C используется FFI, но когда нужна производительность, подобная языку C, используют объявления. И конечно, то, как близко вы захотите приблизить производительность данной части кода на языке Common Lisp к коду на C или C++, зависит главным образом от вашего желания. Другое средство оптимизации, встроенное в язык Lisp, – это функция DISASSEMBLE. Точное поведение этой функции зависит от реализации, потому что оно зависит от того, как реализация компилирует код: в машинный код, байт-код или какую-то другую форму. Но основная идея в том, что она показывает вам код, сгенерированный компилятором, когда он компилировал данную функцию. Таким образом, вы можете использовать DISASSEMBLE, чтобы увидеть, возымели ли ваши объявления какой-то эффект на генерируемый код. Если ваша реализация языка LISP использует компиляцию в машинный код, и если вы знаете язык ассемблера вашей платформы, вы сможете достаточно хорошо представить себе, что реально происходит, когда вы вызываете одну из ваших функций. Например, вы можете использовать DISASSEMBLE, чтобы понять, в чем различия между нашей первой версией add и окончательной версией. Сначала определите и скомпилируйте исходную версию (defun add (x y) (+ x y)) Затем, в сессии REPL вызовите DISASSEMBLE с именем этой функции. В Allegro это выведет следующий ассемблероподобный листинг сгенерированного компилятором кода: CL-USER> (disassemble 'add) ;; disassembly of #<Function ADD> ;; formals: X Y ;; code start: #x737496f4: 0: 55 pushl ebp 1: 8b ec movl ebp,esp 3: 56 pushl esi 4: 83 ec 24 subl esp,$36 7: 83 f9 02 cmpl ecx,$2 10: 74 02 jz 14 12: cd 61 int $97 ; SYS::TRAP-ARGERR 14: 80 7f cb 00 cmpb [edi-53],$0 ; SYS::C_INTERRUPT-PENDING 18: 74 02 jz 22 20: cd 64 int $100 ; SYS::TRAP-SIGNAL-HIT 22: 8b d8 movl ebx,eax 24: 0b da orl ebx,edx 26: f6 c3 03 testb bl,$3 29: 75 0e jnz 45 31: 8b d8 movl ebx,eax 33: 03 da addl ebx,edx 35: 70 08 jo 45 37: 8b c3 movl eax,ebx 39: f8 clc 40: c9 leave 41: 8b 75 fc movl esi,[ebp-4] 44: c3 ret 45: 8b 5f 8f movl ebx,[edi-113] ; EXCL::+_2OP 48: ff 57 27 call *[edi+39] ; SYS::TRAMP-TWO 51: eb f3 jmp 40 53: 90 nop ; No value Очевидно, что здесь полно всякой всячины. Если вы знакомы с ассемблером процессоров архитектуры x86, вы может быть это поймете. Теперь скомпилируйте версию функции add со всеми объявлениями: (defun add (x y) (declare (optimize (speed 3) (safety 0))) (declare (fixnum x y)) (the fixnum (+ x y))) Теперь дизассемблируйте функцию add снова, и посмотрите, был ли какой-то толк от этих объявлений. CL-USER> (disassemble 'add) ;; disassembly of #<Function ADD> ;; formals: X Y ;; code start: #x7374dc34: 0: 03 c2 addl eax,edx 2: f8 clc 3: 8b 75 fc movl esi,[ebp-4] 6: c3 ret 7: 90 nop ; No value Похоже, что был. неплохо для Лиспа, но вы сами наверно понимаете, что пример слабоват - слишком мало работы чтобы оценить оптимальность кодирования компилятора, и если ж вы про это заговорили компилятор под С\С++ от майкрософт один из лучших в мире, то что написано выше это пока что ничего не гарантирующие положения, хотя безусловно они интересны... отмечу тот факт, что такое описание довольно накладно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 11:26:05 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик неплохо для Лиспа, но вы сами наверно понимаете, что пример слабоват - слишком мало работы чтобы оценить оптимальность кодирования компилятора, и если ж вы про это заговорили компилятор под С\С++ от майкрософт один из лучших в мире, то что написано выше это пока что ничего не гарантирующие положения, хотя безусловно они интересны... отмечу тот факт, что такое описание довольно накладно Что именно накладно? Все те же объявления типов, что и в с++, разве что настройки компилятора, но у меня есть подозрение что их можно и для модулей целиком прописывать. Главная радость в том, что есть возможность не писать это все сразу, а делать оптимизацию только в нужных местах после проверки работоспособности кода и профилирования с выявлением узких мест. Можете прочитать этот кусок целиком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 11:48:05 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
zloy denстудентик неплохо для Лиспа, но вы сами наверно понимаете, что пример слабоват - слишком мало работы чтобы оценить оптимальность кодирования компилятора, и если ж вы про это заговорили компилятор под С\С++ от майкрософт один из лучших в мире, то что написано выше это пока что ничего не гарантирующие положения, хотя безусловно они интересны... отмечу тот факт, что такое описание довольно накладно Что именно накладно? Все те же объявления типов, что и в с++, разве что настройки компилятора, но у меня есть подозрение что их можно и для модулей целиком прописывать. Главная радость в том, что есть возможность не писать это все сразу, а делать оптимизацию только в нужных местах после проверки работоспособности кода и профилирования с выявлением узких мест. Можете прочитать этот кусок целиком спасибо вам за развернутый ответ, где приведены конкретные факты... после него я даже заинтересовался Лиспом... хотя согласитесь его компилятор еще далек от совершенства, но быть может в будущем... для интереса прилагаю ряд тестов компиляторов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2009, 21:10:51 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик1 спасибо вам за развернутый ответ, где приведены конкретные факты... после него я даже заинтересовался Лиспом... хотя согласитесь его компилятор еще далек от совершенства, но быть может в будущем... для интереса прилагаю ряд тестов компиляторов... Смешно. Сравнивать десятилетия развития Лиспа с борландовским компилятором. Лисп умеет менять тип переменных на лету. Поделит 1 на 3 и получит ТОЧНУЮ рациональную дробь. А вы про какие то Range-чеки :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 08:16:45 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)студентик1 спасибо вам за развернутый ответ, где приведены конкретные факты... после него я даже заинтересовался Лиспом... хотя согласитесь его компилятор еще далек от совершенства, но быть может в будущем... для интереса прилагаю ряд тестов компиляторов... Смешно. Сравнивать десятилетия развития Лиспа с борландовским компилятором. Лисп умеет менять тип переменных на лету. Поделит 1 на 3 и получит ТОЧНУЮ рациональную дробь. А вы про какие то Range-чеки :( я поменял свою позицию насчет Лиспа:) но хотелось бы отметить, что автоопределение типа - спорная тема, являющаяся посылом для многих холиваров... мое мнение, что это крайне спорный инструмент, пусть и удобный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 14:36:15 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)ПХПGluk (Kazan)ПХП Неужели так приятен для восприятия второй код!? Дело привычки Видимо). Сродни мазохизму чтоль. Знаешь, недавно написал пару плагинов для Yasca. Пришлось в спешном порядке освоить PHP. Вот это был мазохизм :) А Lisp - это зарядка для ума - удовольствие Выб лучше все нормальны ссылки на русском про этот язык приводили и нах он и что уже есть. А-то посылаете куда-то в никуда. И получается, что он, наверное, нужен тока для зарядки ума. Видимо любишь задачки, ребусы и их разгадки. Но на практике хочется просто-тупых решений, а не разбираться в ахинее какой-то. Потому, как и там она будет такая же ахинея, как и везде. Да и смолоду ещё как-то привык в постфиксной формы записи выражений. Как-то еще со школы. А про ПХП не надо, не надо побыстрому, а то будешь как очередной быдлокодер. Модератор: начиная со следующего вхождения, употребившие слова быдлокодер, гавнокодер и т.д. и производные от них будут банится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:07:43 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)МмихалычGluk (Kazan)Знаешь, недавно написал пару плагинов для Yasca. Пришлось в спешном порядке освоить PHP. Вот это был мазохизм :) А Lisp - это зарядка для ума - удовольствие нормальный язык, вот тока нафуфа его так раздули, ведь он узкоспециализированный, пока. Жалкое подобие левой руки (тьфу ты Perl-а) А количество способов прострелить ногу никак не уравновешено с его изобразительными возможностями (все это IMHO разумеется, чтобы не ранить адептов) Да не жалкий он и не подобие. Похож он просто. А ты крутыш попробуй как-нибудь пописать интерфейс на Перле, а потом на ПЫхе и почувствуешь разницу. Модератор: господа. просьба не допускать иных обращений друг к другу, кроме как ник участника. И , желательно, в не измененной форме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:13:38 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик, Вообще никто никому Лисп не навязывает. И наврядли он, станет когда популярным, как скажем с++ или java. Просто это другой взгляд на программирование, вот и все. Расширяет горизонты, так сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:16:40 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
студентик пишет: но хотелось бы отметить, что > автоопределение типа - спорная тема, Авто определение типа ГДЕ ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:29:22 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
MasterZiv студентик пишет: но хотелось бы отметить, что > автоопределение типа - спорная тема, Авто определение типа ГДЕ ? Это наверно про динамическую типизацию так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:30:54 |
|
||
|
Скачал Common Lisp от Ufa Soft
|
|||
|---|---|---|---|
|
#18+
ПХП пишет: > ахинея, как и везде. Да и смолоду ещё как-то привык в постфиксной формы > записи выражений. Как-то еще со школы. Это в какой школе-то тебя постфиксной форме учили ? Видимо, ты либо описался, либо вообще не знаешь, о чём говоришь. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2009, 15:31:56 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35895967&tid=1344571]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 515ms |

| 0 / 0 |
