HeadlinesBriefing HeadlinesBriefing 12 languages

Push Ifs Up and Fors Down: The Idiom, Its Algebra, and Its Limits

Hacker News ·

🇬🇧 English

The programming heuristic 'push ifs up and fors down' suggests that conditional logic (if statements) should be moved upward towards the caller, while iterative loops (fors) should be pushed downward toward batch processing. This improves clarity and performance by centralizing branching and leveraging bulk operations.

Matklad has discussed this principle, demonstrating how pushing conditionals up means the caller handles cases like None, while the function takes a plain Walrus. Pushing loops down involves deferring loops until after filtering, so the hot loop runs without a branch and is a candidate for vectorization. The two moves compose: given a collection of Option<Walrus> values, the caller discards the Nones and hands a Vec<Walrus> to frobnicate_batch, which never sees a None.

This principle has broader applications in relational database query optimizations and functional programming. In database query optimization, the same principle appears as 'projections early, joins late'. Early projections and selections reduce dataset width and filter early, while joins are deferred to run on smaller inputs. The vocabulary runs upside-down: a query plan is a tree where data flows up from leaves, so 'down the tree' means 'earlier in execution'.

View original article →


🇸🇦 العربية

ادفع if للأعلى و for للأسفل: شرح المصطلح البرمجي

القاعدة البرمجية 'ادفع if للأعلى و for للأسفل' تقترح أن المنطق الشرطي (عبارات if) يجب أن يُنقل للأعلى نحو المتصل، بينما يجب دفع الحلقات التكرارية (for) للأسفل نحو المعالجة بالدفعات. هذا يحسن الوضوح والأداء من خلال تركيز التفرع والاستفادة من العمليات الجماعية.

ناقش Matklad هذا المبدأ، موضحًا أن دفع الشروط للأعلى يعني أن المتصل يتعامل مع حالات مثل None، بينما تأخذ الدالة Walrus عاديًا. دفع الحلقات للأسفل يتضمن تأجيل الحلقات حتى بعد التصفية، بحيث تعمل الحلقة الساخنة بدون فرع وتكون مرشحة للتوجيه المتجهي. الحركتان تتحدان: بالنظر إلى مجموعة من قيم Option<Walrus>، يتجاهل المتصل قيم None ويسلم Vec<Walrus> إلى frobnicate_batch، التي لا ترى None أبدًا.

لهذا المبدأ تطبيقات أوسع في تحسين استعلامات قواعد البيانات العلائقية والبرمجة الوظيفية. في تحسين استعلامات قواعد البيانات، يظهر نفس المبدأ كـ 'الإسقاطات مبكرًا، والانضمامات متأخرًا'. الإسقاطات والاختيارات المبكرة تقلل عرض مجموعة البيانات وتصفية مبكرًا، بينما يتم تأجيل الانضمامات للعمل على مدخلات أصغر. المفردات مقلوبة: خطة الاستعلام هي شجرة حيث تتدفق البيانات من الأوراق، لذا 'أسفل الشجرة' يعني 'في وقت سابق من التنفيذ'.

ماذا يعني 'ادفع if للأعلى و for للأسفل' في البرمجة؟

يعني نقل المنطق الشرطي (ifs) إلى المتصل أو في وقت سابق في خط الأنابيب، ودفع الحلقات التكرارية (fors) إلى معالجة دفعات لاحقة لتحسين الوضوح والأداء.

العربية version →


🇧🇩 বাংলা

if উপরে ঠেলে দিন এবং for নিচে: প্রোগ্রামিং ইডিয়ম ব্যাখ্যা

প্রোগ্রামিং হিউরিস্টিক 'if উপরে এবং for নিচে' পরামর্শ দেয় যে শর্তযুক্ত লজিক (if স্টেটমেন্ট) কলারের দিকে উপরে সরানো উচিত, যখন পুনরাবৃত্তিমূলক লুপ (for) ব্যাচ প্রসেসিংয়ের দিকে নিচে ঠেলে দেওয়া উচিত। এটি ব্রাঞ্চিং কেন্দ্রীভূত করে এবং বাল্ক অপারেশন ব্যবহার করে স্পষ্টতা এবং কর্মক্ষমতা উন্নত করে।

