LINUX.ORG.RU

Программируете ли вы на Паскале?

 


0

4

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

>>> Результаты



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

Да, Паскаль рулёз форева!

saahriktu ★★★★★
()
Ответ на: комментарий от no-such-file

Для размера фрейма больше ничего знать не нужно. Хватит уже тупить.

Ты сам тупишь.

int a = 2;
int b = f(a);
int c;
Какой тут будет размер фрейма и откуда компилятор его узнает на момент вызова f(a)? Хотя на самом деле ему его к этому моменту знать и не нужно, но давай рассмотрим твою теорию.

Да. И что?

Без пруфов тут не обойтись.

да ещё запоминал, что где вставил.

Запомнить надо только счётчик виртуальных скобок, который влезет в 1 байт.

Компиляцию в два прохода. Или эквивалентное этому компиляцию во внутренний буфер.

Я ничего такого не предлагал, хватит выдумывать.

Для этого не надо много запоминать. По месту такого goto можно компилять как косвенный переход.

Гениальная идея как увеличить расход и ресурсов компилятора, и затраты тактов на исполнение кода, не получив взамен ничего.

Нахрена как ты думаешь вообще делали однопроходные компиляторы? Смысл именно в том, чтобы не хранить исходник и код в памяти.

Я уже выше написал - не знаю зачем делали двухпроходные, если речь про Си без встроенного оптимизатора. Он прекрасно компилируется за 1 проход.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Какой тут будет размер фрейма и откуда компилятор его узнает на момент вызова f(a)?

3 int размер, внезапно. На любой момент. Дальше твой тупняк читать интереса нет.

no-such-file ★★★★★
()
Ответ на: комментарий от firkax

Никакой разницы с goto вперёд тут нет.

Разница в том, что адреса перехода можно позднее сохранить отдельной секцией (для косвенных переходов), а пролог функции должен быть вкомпилен непосредственно.

Кстати сказать, в Паскале метки тоже нужно объявлять заранее. И тоже не от хорошей жизни.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от firkax

Я уже выше написал - не знаю зачем делали двухпроходные

В реальности проходов существенно больше чем 2.

если речь про Си без встроенного оптимизатора

Полезность такого компилятора в современных реалиях стремиться к нулю: всё что меньше чем O2 тупо очень медленное, и по факту - народ закладывается на оптимизатор (и даже на конкретные его действия).

bugfixer ★★★★
()
Ответ на: комментарий от MOPKOBKA

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

Нашёл в запаснике, вот такой код компилится:

#include <stdio.h>
int main (void)
{
 int a=200;
 printf ("A = %d \n",a);
  {
    float a=-3.7;
    printf ("A = %f\n",a);
    }
printf ("A = %d \n",a); 
printf ("A = %f \n",a);
float c=3.7,q;
q=c+a;
printf ("Q = %f \n",q); 
return 0;
}

Выдаёт при исполнении:

A = 200 
A = -3.700000
A = 200 
A = -3.700000 
Q = 203.699997 
mister_VA ★★
()
Ответ на: комментарий от liksys

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

Правильно? На Си?! Это как?

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

Кстати, если в printf указать неверный тип выводимых данных, по получим «мусор». Пример:

#include <stdio.h>

int main (void)
{
  long double a=1234.56789;
  printf("a=%f\n", a);
  return 0;
}

выдаст a=0.000000

Это я лишь одну функцию, вроде даже вообще не рекомендуемую к использованию проверил. Можно ли таким макаром передать неверное значение переменной в другие я не знаю, но что если можно?

mister_VA ★★
()
Ответ на: комментарий от no-such-file

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

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)

Больше половины ПО работодателя написано на Дельфи. Последние лет 15 это создаёт проблемы при найме – большинство сеньоров не собираются менять работу, а джуны не хотят его изучать, так как нанимателей можно пересчитать по пальцам. Лично я на Дельфи не программирую, но часто имею дела с паскалеподобным скриптовым языком.

olegd ★★★
()
Ответ на: комментарий от mister_VA

Правильно? На Си?! Это как?

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

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

Люди должны знать язык, на котором пишут. Благо Си - не плюсы, и он вполне себе обозрим. Та проблема, что ты описал, происходит или от незнания, или от лени изучить код остальной функции, чтобы убедиться, что ничего не сломается. В обоих случаях это проблемы компетенции.

Кстати, если в printf указать неверный тип выводимых данных, по получим «мусор».

Чтобы этого не произошло, достаточно использовать -Wall:

