Были ли в языках до C / C ++ указатели? - PullRequest
5 голосов
/ 18 марта 2011

Были ли какие-либо указатели на старых языках, таких как FORTRAN (до Fortran-90), кобол или паскаль? Если нет, то какой метод используют эти языки для реализации работ, выполняемых указателями, которые используются в современных языках высокого уровня.

А так как в java нет указателей есть ли другой способ повторить работу, выполненную указателем.

Ответы [ 6 ]

7 голосов
/ 18 марта 2011

У Алгола 68 были ссылки, похожие на указатели C / C ++.

У Паскаля были указатели, хотя вы не могли выполнять арифметику с ними.

PL / У меня были указатели.

В FORTRAN и COBOL вы в основном жили без таких вещей, как динамическое распределение, написанное на языке.Однажды я написал в FORTRAN код связанного списка, в котором использовался массив с индексом массива в качестве ссылки на «следующий» элемент (т. Е. X [1] был элементом данных, x [2] был его ссылкой наследующий элемент данных, x [3] был другим элементом данных и т. д.).Назвать это «неуклюжим» было почти чрезмерно щедрым.

3 голосов
/ 18 марта 2011

BCPL имел конструкцию a*[b] (которую в нашей реализации можно было бы упростить до a!b, компилятор встроенной системы 6809, работающей на блоке 3B2 UNIX), которая была эквивалентна a[b] в C. Конечно, только BCPL имел понятие слова, без всех структур и так далее, которые дают С больше силы.

a!b было смещением слова от адреса слова, но в используемой нами реализации также были варианты смещения байта от адреса слова a!%b и смещения байта от адреса байта a%%b.

0 голосов
/ 23 марта 2011

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

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

В первых реализациях lisp all была автоматическая сборка мусора.

0 голосов
/ 18 марта 2011

Функциональные возможности, представленные указателями, присутствовали в компьютерных машинных языках с самого начала, поэтому языки всегда давали какой-то доступ к функциональности, даже если не всегда так широко, как с указателями.Я помню, как консультировался о порте некоторого кода K & R C в Fortran 66. Код C был полон указателей на структуры, которые не очень хорошо отображались в какой-либо функции Fortran 66.

Скажите, что код C имеет структурывот так:

struct datastruct {int ival;float fval;} data [100];

Отображение на Фортране имело общий блок (не уверен, что у меня правильное форматирование, мой Фортран 66 чрезвычайно устарел):

COMMON / DATASTRUCT / IVAL (100), FVAL (100)

Функция в C, которая берет указатель на структуру, не должна знать, была ли структура получена из массива или была malloc'ed, или что-то еще:

floatfunc (struct datastruct * sp) {return sp-> ival * sp-> fval;}

При отображении в Fortran 66 все «структуры» были просто индексами массивов, содержащихся в общем блоке:

FUNCTION FUNC(INDEX)
COMMON /DATASTRUCT/ IVAL(100), FVAL(100)
RETURN IVAL(INDEX) * FVAL(INDEX)

Не так элегантно, как указатели, но выполнили работуна CDC 7600 назад в день.

0 голосов
/ 18 марта 2011

Не забудьте ADA (и VHDL) типы доступа . И ассемблер, и (удушливый) машинный код поддерживают косвенное указание, хотя нет типа указатель , все это используется.

0 голосов
/ 18 марта 2011

На этих языках можно передавать параметры в функции по ссылке или по значению .Под ссылкой подразумевается точная передача указателя на эту функцию.Это делается на современных языках, таких как C # и Visual Basic.

...