Matklad এই নীতিটি নিয়ে আলোচনা করেছেন, দেখিয়েছেন যে শর্তগুলো উপরে ঠেলে দেওয়ার অর্থ হল কলার None-এর মতো কেসগুলি পরিচালনা করে, যখন ফাংশনটি একটি সাধারণ Walrus নেয়। লুপ নিচে ঠেলে দেওয়ার মধ্যে ফিল্টারিংয়ের পরে লুপ স্থগিত করা জড়িত, যাতে হট লুপটি ব্রাঞ্চ ছাড়াই চলে এবং ভেক্টরাইজেশনের প্রার্থী হয়। দুটি চাল একত্রিত হয়: Option<Walrus> মানের সংগ্রহ দেওয়া হলে, কলার None-গুলি বাদ দেয় এবং Vec<Walrus> frobnicate_batch-কে দেয়, যা কখনও None দেখে না।

এই নীতির রিলেশনাল ডেটাবেস কোয়েরি অপ্টিমাইজেশন এবং ফাংশনাল প্রোগ্রামিংয়ে বিস্তৃত প্রয়োগ রয়েছে। ডেটাবেস কোয়েরি অপ্টিমাইজেশনে, একই নীতিটি 'প্রজেকশন তাড়াতাড়ি, জয়েন দেরিতে' হিসাবে প্রকাশ পায়। প্রাথমিক প্রজেকশন এবং নির্বাচন ডেটাসেটের প্রস্থ হ্রাস করে এবং তাড়াতাড়ি ফিল্টার করে, যখন জয়েনগুলি ছোট ইনপুটে চালানোর জন্য স্থগিত করা হয়। শব্দভাণ্ডারটি উল্টো: একটি কোয়েরি প্ল্যান একটি গাছ যেখানে ডেটা পাতা থেকে উপরে প্রবাহিত হয়, তাই 'গাছের নিচে' অর্থ 'নির্বাহে আগে'।

প্রোগ্রামিংয়ে 'if উপরে এবং for নিচে' বলতে কী বোঝায়?

এর অর্থ শর্তযুক্ত লজিক (ifs) কলার বা পাইপলাইনে আগে সরানো, এবং পুনরাবৃত্তিমূলক লুপ (fors) পরে ব্যাচ প্রসেসিংয়ে ঠেলে দেওয়া, ভাল স্পষ্টতা এবং কর্মক্ষমতার জন্য।

বাংলা version →


🇩🇪 Deutsch

Ifs nach oben und Fors nach unten schieben: Programmier-Idiom erklärt

Die Programmier-Heuristik 'Ifs nach oben und Fors nach unten' schlägt vor, dass bedingte Logik (if-Anweisungen) nach oben in Richtung Aufrufer verschoben werden sollte, während iterative Schleifen (for) nach unten in Richtung Stapelverarbeitung gedrückt werden sollten. Dies verbessert Klarheit und Leistung, indem Verzweigungen zentralisiert und Stapeloperationen genutzt werden.

Matklad hat dieses Prinzip diskutiert und gezeigt, dass das Verschieben von Bedingungen nach oben bedeutet, dass der Aufrufer Fälle wie None behandelt, während die Funktion einen einfachen Walrus akzeptiert. Das Verschieben von Schleifen nach unten beinhaltet das Aufschieben von Schleifen bis nach dem Filtern, sodass die heiße Schleife ohne Verzweigung läuft und ein Kandidat für Vektorisierung ist. Die beiden Bewegungen kombinieren sich: Bei einer Sammlung von Option<Walrus>-Werten verwirft der Aufrufer die Nones und übergibt ein Vec<Walrus> an frobnicate_batch, das nie ein None sieht.

