Какое высказывание верно для языка java
Перейти к содержимому

Какое высказывание верно для языка java

  • автор:

Статическая и динамическая типизация

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

Тип — это коллекция возможных значений. Целое число может обладать значениями 0, 1, 2, 3 и так далее. Булево может быть истиной или ложью. Можно придумать свой тип, например, тип «ДайПять», в котором возможны значения «дай» и «5», и больше ничего. Это не строка и не число, это новый, отдельный тип.

Статически типизированные языки ограничивают типы переменных: язык программирования может знать, например, что x — это Integer. В этом случае программисту запрещается делать x = true , это будет некорректный код. Компилятор откажется компилировать его, так что мы не сможем даже запустить такой код. Другой статически типизированный язык может обладать другими выразительными возможностями, и никакая из популярных систем типов не способна выразить наш тип ДайПять (но многие могут выразить другие, более изощренные идеи).

Динамически типизированные языки помечают значения типами: язык знает, что 1 это integer, 2 это integer, но он не может знать, что переменная x всегда содержит integer.

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

Статически типизированные языки

Статические языки проверяют типы в программе во время компиляции, еще до запуска программы. Любая программа, в которой типы нарушают правила языка, считается некорректной. Например, большинство статических языков отклонит выражение «a» + 1 (язык Си — это исключение из этого правила). Компилятор знает, что «a» — это строка, а 1 — это целое число, и что + работает только когда левая и правая часть относятся к одному типу. Так что ему не нужно запускать программу чтобы понять, что существует проблема. Каждое выражение в статически типизированном языке относится к определенному типу, который можно определить без запуска кода.

Многие статически типизированные языки требуют обозначать тип. Функция в Java public int add(int x, int y) принимает два целых числа и возвращает третье целое число. Другие статически типизированные языки могут определить тип автоматически. Та же самая функция сложения в Haskell выглядит так: add x y = x + y . Мы не сообщаем языку типы, но он может определить их сам, потому что знает, что + работает только на числах, так что x и y должны быть числами, значит функция add принимает два числа как аргументы.

Это не уменьшает «статичность» системы типов. Система типов в Haskell знаменита своей статичностью, строгостью и мощностью, и в по всем этим фронтам Haskell опережает Java.

Динамически типизированные языки

Динамически типизированные языки не требуют указывать тип, но и не определяют его сами. Типы переменных неизвестны до того момента, когда у них есть конкретные значения при запуске. Например, функция в Python

def f(x, y): return x + y

может складывать два целых числа, склеивать строки, списки и так далее, и мы не можем понять, что именно происходит, пока не запустим программу. Возможно, в какой-то момент функцию f вызовут с двумя строками, и с двумя числами в другой момент. В таком случае x и y будут содержать значения разных типов в разное время. Поэтому говорят, что значения в динамических языках обладают типом, но переменные и функции — нет. Значение 1 это определенно integer, но x и y могут быть чем угодно.

Сравнение

Большинство динамических языков выдадут ошибку, если типы используются некорректно (JavaScript — известное исключение; он пытается вернуть значение для любого выражения, даже когда оно не имеет смысла). При использовании динамически типизированных языков даже простая ошибка вида «a» + 1 может возникнуть в боевом окружении. Статические языки предотвращают такие ошибки, но, конечно, степень предотвращения зависит от мощности системы типов.

Статические и динамические языки построены на фундаментально разных идеях о корректности программ. В динамическом языке «a» + 1 это корректная программа: код будет запущен и появится ошибка в среде исполнения. Однако, в большинстве статически типизированных языков выражение «a» + 1 — это не программа: она не будет скомпилирована и не будет запущена. Это некорректный код, так же, как набор случайных символов !&%^@*&%^@* — это некорректный код. Это дополнительное понятие о корректности и некорректности не имеет эквивалента в динамических языках.

Сильная и слабая типизация

Понятия «сильный» и «слабый» — очень неоднозначные. Вот некоторые примеры их использования:

  • Иногда «сильный» означает «статический».
    Тут все просто, но лучше использовать термин «статический», потому что большинство используют и понимают его.
  • Иногда «сильный» означает «не делает неявное преобразование типов».
    Например, JavaScript позволяет написать «a» + 1 , что можно назвать «слабой типизацией». Но почти все языки предоставляют тот или иной уровень неявного преобразования, которое позволяет автоматически переходить от целых чисел к числам с плавающей запятой вроде 1 + 1.1 . В реальности, большинство людей используют слово «сильный» для определения границы между приемлемым и неприемлемым преобразованием. Нет какой-то общепринятой границы, они все неточные и зависят от мнения конкретного человека.
  • Иногда «сильный» означает, что невозможно обойти строгие правила типизации в языке.
  • Иногда «сильный» означает безопасный для памяти (memory-safe).
    Си — это пример небезопасного для памяти языка. Если xs — это массив четырех чисел, то Си с радостью выполнит код xs[5] или xs[1000] , возвращая какое-то значение из памяти, которая находится сразу за xs .

Давайте остановимся. Вот как некоторые языки отвечают этим определениям. Как можно заметить, только Haskell последовательно «сильный» по всем параметрам. Большинство языков не такие четкие.

Язык Статический? Неявные преобразования? Строгие правила? Безопасный для памяти?
C Сильный Когда как Слабый Слабый
Java Сильный Когда как Сильный Сильный
Haskell Сильный Сильный Сильный Сильный
Python Слабый Когда как Слабый Сильный
JavaScript Слабый Слабый Слабый Сильный

(«Когда как» в колонке «Неявные преобразования» означает, что разделение между сильным и слабым зависит от того, какие преобразования мы считаем приемлемыми).

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

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

Сильная типизация: Система типов, которую я люблю и с которой мне комфортно.

Слабая типизация: Система типов, которая беспокоит меня или с которой мне не комфортно.

Постепенная типизация (gradual typing)

Можно ли добавить статические типы в динамические языки? В некоторых случаях — да. В других это сложно или невозможно. Самая очевидная проблема — это eval и другие похожие возможности динамических языков. Выполнение 1 + eval(«2») в Python дает 3. Но что даст 1 + eval(read_from_the_network()) ? Это зависит от того, что в сети на момент выполнения. Если получим число, то выражение корректно. Если строку, то нет. Невозможно узнать до запуска, так что невозможно анализировать тип статически.

Неудовлетворительное решение на практике — это задать выражению eval() тип Any, что напоминает Object в некоторых объектно-ориентированных языках программирования или интерфейс interface <> в Go: это тип, которому удовлетворяет любое значение.

Значения типа Any не ограничены ничем, так что исчезает возможность системы типов помогать нам в коде с eval. Языки, в которых есть и eval и система типов, должны отказываться от безопасности типов при каждом использовании eval .

В некоторых языках есть опциональная или постепенная типизация (gradual typing): они динамические по умолчанию, но позволяют добавлять некоторые статические аннотации. В Python недавно добавили опциональные типы; TypeScript — это надстройка над JavaScript, в котором есть опциональные типы; Flow производит статический анализ старого доброго кода на JavaScript.

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

Компиляция статически типизированного кода

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

Компиляторы статических языков обычно могут генерировать более быстрый код, чем компиляторы динамических. Например, если компилятор знает, что функция add принимает целые числа, то он может использовать нативную инструкцию ADD центрального процессора. Динамический язык будет проверять тип при выполнении, выбирая один из множества функций add в зависимости от типов (складываем integers или floats или склеиваем строки или, может быть, списки?) Или нужно решить, что возникла ошибка и типы не соответствуют друг другу. Все эти проверки занимают время. В динамических языках используются разные трюки для оптимизации, например JIT-компиляция (just-in-time), где код перекомпилируется при выполнении после получения всей необходимой о типах информации. Однако, никакой динамический язык не может сравниться по скоростью с аккуратно написанным статическим кодом на языке вроде Rust.

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

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

Сторонники динамических языков указывают на то, что на таких языках, кажется, легче писать код. Это определенно справедливо для некоторых видов кода, который мы время от времени пишем, как, например, тот код с eval . Это спорное решение для регулярной работы, и здесь имеет смысл вспомнить неопределенное слово «легко». Рич Хики отлично рассказал про слово «легко», и его связь со словом «просто». Посмотрев этот доклад вы поймете, что не легко правильно использовать слово «легко». Опасайтесь «легкости».

