Этот рассказ является переводом из заметки, которую я написал 2 года назад.
Отказ от ответственности: как обычно, это мое собственное мнение и точка зрения по этому вопросу. Для некоторых это может стать деликатным вопросом, из-за которого легко могут возникнуть пламенные войны между пользователями одного конкретного языка и другого, чего я постараюсь избежать.

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

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

На самом деле до сих пор Исчисление — математический предмет/курс, который вы должны пройти (все еще помните? «интегралы»? «производные»? или ту ночь с нулевой эффективностью, которую вы провели, пытаясь решить единственный интеграл?) имеет два подхода.

Эти два подхода называются «Ранние трансцендентальные» и «Поздние трансцендентальные» (я думаю, что это как-то связано с трансцендентальными функциями, но опять же, я не очень хорош в математика, так что я ничего не подтверждаю).

Так случилось, что я выбираю ранний трансцендентальный путь, потому что в моем университете используется учебник Джеймса Стюарта «Исчисление», 8-е издание. Курс не следует позднему пути, который выдающимися авторами такого подхода являются Антон, Бивенс и Дэвис. (примечание: у них есть учебники по раннему трансцендентальному подходу, но, тем не менее, я подозреваю, что учебник Джеймса Стюарта является самым популярным, потому что при поиске ранних трансцендентальных подходов вы получаете результаты только текстов Джеймса Стюарта).

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

Но у них есть разница или две в педагогических аспектах.

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

… а мощность функции e (exp) определяется как функция, обратная ln. Важные свойства, такие как ln(xy) = ln(x)+ln(y), вытекают из определения. А экспоненциальные функции определяются как

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

… и сопровождается кучей формул вроде «производная от exp(x) тоже есть exp(x)». Некоторые говорят, что этому подходу не хватает строгости. Даже доказательство вышеуказанного предела оказывается проблемой.

Но давайте посмотрим правде в глаза. Если у этого подхода есть только минусы, зачем они вообще его придумали? Это потому, что у него тоже есть свои плюсы. И плюсы ранних трансцендентов есть не что иное, как взятые из минусов поздних трансценденталов. И что это за плюсы и минусы, о которых я болтаю? Оказывается, отсутствие строгости — это не конец света, потому что, скорее всего, большинство из нас не делают карьеру исключительно в математике. Так что это нормально (и в большинстве случаев даже удобно) использовать «ранние» формулы для вещей, которые практичны и реальны, не слишком беспокоясь о том, как они были получены. Но если вам действительно нужно доказывать, это все равно выглядит как «ответ, ищущий проблему». В этом тоже нет ничего странного, просто взгляните на рекуррентные отношения. Держу пари, вам будет трудно понять, почему они придумали эти монструозные формулы. Но, в конце концов, они по-прежнему работают автоматически и, что наиболее важно, выглядят законно.

Вот почему они придумали эти два подхода.

источник [1]: этот вопрос на Math StackExchange, а также этот вопрос на Mathematic Educators.

И вернемся к основной проблеме. Почему я говорю об этих двух подходах? Это потому, что у нас здесь почти такая же история:

«Должен ли я сначала изучить [C#] или [C/C++]?»

Мой университет выбирает C для начала. А мои друзья выбирают Java. Но я лично не вижу, чтобы (Java) сильно отличалась от C#, так что давайте разделим их так.

  • C/C++ или языки, которые я называю «нижним уровнем», — это языки, в которых вам приходится заниматься управлением памятью самостоятельно.
  • C#, Java или языки, которые я называю «более высокого уровня», — это языки, которые не касаются (или избегают касания) памяти напрямую (вместо этого у них есть какой-то GC — сборщик мусора — для таких вещей)

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

А что за еда без еды? Вот некоторые из кодов, сделанные специально для вашего аппетита, и вы, как новичок, определенно обнаружите, что «высшие языки» легче понять, чем «низшие языки» (C, я смотрю на вас).

// A simple C program
#include <stdio.h>
void main()
{    
     printf("Hello!\n");
}

­

// A simple C# program
using System;
static class Program
{    
     static void main() 
     {
         Console.WriteLine("Hello!");    
     }
}

­

// A simple Java program
public class HelloWorld 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello!");
    }
}

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

