Надеюсь, что мне удалось достаточно убедительно показать, что программы не пишутся на языках программирования. Программы – это сложные сооружения, собираемые из частей.
Следующее очевидное соображение, которое нам понадобится: программы не работают сами по себе. Программы всегда
- исполняются на вычислительном устройстве,
- на котором есть [программная] среда, обеспечивающая выполнение программ.
Да, есть программы, которые работают на «голом» железе, но эти программы не входят в 90% обычных программ. И мы их сейчас не рассматриваем.
Их стоит когда-нибудь рассмотреть, хотя бы потому, что именно там скрывается предельное удовлетворение, который может получить разработчик программы. Я не знаю большего восторга от своей работы, чем тот восторг, который возникает, когда начинает работать код, порожденный твоим новым компилятором. И ты ощущаешь себя творцом, разворачивающим новое пространство, поднимая себя за шнурки от ботинок (bootstrapping). При этом у тебя программа, которую ты знаешь целиком, и понимаешь до последней запятой, как она работает. Увы, но большинство программистов работает с крошечной надстройкой над огромной подводной частью айсберга. И понимает (и то далеко не всегда) только то, как работает эта надстройка. А если не работает, то программисту приходится пинать колеса и открывать/закрывать капот (или читать stackoverflow) в надежде, что произойдет чудо и машина заведется и поедет.
То, что мы обычно называем «программой» — это крошечная надстройка над вычислительным устройством, операционной системой, драйверами, фреймворками и библиотеками.
Программа не работает сама по себе, она подключена к среде, обеспечивающей выполнения, и она должна соответствовать требованиям этой среды, явным или неявным.
Мы часто говорим о программе, забывая о среде, точно так же, например, на бытовом уровне, мы говорим о стиральной машине, как о чем-то существующем сама по себе. Но машинка не будет стирать, если она не подключена к электричеству, воде и канализации. Кроме того, она не будет стирать, если в машину не вложено белье. А качество стирки будет страдать, если в машину забыли насыпать стиральный порошок. На примере среды стиральной машины мы видим уровни обеспечивающей среды, отсутствие которых приводит к тому, что машинка:
- вообще не работает (нет электричества, воды, слива в канализацию)
- не решает задачу (нет стираемого белья)
- решает задачу с ненадлежащим качеством (нет стирального порошка)
Хочу отметить, что мы можем говорить о стиральной машинке не учитывая окружение (например, выбирать себе машинку, сравнивать с другими) только потому, что у стиральной машины стандартизованы разъемы. Стандартизация позволяет забыть о среде, точнее не думать о ней, пока среда стандартна.
Если привезти стиральную машинку с американской вилкой, то придется:
- Менять вилку (машинку)
- Или менять розетку (среду)
- Или ставить переходник.
Замечу, что для стиральных машинок (и вообще бытовой техники) задача давно решена и не требует участия разработчика стиральных машинок.
А вот для программ, дела со стандартизацией обстоят гораздо хуже. Программа почти всегда делается для конкретной обеспечивающей среды и может работать только в ней. И это безусловно плохо.
На сегодня есть 5 основных обеспечивающих выполнение программ сред: Windows, Linux, iOS, Android, Web. Это уже большой шаг вперед, по сравнению с тем, что было раньше. Стандартизация потихоньку идет. Увы, положение сильно осложняется тем, что каждая из этих обеспечивающих сред не едина, а делится на множество различных вариаций и девиаций.
В итоге, мы делаем много программ, делающих одно и тоже на разных платформах или делаем переходные слои, позволяющие выполнять программу в другой среде (wine) или вынуждены делать нечто «усредненное», что работает на нескольких платформах.
Я могу сказать (с небольшим преувеличением), что единственной проблемой, мешающей человечеству достичь высоких целей (будь то космическая экспансия или счастья всем, и пусть никто не уйдет обиженным) является отсутствие стандартов программирования.
Предвижу несколько возражений:
- Стандартизировать нельзя, так как отсутствие стандартов выгодно корпорациям-монополистам. Полностью согласен, значит, надо что-то делать с корпорациями.
- Стандартизировать нельзя, так как программирование – это творчество. Отбрасываем, так как речь идет о обычных программах. Впрочем, тут есть о чем поговорить, но отдельно.
- Стандартизировать нельзя, так как программа – это не стиральная машина, у которой очень мало разъемов.
С 3-го пункта можно идти дальше, переходя на вопрос: Что и как стандартизировать.