$ gcc -Wall test.c
test.c: In function 'main':
test.c:6:14: warning: format '%f' expects argument of type 'double', but argument 2 has type 'long double' [-Wformat=]
    6 |   printf("a=%f\n", a);
      |             ~^     ~
      |              |     |
      |              |     long double
      |              double
      |             %Lf
liksys ★★★★
()
Ответ на: комментарий от AntonI

много поменялось за 30 лет.

Трава была лучше

novus
() автор топика
Ответ на: комментарий от MOPKOBKA

Получается я не смогу реализовать адекватно goto.

Сможешь, я рассказал как. Да это компромисс, но не очень большой.

no-such-file ★★★★★
()

Паскаль я как таковой не учил никогда. Я учил сразу Delphi 5-7 по книжке. Потом в ВУЗе мне уже что-то преподавали про Паскаль. Поэтому я к Паскалю как к языку обучения не отношусь никак. Но меня улыбает от «маст дай» и т.п.
Delphi с его библиотекой VCL - это лучшая среда разработки GUI приложений под винду до появления .NET’а. Этим все сказано. Альтернативой было на с++ ковырять Win API всякие. Оно к любой СУБД в два клика подключалось, именно поэтому половина всего клиентского офисного ПО на нем написано. Если ваш опыт работы с паскалем окончился на уровне лабораторки в ВУЗе, то наверное «маст дай», а так в свое время он кормил целое поколение программистов.

Truf
()
Ответ на: комментарий от mister_VA

Правильно? На Си?! Это как?

Это не для Вас, смиритесь. Лучше рассуждайте об энергии которая у Вас имеет размерность импульса - так безопасней и для Вас и для окружающих.

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

Если среди тех людей будете Вы то там уже число строк и ЯП неважны, будет аццкий адЪ по любому.

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

В приведенном Вами примере виновата не область видимости а баг printf-а. Комментим одну строчку

#include <stdio.h>
int main (void)
{
 int a=200;
 printf ("A = %d \n",a);
  {
    float a=-3.7;
    // printf ("A = %f\n",a); <== вот эту
    }
printf ("A = %d \n",a); 
printf ("A = %f \n",a);
float c=3.7,q;
q=c+a;
printf ("Q = %f \n",q); 
return 0;
}

и все становится норм.

Кстати, если в printf указать неверный тип выводимых данных, по получим «мусор».

И об этом написано в доках, и компилятор по этому поводу кидает ворнинги. И то и то надо читать.

Можно ли таким макаром передать неверное значение переменной в другие

таким это каким? Сломав va_list? Это UB, там все что угодно может быть, да.

я не знаю, но что если можно?

Видно что не знаете - беда в том, что Вы о том что не знаете беретесь рассуждать…

AntonI ★★★★
()
Ответ на: комментарий от liksys

Чтобы этого не произошло, достаточно использовать -Wall:

Он и без -Wall ругаться будет. Кстати в плюсах можно сколхозить типобезопасный printf на variadic template;-)

AntonI ★★★★
()
Ответ на: комментарий от AntonI

У меня без -Wall не ругался. Но это и не важно, потому что все варнинги всегда нужно включать, чтобы потом не получилось сюрпризов. Лучше где-то выключить явно через #pragma, чем потом рвать на себе волосы о том, о чем компилятор мог бы и предупредить.

liksys ★★★★
()
Ответ на: комментарий от novus

Я за больший мильтивыбор по привычке. Вы правы, мультивыбор тут, наверное, лишнее.

статистика не терпит таких оптимизаций. к составлению опросов нужно подходить как к написанию юнит тестов. варианты решают.

vstartsev
()
Ответ на: комментарий от liksys

и тут все какбэ забыли, что форматная строка в принтфы может быть сгенерирована в рантайме и компилятор ее не проверит никак.

все эти принтфы - полиморфные функции, внутре представляющие собой микроинтерпретатор форматной строки, и разумеется, если программа для такого микроинтерпретатора написана неверно - то будет ошибка.

хотите чтобы ошибок не было, пишите строго типизированные принты, навроде print_int, print_float и так далее.

alysnix ★★★
()
Ответ на: комментарий от flant

Дык паскаль на информатике не всегда был. Я в 11м классе учился в физматшколе - вот там был паскаль. До того, в обычной школе, был бейсик на корветах. Чего сейчас в школах даже и не знаю…

AntonI ★★★★
()

сам вирт кинул паскаль и породил куда более совершенную modula-2. кидаться в паскаль какашками уже поздно. вирт это сделал аж в 1978 году.

alysnix ★★★
()
Ответ на: комментарий от flant