Плюсы и минусы статических и динамических систем типизации все еще плохо изучены, но они определенно зависят от языка и конкретной решаемой задачи.

JavaScript пытается продолжить работу, даже если это означает бессмысленную конвертацию (вроде «a» + 1 , дающее «a1»). Python в свою очередь старается быть консервативным и часто возвращает ошибки, как в случае с «a» + 1 .

Существуют разные подходы с разными уровнями безопасности, но Python и JavaScript оба являются динамически типизированными языками.

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

Haskell же не позволит сложить integer и float без явного преобразования перед этим. Си и Haskell оба являются статически типизированными, не смотря на такие большие отличия.

Есть множество вариаций динамических и статических языков. Любое безоговорочное высказывание вида «статические языки лучше, чем динамические, когда дело касается Х» — это почти гарантированно ерунда. Это может быть правдой в случае конкретных языков, но тогда лучше сказать «Haskell лучше, чем Python когда дело касается Х».

Разнообразие статических систем типизации

Давайте взглянем на два знаменитых примера статически типизированных языков: Go и Haskell. В системе типизации Go нет обобщенных типов, типов с «параметрами» от других типов. Например, можно создать свой тип для списков MyList, который может хранить любые нужные нам данные. Мы хотим иметь возможность создавать MyList целых чисел, MyList строк и так далее, не меняя исходный код MyList. Компилятор должен следить за типизацией: если есть MyList целых чисел, и мы случайно добавляем туда строку, то компилятор должен отклонить программу.

Go специально был спроектирован таким образом, чтобы невозможно было задавать типы вроде MyList. Лучшее, что возможно сделать, это создать MyList «пустых интерфейсов»: MyList может содержать объекты, но компилятор просто не знает их тип. Когда мы достаем объекты из MyList, нам нужно сообщить компилятору их тип. Если мы говорим «Я достаю строку», но в реальности значение — это число, то будет ошибка исполнения, как в случае с динамическими языками.

В Go также нет множества других возможностей, которые присутствуют в современных статически типизированных языках (или даже в некоторых системах 1970-х годов). У создателей Go были свои причины для этих решений, но мнение людей со стороны по этому поводу иногда может звучать резко.

Теперь давайте сравним с Haskell, который обладает очень мощной системой типов. Если задать тип MyList, то тип «списка чисел» это просто MyList Integer . Haskell не даст нам случайно добавить строку в список, и удостоверится, что мы не положим элемент из списка в строковую переменную.

Haskell может выражать намного более сложные идеи напрямую типами. Например, Num a => MyList a означает «MyList значений, которые относятся к одному типу чисел». Это может быть список integer’ов, float’ов или десятичных чисел с фиксированной точностью, но это определенно никогда не будет списком строк, что проверяется при компиляции.

Можно написать функцию add, которая работает с любыми численными типами. У этой функции будет тип Num a => (a -> a -> a) . Это означает:

  • a может быть любым численным типом ( Num a => ).
  • Функция принимает два аргумента типа a и возвращает тип a ( a -> a -> a ).

Последний пример. Если тип функции это String -> String , то она принимает строку и возвращает строку. Но если это String -> IO String , то она также совершает какой-то ввод/вывод. Это может быть обращение к диску, к сети, чтение из терминала и так далее.

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

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

Сравните эту мощность с Go, который не способен выразить простую идею MyList, не говоря уже о «функции, которая принимает два аргумента, и они оба численные и одного типа, и которая делает ввод/вывод».

Подход Go упрощает написание инструментов для программирования на Go (в частности, реализация компилятора может быть простой). К тому же, требуется изучить меньше концепций. Как эти преимущества сравнимы со значительными ограничениями — субъективный вопрос. Однако, нельзя поспорить, что Haskell сложнее изучить, чем Go, и что система типов в Haskell намного мощнее, и что Haskell может предотвратить намного больше типов багов при компиляции.

Go и Haskell настолько разные языки, что их группировка в один класс «статических языков» может вводить в заблуждение, не смотря на то, что термин используется корректно. Если сравнивать практические преимущества безопасности, то Go ближе к динамических языкам, нежели к Haskell’у.

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

Конкретные примеры отличия в возможностях систем типизации

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

В Go можно сказать «функция add принимает два integer’а и возвращает integer»:

func add(x int, y int) int

В Haskell можно сказать «функция принимает любой численный тип и возвращает число того же типа»:

f :: Num a => a -> a -> a add x y = x + y

В Idris можно сказать «функция принимает два integer’а и возвращает integer, но первый аргумент должен быть меньше второго аргумента»:

add : (x : Nat) -> (y : Nat) -> -> Nat add x y = x + y

Если попытаться вызвать функцию add 2 1 , где первый аргумент больше второго, то компилятор отклонит программу во время компиляции. Невозможно написать программу, где первый аргумент больше второго. Редкий язык обладает такой возможностью. В большинстве языков такая проверка происходит при выполнении: мы бы написали что-то вроде if x >= y: raise SomeError() .

В Haskell нет эквивалента такому типу как в примере с Idris выше, а в Go нет эквивалента ни примеру с Haskell, ни примеру с Idris. В итоге, Idris может предотвратить множество багов, которые не сможет предотвратить Haskell, а Haskell сможет предотвратить множество багов, которые не заметит Go. В обоих случаях необходимы дополнительные возможности системы типизации, которые сделают язык более сложным.

Системы типизации некоторых статических языков

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

  • C (1972), Go (2009): Эти системы совсем не мощные, без поддержки обобщенных типов. Невозможно задать тип MyList, который бы означал «список целых чисел», «список строк» и т.д. Вместо этого придется делать «список необозначенных значений». Программист должен вручную сообщать «это список строк» каждый раз, когда строка извлекается из списка, и это может привести к ошибке при исполнении.
  • Java (1995), C# (2000): Оба языка поддерживают обобщенные типы, так что можно сказать MyList и получить список строк, о котором компилятор знает и может следить за соблюдением правил типов. Элементы из списка будут обладать типом String, компилятор будет форсировать правила при компиляции как обычно, так что ошибки при исполнении менее вероятны.
  • Haskell (1990), Rust (2010), Swift (2014): Все эти языки обладают несколькими продвинутыми возможностями, в том числе обобщенными типами, алгебраическими типами данных (ADTs), и классами типов или чем-то похожим (типы классов, признаки (traits) и протоколы, соответственно). Rust и Swift более популярны, чем Haskell, и их продвигают крупные организации (Mozilla и Apple, соответственно).
  • Agda (2007), Idris (2011): Эти языки поддерживают зависимые типы, позволяя создавать типы вроде «функция, которая принимает два целых числа х и y, где y больше, чем x». Даже ограничение «y больше, чем x» форсируется при компиляции. При выполнении y никогда не будет меньше или равно x, что бы ни случилось. Очень тонкие, но важные свойства системы могут быть проверены статически в этих языках. Их изучает очень мало программистов, но эти языки вызывают у них огромный энтузиазм.

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

