2013-10-09 3 views
2

Я смущен о том, где и как часто я должен объявлять типы возвращаемых функций в общем lisp. Если я правильно понимаю, для использования информации, предоставляемой декларациями, не требуется никакой реализации, и когда эта информация используется, эффекты не являются четко определенными и, вероятно, не согласованными в разных реализациях, поэтому это скорее вопрос лучших практик чем официальные определения. Пожалуйста, имейте это в виду, если вы попытаетесь ответить на них. В принципе, это то, что я хочу знать: Предполагая, что я нацелен на максимальную эффективность ((optimize (debug 0) (safety 0) speed)), когда функция декларации типа возвращаемого типа предоставляет в принципе, полезную информацию, которую компилятор может использовать для оптимизации? Это широкий вопрос, и я возьму широкие ответы; но чтобы лучше понять, что мне нужно, позвольте мне разбить его на несколько конкретных вопросов. С учетом следующих определений:Когда я должен объявлять типы возвращаемых функций?

(defun foo (a) 
    (the <type> <form>)) 

(defun bar (a) 
    (foo a)) 

(defun baz (a) 
    (bar a)) 

a. Может ли компилятор оптимизировать вызовы на BAZ, или должны ли формы возврата в BAR и BAZ быть обернуты в (как представляется, избыточным) форму THE, как в FOO? Другими словами, сможет ли компилятор обработать (bar <form>) как (the <type> (bar <form>)), если бы я не сказал это явно?

b. Относительный порядок трех определений влияет на ответ на (a)?

c. Если вышеупомянутые определения произошли в трех отдельных исходных файлах, которые были скомпилированы в три отдельных файла fasl, как это изменит ответ на (a)?

d. Учитывая следующее:

(let ((var1 (foo <form1>)) 
     (var2 (bar <form2>)) 
     (var3 (baz <form3>))) 
    <form>*) 

Может/будет компилятор правильно выводить типы (объекты, связанные с) VAR1, VAR2 и VAR3 внутри тела LET без деклараций явного типа, или я должен добавить еще DECLARE форму сразу после привязки?

e. Если предположить, что LET от вопроса (г) имеет место в файле, отличном от файла (ов), в котором определены три функции, какой эффект будет следующие объявления:

(declaim (ftype (function (t) <type>) foo bar baz)) 

в верхней части файла имеют на ответ на (d)?

+1

Common Lisp - это спецификация языка. Как компилятор оптимизирует сгенерированный код, во многом зависит от компилятора. В реализациях существует такое широкое разнообразие, что невозможно дать общий ответ. Вам нужно задать конкретные вопросы для конкретных реализаций. Одна реализация не очень-то и использует виртуальную машину, другая - компилирует целые программы на C, третий запускается на JVM, четвертый - делает какой-то вывод типа и генерирует машинный код напрямую ... Все очень разные. –

+0

Я понимаю, что информация используется по-разному в разных реализациях. Мой вопрос - это больше о том, как предоставить большую часть информации, не будучи избыточным. – nbtrap

+0

Это очень отличается для каждой реализации. –

ответ

2

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

Теперь, ваш конкретный список:

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

b, c. Скорее всего, да. В противном случае ему придется загрузить файл перед компиляцией или перекомпилировать bar после того, как он увидит foo.

d. Вероятно, да.

e.Если компилятор знает о функциях foo & c, когда он компилирует форму let, она должна быть в состоянии использовать эти знания. Если файлы, в которых определены функции, еще не загружены, то объявление необходимо. Обратите внимание, однако, что вы можете столкнуться с очень серьезными проблемами (например, segfault), если вы лжете компилятору.

+0

Ваш первый абзац на самом деле не пытается ответить на мой вопрос. Я уточнил вопрос (а), поэтому, пожалуйста, посмотрите на это снова. Вопрос (d) имеет форму «должен ли я делать то или это», поэтому я не могу расшифровать ваш ответ. Благодарю. – nbtrap

+0

Мой первый параграф пытается сказать вам, что ваше мышление о объявлениях неверно. – sds

+0

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

Смежные вопросы