Дело не только в замыканиях. Синтаксис (лиспы в этом плане ещё простые относительно, только к скобкам привыкнуть, но там хаскель или какие-то окамлы и прочее без подготовки трудно или невозможно читать, посмотрите J, например), неизменяемые данные и структуры данных, функции как first class citizen (когда я последний раз трогал пхп года 4 назад, там этого не было, и попытки при этом делать фп на пхп казались совершенно упоротыми), и т.д.. Мне попадался живой "синёр пхп" на галере, который говорил, что "ну там нет ооп, эта кложура вообще низкоуровневый язык". Я не шучу, так и говорил. Когда я пытался пролить на них лучезарный свет трансдьюсеров, кроме стены непониманияю тоже особо ничего не встретил. Так что в итоге:
Если ты знаешь один ЯВУ, хорошо если ты знаешь хотя бы один ЯВУ, а не просто думаешь, что знаешь.
В случае, когда на картинке пхп - это не так. Если ты можешь в программирование на пхп, для того, чтобы смочь в программирование на многих других языках тебе ещё надо хорошенько попотеть.
Плюс это не совсем то, что написано в первом камменте, на который я отвечал.
И язык вполне себе важен.
Все из перечисленных — императивные языки старой школы, действительно очень похожие. Я тоже был уверен, что изучить другой язык просто, пока не попробовал хаскел, где основной стиль — функциональный. Сам хаскел я так и не сумел одолеть, потому что меня ставили в тупик всевозможные рекурсивные определения и невероятно непривычный синтаксис. Затем я опробовал раст. Он оказался гораздо более привычным, но всё же меня очень долго сводил с ума борроу чеккер (болезнь всех растоновичков).
В отличие от си, раст совершенно иначе понимает ссылки (на их создание наложены строгие ограничения и времена жизни), переменные (владение, Copy/Clone), указатели (целый отдельный unsafe диалект) и функции (особенно с обобщениями — динамическая диспетчеризация, статическая диспетчеризация, dyn trait, impl trait, времена жизни опять же). Ну а функторы и псевдо-монады (в хаскеле монады настоящие) становятся постоянными гостями.
Часто высказывается мысль, что хаскел проще выучить не зная императивных языков — слишком уж он другой.
В качестве примера могу привести вот эту статью с хабра о комбинаторном парсере — совершенно нормальный стиль для раста, невозможный для си. Попытка писать в си-стиле на расте сразу же упрётся в ошибки владения. Не «сложнее», а именно «невозможно». На попытку имитировать функционал достаточно разных языков и жизни может не хватить из-за этих «непринципиальных» различий. Примеры с хаскелем не дам — я их сам до сих пор не могу понять.
Если приводит аналогии, то перечисленные тобой языки — это как будто романские языки — у всех есть рода, падежи, произвольный порядок слов, все пишутся буквами слева направо, да ещё и слова похожие. А хаскел — это древнеегипетский, который пишется бустрофедоном, да ещё и смысловыми иероглифами. Выразить мысль можно и на том, и на том, но зная один нельзя почти ничего сказать о другом.
Примерно в 2010.
ФЯП (функциональные) и ИЯП (императивные) возникли почти одновременно — в 50-х годах. Функциональным был лисп, который жив до сих пор, но на этом и всё — их было слишком сложно компилировать, быстро с ними работала разве что лисп-машина, умершая в конце 70-х (более привычные ПК её вытеснили по закону Мура). Лисп-машина дала многое, но она не стала массовой.
Императивщина же была представлена фортраном (жив из-за накопившегося кода), алголом (мёртв), паскалем (еле ворочается) и бейсиком (аналогично). Большие изменения принесли в 70-х и 80-х C и C++. Они заняли все доступные ниши, а библиотека си стала системной, так как системы писались… на си и больше ни на каком другом языке.
В 90-х с новыми мощностями пришли языки, дающие гарантии надежности — эрланг, джава с её JVM и JIT, и пародия на джаву — шарп. Джава вытеснила си целиком с развитых встраиваемых систем (телефонов, а позже — смартфонов и планшетов), заняла прочное место в огромных проектах (потому что на си их писать было слишком небезопасно), где можно было жертвовать скоростью. В то же самое время появились первые претенденты на легкую распараллеливаемость — эрланг и хаскел, тоже гарантирующие надёжность благодаря математической основе. Хаскел стал потомком лиспа, который не был диалектом лиспа (за долгие годы это действительно уникальное событие). Но они были слабы в плане производительности, а поток по-прежнему был один.
На маках си отбросили — всё апи гвоздями стали прибивать к objective-c, а позже — к swift.
Ближе к 2010 джаву стали выталкивать её потомки, а сейчас и вовсе рекомендуется предпочитать kotlin (со слов представителей гугла).
Функциональные же языки наконец получили многопоточность и ресурсы для компиляции, а так же учли прошлые ошибки. Поэтому появились раст, эликсир, кложура и другие. Императивные языки не хотели отставать и принесли голанг, который за счёт стандартизации решений, широкой поддержке юникода и многопоточности обрёл славу надёжного и эффективного с точки зрения разработки языка (опять же относительно си). Но в нём до сих пор живёт сборщик мусора, появившийся со времён лисп-машин, потому на роль системного и встраиваемого он не годится. Другое дело раст — он захватил встраиваемые системы (avr, arm), графику (gfx — почти бесплатная абстракция над мантл-подобными апи, на которой строят webgpu и пользовательские движки), способен компилироваться в код для самих видеокарт (для opencl и скоро обещают подвезти шейдеры), да ещё на нём стали писать ОС (redox). То есть он может забрать оставшиеся ниши си.
Си был потеснён дважды — в 95 году, когда пришла более надёжная jvm и в ≈ 10 году, когда новые языки принесли скорость, многопоточность, встроенный юникод и очень высокую надежность. Он навсегда останется стандартом, как Вавилонская башня, между языками, но как самостоятельный язык он стремительно теряет силы. Его судьба в моём понимании — новый фортран, живущий за счёт древних проектов. Си пытается не отставать, встраивая дженерики (последний на сегодня стандарт), llvm, С++ вообще превратил себя в какую-то кашу, которую ни один компилятор полноценно не поддерживает. Их тянет на дно обратная совместимость, которая гвоздями прибита к реалиям 70-х.
Ну и ещё одна важная черта — отсутствие менеджера пакетов. В си они так и не прижились, зато слоями обрастали обёртки — makefile, cmake, auto tools… Да и само встраивание библиотек — дубовое встраивание одних исходников в другие, из-за которого современные автоконверторы на современных языках не могут нормально подключиться (приходится или использовать плохое подключение, или допиливать руками). Lex и yacc тоже себя изживают — создавать код на си так же сложно, как и обрабатывать вывод его компилятора, поэтому правки вносить очень сложно, зато внести правки в комбинаторный парсер очень легко — их популярность растёт.
Вот поэтому я называю си и его ближайшую родню устаревающими — они теряют популярность, их вытесняют, они справляются всё хуже со своей работой в новых реалиях.
Если я был излишне субъективен, то… прошу прощения и с удовольствием выслушаю альтернативную точку зрения — нужно знать как можно больше недостатков и плюсов, чтобы умело использовать их в будущем.
Я чуток не успел, там уже написали. Все эти языки действительно очень похожи. Попробуй написать на любых двух из этих языков что-то тривиальное, к примеру: функцию которая принимает массив/вектор интов, только четные из них возводит в квадрат и суммирует те первые десять квадратов, которые меньше 500. Чтоб было чуть веселей, сделать это надо в один обход массива/вектора. Увидишь, что код мало чем отличается. Потом возьмы любой фяп (лисп какой-то, хаскель, эрланг) и попробуй написать это же. Ну и найди 10 отличий. :)
One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power?
Discussion
♦ 154 + W 479 & Share
^ BEST COMMENTS ▼
I like forks • 5h
hehe3301 • 7h
sudo rm -rf oceans/*/contents/
*.plástic
sudo rm -rf people/*/*.cáncer sudo rm -rf v
Если ты знаешь один ЯВУ, хорошо если ты знаешь хотя бы один ЯВУ, а не просто думаешь, что знаешь.
Плюс это не совсем то, что написано в первом камменте, на который я отвечал.
И язык вполне себе важен.
Я не вижу каких-то принципиальных различий между ЯВУ. Что-то на одном языке делается проще, что-то в разы сложнее.
Может ещё на чём. За 10 лет всякого написал.
В отличие от си, раст совершенно иначе понимает ссылки (на их создание наложены строгие ограничения и времена жизни), переменные (владение, Copy/Clone), указатели (целый отдельный unsafe диалект) и функции (особенно с обобщениями — динамическая диспетчеризация, статическая диспетчеризация, dyn trait, impl trait, времена жизни опять же). Ну а функторы и псевдо-монады (в хаскеле монады настоящие) становятся постоянными гостями.
Часто высказывается мысль, что хаскел проще выучить не зная императивных языков — слишком уж он другой.
В качестве примера могу привести вот эту статью с хабра о комбинаторном парсере — совершенно нормальный стиль для раста, невозможный для си. Попытка писать в си-стиле на расте сразу же упрётся в ошибки владения. Не «сложнее», а именно «невозможно». На попытку имитировать функционал достаточно разных языков и жизни может не хватить из-за этих «непринципиальных» различий. Примеры с хаскелем не дам — я их сам до сих пор не могу понять.
Если приводит аналогии, то перечисленные тобой языки — это как будто романские языки — у всех есть рода, падежи, произвольный порядок слов, все пишутся буквами слева направо, да ещё и слова похожие. А хаскел — это древнеегипетский, который пишется бустрофедоном, да ещё и смысловыми иероглифами. Выразить мысль можно и на том, и на том, но зная один нельзя почти ничего сказать о другом.
И когда я успел стать олдскульщиком?...
ФЯП (функциональные) и ИЯП (императивные) возникли почти одновременно — в 50-х годах. Функциональным был лисп, который жив до сих пор, но на этом и всё — их было слишком сложно компилировать, быстро с ними работала разве что лисп-машина, умершая в конце 70-х (более привычные ПК её вытеснили по закону Мура). Лисп-машина дала многое, но она не стала массовой.
Императивщина же была представлена фортраном (жив из-за накопившегося кода), алголом (мёртв), паскалем (еле ворочается) и бейсиком (аналогично). Большие изменения принесли в 70-х и 80-х C и C++. Они заняли все доступные ниши, а библиотека си стала системной, так как системы писались… на си и больше ни на каком другом языке.
В 90-х с новыми мощностями пришли языки, дающие гарантии надежности — эрланг, джава с её JVM и JIT, и пародия на джаву — шарп. Джава вытеснила си целиком с развитых встраиваемых систем (телефонов, а позже — смартфонов и планшетов), заняла прочное место в огромных проектах (потому что на си их писать было слишком небезопасно), где можно было жертвовать скоростью. В то же самое время появились первые претенденты на легкую распараллеливаемость — эрланг и хаскел, тоже гарантирующие надёжность благодаря математической основе. Хаскел стал потомком лиспа, который не был диалектом лиспа (за долгие годы это действительно уникальное событие). Но они были слабы в плане производительности, а поток по-прежнему был один.
На маках си отбросили — всё апи гвоздями стали прибивать к objective-c, а позже — к swift.
Ближе к 2010 джаву стали выталкивать её потомки, а сейчас и вовсе рекомендуется предпочитать kotlin (со слов представителей гугла).
Функциональные же языки наконец получили многопоточность и ресурсы для компиляции, а так же учли прошлые ошибки. Поэтому появились раст, эликсир, кложура и другие. Императивные языки не хотели отставать и принесли голанг, который за счёт стандартизации решений, широкой поддержке юникода и многопоточности обрёл славу надёжного и эффективного с точки зрения разработки языка (опять же относительно си). Но в нём до сих пор живёт сборщик мусора, появившийся со времён лисп-машин, потому на роль системного и встраиваемого он не годится. Другое дело раст — он захватил встраиваемые системы (avr, arm), графику (gfx — почти бесплатная абстракция над мантл-подобными апи, на которой строят webgpu и пользовательские движки), способен компилироваться в код для самих видеокарт (для opencl и скоро обещают подвезти шейдеры), да ещё на нём стали писать ОС (redox). То есть он может забрать оставшиеся ниши си.
Си был потеснён дважды — в 95 году, когда пришла более надёжная jvm и в ≈ 10 году, когда новые языки принесли скорость, многопоточность, встроенный юникод и очень высокую надежность. Он навсегда останется стандартом, как Вавилонская башня, между языками, но как самостоятельный язык он стремительно теряет силы. Его судьба в моём понимании — новый фортран, живущий за счёт древних проектов. Си пытается не отставать, встраивая дженерики (последний на сегодня стандарт), llvm, С++ вообще превратил себя в какую-то кашу, которую ни один компилятор полноценно не поддерживает. Их тянет на дно обратная совместимость, которая гвоздями прибита к реалиям 70-х.
Ну и ещё одна важная черта — отсутствие менеджера пакетов. В си они так и не прижились, зато слоями обрастали обёртки — makefile, cmake, auto tools… Да и само встраивание библиотек — дубовое встраивание одних исходников в другие, из-за которого современные автоконверторы на современных языках не могут нормально подключиться (приходится или использовать плохое подключение, или допиливать руками). Lex и yacc тоже себя изживают — создавать код на си так же сложно, как и обрабатывать вывод его компилятора, поэтому правки вносить очень сложно, зато внести правки в комбинаторный парсер очень легко — их популярность растёт.
Вот поэтому я называю си и его ближайшую родню устаревающими — они теряют популярность, их вытесняют, они справляются всё хуже со своей работой в новых реалиях.
Если я был излишне субъективен, то… прошу прощения и с удовольствием выслушаю альтернативную точку зрения — нужно знать как можно больше недостатков и плюсов, чтобы умело использовать их в будущем.
На будущее: многоточие после вопросительного знака означает риторический вопрос.
header.php
если кому интересно.