Группа два (Java и C#) — это мэйнстримовые языки, зрелые и широко используемые.

Группа три находится на пороге входа в мэйнстрим, с большой поддержкой со стороны Mozilla (Rust) и Apple (Swift).

Группа четыре (Idris and Agda) далеки от мэйнстрима, но это может измениться со временем. Языки группы три были далеко от мэйнстрима еще десять лет назад.

Вильгельм фон Гумбольдт

Вильгельм фон Гумбольдт (1767–1835) был одним из крупнейших лингвистов-теоретиков
в мировой науке. По поводу его роли в языкознании В. А. Звегинцев
писал: «Выдвинув оригинальную концепцию природы языка и подняв ряд
фундаментальных проблем, которые и в настоящее время находятся в центре
оживленных дискуссий, он, подобно непокоренной горной вершине,
возвышается над теми высотами, которых удалось достичь другим
исследователям».

В. фон Гумбольдт был многосторонним человеком
с разнообразными интересами. Он был прусским государственным деятелем
и дипломатом, занимал министерские посты, играл значительную роль
на Венском конгрессе, определившем устройство Европы после разгрома
Наполеона. Он основал Берлинский университет, ныне носящий имена его
и его брата, знаменитого естествоиспытателя и путешественника А. фон
Гумбольдта. Ему принадлежат труды по философии, эстетике
и литературоведению, юридическим наукам и др. Его работы по лингвистике
не столь уж велики по объему, однако в историю науки он вошел в первую
очередь как языковед-теоретик .

Время, когда работал В. фон Гумбольдт, было
периодом расцвета немецкой классической философии; в это время работали
такие великие мыслители, как старший современник В. фон Гумбольдта И.
Кант и принадлежавший к одному с В. фон Гумбольдтом поколению
Г. Гегель. Вопрос о связи гумбольдтовской теории с теми или иными
философскими концепциями, в частности, И. Канта, по-разному
трактуется историками науки. Однако несомненно одно: влияние на ученого
общей философской атмосферы эпохи, способствовавшее рассмотрению
крупных, кардинальных вопросов теории. В то же время эпоха сказывалась
и на научном стиле ученого: перед ним не стояла задача строить
логически непротиворечивую теорию или доказывать каждое
из её положений; такого рода требования появились в лингвистике позже.
Зачастую философская манера рассуждений В. фон Гумбольдта кажется
современному читателю не очень понятной, особенно это относится к его
главному лингвистическому труду. Однако за сложно изложенными и никак
не доказанными рассуждениями скрывается глубокое содержание, часто
очень актуальное для современной науки. Наряду с несомненно устаревшими
положениями мы видим у В. фон Гумбольдта постановку и решение, пусть
в зачаточном виде, многих проблем, к которым впоследствии вновь
приходила наука о языке.

Лингвистикой В. фон Гумбольдт в основном
занимался в последние полтора десятилетия жизни, после отхода
от активной государственной и дипломатической деятельности. Одной
из первых по времени работ был его доклад «О сравнительном изучении
языков применительно к различным эпохам их развития», прочитанный
в Берлинской академии наук в 1820 г. Несколько позже появилась другая
его работа — «О возникновении грамматических форм и их влиянии
на развитие идей». В последние годы жизни ученый работал над трудом
«О языке кави на острове Ява», который не успел завершить. Была
написана его вводная часть «О различии строения человеческих языков
и его влиянии на духовное развитие человечества», опубликованная
посмертно в 1848 г. Это безусловно главный лингвистический труд В. фон
Гумбольдта, в котором наиболее полно изложена его теоретическая
концепция. Работа сразу стала очень знаменитой, и уже спустя
десятилетие появился её русский перевод, хотя и не бывший достаточно
адекватным. В хрестоматию В. А. Звегинцева включены доклад
«О сравнительном изучении языков применительно к различным эпохам
их развития» и фрагменты из его главного труда. Наконец, в 1984 г.
вышла книга В. фон Гумбольдта «Избранные труды по языкознанию», куда
впервые включены русские переводы всех его основных лингвистических
работ.

В двух более ранних работах В. Гумбольдта,
прежде всего в статье «О сравнительном изучении языков применительно
к различным эпохам их развития», ученый высказывает идеи, связанные
с так называемой стадиальной концепцией языка. Эти идеи были основаны
на анализе значительного для того времени количества языков;
в частности, на основании материалов, собранных его братом, он первым
среди языковедов-теоретиков стал изучать языки американских индейцев.

Сравнительное изучение языков было нужно В. фон
Гумбольдту не для выяснения языкового родства (работы Ф. Боппа
он оценивал высоко, но сам компаративистикой такого типа не занимался),
но и не просто для выявления общего и различного в языковых структурах,
как в типологии более позднего времени. Для него было необходимым
выявить общие закономерности исторического развития языков мира.
Языкознание он, как и все его современники, понимал как историческую
науку, но история языков не сводилась для него к истории языковых семей.

В связи с выделяемыми им тремя этапами развития
В. фон Гумбольдт выделял «три аспекта для разграничения исследований
языков». Первый этап — период происхождения языков. Владевший
материалом многих языков так называемых примитивных народов ученый
четко осознавал, что «ещё не было обнаружено ни одного языка,
находящегося ниже предельной границы сложившегося грамматического
строения. Никогда ни один язык не был застигнут в момент становления
его форм». Тем более нет никаких прямых данных о происхождении языка.
В. фон Гумбольдт отказывался от сколько-нибудь
развернутых гипотез в духе XVIII в. о происхождении языка, предполагая
лишь, что «язык не может возникнуть иначе как сразу и вдруг», то есть
происхождение языка из чего-то ему
предшествовавшего — скачкообразный переход из одного состояния
в другое. На первом этапе происходит «первичное, но полное образование
органического строения языка».

Второй этап связан со становлением языков,
формированием их структуры; его изучение «не поддается точному
разграничению» от исследования первого этапа. Как уже отмечено выше,
этот этап также недоступен прямому наблюдению, однако данные о нем
можно полнить, исходя из различий структур тех или иных языков.
Становление языков продолжается вплоть до «состояния стабильности»,
после достижения которого принципиальное изменение языкового строя уже
невозможно: «Как земной шар, который прошел через грандиозные
катастрофы до того, как моря, горы и реки обрели свой настоящий рельеф,
но внутренне остался почти без изменений, так и язык имеет некий предел
законченности организации, после достижения которого уже
не подвергаются никаким изменениям ни его органическое строение, ни его
структура… Если язык уже обрел свою структуру, то важнейшие
грамматические формы уже не претерпевают никаких изменений; тот язык,
который не знает различий в роде, падеже, страдательном или среднем
залоге, этих пробелов уже не восполнит».

Согласно В. фон Гумбольдту, языки проходят
принципиально единый путь развития, но «состояние стабильности» может
достигаться на разных этапах. Здесь он развил существовавшие и до него
идеи о стадиях развития языков, отражающих разные уровни развития тех
или иных народов. Здесь позиция ученого оказывается несколько
противоречивой. С одной стороны, он предостерегает против установления
принципиальной пропасти между уровнями развития языков «культурных»
и «примитивных» народов: «Даже так называемые грубые и варварские
диалекты обладают всем необходимым для совершенного употребления»;
«Опыт перевода с различных языков, а также использование самого
примитивного и неразвитого языка при посвящении в самые тайные
религиозные откровения показывают, что, пусть даже с различной
точностью, каждая мысль может быть выражена в любом языке». С другой
стороны, он же определенно пишет: «Наивысшего совершенства по своему
строю, без сомнения, достиг греческий язык» (имеется в виду
древнегреческий). В статье «О возникновении грамматических форм
и их влиянии на развитие идей», откуда взята последняя цитата, В. фон
Гумбольдт стремится выявить шкалу, по которой можно расположить языки,
достигшие «состояния стабильности» на том или ином уровне (он допускает
и возможность того, что некоторые языки ещё развиваются и «состояния
стабильности» не достигли и достигнут лишь в будущем).

В этом пункте В. фон Гумбольдт развил идеи,
высказанные незадолго до того двумя другими немецкими мыслителями,
принадлежавшими к тому же поколению, — братьями Августом и Фридрихом
Шлегелями. Они ввели понятия аморфных (позднее переименованных
в изолирующие), агглютинативных и флективных языков; эти понятия,
позднее ставшие чисто лингвистическими, связывались братьями Шле-гелями
и затем В. фон Гумбольдтом со стадиями развития языков и народов.

В. фон Гумбольдт выделяет четыре ступени
(стадии) развития языков: «На низшей ступени грамматическое обозначение
осуществляется при помощи оборотов речи, фраз и предложений… На второй
ступени грамматическое обозначение осуществляется при помощи
устойчивого порядка слов и при помощи слов с неустойчивым вещественным
и формальным значением… На третьей ступени грамматическое обозначение
осуществляется при помощи аналогов форм… На высшей ступени
грамматическое обозначение осуществляется при помощи подлинных форм,
флексий и чисто грамматических форм». Нетрудно видеть, что три
последние ступени соответствуют изолирующему, агглютинативному и
флективному строю («аналоги форм» отделяются от «подлинных форм» тем,
что в первых «связь… компонентов ещё недостаточно прочна, заметны места
соединения. Образовавшаяся смесь ещё не стала одним целым», то есть
речь идет явно об агглютинации). Стадиальное различие прямо связывается
со степенью духовного развития: «Первое, и самое существенное, из того,
что дух требует от языка, — это не смешение, а четкое разграничение
вещи и формы, предмета и отношения… Однако такое разграничение
происходит только при образовании подлинных грамматических форм путем
флексии или грамматических слов… при последовательном обозначении
грамматических форм. В каждом языке, располагающем только аналогами
форм, в грамматическом обозначении, которое должно быть чисто
формальным, остается материальный компонент».

Правда, тут же В. фон Гумбольдт вынужден
констатировать, что в данную схему с трудом укладывается китайский
язык, составляющий, по его мнению, «самый необычный пример», другой
сходный пример представлял и древнеегипетский язык. Оказывается, что
«два самых необычных народа были в состоянии достигнуть высокой ступени
интеллектуального развития, обладая языками совершенно или большей
частью лишенными грамматических форм». Однако В. фон Гумбольдт
не склонен данные примеры считать опровержением своей точки зрения:
«Там, где человеческий дух действует при сочетании благоприятных
условий и счастливого напряжения своих сил, он в любом случае достигает
цели, пусть даже пройдя к ней трудным и долгим путем. Трудности при
этом не уменьшаются оттого, что духу приходится их преодолевать». Все-таки
к языкам, «обладающим истинным строем грамматических форм», относятся,
согласно В. фон Гумбольдту, санскрит, семитские языки и, наконец,
классические языки Европы с греческим на вершине.

Позиция ученого оказывается здесь не вполне
цельной. С одной стороны, он ставит в данной статье важную
и не потерявшую актуальности проблему описания «экзотических» языков
в их собственных категориях, без европеизации: «Поскольку к изучению
неизвестного языка подходят с позиции более известного родного языка
или латыни, то для иностранного языка избирается способ обозначения
грамматических отношений, принятый в ряде языков… Во избежание ошибки
необходимо изучать язык во всем его своеобразии, чтобы при точном
расчленении его частей можно было определить, при помощи какой
определенной формы в данном языке в соответствии с его строем
обозначается каждое грамматическое отношение». В этой связи
он разбирает некоторые испанские и португальские грамматики индейских
языков, показывая, что, например, инфинитивом в них именуют то, что
не соответствует европейскому инфинитиву. Но с другой стороны,
он считает, что «дух требует от языка» тех качеств, которые специфичны
для флективных, прежде всего классических языков. Во времена В. фон
Гумбольдта ещё сильны были шедшие от эпохи Возрождения представления
об античной культуре как самой «мудрой» и совершенной; после открытия
санскрита такое же совершенство стали видеть и в древнеиндийской
культуре. Имелось и объективное «доказательство» такого подхода:
максимальная морфологическая сложность, действительно свойственная
санскриту или древнегреческому по сравнению с большинством языков мира.

Типологическими проблемами В. фон Гумбольдт
занимался и в главном своем лингвистическом труде. Там на основе
изучения индейских языков он выделил наряду с тремя типами братьев
Шлегелей ещё один языковой тип — инкорпорирующий. Стадиальная
типологическая концепция после В. фон Гумбольдта в течение нескольких
десятилетий господствовала в европейской науке. Однако многие
её положения нельзя было тактически доказать. Это относилось не только
к представлениям о том, чего «дух требует от языка», но и к тезису
о достижении каждым языком «предела законченности организации»
(аналогия с земным шаром, соответствовавшая представлениям времен В.
фон Гумбольдта, также была отвергнута последующей наукой). Как дальше
будет показано, стадиальная концепция потеряла влиятельность уже
во второй половине XIX в. и ушла из языкознания, если не считать
неудачной попытки её возрождения Н. Я. Марром. И в то же время кое-что
осталось. Сами понятия агглютинативных, флективных, изолирующих
(аморфных) и инкорпорирующих языков, также как и сопряженные с ними
понятия агглютинации, инкорпорации и др., несмотря ни на что всегда
оставались в арсенале науки о языке. Братья Шлегели и Гумбольдт сумели
открыть некоторые существенные черты языковых структур. Вопрос
о закономерностях развития языкового строя, впервые поставленный В. фон
Гумбольдтом, остается важным и серьезным и сейчас, хотя современная
наука решает его не столь прямолинейно. И наконец, сама идея
структурного сравнения языков вне зависимости от их родственных связей
легла в основу одной из важнейших лингвистических дисциплин —
лингвистической типологии.

Вернемся к докладу В. фон Гумбольдта
«О сравнительном изучении языков применительно к различным эпохам
их развития». Третий и последний этап языковой истории начинается
с момента, когдг язык достиг «предела законченности организации». Язык
уже не развивается, но и не деградирует (такого рода идеи появились
позже). Однако в органическом строении языка и его структуре, «как
живых создания? духа», может до бесконечности происходить более тонкое
совершенствование языка». «Посредством созданных для выражения более
тонки? ответвлений понятий, сложением, внутренней перестройкой
структуры слов, их осмысленным соединением, прихотливым использованием
первоначального значения слов, точно схваченным выделением отдельных
форм, искоренением излишнего, сглаживанием редких звучаний язык,
который в момент своего формирования беден, слаборазвит
и не значителен, если судьба одарит его своей благосклонностью,
обретет, но вый мир понятий и доселе неизвестный ему блеск
красноречия». Ш этом этапе истории находятся, в частности, современные
языки Европы.

Изучение языка на этом этапе составляет предмет
собственно исторической лингвистики. Совершенствование языка тесно
связано с историческим развитием соответствующего народа. В то же время
и здесь можно и нужно сопоставлять языки. Только на материале языков,
стоящих на одинаковой ступени развития, «можно ответить на общий вопрос
о том, как все многообразие языков вообще связано с процессом
происхождения человеческого рода». Уже здесь В. фон Гумбольдт отвергает
идею о том, что представления человека о мире независимы oт его языка.
Различное членение мира различными языками, как отмечал ученый,
«выявляется при сопоставлении простого слова с простым понятием…
Безусловно, далеко не безразлично, использует ли один язык описательные
средства там, где другой язык выражает это одним словом, без обращения
к грамматическим формам… Закон членения неизбежно будет нарушен, если
то, что в понятии представляется как единство, не проявляется таковым
в выражении, и вся реальная действительность отдельного слова пропадает
для понятия, которому недостает такого выражения». Уже в этой
сравнительно ранней работе В. фон Гумбольдт заявляет: «Мышление
не просто зависит от языка вообще, потому что до известной степени оно
определяется каждым отдельным языком». Здесь уже сформулирована так
называемая гипотеза лингвистической относительности, выдвигавшаяся
лингвистами, в частности, Б. Уорфом, и в XX в.

Здесь же В. фон Гумбольдт описывает, что такое
язык. Он указывает на его коллективный характер: «Язык не является
произвольным творением отдельного человека, а принадлежит всегда целому
народу; позднейшие поколения получают его от поколений минувших». Очень
важна и такая формулировка: «Языки являются не только средством
выражения уже познанной действительности, но, более того, и средством
познания ранее неизвестной. Их различие не только различие звуков
и знаков, но и различие самих мировоззрений. В этом заключается смысл
и конечная цель всех исследований языка». Как отмечает комментатор В.
фон Гумбольдта Г. В. Рамишвили, точнее по-русски говорить не о мировоззрении (этот термин имеет другой устоявшийся смысл), а о мировидении.

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

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

Первичное и неопределяемое для В. Гумбольдта
понятие — «человеческая духовная сила», конкретно проявляющаяся в виде
«духа народа». Он пишет: «Разделение человечества на народы и племена
и различие его языков и наречий, конечно, тесно связаны между робой,
но вместе с тем и то и другое непосредственно зависит от третьего
явления более высокого порядка — действия человеческой духовной силы,
выступающей всегда в новых и часто более совершенных формах… Выявление
человеческой духовной силы, в разной степени и разными способами
совершающееся в продолжение тысячелетий на пространстве земного круга,
есть высшая цель всего движения духа, окончательная идея, которая
должна явственно вытекать из всемирно-исторического
процесса». Как «язык вообще» неразрывно связан с «человеческой духовной
силой», так каждый конкретный язык связан с «духом народа»: «Язык…
всеми тончайшими нитями своих корней сросся… с силой национального
духа, и чем сильнее воздействие духа на язык, тем закономерней и богаче
развитие последнего. Во всем своем строгом сплетении он есть лишь
продукт языкового сознания нации, и поэтому на главные вопросы
о началах и внутренней жизни языка, — а ведь именно здесь мы подходим
к истокам важнейших звуковых различий, — вообще нельзя должным образом
ответить, не поднявшись до точки зрения духовной силы и национальной
самобытности». В. фон Гумбольдт не дает ни определения народа,
ни определения отдельного языка, но он постоянно указывает
на их неразрывность: язык в отличие диалекта, с одной стороны,
и языковой семьи, с другой, есть достояние отдельного народа, а народ —
это множество людей, говорящих на одном языке. В первой половине XIX в.
такая точка зрения имела и четкий политико-идеологический
смысл: шла борьба за объединение Германии, в которой ведущую роль
играла именно Пруссия, а одним из обоснований этой борьбы была идея
о единстве немецкоговорящей нации.

Согласно В. фон Гумбольдту, язык неотделим
от человеческой культуры и представляет собой важнейший её компонент:
«Язык тесно переплетен с духовным развитием человечества и сопутствует
ему на каждой ступени его локального прогресса или регресса, отражая
в себе каждую стадию культуры». По сравнению с другими видами культур
язык наименее связан с сознанием: «Язык возникает из таких глубин
человеческой природы, что в нем никогда нельзя видеть намерение
произведение, создание народов. Ему присуще очевидное для нас, хотя
необъяснимое в своей сути самодеятельное начало, и в этом плане
он вовсе не продукт ничьей деятельности, а непроизвольная эманация
духа, не создание народов, а доставшийся им в удел дар, их внутренняя
судьба. Они пользуются им, сами не зная, как его построили». Идея
о полностью бессознательном развитии языка и невозможности
вмешательства в него потом получила развитие у Ф. де Соссюра и других
лингвистов.

Человек не может ни мыслить, ни развиваться без
языка: «Создание языка обусловлено внутренней потребностью
человечества. Язык -не просто внешнее средство общения людей,
поддержания общественных связей, но заложен в самой природе человека
и необходим для развития его духовных сил и формирования мировоззрения,
а этого человек только тогда сможет достичь, когда свое мышление
поставит: связь с общественным мышлением». «Языкотворческая сила
в человечестве» стремится к совершенству, этим и обусловливаются единые
закономерности развития всех языков, даже тех, «которые не обнаруживают
между собой никаких исторических связей». Отсюда необходим стадиальный
подход и кажущееся В. фон Гумбольдту несомненный разграничение более
и менее совершенных языков. При этом он указывает, что «язык
и цивилизация вовсе не всегда находятся в одинаково» соотношении друг
с другом»; в частности, «так называемые примитивные и некультурные
языки могут иметь в своем устройстве выдающиеся достоинства,
и действительно имеют их, и не будет ничего удивительного, если
окажется, что они превосходят в этом отношении языки более культурных
народов».

Как уже говорилось, для Ф. фон Гумбольдта
язык — безусловно общественное явление: «Жизнь индивида, с какой
стороны ее ни рассматривать, обязательно привязана к общению… Духовное
развитие, даже при крайней сосредоточенности и замкнутости характера,
возможно только благодаря языку, а язык предполагает обращение
к отличному от нас и понимающему нас существу… Отдельная
индивидуальность есть вообще лишь явление духовной сущности в условиях
ограниченного бытия». Такая точка зрения была естественной, если
исходить из первичности духа народа; позднее, как мы увидим, вопрос
о соотношении индивидуального и коллективного в языке получал
в лингвистике и иные решения.

Дух народа и язык народа неразрывны: «Духовное
своеобразие и строение языка народа пребывают в столь тесном
слиянии друг с другом, что коль скоро существует одно, то из этого
обязательно должно вытекать другое… Язык есть как бы внешнее проявление
духа народов: язык народа есть его дух, и дух народа есть его язык,
и трудно представить себе что-либо
более тождественное». При этом единстве первичен все же дух народа:
«Мы должны видеть в духовной силе народа реальный определяющий принцип
и подлинную определяющую основу для различий языков, так как только
духовная сила народа является самым жизненным и самостоятельным
началом, а язык зависит от нее». В то же время дух народа в полной мере
недоступен наблюдению, о нем мы можем узнавать лишь по его проявлениям,
прежде всего по языку: «Среди всех проявлений, посредством которых
познается дух и характер народа, только язык и способен выразить самые
своеобразные и тончайшие черты народного духа и характера и проникнуть
в их сокровенные тайны. Если рассматривать языки в качестве основы для
объяснения ступеней духовного развития, то их возникновение следует,
конечно, приписывать интеллектуальному своеобразию народа, а это
своеобразие отыскивать в самом строе каждого отдельного языка».

Но чтобы понять, как дух народа реализуется
в языке, надо правильно понять, что же такое язык. Как отмечает В. фон
Гумбольдт, «язык предстает перед нами в бесконечном множестве своих
элементов — слов, правил, всевозможных аналогий и всякого рода
исключений, и мы впадаем в немалое замешательство в связи с тем, что
все это многообразие явлений, которое, как его ни классифицируй, все же
предстает перед нами обескураживающим хаосом, мы должны возвести
к единству человеческого духа». Нельзя ограничиться фиксацией этого
хаоса, надо в каждом языке искать главное. А для этого надо
«определить, что следует понимать под каждым языком».

И здесь В. фон Гумбольдт дает определение
языка, ставшее, пожалуй самым знаменитым местом всего его труда:
«По своей действительной сущности язык есть нечто постоянное и вместе
с тем в каждый данный момент преходящее. Даже его фиксация посредством
письма представляет собой далеко не совершенное мумиеобразное
состояние, которое предполагает воссоздание его в живой речи. Язык есть
не продукт деятельности ( ergon ), а деятельность ( energeia ).
Его истинное определение может быть поэтому только генетическим. Язык
представляет собой постоянно возобновляющуюся работу духа, направленную
на то, чтобы сделать артикулируемый звук пригодным для выражения мысли.
В подлинном и действительном смысле под языком можно понимать только
всю совокупность актов речевой деятельности. В беспорядочном хаосе слов
и правил, который мы по привычке именуем языком, наличествуют лишь
отдельные элементы, воспроизводимые — и притом неполно — речевой
деятельностью; необходима все повторяющаяся деятельность, чтобы можно
было познать сущность живой речи и составить верную картину живого
языка, по разрозненным элементам нельзя познать то, что есть высшего
и тончайшего в языке; это можно постичь и уловить только в связной
речи… Расчленение языка на слова и правила — это лишь мертвый продукт
научного анализа. Определение языка как деятельности духа совершенно
правильно и адекватно уже потому, что бытие духа вообще может мыслиться
только в деятельности и в качестве таковой».

Два греческих слова, ergon и energeia,
употребленные В. фон Гумбольдтом, с тех пор часто рассматривались
многими лингвистами и не редко употребляются как термины без перевода.
Понимание языка в качестве energeia было новым в науке о языке. Как
верно определил В. фон Гумбольдт, вся европейская лингвистика начиная
по крайней мере со стоиков и александрийцев сводила язык к множеству
правил, устанавливаемому в грамматиках, и множеству слов, записанных
в словарях. Ориентация на изучение продукта деятельности была отчасти
связана и с преимущественным, особенно в Средние века и в Новое время,
вниманием к письменным текстам в ущерб устным. Ещё в большей степени
она определялась аналитическим подходом к языку. Языковед моделировал
деятельность слушающего, а не говорящего. Он имел дело с речевой
деятельностью, либо прямо, либо косвенно через посредство письменных
текстов, расчленяя её на части, извлекая из нее единицы, в том числе
слова, и правила оперирования этими единицами. Этого было достаточно
для тех практических целей, из которых выросла европейская традиция
(обучение языкам, толкование текстов, помощь при стихосложении и пр.),
а после появления теоретической лингвистики аналитический подход
к языку оставался господствующим. В. фон Гумбольдт впервые поставил
вопрос иначе, хотя и признавал, что для изучения языков происходит
«неизбежное в языковедении расчленение языкового организма». Какого-либо примера конкретного описания языка в соответствии со своим подходом В. фон Гумбольдт 30-е
гг. XIX в. не дал и, вероятно, ещё не мог дать. Однако после него все
направления теоретического языкознания не могли не учитывать его
разграничения. Наряду с подходом к языку как ergon ,
получившим законченное развитие в структурализме, существовало и так
называемое гумбольдтовское направление, для которого язык — energeia.
Это направление было влиятельным в течение всего XIX в., отошло
на периферию науки, но не исчезло совсем в первой половине XX в.,
а затем нашло новое развитие в генеративной лингвистике.

Язык, согласно В. фон Гумбольдту, состоит
из материи (субстанции) и формы. «Действительная материя языка — это,
с одной стороны, звук вообще, а с другой — совокупность чувственных
впечатлений и непроизвольных движений духа, предшествующих образованию
понятия, которое совершается с помощью языка». Говорить что-либо
о языковой материи в отвлечении от формы невозможно: «в абсолютном
смысле в языке не может быть никакой неоформленной материи»;
в частности, звук «становится членораздельным благодаря приданию ему
формы». Именно форма, а не играющая лишь вспомогательную роль материя
составляет суть языка. Как пишет В. фон Гумбольдт, «постоянное
и единообразное в этой деятельности духа, возвышающей членораздельный
звук до выражения мысли, взятое во всей совокупности своих связей
и систематичности, и составляет форму языка». Ученый выступал против
представления о форме как о «плоде научной абстракции». Форма, как
и материя, существует объективно; форма «представляет собой сугубо
индивидуальный порыв, посредством которого тот или иной народ воплощает
в языке свои мысли и чувства». Нетрудно видеть, что формулировка Ф.
де Соссюра «Язык — форма, а не субстанция» восходит к В. фон
Гумбольдту, хотя понимание формы у него во многом иное.

Форму нельзя познать в целом, её нам дано наблюдать «лишь в конкретно-единичных
проявлениях». С одной стороны, все в языке так или иначе отражает его
форму. С другой стороны, разные явления имеют разную значимость:
«в каждом языке можно обнаружить много такого, что, пожалуй, не искажая
сущности его формы, можно было бы представить и иным». Лингвист должен
уметь находить наиболее существенные черты языка (к их числу В. фон
Гумбольдт относил, в частности, флексию, агглютинацию, инкорпорацию),
но в то же время ему «приходится обращаться к представлению о едином
целом», выделение отдельных черт не дает полного представления о форме
того или иного языка. Если же он не стремится изучать язык как форму
воплощения мыслей и чувств народа, то «отдельные факты будут
представляться изолированными там, где их соединяет живая связь». Тем
самым необходимо системное изучение языка; то есть В. фон Гумбольдт
предвосхищает здесь ещё одно основополагающее требование структурной
лингвистики.

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

Поскольку бесформенные «непроизвольные движения
духа» не могут создать мысль, то невозможно мышление без языка: «Язык
есть орган, образующий мысль. Интеллектуальная деятельность, совершенно
духовная, глубоко внутренняя и проходящая в известном смысле бесследно,
посредством звука материализуется в речи и становится доступной для
чувственного восприятия. Интеллектуальная деятельность и язык
представляют собой поэтому единое целое. В силу необходимости мышление
всегда связано со звуками языка; иначе мысль не сможет достичь
отчетливости и ясности, представление не сможет стать понятием». Важно
и такое высказывание В. фон Гумбольдта: «Даже не касаясь потребностей
общения людей друг с другом, можно утверждать, что язык есть
обязательная предпосылка мышления и в условиях полной изоляции
человека. Но обычно язык развивается только в обществе, и человек
понимает себя только тогда, когда на опыте убедится, что его слова
понятны также и другим людям… Речевая деятельность даже в самых своих
простейших проявлениях есть соединение индивидуальных восприятий
с общей природой человека. Так же обстоит дело и с пониманием». Такой
подход к взаимоотношениям языка и мышления в течение долгого времени
оставался самым влиятельным в языкознании.

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

В связи с этим В. фон Гумбольдтом трактуется
и противоречие между неизменностью и изменчивостью языка: «В каждый
момент и в любой период своего развития язык… представляется человеку —
в отличие от всего уже познанного и продуманного им — неисчерпаемой
сокровищницей, в которой дух всегда может открыть что-то ещё неведомое, а чувство — всегда по-новому воспринять что-то
ещё не прочувствованное. Так на деле и происходит всякий раз, когда
язык перерабатывается поистине новой и великой индивидуальностью… Язык
насыщен переживаниями прежних поколений и хранит их живое дыхание,
а поколения эти через звуки материнского языка, которые и для нас
становятся выражением наших чувств, связаны с нами национальными
и родственными узами. Эта отчасти устойчивость, отчасти текучесть языка
создает особое отношение между языком и поколением, которое на нем
говорит». Если отвлечься от стиля, который в наши дни может казаться
ненаучным, мы имеем здесь важное положение о динамике языкового
развития, о связи каждого состояния языка с предшествующим
и последующим, а к этому в конечном итоге пришла и лингвистика XX в.
Важны для последующего развития вопроса о причинах языковых изменений
и такие слова В. фон Гумбольдта: «Ясно, до чего ничтожна сила одиночки
перед могущественной властью языка… И все-таки
каждый со своей стороны в одиночку, но непрерывно воздействует на язык,
и потому каждое поколение, несмотря ни на что, вызывает в нем какой-то сдвиг, который, однако, часто ускользает от наблюдения».

Язык помогает человеку познавать мир, и в то же
время это познание зависимо от языка: «Как отдельный звук встает между
предметом и человеком, так и весь язык в целом выступает между
человеком и природой, воздействующей на него изнутри и извне, человек
окружает себя миром звуков, чтобы воспринять в себя и переработать мир
вещей… Человек преимущественно — да даже и исключительно, поскольку
ощущение и действие у него зависят от его представлений, — живет
с предметами так, как их преподносит ему язык… И каждый язык описывает
вокруг народа, которому он принадлежит, круг, откуда человеку дано
выйти лишь постольку, поскольку он тут же вступает в круг другого
1зыка». Таким образом и здесь, как и в более ранней работе, В. фон
Гумбольдт ставит вопрос о языковых картинах мира, высказывая точку
зрения о том, что многое в представлении каждого человека о мире
обусловлено его языком; эта проблематика была позднее развита Б. Уорфом
и др.

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

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

Среди единиц языка В. фон Гумбольдт прежде
всего выделял слово. Выступая против традиционных наивных представлений
о происхождении языка, он писал: «Нельзя себе представить, чтобы
создание языка начиналось с обозначения словами предметов, а затем уже
происходило соединение слов. В действительности речь строится
не из предшествующих ей слов, а, наоборот, слова возникают из речи».
В то же время любая речь членится на слова; «под словами следует
понимать знаки отдельных понятий»; «слово образует границу, вплоть
до которой язык в своем созидательном процессе действует
самостоятельно». То есть слова уже даны говорящему языком, тогда как
«для предложения и речи язык устанавливает только регулирующие схемы,
предоставляя их индивидуальное оформление произволу говорящего». Ср.
существующую у ряда лингвистов XX в. концепцию, согласно которой слова
и «регулирующие схемы» предложений принадлежат языку, а сами
предложения — единицы речи. Наряду со словами В. фон Гумбольдт выделял
и корни. Он разграничивал корни «как продукт частой рефлексии
и результат анализа слов», то есть «как результат работы грамматистов»,
и существующие в ряде языков реальные корни, нужные говорящим в связи
с «определенными законами деривации».

В связи с внутренней формой языка В. фон
Гумбольдт затрагивает проблему, которая позже стала трактоваться как
различие значения и смысла слова; с точки зрения образования понятия
«слово — не эквивалент чувственно воспринимаемого предмета,
а эквивалент того, как он был осмыслен речетворческим актом
в конкретный момент изобретения слова. Именно здесь — главный источник
многообразия выражений для одного и того же предмета: так, в санскрите,
где слона называют то дважды пьющим, то двузубым, то одноруким, каждый
раз подразумевая один и тот же предмет, тремя словами обозначены три
равных понятия. Поистине язык представляет нам не сами предметы,
а всегда лишь понятия о них». Позднее в отечественной традиции начиная
с А. А. По-тебни термин «внутренняя
форма» стал употребляться в суженном по сравнению с В. фон Гумбольдтом
значении: говорится не о внутренней форме языка, а о внутренней форме
слова в связи с тем, как в морфемной структуре слова или же в его
этимологической структуре отражаются те или иные смысловые признаки.

Образование понятий в указанном выше смысле
специфично для каждого народа, поэтому «влияние национального
своеобразия обнаруживается в языке… двояко: в способе образования
отдельных понятий и в относительно неодинаковом богатстве языков
понятиями определенного рода». Здесь опять-таки
В. фон Гумбольдт исходил из разных уровней развития языков, которые
проявляются не только в звуковой форме, но и в образовании понятий;
вновь самыми богатыми и в этом плане признаются санскрит
и древнегреческий.

Ни звуковая, ни внутренняя форма языка
не создают язык сами по себе, необходим их синтез: «Соединение звуковой
формы с внутренними языковыми законами придает завершенность языкам,
и высшая ступень их завершенности знаменуется переходом этой связи,
всегда возобновляющейся в одновременных актах языкотворческого духа,
в их подлинное и чистое взаимопроникновение. Начиная со своего первого
элемента, порождение языка — синтетический процесс, синтетический в том
подлинном смысле слова, когда синтез создает нечто такое, что
не содержалось ни в одной из сочетающихся частей как таковых». Этот
процесс завершается, только когда весь строй звуковой формы прочно
и мгновенно сливается с внутренним формообразованием. Благотворным
следствием этого является полная согласованность одного элемента
с другим». Фактически здесь речь идет о том, что позднее получило
название двусторонности знака, и ещё раз здесь В. фон Гумбольдт
подчеркивает системность языка, взаимосвязанность его элементов.

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

Шор Р. О.
Краткий очерк истории лингвистических учений с эпохи Возрождения до конца XIX в. //
Томсен В. История языковедения до конца XIX в. М., 1938.

Звегинцев В. А.
Вводная статья к разделу «В. Гумбольдт» //
Звегинцев В. А. История языкознания XIX—XX вв. в очерках и извлечениях, ч. 1. М., 1964.

Звегинцев В. А.
О научном наследии Вильгельма фон Гумбольдта //
Гумбольдт В. фон. Избранные труды по языкознанию. М., 1984.

Рамишвили Г. В.
Вильгельм фон Гумбольдт — основоположник теоретического языкознания //
Гумбольдт В. фон. Избранные труды по языкознанию. М., 1984.

Срочно, пожалуйста! Сформулируйте и запишите основную мысль этих высказываний. Что их объединяет?

1. Что может быть ближе и дороже, чем родной язык? И, верно, слово родной –
волшебное слово, оно затрагивает сокровеннейшие стороны нашего существования, оно
согревает своим теплом всё то, к чему прикладывается в качестве эпитета: родная страна,
родной дом, родная мать, родной язык. Только любящим его, то есть в совершенстве
владеющим им, открывает он свои возможности, открывает пути. Его надо любить и
неустанно изучать в его совершенных образцах, но вместе с тем и бороться с ним,
стремясь найти способы выражения новых мыслей. Л. В. Щерба

2. Русский язык открывается до конца в своих поистине волшебных свойствах и
богатстве лишь тому, кто кровно любит и знает «до косточки» свой народ и чувствует
сокровенную прелесть нашей земли. К. Г. Паустовский
Как вы понимаете выражение знать до косточки?

Голосование за лучший ответ
Родной язык хорош только на чужой территории, так как постоянное надоедает

1. Русский язык как способ выражать свои мысли и находить новые решения своих проблем.
2. Русский язык в совершенстве доступен только тем, кто много ездит по стране.

Знать «до косточки» значит — знать во всех нюансах.

Опасности обучения на Java

«Вы счастливчики. Мы по три месяца жили в мешках из дерюги в грязных сараях. Мы вставали в шесть утра, стирали мешки, съедали по корке чёрствого хлеба и шли работать на мельницу, по 14 часов в день, с понедельника и до воскресенья, и когда мы возвращались домой, наш папа порол нас своим ремнем»
— Летающий цирк Монти Пайтона, Четыре йоркширца

Что может быть хорошего в тяжёлой работе?

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

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

Когда я начинал проводить интервью с программистами в 1991 г., я обычно позволял им использовать любой язык программирования для решения моей задачи на кодирование. В 99% случаев они выбирали C.

В наши дни они обычно выбирают Java.

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

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

Вместо этого я хочу сказать, что Java в целом недостаточно сложна, чтобы отделить отличных программистов от посредственных. Может быть, это отличный язык для работы, но сегодня речь не об этом. Я даже могу зайти так далеко, что скажу — факт того, что Java не сложен, это фича, а не баг, — но это ведёт к данной проблеме.

Это может звучать немного резковато, это просто моё скромное мнение, но есть две вещи, которым традиционно учат в университетах в курсе компьютерных наук (Computer Science, CS) и которые многие люди никогда полностью по-настоящему так и не понимают: указатели и рекурсия.

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

Все те юные гении, которые в старших классах школы писали на Бейсике пинг-понг для Apple II, поступают в колледжи, выбирают CompSci 101, курс по структурам данных, и когда сталкиваются с работой с указателями, их мозги просто взрываются, и они решают перевестись на политологию, потому что теперь правовая школа кажется им лучшим выбором. Я много раз видел графики отсеивания студентов с курсов CS, и обычно процент выбывших составляет от 40% до 70%. В университетах склонны считать это разбазариванием; я думаю, что это просто необходимая естественная отбраковка людей, которые просто не смогут быть счастливы или успешны в карьере программиста.

Другим сложным для многих студентов был курс, в котором изучалось функциональное программирование, в том числе рекурсивное программирование. В Массачусетском Технологическом Институте была очень высоко поставлена планка по этим курсам, разработан обязательный курс (6.001) и учебник ( Абельсон и Сассман, Структуры и Интерпретация Компьютерных Программ (Abelson & Sussman’s Structure and Interpretation of Computer Programs)) которые используются десятками или даже сотнями лучших школ CS как стандарт де факто для курсов введения в CS.

Сложность этих курсов просто ошеломляющая. На первой лекции вы целиком изучаете Scheme, и теперь вы можете быть посвящены в работу функций, работающих с неподвижной точкой, которые используют другие функции на входе. Когда я смог побороть такой курс, CSE121 в Университете Пенсильвании, я увидел, как много, если не большинство, студентов так и не смогли это сделать. Материал был слишком сложным. Я послал по электронной почте профессору длинное письмо, полное рыданий, говорящее о том, что Это Просто Нечестно. Кто-то в университете, должно быть, услышал меня (или одного из других жалобщиков), потому что теперь на этом курсе изучают Java.

Теперь я бы предпочёл, чтобы меня не услышали.
Думаете, что вы знаете, что это такое? Проверьте Себя Здесь!

Об этом и ведутся споры. Годы скуления ленивых студентов, подобных мне, в сочетании с жалобами индустрии программного обеспечения на то, как мало американские университеты выпускают специалистов по CS, сделали своё дело, и за последнее десятилетие множество безупречных в остальном школ на 100% перешли на Java. И это приветствовалось: рекрутёрам, которые используют «grep» для оценки резюме (прим.: grep — это программа в Unix, позволяющая выбирать строки, в которых есть нужное слово), это, кажется, нравится, и, что лучше всего, в Java нет ничего достаточно сложного, чтобы реально отсеять программистов без той части мозга, которая отвечает за указатели или рекурсии, соответственно уровень отсеивания в университетах понижается, факультеты CS выпускают больше студентов, за это получают больше денег, и всем становится хорошо.

Счастливые ученики Java-школ никогда не столкнутся с ужасными segfault (прим.: Segmentation Fault — типичная ошибка при обращении по некорректному адресу) при попытках реализовать основанные на указателях хеш-таблицы. Они никогда не будут делать безумных, сумасшедших попыток упаковать что-то в биты. Они никогда не будут загружать свои головы мыслями о том, как в полностью функциональных программах значение переменной никогда не изменяется, и все-таки оно постоянно изменяется! Парадокс!

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

Неужели я всего лишь один из тех старомодных ворчунов, вроде Четырёх Йоркширцев, которые хвастаются тем, как тяжело было жить в суровые старые времена?

Эй, в 1900 г. латынь и греческий были обязательными предметами в колледже, не потому, что они были как-то необходимы в жизни, но потому, что их знание было одним из обязательных признаков образованного человека. В некотором смысле мои аргументы не отличаются от тех аргументов, которые приводили сторонники латыни (все четыре). «[Латынь] тренирует ваш ум. Тренирует вашу память. Распутывание предложений на латыни — это отличное упражнение для ума, настоящая интеллектуальная головоломка, и хорошее введение в логическое мышление», писал Скотт Баркер (Scott Barker). Но я не смог найти ни одного университета, который до сих пор преподаёт латынь в обязательном порядке. Неужели указатели и рекурсия — это латынь и греческий компьютерных наук?

Итак, я легко соглашусь с тем, что программирование указателями сегодня не является необходимым в 90% разработки кода, и даже представляет опасность в промышленном коде. Да. Прекрасно. И функциональное программирование не так уж часто используется на практике. Согласен.

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

Без понимания функционального программирования вы не сможете придумать MapReduce — алгоритма, который делает Google столь хорошо масштабируемым. Термины Map и Reduce пришли из Lisp и функционального программирования. MapReduce понятен любому, кто помнит из своего курса, эквивалентного 6.001, что истинно функциональные программы не имеют побочных эффектов и поэтому легко распараллеливаемы. Очень показателен тот факт, что в Google изобрели MapReduce, а в Microsoft нет, и это говорит кое-что о том, почему Microsoft до сих пор играет в догонялки, пытаясь заставить работать основные функции поисковой машины, в то время как в Google перешли к следующей проблеме: построению Skynet величайшего в мире параллельного суперкомпьютера. Я не думаю, что Microsoft действительно понимает, насколько они отстали на этом пути.

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

Ничто в образовании, построенном полностью на Java, не отсеивает студентов из-за недостаточной гибкости их мозгов для понимания этих концепций. Как работодатель, я вижу, что 100%-Java школы начали штамповать выпускников курсов CS, некоторые из которых просто недостаточно умны для того, чтобы работать программистами с чем-то более замысловатым, чем Ещё Одно Бухгалтерское Приложение На Java, хотя они и управились со скрипом с «современной-упрощённой-для-тупиц» курсовой работой. Эти студенты никогда не справились бы с курсом 6.001 в Массачусетском Технологическом, или с CS 323 в Йеле, и, честно говоря, это и есть причина, почему, с точки зрения работодателя, диплом Массачусетского Технологического или Йеля имеет больший вес, чем диплом Дюка, который недавно стал Полностью-На-Java, или Penn University, который заменил Scheme и ML на Java, пытаясь преподавать на ней курс, который когда-то почти убил меня и моих друзей, CSE121. Дело не в том, что я не хочу нанимать умных ребят из Duke или Penn — я нанимаю их — просто мне гораздо сложнее понять, кто они. Раньше я мог сказать, что парень действительно умён, если он за несколько секунд может разобраться в рекурсивном алгоритме, или реализует функции, манипулирующие связными списками на основе указателей, с такой скоростью, с которой он может писать на листе бумаги. Но в случае выпускников школ Java я не могу сказать, имеет ли претендент проблемы с этими задачами, потому что у него просто не хватает соответствующего образования, или потому, что у него нет соответствующей части мозгов, необходимой для отличной работы в качестве программиста. Пол Грэхэм называет их Горе-Программистами.

Достаточно плохо уже то, что Школы-на-Java не отсеивают тех, кто никогда не сможет стать великими программистами, но на это школы вполне обоснованно могут сказать, что это не их проблема. Индустрия, или, по крайней мере, «рекрутёры-использующие-grep», действительно требуют, чтобы школы преподавали Java.

Но «школы-только-на-Java» также перестали тренировать мозги студентов для того, чтобы они стали знающими, проворными, и гибкими достаточно, чтобы могли хорошо проектировать программы (и я не имею в виду объектно-ориентированное «проектирование», когда вы тратите несчётное количество часов, переписывая собственный код при перестройке вашей объектной иерархии, или мучаетесь такими фальшивыми «проблемами», как выбор «содержит» или «является» (прим.: has-a vs. is-a, выбор между наследованием и композицией классов)). Необходимы тренировки, чтобы научиться думать на нескольких уровнях абстракции одновременно, что является абсолютно необходимым для проектирования отличной архитектуры программного обеспечения.

Вам может быть интересно, может ли обучение объектно-ориентированному программированию (ООП) быть хорошим заменителем указателей и рекурсии как вычищающих курсов. Короткий ответ — нет. Не обсуждая достоинства ООП, можно просто сказать, что оно недостаточно сложно для отсеивания посредственных программистов. Преподавание ООП состоит в основном в запоминании нескольких словарных терминов, таких как «инкапсуляция» и «наследование» и заучивании ответов на множество вопросов о разнице между полиморфизмом и перегрузкой операций. Не сложнее заучивания знаменательных дат и имён на уроках истории, ООП ставит неадекватно простую задачу для того, чтобы отпугнуть первокурсников. Когда у вас проблемы с ООП, ваша программа все-таки работает, она просто становится сложной для поддержки. Якобы. Но когда у вас проблемы с указателями, ваша программа выдаёт Segmentation Fault, и вы понятия не имеете, что происходит, до тех пор пока вы не остановитесь, не сделаете глубокий вдох и не попытаетесь на самом деле заставить свой ум работать на двух уровнях абстракции одновременно.

Рекрутёры-использующие-grep, кстати, высмеиваются здесь, и для этого есть веские доводы. Я никогда не был знаком с человеком, который бы понимал Scheme, Haskell и указатели С, и не мог бы освоить Java за пару дней, и после этого писать код на Java лучше, чем люди, имеющие пятилетний опыт работы с Java, но попробуйте объяснить это среднему HR-биороботу.

А что насчёт миссии CS-факультетов? Это не ПТУ! Их работа не состоит в том, чтобы подготовить людей к работе в промышленности. Это только для общинных колледжей, скажут вам, (прим.: в США двухгодичный колледж, готовящий специалистов средней квалификации для работы на территории местного сообщества) и государственных программ переобучения для уволенных рабочих. Предполагается, что они дают студентам фундаментальные инструменты для того, чтобы те жили своей жизни, а не готовят их к первым дням работы. Правильно?

Всё же. CS это доказательства (рекурсия), алгоритмы (рекурсия), языки (лямбда-исчисление), операционные системы (указатели), компиляторы (лямбда-исчисление) — и в результате получаем, что школы-на-Java, которые не учат С и не учат Scheme, в действительности не учат компьютерной науке. Насколько бесполезно в реальном мире понимание концепции каррирования (прим.: в функциональном программировании порождения из одной функции другой функции с меньшим числом аргументов; например из f(x,y) = x*y получение функции f3(x) = f(x,3) = 3*x), настолько же это необходимая предпосылка для высшего образования в области CS. Я не понимаю, почему профессора в комитетах, утверждающих программы обучения в колледжах, позволяют их программам тупеть до такой степени, что они не только не могут готовить программистов, готовых к работе, они даже не могут подготовить выпускников, которые могли бы получить степень PhD (прим.: аналог кандидата наук) и соперничать с ними за рабочие места. Хотя нет, подождите. Забудьте. Может быть я всё-таки понимаю.

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

«Боже мой», — подумал я, — «они пытались отупить курс ещё сильнее!» Почему бы не кормить всех студентов с ложечки? Почему бы преподавателям самим не делать и тесты за них — тогда точно никто не будет переходить на гуманитарные специальности! Как предполагается научить кого-то чему-то, если курс обучения заботливо сконструирован так, чтобы стать ещё проще, чем он есть сейчас? Кажется, ставится задача приложить усилия (PDF) по разработке простого подмножества Java, предназначенного для изучения студентами, выпуск упрощённой документации, которая заботливо прячет весь этот EJB/J2EE-мусор от их нежных мозгов так, чтобы они не беспокоили свои крохотные головки какими-то другими классами кроме тех, которые необходимы для того, чтобы решать стандартный простейший набор заданий по курсу.

Наиболее сочувственное объяснение, почему факультеты CS с таким энтузиазмом отупляют свои курсы, это то, что у них будет значительно больше времени для обучения актуальным концепциям CS, если только они не будут вынуждены тратить две лекции на то, чтобы объяснить разницу между, скажем, int и Integer в Java. Хорошо, если дело только в этом, 6.001 будет для вас отличным ответом: учебный язык Scheme так прост, что весь язык может быть рассказан смышлёным студентам примерно за десять минут; после этого вы можете потратить остаток семестра на неподвижные точки.

Я возвращаюсь обратно к единицам и нулям.

(У вас есть единицы? Везучий ублюдок! Всё, что было у нас — это нули.)

Конец
Переводчик: Илья Болодурин

Cтатья давнишняя, но «зацепило».

Upd
В комментариях многие просили озвучить собственное мнение, а не тупой копипаст статьи. Ответил

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *