История появления Delphi

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: История появления Delphi

Сообщение mirk » 11.10.2025 14:03:39

sts писал(а):оберон 2 и последующий компонентный паскаль - это возврат удаленного и наращивание сложности.

обычная работа над ошибками при работе над продуктом

sts писал(а):при этом когда смотришь на оберон тутже возникает вопрос - зачем

так можно сказать про любой язык
mirk
постоялец
 
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Re: История появления Delphi

Сообщение sts » 11.10.2025 15:48:16

mirk писал(а):обычная работа над ошибками при работе над продуктом

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

нет конечно, обычно их расширяют а не удаляют.
например, зачем удалять for? это самая востребованная конструкция из циклов, потом идет while, repeat же наименее востребованная, грубо говоря на 1 репит приходится 10000 вайлов, более того, из наблюдений, когда переписываешь репит на вайл, код становится более правильным. если уж удалять то репит. к томуже фор позволяет использовать легко реализуемые оптимизации которые в других случаях затруднительны так как для них неизвестно количество элементов.
ладно бы for to заменили бы на for in, т.е. где индекс опционален, ведь чаще всего он ненужен, более того вместо items[i] получается item, что тоже является серьезной оптимизацией, при этом конструкция была уже известна

Добавлено спустя 26 минут 46 секунд:
вон каким for должен быть
https://blogs.oracle.com/sql/post/bette ... s-in-plsql
sts
постоялец
 
Сообщения: 498
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: История появления Delphi

Сообщение Sharfik » 11.10.2025 17:30:27

sts писал(а):ладно бы for to заменили бы на for in, т.е. где индекс опционален, ведь чаще всего он ненужен

Ты про такое?
Код: Выделить всё
TargetDS.Edit;
        // Обновляем оставшиеся поля
        for Field in SourceDS.Fields do
        //for j:=0 to SourceDS.Fields.Count-1 do
        begin
          //Field:=SourceDS.Fields.Fields[j];
          if (Field.FieldName<>'')and(Field.FieldName <> KeyFieldName) then
            TargetDS.FieldByName(Field.FieldName).Value := Field.Value;
        end;
        TargetDS.Post;

Я тут попросил gigachat сделать код обновления DataSet. Он мне выдал с такой конструкцией. Прифигел, не знал такого. И до сих пор не понимаю, зачем козе баян? Зачем делать какую то дичь c for, когда есть While. Логика лучше читается, сразу понимаешь что там индексы.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 824
Зарегистрирован: 20.07.2013 01:04:30

Re: История появления Delphi

Сообщение sts » 11.10.2025 18:58:27

Sharfik писал(а):Ты про такое?

да
Sharfik писал(а):Зачем делать какую то дичь c for

нет в коде паразитной переменной i + доп оптимизация + визуально чище код
Sharfik писал(а):когда есть While

вот этого не понял, как вайл в приведенном примере использовать?
sts
постоялец
 
Сообщения: 498
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: История появления Delphi

Сообщение Alexander » 12.10.2025 07:58:49

Ну, Вирт не только упрощал язык и выкидывал части, но кое-что и добавлял при этом. Например, автоматическое управление памятью, модули. И вопрос скорее о том можем ли мы найти в новых языках Вирта хоть что-то из полезного, что можно использовать в FPC. На самом деле некоторые языки переняли из Оберона автоматическое управление памятью.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 853
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: История появления Delphi

Сообщение sts » 12.10.2025 22:23:33

Alexander писал(а):Ну, Вирт не только упрощал язык и выкидывал части