Dieses Prinzip hat breitere Anwendungen in relationalen Datenbankabfrageoptimierungen und funktionaler Programmierung. Bei der Datenbankabfrageoptimierung erscheint dasselbe Prinzip als 'Projektionen früh, Joins spät'. Frühe Projektionen und Selektionen reduzieren die Breite des Datensatzes und filtern früh, während Joins aufgeschoben werden, um auf kleineren Eingaben zu laufen. Das Vokabular ist umgekehrt: Ein Abfrageplan ist ein Baum, in dem Daten von den Blättern nach oben fließen, also bedeutet 'unten im Baum' 'früher in der Ausführung'.

Was bedeutet 'Ifs nach oben und Fors nach unten' in der Programmierung?

Es bedeutet, bedingte Logik (ifs) zum Aufrufer oder früher in einer Pipeline zu verschieben und iterative Schleifen (fors) zu späterer Stapelverarbeitung zu drücken, für bessere Klarheit und Leistung.

Deutsch version →


🇪🇸 Español

Empujar los if hacia arriba y los for hacia abajo: explicación del modismo de programación

La heurística de programación 'empujar if arriba y for abajo' sugiere que la lógica condicional (sentencias if) debe moverse hacia arriba, hacia el llamador, mientras que los bucles iterativos (for) deben empujarse hacia abajo, hacia el procesamiento por lotes. Esto mejora la claridad y el rendimiento al centralizar la ramificación y aprovechar las operaciones por lotes.

Matklad ha discutido este principio, demostrando que empujar los condicionales hacia arriba significa que el llamador maneja casos como None, mientras que la función toma un Walrus simple. Empujar los bucles hacia abajo implica diferir los bucles hasta después del filtrado, para que el bucle caliente se ejecute sin una rama y sea candidato para la vectorización. Los dos movimientos se componen: dada una colección de valores Option<Walrus>, el llamador descarta los None y entrega un Vec<Walrus> a frobnicate_batch, que nunca ve un None.

Este principio tiene aplicaciones más amplias en optimizaciones de consultas de bases de datos relacionales y programación funcional. En la optimización de consultas de bases de datos, el mismo principio aparece como 'proyecciones tempranas, uniones tardías'. Las proyecciones y selecciones tempranas reducen el ancho del conjunto de datos y filtran temprano, mientras que las uniones se difieren para ejecutarse en entradas más pequeñas. El vocabulario está al revés: un plan de consulta es un árbol donde los datos fluyen desde las hojas, por lo que 'bajo el árbol' significa 'más temprano en la ejecución'.

¿Qué significa 'empujar if arriba y for abajo' en programación?

Significa mover la lógica condicional (ifs) al llamador o más temprano en un pipeline, y empujar los bucles iterativos (fors) a un procesamiento por lotes posterior para mayor claridad y rendimiento.

Español version →


🇫🇷 Français

Pousser les if vers le haut et les for vers le bas : explication de l'idiome de programmation

L'heuristique de programmation 'pousser les if vers le haut et les for vers le bas' suggère que la logique conditionnelle (instructions if) doit être déplacée vers le haut, vers l'appelant, tandis que les boucles itératives (for) doivent être poussées vers le bas, vers le traitement par lots. Cela améliore la clarté et les performances en centralisant les branchements et en tirant parti des opérations par lots.

Matklad a discuté de ce principe, démontrant que pousser les conditionnels vers le haut signifie que l'appelant gère des cas comme None, tandis que la fonction prend un Walrus simple. Pousser les boucles vers le bas implique de différer les boucles jusqu'après le filtrage, afin que la boucle chaude s'exécute sans branche et soit candidate à la vectorisation. Les deux mouvements se composent : étant donné une collection de valeurs Option<Walrus>, l'appelant jette les None et remet un Vec<Walrus> à frobnicate_batch, qui ne voit jamais de None.

Ce principe a des applications plus larges dans les optimisations de requêtes de bases de données relationnelles et la programmation fonctionnelle. Dans l'optimisation de requêtes de bases de données, le même principe apparaît comme 'projections tôt, jointures tard'. Les projections et sélections précoces réduisent la largeur de l'ensemble de données et filtrent tôt, tandis que les jointures sont différées pour s'exécuter sur des entrées plus petites. Le vocabulaire est à l'envers : un plan de requête est un arbre où les données circulent des feuilles vers le haut, donc 'bas de l'arbre' signifie 'plus tôt dans l'exécution'.

