Болталка PascalABC.NET


#103

Смутно помню уже, но была когда-то по крайней мере одна реализация Паскаля, транслирующая его в p(пи)-код, т.е. как раз в байт-код своей виртуальной машины. Не знаю, правда, была ли это чисто академическая история или же реально рабочая по тем временам, и сколько различных платформ/архитектур она поддерживала.

Тут, кстати, важно разделять понятие чисто аппаратной архитектуры, т.е. “железа”, и отдельно ОС как платформы и системной платформы, т.е. полной программно-аппаратной среды исполнения, куда входит уже как сама ОС, так и архитектура + система команд процессора, и его аппаратное окружение (работающие с ним в связке шины, мосты, контроллеры, память, внутренняя и внешняя совместимая периферия, и пр.).

Кроме того, есть еще нюансы с поддержкой (даже в рамках одного и того же процессора) различных режимов битности, endianness, расширенных наборов SIMD-инструкций и разной другой специфики.


#104

Это версия ещё чуть ли не самого Вирта. Она была рабочая, но предназначалась для обучения программированию студентов.


#105

Какой размер множества в паскале абц? Что-то не нашел такой информации в справке. Например хочу создать множество set of integer и записать туда миллиард элементов, не получается, даже 100 миллионов не дает.


#106

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

А для чего вообще вам множество из миллиарда элементов? Возможно, для того что вы делаете - есть способ получше.


#107

Так это памяти не хватило? А динамический массив тоже ограничивается только динамической памятью? Вообще то я задачки решаю пока, там элементы из массивов в множества закидаю вот попадаются такие вопросы.


#108

Да, обычный массив не поддерживает хранение в постоянной памяти. Но, наверное, можно создать файл и использовать поток вместо массива… Конечно, функционал множества вам придётся самим реализовать.

Приведите несколько примеров. Я себе не могу представить чтоб в каком то задачнике дали задание с массивом из больше 100 элементов)).


#109

Та не, это я сам себе такие вопросы задаю, а что будет если… и так далее. И когда не могу найти ответа, то у вас спрашиваю. А так то таких задач там нет, конечно. Вот же в турбо-паскале там было ограничение на множества и на массивы, и на строки, а тут ничего не написано о таких вещах.


#110

Понятно, ну, я примерно так же учился… Что ж, тогда удачи)


#111

Вы там поосторожнее с этими скаутскими замашками. В народе не зря есть пословица: “Один дурак может задать столько вопросов, что и девяносто девять умных не ответят”. Это, понятное дело, лишь пословица, я не имею в виду кого-либо конкретно, но помнить о ней все же полезно каждому.


#112

Ну, на винде случайно так сломать что то нереально. Зато знания на много лучше усваиваются, чем если кто то другой будет выбирать порядок и объяснять.

А вообще, по моему, эта пословица, как и “любопытной варваре на базаре нос оторвали” - отжили своё. В информационный век они как яд.


#113

Вот любопытство сюда не надо - это совсем из другой оперы. Сломать что-то везде можно, почему винда должна быть исключением?

Пословица про “99 умных” - это о том, что надо знать меру, когда грузишь своими проблемами других. А любопытство человек сам удовлетворяет, никого при этом не напрягая. По крайней мере, если это любопытство не вторгается в личное пространство других людей.

Спрашивать полезно и нужно, потому что это один из нормальных путей, ведущих к знанию. Только, еще раз, сначала думать, потом спрашивать. Если, конечно, речь не о ребенке 3-5 лет. Но вот спросить про “миллиард элементов”… Миллиард, если каждый занимает всего один байт - это объем порядка гигабайта. Но с ним же еще что-то делать нужно. Конечно, персоналке будет с этим напряжно. У нее и памяти не шибко, и процессор на гигафлопсы не тянет. Но ведь это можно прокрутить в голове перед тем. как задавать вопрос. А иначе так скоро начнем обсуждать, сколько ангелов помещается на кончике иглы.


#114

Потому что защита от дурака - это единственное что микрософт делают без дырок (ну или почти) )))


#115

А зачем что-то ломать, оно и так сломается, само :smile: Новые продукты не отличаются особой стабильностью.


#116

Меня тут такая дикая мысль посетила: а что если использовать для хранение больших массивов не оперативную память, а быструю флешку? Или жёсткий диск, если он SSD?


#117

А Вы не поинтересовались скоростью обмена с флешками и SSD в части сравнения со скоростью обмена SD RAM ? ))))) И сразу вопрос отпадет.


#118

Можно попробовать, будет, конечно, медленнее чем обычные массивы. Но, наверняка, будут свои применения. Вот что у меня для начала вышло:

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.

Скорость, конечно, ужасная, но работает! И я проверил, оперативки на это всё не тратит нисколько.


#119

Я пробовал на HDD и был возмущён скоростью. Надо на SSD проверить.


#120

Такими игрищами обычно занимаются студенты 1-2 курса на лабораторках по системотехнике. Вам надо было идти в подобный вуз, на технаря учиться)))) Сейчас бы идеи использования медленной внешней памяти Вас бы не посещали. Поскольку знали бы историю вычтехники, как что когда работало и применялось. Есть специализированные МВК с огромным количеством процессоров и “невообразимой памятью”, может, лучше на них считать? )))


#121

Вот Вы пробовали такое замутить? Скорость меряли? Я понимаю, что метод работает дольше, но он работает.


#122

Ну, сейчас речь идёт о том как на домашнем компе иметь массив, объёмом превышающий оперативную память. Конечно, в идеале всё на супер компьютерах считать, но не у каждого такой есть.