Автоматическое управление памятью, это тоже упрощение языка, выкидываются деструкторы. Управление в виде сборщика мусора это плохо, потому что это у же некая среда исполнения, был самодостаточный код, а тут параллельно какая то штука конкурирует за ресурсы. Вот управление на уровне компиляции, чтоб компилятор сам определял где деструктор вызвать, это дело. В любом случае это сильно другой язык.
Глобальные модули, юниты в паскале либо тоже самое, либо сильно проще, там экспортировать надо все что хочешь показать снаружи. Локальные модули любопытно но зачем, проще и правильней на юниты разбить.
Вот еслиб модули состояли из нескольких файлов, но нет, самое забавное что заявляется - модула оберон для больших сложных программ - а на самом деле, борладовский объект паскаль с его dpr dpk гораздо ближе к этому.

Вот чего не хватает в паскале - return, все эти exitы, resultы, тем более присвоение возвращаемого значения имени функции, о чем он вообще думал (такто идея понятна), самая существенная ошибка в паскале.
sts
постоялец
 
Сообщения: 498
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: История появления Delphi

Сообщение Alexander » 13.10.2025 08:38:05

Про return - интересное наблюдение. То есть вполне себе кандидат на включение в Паскаль?

Модули не одно и то же, что юниты. Это "Оберон как операционная система". То есть юнит это единица раздельной компиляции, а модуль не только это, но и наподобие системных утилит в GNU/Linux. По этому и требуется экспортирование - это как ключи командной строки. Единицы раздельной компиляции и раздельного выполнения.

Вирт вёз свой Лилит в Политехнический музей, но его детище не пропустили на таможне. Тогда бы можно было увидеть его в действии со всеми этими модулями. А сейчас наверное можно было бы написать эмулятор Лилит - пишут же эмуляторы Спектрумов.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 853
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: История появления Delphi

Сообщение sts » 13.10.2025 11:33:41

Alexander писал(а):Про return - интересное наблюдение. То есть вполне себе кандидат на включение в Паскаль?

чисто умозрительно, с ходу не получится, сильно неправы были когда разрешили вызывать функцию и не присваивать в переменную ее результат, если в функции f1 написать if then return и забыть указать значение и точку с запятой, if then return 0; то следующая строка станет частью return, и если второй строкой идет вызов функции f2 и ее тип такойже как у f1, вы эту ошибку замучаетесь искать.
Код: Выделить всё
{if true then return 0;}
if true then return
f2();

делать же return(0) бессмысленно так как уже есть exit(0) и семантически неверно, скобочки это костыль чтобы решить вышеописанную проблему

Добавлено спустя 13 минут 1 секунду:
Alexander писал(а):Модули не одно и то же, что юниты.

это понятно, но мы же про то что тащить в паскаль
sts
постоялец
 
Сообщения: 498
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: История появления Delphi

Сообщение Сквозняк » 13.10.2025 17:07:16

mirk писал(а):
Сквозняк писал(а):маразм Вирта

почему маразм?

Потому что он перекраивал хорошо работающее делая его хуже, но красивее с точки зрения менее интеллектуальной публики. Ну вот убрал он часть разметки из языка, якобы сделал его чище. А какая с этого польза, если это не для программ однострочников? Можно случайно зацепить клавиши рукавом, залепить в программу мусор кучей других способов, написать что-то в сонном невнимательном виде, а компилятор это возьмёт да и выполнит, и разобраться что там не так, тоже сложно будет, ведь из языка выброшено "всё ненужное". Что это плохо, можно объяснить тем, кто трезво соображает, но вот некоторым нельзя. У человеков быстрая память не резиновая, её нужно экономить, потому нужна некоторая дополнительная разметка, которая экономит эту память и помогает ориентироваться в коде. И если разработчик языков программирования перестаёт это понимать, как ему не объясняй, то наверно у него развился маразм.

Добавлено спустя 1 минуту 53 секунды:
Awkward писал(а):
mirk писал(а):
Сквозняк писал(а):маразм Вирта

почему маразм?

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

Мало быть несогласным, надо ещё несогласие логически обосновать.
Сквозняк
энтузиаст
 
Сообщения: 1155
Зарегистрирован: 29.06.2006 22:08:32

Re: История появления Delphi

Сообщение sts » 14.10.2025 17:43:51

