[Перевод] О типах

image-loader.svg

Автор оригинала — Роберт С. Мартин (Uncle Bob), 25 июня 2021

Я написал свою первую программу в 1964 году. Программа называлась «Компьютеризированные ворота мистера Паттерсона» и была реализована на маленьком пластиковом компьютере под названием DIGICOMP-I, который представлял из себя симпатичный маленький трехбитный конечный автомат с 6 логическими элементами.

Первым электронным компьютером, на котором я написал программу, был ECP-18 в 1966 г. Это была здоровая 15 битная машина с барабанной памятью вместительностью 1024 слова. Все программы, которые я на ней написал, были на двоичном машинном языке и вводились с помощью переключателей на передней панели.

В период с 1967 по 1969 год мой отец возил меня и моего друга, Тима Конрада, за 25 миль от дома в офиса продаж Digital Equipment Corp, где мы проводили наши субботы, вводя программы в PDP-8, который стоял у них в зале. Они были очень любезны, предоставив нам к нему доступ и свободу действий. Код, который мы писали, был на ассемблере PAL-D (который написал Эд Юрдон, когда ему был 21 год).

Моя самая первая работа программистом была временной. Я проработал всего две недели. Это был 1969 год, и мне было 17. Мой отец пошел к генеральному директору ближайшей страховой компании ASC Tabulation и в своей неподражаемой манере заявил им, что они наймут меня на летнюю работу. Он, конечно, умел быть очень убедительным.

Программа, которую я написал для ASC, получила название IDSET. Она был написан на ассемблере Honeywell H200 (язык назывался Easycoder и был основан на IBM 1401 Autocoder). Ее задача заключалась в том, чтобы считать студенческие записи с магнитной ленты, вставить идентификационные коды в эти записи, а затем записать их на новую ленту. С небольшой помощью со стороны я смог заставить эту программу работать.

После окончания средней школы в 1971 году я снова устроился на работу в ASC;, но на этот раз как оператор офлайн-принтера в третью смену. Мы по сути печатали спам, что тогда было в новинку.

Несколько месяцев спустя меня наняли в качестве штатного программиста-аналитика в ASC, и мне было поручено переписать сложную систему бухгалтерского учета и записей для местного профсоюза водителей грузовиков в Чикаго. Существующая система работала на большущем GE Datanet 30. ASC хотела перенести ее на мини-компьютер Varian 620F.

620F был прекрасным маленьким 16-битным компьютером с 32 КБ оперативной памяти и временем цикла 1 мкс. Основными устройствами ввода-вывода были телетайп, медленное устройство для считывания перфокарт, два накопителя на магнитной ленте и два 2314-х диска по 20 МБ. У этой машины также было 16 (или 32, точно не помню) портов RS232 для связи с телетайпами, которые были подключены удаленно по модемам со скоростью 300 бит/с.

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

В 1973 году я устроился на работу в Chicago Laser Systems, программировать на ассемблере PDP-8-подобную машину для управления импульсными лазерами, зеркалами с гальвонометрическим приводом и столами с фотоповторителями для обрезки электронных компонентов с высокой степенью стойкости.

В 1975 году я устроился на работу в Outboard Marine Corporation, где занимался программированием системы для управления литьем алюминия под давлением в реальном времени на ассемблере IBM System 7.

В 1977 году я устроился на работу в Teradyne Central, где программировал (опять же) на ассемблере PDP-8-подобную машину для управления распределенной системой для тестирования и контроля качества всех телефонных линий в зоне обслуживания телефонной компании. Год спустя мы начали использовать 8085-е микрокомпьютеры и снова переписали весь этот код на ассемблере.

Достаточно сказать, что я был очень сильно погружен в ассемблер и думал, что все языки высокого уровня — это несерьезно. Мои экскурсы в COBOL, Fortran и PL/1 не убедили меня в обратном. Настоящие программисты программировали на ассемблере.

