Си или Паскаль. Что можно и что нет.

Проектирование и разработка идеального средства программирования.

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

Лояльность Си или строгость Паскаля

Си
13
15%
Паскаль
71
85%
 
Всего голосов : 84

Re: Си или Паскаль. Что можно и что нет.

Сообщение runewalsh » 04.11.2016 20:02:45

Единственное, что там из бреда сумасшедшего (в 3-й версии, во 2-й побольше, но на то она и легаси) — синтаксис лямбд. Ничего страшного, в FPC/Delphi их вообще не предвидится (в FPC пока вроде и просто анонимных функций нет, а в Delphi на них не совсем тривиальные накладные расходы, в отличие от C++, где как раз по уму для нативного языка сделали). Я Питон назвал только потому, что его упомянул serbod.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Си или Паскаль. Что можно и что нет.

Сообщение скалогрыз » 04.11.2016 20:17:40

runewalsh писал(а):Паскаль не может рулить на «больших проектах», потому что в Паскале ПРИНЯТО...
Или вот, по крайней мере, в среде Delphi ... есть ТРАДИЦИЯ слишком привязываться к платформе...
...FreeAndNil, официально НЕ ПРОВЕРЯЮЩИЙ тип параметра — это вообще вышка (пропускает незамеченной смену типа FreeAndNil'ящейся переменной с объекта на интерфейс, массив или запись — что там про типизацию?).

Ну это же к Паскалю, как к языку, не относится, это вопрос требования к написанному коду, внутри одного проекта/команды.
а так, это всё особенности бизнес модели Делфи :D

runewalsh писал(а):Вспомните, например, зачем были введены интерфейсы

Интерфейсы были введены, как некий внешний стандарт.
Их вполне можно было не вводить, а говорить разработчикам, вот давай тебе обращаться к интерфейсам, через record-ы, и ручками вызывайте AddRef, Release, где вам угодно. (как это происходит в Си++)
Но концепеция managed-типов победила :D

В том же FPC уже давно присутствуют нерабочий cppclass. И ничего :) может и допилят когда-нибудь, и можно будет какой-нить Qt без лишних обёрток использовать.

runewalsh писал(а):..., или как объяснялись изменения в компиляторе под iOS.

Та же песня - внешний стандарт. (я кстати не знаю, что именно в Делфи менялось, но что менялось в FPC, я лично держу руку на пульсе).
Можно общаться с Objective-C, не с помощью синтаксиса компилятора, а через run-time функции.
НО при этом кода будет написано в разы больше (я сам писал такие обёртки). Что ещё хуже, при написании такой обёртки можно легко ошибиться а потом долго и упорно искать ошибку.

Но вот, что через ран-тайм не сделать, так это не добавить описание используемых ObjC классов. И их придётся подгружать уже динамически (вместо того, чтобы это сделал системный загрузчик).
Можно конечно, ещё делать всякие asm вставки в программу, которые бы добавляли такое описание в итоговый файл, но это уже сликшом :)
А так, компилятор берёт на себя, всю эту бюрократию.

Кстати, я хз, как в других языках (питон, перл, С#) идёт обращение к ObjC, но есть мнение, что через "мостики", писанные на Ся-х в форме удобных функций, которые в свою очередь присодеиняются к классам самого языка.
Проблема таких мостиков, в том, что при изменении интерфейся ObjC класса (или добавления нового), придётся сначала подправить мостик, а потом подправить обёртку, которая мостик использует, (и потом подправить код, который эту обёртку использует).
Т.к. в FPC, классы obj-c нативные, то правка происходит только два раза (правим/добавляем описание, правим/добавляем код), а не три.

я это всё к чему, что добавление нового синтаксиса в язык, с целью поддержать внешний стандарт (как то COM-интерфейсы, dispatch-методы, ObjC классы или cpp-классы), это вынужденная мера, но она хорошая, т.к. облегчает труд программиста, перекладывая труд по использование внешнего стандарта на компилятор.

А в FPC вообще ввели modeswitch, который позволяет (психологически) изолировать такие расширения от синтаксиса языка :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Си или Паскаль. Что можно и что нет.

Сообщение azsx » 04.11.2016 20:52:21

Питон и его синтаксис бред сумасшедсшего.

Не любите Вы его :)
Я читал питон только сверху. Синтаксис, так уже привычно, что вместо стандартизации каждый новый ЯП привносит свой 11 стандарт. Но отделять блок пробелами - это нечто! В моём стиле программирования, когда я "увлекаясь" могу написать несколько вложенных операторов или процедуру на тысячу строк кода - отделение блоков табуляцией (пробелами) - это заранее проигрышный вариант.
Сейчас читаю яву - также что-то с чем-то!
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Си или Паскаль. Что можно и что нет.

Сообщение debi12345 » 05.11.2016 00:03:23

Сейчас читаю яву - также что-то с чем-то!

Это да. Отсутствие "WITH"-конструкции - огромное неудобство С-семейства языков. "Namespace" помогают лишь частично.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Си или Паскаль. Что можно и что нет.