Que signifie 'pousser les if vers le haut et les for vers le bas' en programmation ?

Cela signifie déplacer la logique conditionnelle (ifs) vers l'appelant ou plus tôt dans un pipeline, et pousser les boucles itératives (fors) vers un traitement par lots ultérieur pour une meilleure clarté et performance.

Français version →


🇮🇳 हिन्दी

if को ऊपर धकेलें और for को नीचे: प्रोग्रामिंग मुहावरा समझाया गया

प्रोग्रामिंग ह्यूरिस्टिक 'if ऊपर और for नीचे' सुझाव देता है कि कंडीशनल लॉजिक (if स्टेटमेंट) को कॉलर की ओर ऊपर ले जाना चाहिए, जबकि इटरेटिव लूप्स (for) को बैच प्रोसेसिंग की ओर नीचे धकेलना चाहिए। यह ब्रांचिंग को केंद्रीकृत करके और बल्क ऑपरेशन्स का लाभ उठाकर स्पष्टता और प्रदर्शन में सुधार करता है।

Matklad ने इस सिद्धांत पर चर्चा की है, यह दिखाते हुए कि कंडीशनल्स को ऊपर धकेलने का मतलब है कि कॉलर None जैसे मामलों को संभालता है, जबकि फ़ंक्शन एक सादा Walrus लेता है। लूप्स को नीचे धकेलने में फ़िल्टरिंग के बाद तक लूप्स को स्थगित करना शामिल है, ताकि हॉट लूप बिना ब्रांच के चले और वेक्टराइज़ेशन के लिए उम्मीदवार हो। दोनों चालें संयोजित होती हैं: Option<Walrus> मानों के संग्रह को देखते हुए, कॉलर Nones को हटा देता है और Vec<Walrus> को frobnicate_batch को सौंपता है, जो कभी None नहीं देखता।

इस सिद्धांत के रिलेशनल डेटाबेस क्वेरी ऑप्टिमाइज़ेशन और फंक्शनल प्रोग्रामिंग में व्यापक अनुप्रयोग हैं। डेटाबेस क्वेरी ऑप्टिमाइज़ेशन में, यही सिद्धांत 'प्रोजेक्शन जल्दी, जॉइन देर से' के रूप में प्रकट होता है। शुरुआती प्रोजेक्शन और चयन डेटासेट की चौड़ाई कम करते हैं और जल्दी फ़िल्टर करते हैं, जबकि जॉइन छोटे इनपुट पर चलने के लिए स्थगित किए जाते हैं। शब्दावली उल्टी है: एक क्वेरी प्लान एक पेड़ है जहाँ डेटा पत्तियों से ऊपर बहता है, इसलिए 'पेड़ के नीचे' का मतलब 'निष्पादन में पहले' है।

प्रोग्रामिंग में 'if ऊपर और for नीचे' का क्या अर्थ है?

इसका मतलब है कंडीशनल लॉजिक (ifs) को कॉलर या पाइपलाइन में पहले ले जाना, और इटरेटिव लूप्स (fors) को बेहतर स्पष्टता और प्रदर्शन के लिए बाद की बैच प्रोसेसिंग में धकेलना।

हिन्दी version →


🇮🇩 Bahasa Indonesia

Dorong if ke Atas dan for ke Bawah: Idiom Pemrograman Dijelaskan

Heuristik pemrograman 'dorong if ke atas dan for ke bawah' menyarankan bahwa logika kondisional (pernyataan if) harus dipindahkan ke atas menuju pemanggil, sementara loop iteratif (for) harus didorong ke bawah menuju pemrosesan batch. Ini meningkatkan kejelasan dan kinerja dengan memusatkan percabangan dan memanfaatkan operasi batch.

