Глядя на два предложения:
Старые языки несли накладные расходы в вызовах подпрограмм, что удерживало людей от небольших методов.
Современные ОО-языки в значительной степени исключили эти накладные расходы для внутрипроцессных вызовов.
Вы задаетесь вопросом, что подразумевается под «старым» и «современным», и какие языковые функции могут влиять на производительность.
Если они имеют в виду более старые языки, например, Fortran, то они совершенно не правы - более старые версии Fortran не поддерживали локальный экстент, поэтому вызовы подпрограмм выполнялись очень быстро, так как не требовали сохранения значений, хранящихся в локальных переменных. когда звонки были сделаны. Требование сохранения локальных переменных для каждого вызова вложенной функции представляет собой издержки в таких языках, как C, которые поддерживают рекурсию. Более поздние версии Fortran добавляют рекурсивные функции, но вы должны явно пометить функции как рекурсивные.
Так что, в основном, у «старых языков» меньше накладных расходов. Так что либо это мусор, либо они сравнивают «современные языки OO» с «Старые OO языки»
В традиционном языке OO, таком как Smalltalk (Smalltalk является самым старым «чистым» языком OO, но это также относится и к последним языкам, вдохновленным Smalltalk, таким как Ruby и Python; поскольку вызовы процедур идут, Ruby очень традиционен) каждый вызов процедуры потенциально является полиморфным методом, поэтому он ведет себя так, как будто его ищут по имени во время выполнения, когда выполняется вызов. Без изменений в языке современные реализации Smalltalk работают быстрее благодаря встроенным полиморфным методам, которые вызываются неоднократно.
Но Smalltalk не является современным языком (во многих отношениях это диалект Лиспа, поэтому его наследие - 1950-е годы, хотя он и появился только в 1970-х годах), и улучшена реализация, а не язык. Такое же улучшение существует во время выполнения Sun Java, времени выполнения Google JavaScript и многих распространенных средах выполнения lisp; и Java, и JavaScript являются более новыми ОО-языками, чем Smalltalk, но оптимизация вызова метода существует, несмотря на особенности этих языков (статическая типизация Java предполагает использование статической таблицы диспетчеризации, как во многих реализациях C ++, очень позднее связывание JavaScript и нехватка классов затрудняет реализацию оптимизации).
Я не могу придумать, как прочитать два предложения, и это правда.
Если вы посмотрите на более широкий контекст статьи, это означает, что стиль кода изменился с длинных методов на короткие.
Значит ли это, что этот код Smalltalk из 1970 теперь будет написан с использованием гораздо более коротких методов в более позднем ОО-языке, таком как Java или C ++ 0x?
enter [ self show. edit Menu show. scrollbar show ]
leave [ document hideselection. editMenu hide. scrollbar hide ]
outside
[editMenu startup => []
scrollbar startup => [self showdoc]
^false]
pendown [ document pendown ]
keyboard [ document keyboard ]
Это тоже не кажется вероятным. Изменение пришло с ОО, который так же современен, как Би Джис.
Однако произошел большой сдвиг в размере метода и рефакторинге в метод меньшего размера между процедурным и ОО-кодом.
Как только вы получили объект, поля которого содержат данные, которые вы используете, гораздо проще передать этот один объект в подпроцедуру, чем передавать дюжину различных локальных переменных, и это, вероятно, самая веская причина для небольших методов. чаще встречается в традиционных ОО, но это не сильно связано ни с производительностью, ни с современными языками. Просто очень много работы и очень много ошибок, чтобы спорить 12 аргументов типа double и int в и из функции в C.
Я был как в ситуации, когда смотрел длинный кусок процедурного кода, так и создавал объект (или структуру в C) для хранения состояния, позволяющего рефакторизовать его, и делал обратное (справляясь с большим количеством полей). в локальные переменные и вручную вставляя более короткие методы) для повышения производительности (в Java 1.3 IIRC). Поскольку вы можете сделать этот рефакторинг в ANSI C, он вряд ли ограничен современными языками OO.