Где-то в промежутке между 1977 и 1980 годами я познакомился с Pascal. Я почти сразу отверг его как жизнеспособный язык. Я нашел его систему типов слишком ограничивающей и не доверял его закулисной магии.

В 1980 году я прочитал книгу Карнигана и Ричи и впервые увидел, что язык высокого уровня может быть вполне приемлемым инженерным языком. Я много лет писал на этом замечательном языке, который, кстати, был таким же нетипизированным, как ассемблер.

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

В 1986 году, после нескольких катастрофических поворотах, связанных нетипизированностью в C, я с энтузиазмом принял C++. К сожалению, я не мог достать компилятор C++ до 1987 года. Я стал настоящим экспертом в этом языке и участвовал во многих (многих (очень многих)) спорах по comp.lang.c++ и comp.object (в те головокружительные дни USENET, одной из первых социальных сетей).

C++ — это язык со статической типизацией. Многие сегодня сочли бы его достаточно слабо типизированным;, но с моей точки зрения, после полутора десятилетий использования нетипизированных языков, я считаю, что соблюдение типов там было очень сильным. Я преодолел чувство скованности строгой системой типов и стал довольно искусным в построении типовых моделей.

В 1990 году я устроился по контракту в Rational, работая в C++ над первым выпуском Rational Rose. Здесь я познакомился с Гради Бучем и разработал план своей первой книги.

К 1991 году я стал консультантом, продающим свои услуги компаниям в США и Европе, которые хотели узнать об объектно-ориентированном программировании и C++. Для меня это делом было весьма прибыльным, и я продолжал развивать этот бизнес в течение нескольких лет. В конце концов я стал главным редактором C++ Report (кто-нибудь еще помнит печатные журналы?).

В 1999 году я понял, что C++ — это убывающая технология, и что весь ажиотаж действительно происходит в Java. Java был очень похож на C++, так что я мог относительно легко осуществить переход на него. Система типов Java была немного слабее, чем в C++, и я с радостью отказался использовать более сильный функционал (например, final, хотя я был заядлым потребителем const в C++).

К 2003 году я устал от системы статических типов Java и начал экспериментировать с Python. Я нашел этот язык примитивным и несколько бессистемным; поэтому после нескольких проб этого языка я переключился на Ruby.

В Ruby я обосновался на несколько лет. Динамическая система типов была вполне надежной. Объектно-ориентированные средства были хорошо продуманы и очень просты в использовании. Это был элегантный язык с очень небольшим количеством неровностей.

Затем, примерно в 2010 году, я наткнулся на Clojure. Я как раз недавно прочитал «Структуру и интерпретацию компьютерных программ», и поэтому мне было интересно поиграться с приемником LISP.

Прошло 11 лет, и я не чувствую желания менять язык. Я считаю, что Clojure может быть стать моим последним языком программирования. О, не то чтобы я прекращал обращать внимание на остальные. Я успел немного позаигрывать с Golang, Elixr и Kotlin, и я с трепетом смотрел на Haskel. Я даже пробовал с Scala и F#. Я продолжаю следить за появлением новых языков;, но не нашел ничего, что побудило бы меня отказаться от Clojure.

Обратите внимание на путь моей карьеры. Я перешел от нетипизированных языков, таких как ассемблер и C, к языкам со статической типизацией, таким как C++ и Java, к языкам с динамической типизацией, таким как Python и Ruby, и в конце концов к Clojure.

Система типов в Clojure такая же динамичная, как у Python или Ruby, но в Clojure есть библиотека, называемая clojure/spec, которая обеспечивает всю строгую типизацию, которая может вам когда-либо понадобится. Однако вместо того, чтобы эту типизацию контролировал компилятор, она контролируется мной. Я могу энфорсить простые типы или же очень сложные отношения данных. Вы можете думать об этом как о своего рода языке пред/постусловий. Программисты Eifel будут чувствовать себя здесь как дома. Это почти идеальный способ заниматься контрактным программированием.

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

Материал подготовлен в рамках курса «Архитектура и шаблоны проектирования». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.

© Habrahabr.ru