Matklad telah membahas prinsip ini, menunjukkan bahwa mendorong kondisional ke atas berarti pemanggil menangani kasus seperti None, sementara fungsi mengambil Walrus biasa. Mendorong loop ke bawah melibatkan menunda loop sampai setelah penyaringan, sehingga loop panas berjalan tanpa cabang dan menjadi kandidat untuk vektorisasi. Kedua gerakan tersebut digabungkan: diberikan koleksi nilai Option<Walrus>, pemanggil membuang None dan menyerahkan Vec<Walrus> ke frobnicate_batch, yang tidak pernah melihat None.

Prinsip ini memiliki aplikasi yang lebih luas dalam optimasi kueri basis data relasional dan pemrograman fungsional. Dalam optimasi kueri basis data, prinsip yang sama muncul sebagai 'proyeksi awal, gabungan akhir'. Proyeksi dan seleksi awal mengurangi lebar dataset dan menyaring lebih awal, sementara gabungan ditunda untuk berjalan pada input yang lebih kecil. Kosakatanya terbalik: rencana kueri adalah pohon di mana data mengalir dari daun ke atas, jadi 'bawah pohon' berarti 'lebih awal dalam eksekusi'.

Apa arti 'dorong if ke atas dan for ke bawah' dalam pemrograman?

Ini berarti memindahkan logika kondisional (if) ke pemanggil atau lebih awal dalam pipeline, dan mendorong loop iteratif (for) ke pemrosesan batch nanti untuk kejelasan dan kinerja yang lebih baik.

Bahasa Indonesia version →


🇯🇵 日本語

if を上に、for を下に:プログラミングのイディオム解説

プログラミングのヒューリスティック「if を上に、for を下に」は、条件ロジック(if 文)を呼び出し元に向かって上に移動し、反復ループ(for)をバッチ処理に向かって下に押し下げることを提案します。これにより、分岐を集中させ、バルク操作を活用することで、明確さとパフォーマンスが向上します。

Matklad はこの原則について議論し、条件を上に押し上げることは、呼び出し元が None などのケースを処理し、関数が単純な Walrus を受け取ることを意味することを示しました。ループを下に押し下げることは、フィルタリングの後までループを延期することを含み、ホットループが分岐なしで実行され、ベクトル化の候補になります。2つの動きは組み合わさります:Option<Walrus> 値のコレクションが与えられた場合、呼び出し元は None を破棄し、Vec<Walrus> を frobnicate_batch に渡します。frobnicate_batch は None を決して見ません。

この原則は、リレーショナルデータベースのクエリ最適化や関数型プログラミングにおいて、より広い応用があります。データベースのクエリ最適化では、同じ原則が「射影は早く、結合は遅く」として現れます。早期の射影と選択はデータセットの幅を減らし、早期にフィルタリングします。一方、結合はより小さな入力で実行するために延期されます。語彙は逆さまです:クエリプランはツリーであり、データは葉から上に流れるため、「ツリーの下」は「実行の早い段階」を意味します。

プログラミングにおける「if を上に、for を下に」とはどういう意味ですか?

これは、条件ロジック(if)を呼び出し元またはパイプラインの早い段階に移動し、反復ループ(for)を後のバッチ処理に押し下げて、明確さとパフォーマンスを向上させることを意味します。

日本語 version →


🇧🇷 Português

Empurre os if para cima e os for para baixo: idioma de programação explicado

A heurística de programação 'empurre if para cima e for para baixo' sugere que a lógica condicional (instruções if) deve ser movida para cima, em direção ao chamador, enquanto os loops iterativos (for) devem ser empurrados para baixo, em direção ao processamento em lote. Isso melhora a clareza e o desempenho ao centralizar a ramificação e aproveitar as operações em lote.

Matklad discutiu esse princípio, demonstrando que empurrar os condicionais para cima significa que o chamador lida com casos como None, enquanto a função recebe um Walrus simples. Empurrar os loops para baixo envolve adiar os loops até depois da filtragem, para que o loop quente seja executado sem um ramo e seja candidato à vetorização. Os dois movimentos se compõem: dada uma coleção de valores Option<Walrus>, o chamador descarta os Nones e entrega um Vec<Walrus> para frobnicate_batch, que nunca vê um None.

