Pull to refresh

Почему наши высокоуровневые языки до сих пор не такие уж и высокоуровневые?

Reading time4 min
Views12K
Прошу не судить строго, это моя первая статья на хабре. Лучше оставляйте замечания в комментариях, а я обещаю сделать соответствующие выводы.

Итак, первое моё знакомство с языками программирования состоялось в школе, и был это Бэйсик. С тех пор с языками программирования я не пересекался. Прошло больше 20 лет и мне понадобилось изучить один из современных языков программирования. Всем критериям предъявляемым мной языку программирования, которые я смог сформулировать на тот момент, полностью удовлетворял C#. Засучив рукава, я принялся его изучать и у меня появилась возможность оценить насколько изменились языки программирования за это время.

Многое было привычно, если не по внешнему виду, то по концепции: переменные, циклы, операторы ветвления… А что-то было совсем новым: ООП с его классами (полями, методами, свойствами), наследованием и т. д.
Конечно, многое порадовало. Классы теперь позволяют заниматься распределением обязанностей: Так, ты мне принеси «то»; Ты сделай «это»; Ты посчитай мне «это», результат сообщишь. Это очень напоминает наше взаимодействие с окружающей средой. Например, зашли в прачечную, отдали грязное постельное бельё, забрали чистое. Зашли в ателье, отдали ушить брюки, забрали готовый вариант. Зашли в закусочную, сделали заказ, получили завтрак. Очень удобно и наглядно.
Но вернёмся с теме статьи. Я никак не ожидал спустя 20 лет увидеть в языках программирования некоторые вещи:

1. Индексация с 0.

Для меня было большим удивлением, что индексация массивов, списков, да и любых других коллекций начинается с 0, а не с 1. Зачем? Это же неудобно, подумал я.

Затем я помогал младшему брату с изучением азов C# и объяснял, что считать тут надо с 0, а не с 1 и уже он у меня спросил: «А зачем? Это же неудобно!».

Потом ради интереса я стал рассказывать своим друзьям и знакомым, что в современных языках программирования (за редким исключением) считать нужно с 0, а не с 1. И все спрашивали: «А зачем? Это же неудобно!» и я до сих пор не знаю что ответить им на этот вопрос.

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

2. Числовые типы данных.

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

Во первых, это просто не удобно, постоянно думать какой числовой тип данных использовать в данном конкретном случае.
Во вторых, нужно постоянно заботиться о правильном приведении типов.
В третьих, нужно следить за переполнением типа. А между прочим, из-за этого ракеты падают. Привет Ariane 5. Неужели 7-8 миллиардов долларов это адекватная плата за подобного рода ошибки?

3. Разделение типов данных на целые и дробные.

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

Была на хабре статья о Smalltalk, там рассказывалось о расчётах без потери точности в Smalltalk.
Расчеты без потери точности. Основная проблема во многих языках – потеря точности при делении. Например: 1/3 – это 0.3333 и 3 в периоде. Соответственно в других языках оговаривается количество знаков после запятой, и точность теряется. В Smalltalk эту проблему решили очень красиво. В результате этого деления мы получим число класса Fraction. Оно содержит в себе числитель (1) и знаменатель (3). То есть, как такового деления не будет, а будет дробь. Ничего не теряем. И все последующие операции подчиняются правилам работы с дробями. Когда необходимо получить десятичное число, просто говорим этому объекту asFixedPoint: с нужным числом знаков после запятой и получаем результат. При этом само число остается неизменным, и мы можем продолжать вести расчеты без потери точности.
Так почему у нас до сих пор нет единого типа данных для любых чисел, который бы состоял из числителя, знаменателя и динамически увеличивал занимаемое место в памяти при достижении предела?

Вероятно, многие могли бы привести аргументы «против», такие как: меньшая скорость работы готовой программы, большая требовательность к ресурсам компьютера, но мы ведь говорим о высокоуровневых языках программирования. Насколько я понимаю, можно добиться наибольшей производительности от программы написанной на ассемблере, но каков процент программ написанных на ассемблере от общего числа программ в наши дни? Значит производительность далеко не самая важная вещь в современных языках программирования.

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

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

P.S. Не знаю, кто такой SkidanovAlex, но спасибо тебе, добрый человек, за приглашение на хабр.
Tags:
Hubs:
-27
Comments420

Articles

Change theme settings