Сообщение Лекс Айрин » 05.11.2016 10:07:00

runewalsh писал(а):Паскаль не может рулить на «больших проектах», потому что в Паскале ПРИНЯТО использовать низкоуровневые штучки вроде взятия УКАЗАТЕЛЕЙ на элементы динамических массивов, приведения через простой (не as) каст классов, которые ТОЧНО-ТОЧНО ПРИВОДИМЫ и т. д.


Программисты майкрософт не могут с тобой согласиться. Винда до второй-третьей версии писалась на borland Turbo Pascal. Да и ихний компилятор С написан на нем же. И смена языка, насколько я знаю, имела скорее политическую подоплеку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Си или Паскаль. Что можно и что нет.

Сообщение SSerge » 05.11.2016 10:26:08

Лекс Айрин писал(а):Винда до второй-третьей версии писалась на borland Turbo Pascal. Да и ихний компилятор С написан на нем же


Чё???
Откуда, интересно, эта лажа постоянно проникает в сознание?
Я понимаю - что именно так хотелось бы оправдать пристрастие к не самому популярному языку программирования, но придуманные факты этому нисколько не способствуют. А "ихний компилятор Си" корни имеет скорее в XENIX, чем в чем-то борландовском. То что у него начиная с некоторых версий в загрузочном файле перемешаны сегменты данных и кода, "как в TP", и "внешний вид", если смотреть через F3 нортона командира чем-то похож на бордандовский результат - еще ни о чем. Ах, да! С некоторых пор главный идеолог ПО Борланда пашет на MS и фактически сделал им весь программный интерфейс .NET - так что есть общность в чем-то. Но не раннего периода.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Си или Паскаль. Что можно и что нет.

Сообщение serbod » 05.11.2016 16:01:15

Лекс Айрин писал(а):Программисты майкрософт не могут с тобой согласиться.

Вы что-то путаете - https://en.wikipedia.org/wiki/Apple_Pascal

debi12345 писал(а):Отсутствие "WITH"-конструкции - огромное неудобство

Вредная конструкция на самом деле. Затрудняет отладку, провоцирует путаницу для структур с похожими методами. Лучше использовать локальную переменную с коротким именем.

в Паскале ПРИНЯТО использовать низкоуровневые штучки вроде взятия УКАЗАТЕЛЕЙ

Компилятор ругается на такие вещи, если предупреждения не отключены. И в справке написано, что для прикладных программ лучше использовать высокоуровневые классы. Должно быть четкое деление на низкоуровневые модули (где и арифметика указателей, и ассемблер, и безусловное приведение типов) и на высокоуровневые, где только безопасные операторы, типы и функции, а низкоуровневые модули подключены в uses или include. В официальных рекомендациях (style guide) этого почему-то нет, но де-факто так реализованы RTL, VCL/LCL и многие компоненты.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Си или Паскаль. Что можно и что нет.

Сообщение Sharfik » 05.11.2016 16:31:28

azsx писал(а):Не любите Вы его :)
Я читал питон только сверху. Синтаксис, так уже привычно, что вместо стандартизации каждый новый ЯП привносит свой 11 стандарт. Но отделять блок пробелами - это нечто! В моём стиле программирования, когда я "увлекаясь" могу написать несколько вложенных операторов или процедуру на тысячу строк кода - отделение блоков табуляцией (пробелами) - это заранее проигрышный вариант.
Сейчас читаю яву - также что-то с чем-то!

Из любопытства написал одно приложение для мобильника на Ява. Когда разбирался с языком, многое было необычно, но не вызывало отторжения. Т.е. просто другой язык и все, со своими правилами. А выделение блоков пробелами в Питоне только ужас вызывает.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 756
Зарегистрирован: 20.07.2013 01:04:30

Re: Си или Паскаль. Что можно и что нет.

Сообщение azsx » 06.11.2016 02:57:40

Когда разбирался с языком, многое было необычно, но не вызывало отторжения.

Я читаю Шилдта. Очень напутано у них с классами, искусственно при чём. То есть сейчас логики такой запутанности я не могу осознать. Вот очередной пример - переопределение методов. И вот метод с одним названием в двух разных классах в реальной программе будет выполнять разные вещи. Как такое отслеживать? Или как понять прелесть таких конструкций и самому их начать использовать? Пока для меня куча подобных усложнений в классах на ровном месте, чтобы без дела не сидеть, когда чужой код смотреть буду. Плюс меня лично убивает регистрозависимость переменных.
Отсутствие каких-то конструкций, свой стандарт написания кода - к этому всё таки можно привыкнуть.

Добавлено спустя 12 минут 4 секунды:
Откуда, интересно, эта лажа постоянно проникает в сознание?

