Системное программирование это комплекс

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

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

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

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

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

девушка читает

Аргумент в пользу большей сложности

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

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

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

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

Очень трудно выучить английский язык. Мне повезло, что я носитель английского языка и вырос, изучая английский язык. Но для многих неродных носителей английского язык продолжает оставаться проблемой-даже спустя годы после того. Как они “свободно” говорят на этом языке.

Однако у беглого владения английским языком есть огромное преимущество-выразительность. Я не претендую на то, чтобы быть экспертом по иностранным языкам—я сам знаю только немного испанского. Бразильского португальского и японского,—но я знаю. Что английский является одним из самых выразительных языков. Существующих сегодня.

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

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

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

Ломать вещи еще меньше

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

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

Текст, который вы сейчас читаете, состоит из этих букв, но задумывались ли вы когда-нибудь о том. Что произошло бы. Если бы в алфавите было больше букв? Например, предположим, что вместо 26 букв было 500. Предположим, что мы сделали реальные символы для “th”,”sh”,”oo” и так далее. Предположим, мы превратили слово “the” в собственный символ.

алфавит

Если бы мы добавили больше букв в алфавит, вам потребовалось бы гораздо больше времени. Чтобы выучить алфавит. Но как только вы его выучили. Вы могли бы читать и писать гораздо эффективнее. (Хотя мне бы очень не хотелось видеть. Как будет выглядеть 500-буквенная клавиатура.)

Моя точка зрения заключается в том. Что мы торгуем некоторым потенциалом выразительности. Который мы можем упаковать в ограниченное число символов для некоторой легкости в изучении полезного набора символов.

Когда вы читали это, вы могли подумать, что это именно то, что делают такие языки. Как китайский и японский,—они используют большое количество символов вместо небольшого алфавита. Я не знаю достаточно об этих языках, чтобы знать ответ наверняка, но готов поспорить. Что гораздо легче читать китайскую или японскую газету. Чем английскую—или. По крайней мере, быстрее.

Мы могли бы проделать то же самое упражнение и применить его к системе счисления. Вместо того чтобы использовать основание 10 или иметь 10 символов в нашей системе счисления. Мы могли бы иметь 100 или даже 1000. Потребуется много времени. Чтобы выучить все наши числа. Но мы сможем выполнять математические операции гораздо эффективнее. (Пример меньшего масштаба-запоминание ваших таблиц умножения до 99 х 99. Представьте себе, что вы могли бы сделать с этой силой.)

Какое отношение все это имеет к языкам программирования?

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

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

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

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

Ключевые слова сами по себе не определяют выразительность языка. Я бы сказал, что выразительность языка определяется:

  • Количество ключевых слов
  • Сложность высказываний и конструкций в языке
  • Размер стандартной библиотеки

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

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

Рассмотрим несколько реальных примеров

Чтобы сделать то, что я говорю, немного конкретнее, давайте рассмотрим несколько примеров. Я начну с C#, так как это язык, с которым я очень хорошо знаком. C# — очень выразительный язык. Все начиналось не так, но со всеми ключевыми словами, которые были добавлены в язык. И огромным размером библиотек базовых классов C# стал очень. Очень большим.

C# — это развивающийся язык. Но сейчас в нем около 79 ключевых слов. (Не стесняйтесь поправлять меня, если я ошибаюсь здесь.) Что касается языков. Это довольно много. В дополнение к просто ключевым словам, C# имеет некоторые сложные операторы. Лямбда-выражения и выражения LINQ сразу приходят на ум. Для тех, кто изучает C#. Задача может быть довольно сложной. Но награда в том. Что они могут быть довольно продуктивными и писать довольно сжатый код. (По крайней мере. По сравнению с более подробным языком. Таким как C или C++.) Java довольно близка и в большинстве этих аспектов.

Но возьмите такой язык, как Go. Go-это язык. В котором всего 25 ключевых слов. Это компенсируется наличием некоторых довольно сложных языковых конструкций и довольно надежной стандартной библиотекой. Когда я впервые выучил Го, мне потребовалась примерно неделя, чтобы почувствовать, что я довольно хорошо владею языком. Но потребовалось гораздо больше времени. Чтобы научиться правильно использовать Go. (И мне еще многому предстоит научиться.)

На дальнем конце спектра у нас есть такие языки. Как BASIC. Различные БАЗОВЫЕ реализации имеют разные числа ключевых слов, но большинство из них довольно низкие. А конструкции языка очень просты. BASIC-это очень простой язык для изучения. Но, поскольку так легко выучить BASIC, а BASIC так прост, средний программист быстро перерастает возможности языка. BASIC не очень выразителен. И требуется гораздо больше строк кода. Чтобы написать то же самое. Что вы могли бы написать в нескольких строках C# или Go.

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

Какие более сложные языки программирования покупают нас

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

Подумайте, насколько сложнее английский язык. Чем любой другой язык программирования. Чтобы уметь читать те самые слова, которые вы сейчас читаете, вы должны понимать словарь из нескольких тысяч слов. Распознавать большинство этих слов с первого взгляда и понимать очень сложный набор механизмов. Которые управляют грамматикой языка. Нет даже конкретных правил, многое из того, что “правильно” или “неправильно”, основано на контексте.

И все же, несмотря на всю эту сложность. Вы в состоянии сделать это—наш мозг удивителен.

сложный

А теперь представьте себе, что произойдет, если мы решим. Что английский слишком сложный язык и что нам нужно его заглушить. Что, если мы сократим словарный запас до 200 слов и избавимся от сложных правил? То, что у вас будет, — это в основном книга доктора Сьюза или какая-то другая детская книга для раннего чтения. Мне было бы очень трудно передать те мысли, которые я передаю вам прямо сейчас с этими ограничениями.

Когда вы сравниваете даже самый сложный язык программирования с английским языком, это не соревнование. Английский язык гораздо сложнее любого языка программирования. Который мы когда-либо видели. Я не знаю языка программирования. Который средний человек не смог бы достаточно хорошо выучить за год. Но, если вы попытаетесь научить кого—то писать по-английски за год-что ж, удачи вам.

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

Мы не только смогли бы выразить наши намерения более четко и сжато. Но и значительно сократили бы общее количество строк кода и вероятность появления ошибок в нашем программном обеспечении. Чем меньше кода. Тем меньше ошибок.

Недостатки

А сейчас я просто мысленно играю. Я “наполовину” верю в то, что говорю. Потому что я просто исследую идеи и возможности. Но даже в этом умственном упражнении по размышлению о том. Что произойдет, если мы создадим языки программирования. Такие же сложные. Как письменные языки. Я не могу игнорировать недостатки.

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

Если бы мы создали более сложные языки программирования, нам пришлось бы рассчитывать на еще много лет обучения. Прежде чем кто-то смог бы действительно написать код или понять код. Который уже написан. Может потребоваться 4 или 5 лет. Чтобы просто понять и запомнить достаточно языка. Чтобы иметь возможность эффективно использовать его.

Конечно, мы могли бы в какой-то степени бороться с этим. Начав обучение новичков на более простых языках и продвигая их вверх по цепочке к более сложным. (На самом деле. Написание этой статьи убедило меня. Что это был бы лучший способ учиться сегодня. Мы не должны начинать разработчиков с C# или Java. А вместо этого должны учить их очень простым языкам.)

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

На сегодня достаточно веселья

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

А как насчет тебя. Что ты думаешь? Я просто сошел с ума? Есть ли что-то важное. Что я пропустил здесь?

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