Я уже писал, что сразу Си учил, в школе на нем тоже писал, пока остальные колупались в паскале.

liksys ★★★★
()
Ответ на: комментарий от flant

это же форум старперов, у половины вообще никаких уроков информатики не было

FishHook
()

На ТурбоПаскале писал в 90-х

cheez ★★★
()
Ответ на: комментарий от flant

прогульщики информатики?

Нас на информатике в конце 1990-х QBasic'у учили.

Паскаль я, конечно, учил, но не в школе.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Паскаль я, конечно, учил, но не в школе.

Школа жизни — это школа капитанов 
Там я научился водку пить из стаканов 
Школа жизни — это школа мужчин 
Там научился я 
Обламывать женщин 
Женщин 
Женщин 
Женщин

Пардонте, не удержался;-)

AntonI ★★★★
()
Ответ на: комментарий от hobbit

Очень мощный язык для прикладного программирования, кто бы что ни говорил. Правда, вот года три назад по просьбе заказчика пришлось ненадолго сдуть пыль с одного старого дельфёвого легаси… оказалось очень неудобно, что объявлять переменную приходится в секции var, а инициализировать где-то ниже.

Вообще-то с некоторых пор (но давно, может 4-й Delphi, а может ранее) можно инициализировать прямо в секции объявлений.

var a:integer=0;

https://www.freepascal.org/docs-html/ref/refse24.html

praseodim ★★★★★
()
Ответ на: комментарий от praseodim

Ну про это-то я в курсе.

Но в плюсах я могу посреди тела функции, как только стало возможным что-то вычислить — вычислить и присвоить. Не константу справа написать, а что угодно. И объявить тоже тут же. Чтобы оно пол-функции не пребывало в неопределённом статусе.

hobbit ★★★★★
()
Ответ на: комментарий от dataman

Хорошо, что во Free Pascal так тоже можно.

Так это как? Объявить и проинициализировать посреди функции? Или как в примере выше, в секции var что-то присвоить? Если второе, то это действительно и Delphi умела.

hobbit ★★★★★
()

Учили в универе в виде TP 7 (в школе бейсик). Вставило, много писал по фану. Приятный язык. Потом переориентировался на программиста, перешел на «серьезный» си. Фана стало сильно меньше…

Недавно поставил lazarus, хотел поностальгировать. Увидел интерфейс, ужаснулся, снес.

unsigned ★★★★
()
Ответ на: комментарий от liksys

В обоих случаях это проблемы компетенции.

Вы пишете то, с чем и я всегда был согласен: Си – язык для профессиональных программистов, требует аккуратности и вдумчивости.

Чтобы этого не произошло, достаточно использовать -Wall

Да, так и надо, вот только слишком много рабочих прог написаны так, что предупреждений компилятор выдаёт размером с «Войну и мир».

mister_VA ★★
()
Ответ на: комментарий от AntonI

В приведенном Вами примере виновата не область видимости а баг printf-а.

Это не баг, это фича.

Комментим одну строчку и все становится норм.

Нет.

#include <stdio.h>
int main (void)
{
 int a=200;
 printf ("A = %d \n",a);
  {
    float a=-3.7, b=10.0,e;

///    printf ("A = %f\n",a);
    e=a+b;
    printf ("E = %f\n",e);
	
    }
printf ("A = %d \n",a); 
printf ("A = %f \n",a);
float c=3.7,q;
q=c+a;
printf ("Q = %f \n",q); 
return 0;
}

выдаёт:

A = 200 
E = 6.300000
A = 200 
A = 6.300000 
Q = 203.699997

С «закомментировать» выдаёт:

A = 200 
A = 200 
A = 0.000000 -- мусор
Q = 203.699997

Т.е. достаточно хоть как-то использовать переменную a внутри скобок.

P.S. С остальным идёте нах и приносите 2 баночки, в одной 150 Дж потенциальной энергии, в другой 150 Дж тепловой.

mister_VA ★★
()
Ответ на: комментарий от flant

прогульщики информатики?

Нас на информатике учили сначала РАЯ, потом бейсику. В институте учил фортран. По части паскаля я самоучка, хотя за деньги на нём писал довольно долго. :)

hobbit ★★★★★
()
Ответ на: комментарий от mister_VA

Это проблемы не языка. Ему уже сто лет в обед, и практики для написания хорошего кода на нем давно выработаны. Не рокетсайнс какой-то. Я не могу сделать так, чтобы ворнинги исчезли из всего говнософта на планете, могу лишь предложить отправлять тех, кто его пишет, мести дворы.

liksys ★★★★
()
Ответ на: комментарий от mister_VA