надо ради прикола новый паскаль сделать.

1. чтоб в принципе не было ситуации в коде когда переменная имела значение nil, nil тока как тип Null, если переменная объявлена то ей задается значение до первого обращения к ней, в подавляющем большинстве случаев nil ненужен
2. никаких явных, в виде функции, с разными параметрами, конструкторов у классов, решает проблему сериализации
3. отслеживание владения, место вызова деструктора вычисляет компилятор
4. как положено if a is t then меняет тип переменной на t, не надо писать a as t
5. нет приведению типов вида TObject(a)
6. конструктор тока один TObject(), в скобках анонимный блок кода который вызывается при создании объекта и инициализирует переменные, инициализация переменных объекта значениями по умолчанию при объявлении
7. наконец то сделать нормальное определение классов, чтоб в секции interface у класса были тока protected public а то что ранее было в private в секции implementation

Код: Выделить всё
unit u1;

interface

type
  TNode = class;
 
  TNodeParent = class
  protected
    function GetCount: Integer;
    function GetItem(Index: Integer): TNode;
  public
    property Count: Integer read GetCount;
    property Item[Index: Integer]: TNode read GetItem; 
  end;

  TTree = class(TNodeParent)
  protected
  public
  end;
 
  TNode = class(TNodeParent)
  protected
    FParent: TNodeParent; //так как значение по умолчанию не указано то его надо задать в конструкторе
    FCaption: string; //строки по умолчанию пустые
    FImageIndex: integer = -1;
    procedure SetParent(Value: TNodeParent);
    procedure ReleaseParent;
  public
//перед вызовом write, если FParent <> nil то вызывает release
//так же из release генерируется деструктор, так как FParent пришел из вне его деструктор не вызывается
    property Parent: TNodeParent read FParent write SetParent release ReleaseParent;
    property Caption: string read FCaption write FCaption;
    property ImageIndex: integer read FTestProp1 write FImageIndex;
  end;

procedure p1(t1: TTree; n1: TNode or Null); //прям так жестко и писать через OR чтоб неповадно было

implementation

procedure p1(t1: TTree; n1: TNode or Null);
var
  n2: TNode;
begin
  AddLog(n1.Caption); //ошибка компиляции - так как неизвестно что там
  if n1 is Null then
    AddLog('Null')
  else // так как на Null проверили то значит там TNode
    AddLog(n1.Caption); //нормально

  AddLog(n2.Caption); //ошибка компиляции  - значение n2 не задано

  if n1 is Null then
    n2:= TNode(Parent:= t1; Caption:= 'Root1'; ImageIndex:= 1)
  else
    n2:= TNode(Parent:= n1; Caption:= 'Test1'; ImageIndex:= 2);
 
  AddLog(n2.Caption); //нормально
 
end;

type

  TNodeParent = class
  //private ключевое слово ненужно
    FObjectList: TObjectList = TObjectList(); //так как FObjectList создан в классе он освобождается в деструкторе класса
    procedure SetParent(Node: TNode);
    procedure ReleaseParent(Node: TNode);
  end;

  TNode = class
  end;

{ TNodeParent }

function TNodeParent.GetCount: Integer;
begin
  result:= FObjectList.Count;
end;

function TNodeParent.GetItem(Index: Integer): TNode;
begin
  result:= FObjectList[Index] as TNode;
end;

procedure TNodeParent.SetParent(Node: TNode);
begin
  FObjectList.Add(Node);
end;

procedure TNodeParent.ReleaseParent(Node: TNode);
begin
  FObjectList.Remove(Node);
end;

{ TNode }

procedure TNode.SetParent(Value: TNodeParent);
begin
  FParent:= Value;
  FParent.SetParent(Self);
end;

procedure TNode.ReleaseParent;
begin
  FParent.ReleaseParent(Self);
end;

end.

sts
постоялец
 
Сообщения: 498
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Пред.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1


cron