Рубрики
Без рубрики

Особенности языка: Лучшее и худшее

Мне интересно создать свой собственный язык программирования, и я хочу знать: что… С тегами java, haskell, r, обсудить.

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

Вот несколько моих:

Когда я создам свой собственный язык (надеюсь, скоро), я бы хотел, чтобы он эмулировал парадигму R , где скаляры – это просто векторы длины 1 :

> x <- 3
> length(x)
[1] 1
> x <- c(1,2,3)
> length(x)
[1] 3

…это означает (как вы можете видеть выше), что вы можете использовать такие методы, как length() на скалярах, которые на самом деле являются просто векторами длины 1. Я хотел бы распространить это на матрицы любой размерности и длины, чтобы каждый бит данных на самом деле был N-мерной матрицей. Это позволило бы унифицировать обработку данных для данных любой размерности. ( Хотя производительность, конечно, пострадала бы.)

Я тоже люблю Хаскелл с Целое число тип, который является простым в использовании, целое число бесконечной точности :

ghci> let factorial n = product [1..n]

ghci> factorial 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

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

Представьте, например, что вместо вычисления x/9 и усечения результата в какой-то момент, чтобы сохранить его в переменной x , вместо этого вы сохраняете запись формулы, которая использовалась для построения x . Если затем вы объявите переменную y *3 , вы можете либо сохранить формулу в памяти как y = (1/9) * 3 или признать, что пользователь ввел 3 и 9 в виде целых чисел и упростить формульное представление y внутренне, чтобы 1/3 .

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

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

Наконец, одна языковая особенность, которой я бы никогда не хотел подражать, – это Иерархия чисел Java .

В Java есть примитивы как int , поплавок , логические , которые не являются частью иерархии классов Java. Они предназначены для эмуляции базовых типов данных языка Си и могут использоваться для быстрых вычислений. Они являются одними из немногих типов, не произошедших от всеобъемлющего Java Объект класс. Поскольку Java не поддерживает перегрузку операторов , арифметические операции + , - , * , / , и так далее определяются только для примитивов (и + перегружен внутренне для строки s). Поэтому, если вы хотите заняться какой-либо математикой, вам нужен один из этих примитивных типов… понял?

Ну, в Java также есть классы-оболочки для каждого из примитивных типов: Целое число , Плавающий , Логический и так далее. ((Обратите также внимание, что он обернут Целое число и не Int . Почему? Я не знаю. Если вы это сделаете, пожалуйста, дайте мне знать в комментариях.) Эти классы-оболочки позволяют выполнять правильное ООП с числами. Java “ящики” и “распаковки” типы чисел автоматически, так что вам не придется конвертировать Целое число в int вручную для выполнения арифметики.

Становится все хуже! Иерархия классов чисел в Java является плоской, что означает, что все числовые классы ( Байт , Целое число , Двойной , Короткий , Float , Long ) происходят непосредственно из Числа , и Число не реализует никаких методов для выполнения чего-либо, кроме преобразования данного Числа в определенный примитивный тип. Это означает, что если вы хотите, например, сделать что-то такое простое, как определить метод, который находит максимум два Число с , вам нужно сначала преобразовать каждое число в Двойной а затем используйте Double.max() для сравнения. Вам нужно преобразовать в Двойной таким образом, вы не потеряете точность преобразования в “меньший” тип (при условии, что вы также не принимаете BigInteger s или BigDecimal s, что делает это еще более сложным). Число (ради всего святого) даже не реализует интерфейс Java Сопоставимый , что означает, что вы даже не можете сравнить a Поплавок к Double без распаковки Java в примитивы, неявное приведение float к двойному а затем выполнить сравнение.

Я бы не пожелал иерархии Java Number моему злейшему врагу.

Оригинал: “https://dev.to/awwsmm/language-features-best-and-worst-1451”