Это не баг, это фича.

Это не «фича», и не баг printf(), а прямое следствие ABI - int’ы и float’ы передаются через разные регистры, и просто так «звёзды сошлись» что в оригинальном примере ваш -3.7 «выжил» в соответствующем регистре между 2ым и 4ым printf(). Очевидный баг (а точнее UB) именно в 4ом printf`е. Добавьте любые операциями над floats между - вы увидите как всё «поплывёт».

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 3)
Ответ на: комментарий от liksys

Это проблемы не языка.

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

Собственно к приведённому примеру: там фишка в том, что просто скобки {} не дают компилятору понимание, чего от него хотят в отличии от них же в операторах. Вот только наличие этих скобок даёт возможность использовать одинаковые имена переменных различных типов и обращаться к ним вне блока.

Во такое

#include <stdio.h>
int main (void)
{       
int k;
printf("k - ? > ");
scanf("%d", &k);
  if (k >= 5) {
	  long double a=98765.4321;
	  printf("a = %Lf\n", a);
  }
  else
  {
	  double a=1234.56789;
	  printf("a = %f\n", a);
  }
return 0;
}

отработает штатно и за пределами блоков не позволит обратится к переменной «a» из if-а.

Вот только тут можно подскользнуться на «удобстве» объявления переменных в любом месте программы: объявив переменную внутри if-а, получить её вычисленное значение вне оператора не получится. Учитывая, что переменную с тем же именем можно объявить вне if-а, получим ещё один источник ошибок из удобств Си.

Так что это не удобство, а свобода вытворять, что хочешь. Так что фраза «Свобода – осознанная необходимость» предвосхитила требуемый метод программирования на Си.

mister_VA ★★
()
Ответ на: комментарий от mister_VA

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

Откройте наконец для себя уже warnings - та ещё полезняшка. Все примеры что вы приводили до сих пор ловятся более чем тривиально.

bugfixer ★★★★
()
Ответ на: комментарий от mister_VA

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

Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)
Ответ на: комментарий от mister_VA
  1. переменные, надо объявлять как можно ближе к месту их использования.

  2. переменные внутри блоков экономят стек, или регистры. пример

{
  int x = fun1();
  ...
}
{
  int some_counter = fun2();
  ...
}
{
  bool ok = fun3();
}

если эти три переменные обьявлять в прологе функции - будет использовано 3 регистра, по одному под каждую. либо компилятор должен следить за областью использования переменной, и переиспользовать регистр.

если их обьявлять в блоках - будет использован автоматически только один регистр. со всеми вытекающими.

alysnix ★★★
()
Ответ на: комментарий от alysnix

если эти три переменные обьявлять в прологе функции - будет использовано 3 регистра, по одному под каждую.

С чего бы?

bugfixer ★★★★
()
Ответ на: комментарий от mister_VA

достаточно хоть как-то использовать переменную a внутри скобок.

Что бы она попала в регистры, откуда её достают сломав va_list. Браво!

A = 0.000000 – мусор

Мусор у Вас в межушном ганглии. Идите читайте про представление чиселок в памяти ЭВМ.

С остальным идёте нах

Вами там плотно занято.

«энергия ИЗНАЧАЛЬНО – это МЕРА возможности системы тел совершить работу, т.е. переместить тело массой 1 кг на 1 м за 1с.»(с) Вы.

Дяденька, у работы размерность не такая.

AntonI ★★★★
()
Ответ на: комментарий от mister_VA

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

Единственный допустимый случай - i, когда у тебя есть счетчик. Даже j рядом с ним уже создает путанницу в порядках - где по логике должен использоваться i, а где j.

А если у тебя в коде десять переменных k распихано внутри функции по разным уровням блоков - проблема не в языке и лишней свободе, а в прокладке между стулом и монитором, которая генерирует говнокод.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 2)

А где пункт не умею программировать и не собираюсь?

Dieter ★★★
()
Ответ на: комментарий от bugfixer

с того бы, … если есть такой код

int x = 0;
int some_counter = 0;
bool ok = false;
...
x = fun1();
...
some_counter = fun2();
...
ok = fun3();

то тут комплятор или вынужден занимать три регистра, или анализировать код и понимая, что переменные совместно не используются, фактически превращать код в такой:

{
  int x = fun1();
  ...
}
{
  int some_counter = fun2();
  ...
}
{
  bool ok = fun3();
}

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

то тут комплятор или вынужден занимать три регистра

Да нет, конечно. В худшем случае - 12 байт на стеке. Никто не «резервирует» регистры заранее, не в таких случаях - так точно.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)