1

Я довольно новичок в языке, и мне было интересно, были ли оптимизированы хвостовые звонки. На другом языке я мог бы проверить машинный код или промежуточное представление и сделать это для себя, но я не знаю, как это сделать в PL/SQL.Выполняет ли PL/SQL оптимизацию хвостовых вызовов?

Заранее спасибо.

ответ

3

Онлайновые документы свидетельствуют: не

http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#i2884

Каждый рекурсивный вызов создает новый экземпляр любых предметов, объявленных в подпрограмме, включая параметры, переменные, курсоры и исключения. Аналогично, новые экземпляры SQL-операторов создаются на каждом уровне в рекурсивном спуске.

И:

По крайней мере один путь должен привести к состоянию завершающего. В противном случае рекурсия будет продолжаться до тех пор, пока PL/SQL не исчерпает память и создает предопределенное исключение STORAGE_ERROR.

Если оптимизация хвост вызов был доступен, он не будет работать из хранения (хотя это может ударить некоторый тайм-аут, если вы позволите ему работать слишком долго.)

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

+0

Я закодировал простой факториал и выполнил его на Oracle XE, работающем на моей рабочей станции, исчерпал свою виртуальную память, поэтому кажется, что вы были правы. Большое спасибо. BTW, можно ли получить какой-либо ассемблер из Oracle? – Samuel

+0

Я бы предположил, что PL/SQL в значительной степени интерпретируется. –

+0

PL/SQL может быть интерпретирован или скомпилирован в более новых версиях. Если вы действительно хотите получить низкий уровень, вы можете попробовать программировать в PRO * C. –

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

  • Нет связанных вопросов^_^