Смутно помню уже, но была когда-то по крайней мере одна реализация Паскаля, транслирующая его в p(пи)-код, т.е. как раз в байт-код своей виртуальной машины. Не знаю, правда, была ли это чисто академическая история или же реально рабочая по тем временам, и сколько различных платформ/архитектур она поддерживала.
Тут, кстати, важно разделять понятие чисто аппаратной архитектуры, т.е. “железа”, и отдельно ОС как платформы и системной платформы, т.е. полной программно-аппаратной среды исполнения, куда входит уже как сама ОС, так и архитектура + система команд процессора, и его аппаратное окружение (работающие с ним в связке шины, мосты, контроллеры, память, внутренняя и внешняя совместимая периферия, и пр.).
Кроме того, есть еще нюансы с поддержкой (даже в рамках одного и того же процессора) различных режимов битности, endianness, расширенных наборов SIMD-инструкций и разной другой специфики.
Какой размер множества в паскале абц? Что-то не нашел такой информации в справке. Например хочу создать множество set of integer и записать туда миллиард элементов, не получается, даже 100 миллионов не дает.
Множество - это лишь обёртка обычного массива. Ограничение по количеству элементов даёт ваша операционка, когда RAM не хватает (или винда считает что это не правильно, выделять так много памяти за раз) - вам даёт ошибку.
А для чего вообще вам множество из миллиарда элементов? Возможно, для того что вы делаете - есть способ получше.
Так это памяти не хватило? А динамический массив тоже ограничивается только динамической памятью? Вообще то я задачки решаю пока, там элементы из массивов в множества закидаю вот попадаются такие вопросы.
Да, обычный массив не поддерживает хранение в постоянной памяти. Но, наверное, можно создать файл и использовать поток вместо массива… Конечно, функционал множества вам придётся самим реализовать.
Приведите несколько примеров. Я себе не могу представить чтоб в каком то задачнике дали задание с массивом из больше 100 элементов)).
Та не, это я сам себе такие вопросы задаю, а что будет если… и так далее. И когда не могу найти ответа, то у вас спрашиваю. А так то таких задач там нет, конечно. Вот же в турбо-паскале там было ограничение на множества и на массивы, и на строки, а тут ничего не написано о таких вещах.
Вы там поосторожнее с этими скаутскими замашками. В народе не зря есть пословица: “Один дурак может задать столько вопросов, что и девяносто девять умных не ответят”. Это, понятное дело, лишь пословица, я не имею в виду кого-либо конкретно, но помнить о ней все же полезно каждому.
Вот любопытство сюда не надо - это совсем из другой оперы. Сломать что-то везде можно, почему винда должна быть исключением?
Пословица про “99 умных” - это о том, что надо знать меру, когда грузишь своими проблемами других. А любопытство человек сам удовлетворяет, никого при этом не напрягая. По крайней мере, если это любопытство не вторгается в личное пространство других людей.
Спрашивать полезно и нужно, потому что это один из нормальных путей, ведущих к знанию. Только, еще раз, сначала думать, потом спрашивать. Если, конечно, речь не о ребенке 3-5 лет. Но вот спросить про “миллиард элементов”… Миллиард, если каждый занимает всего один байт - это объем порядка гигабайта. Но с ним же еще что-то делать нужно. Конечно, персоналке будет с этим напряжно. У нее и памяти не шибко, и процессор на гигафлопсы не тянет. Но ведь это можно прокрутить в голове перед тем. как задавать вопрос. А иначе так скоро начнем обсуждать, сколько ангелов помещается на кончике иглы.
Меня тут такая дикая мысль посетила: а что если использовать для хранение больших массивов не оперативную память, а быструю флешку? Или жёсткий диск, если он SSD?
Можно попробовать, будет, конечно, медленнее чем обычные массивы. Но, наверняка, будут свои применения. Вот что у меня для начала вышло:
type
StrArray<T>=class
where T:byte;//Заменить на "where TCByteArrConvertable[T];", когда будут тайпклассы
//где TCByteArrConvertable - тайпкласс для всего что можно превратить в последовательность байт и назад
private str:System.IO.Stream;
private function GetItem(i:integer):T;
begin
str.Position := 1*i;
var res := str.ReadByte;
if res = -1 then raise new System.IndexOutOfRangeException;
Result := T(byte(res));
end;
private procedure SetItem(i:integer; o:T);
begin
str.Position := 1*i;
str.WriteByte(byte(o));
str.Flush;//WriteByte оставляет эту новую информацию в оперативке, поэтому надо сразу сбросить на диск
end;
public property Item[i:integer]:T read GetItem write SetItem; default;
private constructor := exit;
public constructor(fname:string);
begin
self.str := System.IO.File.Open(fname, System.IO.FileMode.OpenOrCreate);
end;
public class function GetTemp :=
new StrArray<T>(System.IO.Path.GetTempFileName);
end;
begin
System.IO.File.Delete('arr.dat');
var arr1 := new StrArray&<byte>('arr.dat');
for var i := 0 to 1000*1000 - 1 do
begin
arr1[i*1000] := Random(256);
if i mod (100*1000) = 0 then
writeln(i);
end;
loop 3 do writeln;
loop 20 do writeln(arr1[Random(1000*1000)*1000]);
end.
Скорость, конечно, ужасная, но работает! И я проверил, оперативки на это всё не тратит нисколько.
Такими игрищами обычно занимаются студенты 1-2 курса на лабораторках по системотехнике. Вам надо было идти в подобный вуз, на технаря учиться)))) Сейчас бы идеи использования медленной внешней памяти Вас бы не посещали. Поскольку знали бы историю вычтехники, как что когда работало и применялось. Есть специализированные МВК с огромным количеством процессоров и “невообразимой памятью”, может, лучше на них считать? )))
Ну, сейчас речь идёт о том как на домашнем компе иметь массив, объёмом превышающий оперативную память. Конечно, в идеале всё на супер компьютерах считать, но не у каждого такой есть.