Поскольку я считаю (очевидно) «высшие языки» «высшими», потому что они рождаются позже, чем «низшие языки», названия более или менее «стандартизированы». Просто возьмите приведенный выше пример printf и Console.WriteLine. Конечно, printf не приносит вам «фамильярности» и, более того, кажется, усложняет проблему, что только когда вы станете более опытным, вы начнете понимать, почему они назвали это так. И, конечно же, утверждение, что имена функций C не являются «стандартизированными», также неверно, поскольку существуетстандарт, определяющий их имена. Но почему это выглядело так сложно? Потому что это не вызывает той «фамильярности», о которой я говорил: atol, ~ (да, это специальное имя), fdim, frexp, … по сравнению с ToString, Parse, Write, NewLine, Finalizer, … Я даже думаю, что это одна из основных сильных сторон языков «высокого уровня». И, честно говоря, с помощью Visual Basic (это язык «более высокого уровня») я поднялся с самого низа.

Но на этом все не останавливается.
В отличие от ранних трансцендентальных и поздних трансцендентальных книг, где вы могли закрыть глаза и случайным образом выбрать одну, потому что они охватывают одни и те же вещи, это не зависит от изучения и использования языка, они относятся к различным аспектам знаний. Вы видели раньше, вы пробовали раньше, C трудно начать с C из-за его сварливого синтаксиса, но в конечном итоге это стало скрытым благословением. C позволяет вам манипулировать памятью напрямую, и как только вы накопите достаточно боли в этом мире, вы даже не осознаете, что освоили его синтаксис и управление памятью.
В то же время в C# или Java или любых языках «высокого уровня» у вас есть GC в вашем распоряжении, и все, что вам нужно, это попросить (кого?) создать для вас то или иное. Вам даже не нужно думать о финализаторах и вещах, которые вы выпросили после того, как сделали с ними. И угадайте, что? Все по-прежнему работает так, как вы ожидаете. Честно говоря, я люблю реализовывать структуры данных, такие как 2–3 Tree, AVL или RB tree, на «высших языках», потому что их размещение — это PITA.

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

- Почему это становится ужасно медленным, когда я рисую?

- Почему он съел 500 МБ моей гребаной памяти??

- И какого хрена она все еще увеличивается?!?!

Начав с C#/Visual Basic, вы также получили еще одно преимущество: стало проще делать интуитивно понятные и привлекательные вещи вместо того, чтобы смотреть на черную консоль с белым текстом. Но люди остаются людьми, в какую бы одежду они ни были одеты, вещи «под ними» не меняются. Обучение управлению памятью после языковых трюков, кажется, происходит в обратном порядке. Конечно, насколько перевернуто, зависит от языка. Но, тем не менее, изучение синтаксиса C и его управления памятью кажется менее болезненным, чем необходимость тратить час на попытки исправить вашу растровую программу, которую вы понятия не имею, что вызов Dispose является обязательным или тратит от 15 часов до недели, пытаясь понять, почему вы назначили объект A для объект B с тем же классом, только чтобы сходить с ума, поскольку любые изменения, внесенные в A, также влияют на B. И, вероятно, самое болезненное, с чем я столкнулся, это то, что я провел два дня подряд, выясняя, почему я не могу взаимодействовать с библиотекой пользовательского режима, которую я написал для общения. драйвер ядра. Это все ошибки, которые вы совершали время от времени, даже в будущем. Честно говоря, я сделал две ошибки, кроме классовой. И это потому, что мышление, которое я придумал, изучая язык «более высокого уровня», которое я чувствовал, было совсем другим: больше концентрируется на результате, а не на сути.

Итак, в заключение я хотел бы подвести некоторые итоги о языках «нижнего уровня»:

  • Они позволяют вам получить представление о кровавых деталях оборудования под ним.
  • Но, конечно же, они попытаются помешать (читай: бросить вызов) вашим попыткам их выучить.

И про языки «высшего уровня»:

  • Время выхода на рынок, которое часто играет очень важную роль на многих предприятиях, резко сокращается. Они также более практичны.
  • Но они скрывают кровавые подробности из-за своей природы, которая для некоторых оказывается существенной.

Редакция 1, 03 сентября 2019 г.