Este princípio tem aplicações mais amplas em otimizações de consultas de bancos de dados relacionais e programação funcional. Na otimização de consultas de banco de dados, o mesmo princípio aparece como 'projeções cedo, junções tarde'. Projeções e seleções precoces reduzem a largura do conjunto de dados e filtram cedo, enquanto as junções são adiadas para serem executadas em entradas menores. O vocabulário está de cabeça para baixo: um plano de consulta é uma árvore onde os dados fluem das folhas para cima, então 'abaixo da árvore' significa 'mais cedo na execução'.

O que significa 'empurre if para cima e for para baixo' em programação?

Significa mover a lógica condicional (ifs) para o chamador ou mais cedo em um pipeline, e empurrar os loops iterativos (fors) para processamento em lote posterior para melhor clareza e desempenho.

Português version →


🇷🇺 Русский

Поднимайте if вверх и опускайте for вниз: объяснение идиомы программирования

Эвристика программирования 'поднимайте if вверх и for вниз' предполагает, что условную логику (операторы if) следует перемещать вверх, к вызывающему коду, а итеративные циклы (for) следует опускать вниз, к пакетной обработке. Это улучшает ясность и производительность за счет централизации ветвления и использования пакетных операций.

Matklad обсуждал этот принцип, демонстрируя, что подъем условных операторов вверх означает, что вызывающий код обрабатывает такие случаи, как None, в то время как функция принимает простой Walrus. Опускание циклов вниз включает откладывание циклов до после фильтрации, чтобы горячий цикл выполнялся без ветвления и был кандидатом на векторизацию. Два движения сочетаются: имея коллекцию значений Option<Walrus>, вызывающий код отбрасывает None и передает Vec<Walrus> в frobnicate_batch, которая никогда не видит None.

Этот принцип имеет более широкое применение в оптимизации запросов реляционных баз данных и функциональном программировании. В оптимизации запросов баз данных тот же принцип проявляется как 'проекции рано, соединения поздно'. Ранние проекции и выборки уменьшают ширину набора данных и фильтруют рано, в то время как соединения откладываются для выполнения на меньших входных данных. Словарь перевернут: план запроса — это дерево, где данные текут от листьев вверх, поэтому 'ниже по дереву' означает 'раньше в выполнении'.

Что означает 'поднимайте if вверх и for вниз' в программировании?

Это означает перемещение условной логики (if) к вызывающему коду или раньше в конвейере, и опускание итеративных циклов (for) к более поздней пакетной обработке для лучшей ясности и производительности.

Русский version →


🇨🇳 简体中文

将 if 上移、将 for 下移:编程惯用法解析

编程启发式方法'将 if 上移、将 for 下移'建议将条件逻辑(if 语句)向调用者方向移动,而将迭代循环(for)向批处理方向下移。这通过集中分支和利用批量操作来提高清晰度和性能。

Matklad 讨论了这一原则,展示了将条件上移意味着调用者处理诸如 None 的情况,而函数接受普通的 Walrus。将循环下移涉及将循环延迟到过滤之后,这样热循环无需分支即可运行,并且是向量化的候选。这两种移动可以组合:给定一个 Option<Walrus> 值的集合,调用者丢弃 None 并将 Vec<Walrus> 交给 frobnicate_batch,后者永远不会看到 None。

这一原则在关系数据库查询优化和函数式编程中有更广泛的应用。在数据库查询优化中,同样的原则表现为'早期投影,晚期连接'。早期投影和选择减少数据集宽度并提前过滤,而连接被延迟以在较小的输入上运行。词汇表是颠倒的:查询计划是一棵树,数据从叶子向上流动,因此'树下'意味着'执行更早'。

编程中'将 if 上移、将 for 下移'是什么意思?

这意味着将条件逻辑(if)移动到调用者或管道中更早的位置,并将迭代循环(for)推迟到更晚的批处理,以提高清晰度和性能。

简体中文 version →