Могу Вам рассказать, только Вам пофиг будет. В сети (особенно на .cn доменах) активно гуляют исходники старых виндосов. Многие люди с удивлением обнаруживали, что некоторые утилиты в винде (ключевые по их словам) написаны на паскале. Отказ от паскаля был скорее политическим решением.
Я лично редко смотрю чужие коды больших компаний - не мой уровень. Но вы можете скачать и убедительно доказать, что мы не правы все вместе взятые. Но Вам ведь также как и мне пофиг, да?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Си или Паскаль. Что можно и что нет.

Сообщение runewalsh » 06.11.2016 03:47:51

serbod писал(а):Компилятор ругается на такие вещи, если предупреждения не отключены.

У тебя компилятор против этого:
Код: Выделить всё
{$mode objfpc} {$h+}
uses
  heaptrc, SysUtils;

type
  Struct = record
    x, y, z: int64;
  end;
  StructList = array of Struct;

  function Make(const x, y, z: int64): Struct;
  begin
    result.x := x;
    result.y := y;
    result.z := z;
  end;

  function ToString(const s: Struct): string;
  begin
    result := '(' + IntToStr(s.x) + ', ' + IntToStr(s.y) + ', ' + IntToStr(s.z) + ')';
  end;

  procedure Add(var list: StructList; const s: Struct);
  begin
    SetLength(list, length(list) + 1);
    list[High(list)] := s;
  end;

var
  list: StructList;
  i: integer;

begin
  Add(list, Make(1, 2, 3));
  Add(list, Make(4, 5, 6));
  Add(list, Make(7, 8, 9));
  Add(list, list[0]); // ожидается: (1, 2, 3)
  Add(list, list[1]); // ожидается: (4, 5, 6)
  Add(list, list[2]); // ожидается: (7, 8, 9)

  for i := 0 to High(list) do
    writeln(ToString(list[i]));
end.

имеет что-нибудь? У меня с heaptrc вывод
Код: Выделить всё
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
(-1085102592571150096, -1085102592571150096, -1085102592571150096)
(-1085102592571150096, -1085102592571150096, -1085102592571150096)
(-1085102592571150096, -1085102592571150096, -1085102592571150096)

На классы с ходу не заменишь, ладно бы только оверкилл, у них же и семантика другая. Впрочем, с ними тоже можно воспроизвести при желании, они сами по себе здесь не помогут — только факт, что их реже передают по ссылке.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Си или Паскаль. Что можно и что нет.

Сообщение SSerge » 06.11.2016 05:20:57

azsx писал(а):Могу Вам рассказать, только Вам пофиг будет. В сети (особенно на .cn доменах) активно гуляют исходники старых виндосов. Многие люди с удивлением обнаруживали, что некоторые утилиты в винде (ключевые по их словам) написаны на паскале.


Очень рад, что Вам пофиг. Алсо, основное противоречие в том, что MS никогда не было необходимости использовать борландовские компиляторы для создания утилит, потому что у них вот это было: https://ru.wikipedia.org/wiki/Microsoft_Pascal
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Си или Паскаль. Что можно и что нет.

Сообщение azsx » 06.11.2016 06:01:36

SSerge скромно отмечу, что разницу между борланд и майкрософт я улавливаю.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Си или Паскаль. Что можно и что нет.

Сообщение serbod » 06.11.2016 14:55:52

runewalsh писал(а):(7, 8, 9)
(-1085102592571150096, -1085102592571150096, -1085102592571150096)


Какой красивый косяк! При росте массива он перемещается в новую область памяти, и старые ссылки ведут в мусор.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Си или Паскаль. Что можно и что нет.

Сообщение bormant » 06.11.2016 16:40:24

Если причина в убежавших по новым адресам данных, должно помочь здесь и в аналогичных случаях:
Код: Выделить всё
-procedure Add(var list: StructList; const s: Struct);
+procedure Add(var list: StructList; s: Struct);


Добавлено спустя 4 минуты 28 секунд:
А про первые версии Windows, якобы написанные на Паскале...
1) на самом деле это не так, Си + Ассемблер
2) виной подобным слухам использовавшаяся для экономии памяти модель вызова "pascal" -- стек чистит вызванный (в одном месте), а не вызывающий (в каждом месте вызова), как традиционно принято в Си.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Си или Паскаль. Что можно и что нет.

Сообщение sign » 07.11.2016 08:12:58

serbod писал(а):
debi12345 писал(а):Отсутствие "WITH"-конструкции - огромное неудобство

Вредная конструкция на самом деле. Затрудняет отладку, провоцирует путаницу для структур с похожими методами. Лучше использовать локальную переменную с коротким именем.

Было бы хорошо иметь эту конструкцию в таком вот виде:
например, имеем
Код: Выделить всё
begin
  with FBGRA.Canvas2D do begin
     moveTo(FPoints[0]);
     lineTo(FPoints[1]);
  end;
end;

изменить в
Код: Выделить всё
var B with FBGRA.Canvas2D;
begin
  B.moveTo(FPoints[0]);
  B.lineTo(FPoints[1]);
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Пред.След.

Вернуться в Компилятор / язык программирования

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru