3 puan yazan GN⁺ 2025-08-19 | 1 yorum | WhatsApp'ta paylaş
  • FFmpeg Assembly Dili Dersleri, bilgisayarın iç işleyişini derinlemesine anlamayı sağlayacak şekilde tasarlanmış açık kaynaklı bir öğrenme materyalidir
  • Bu depo, FFmpeg'te kullanılan assembly dili için gerçek örnekler ve uygulama odaklı alıştırmalar sunar
  • C dili işaretçileri ve lise düzeyinde matematik bilgisi, öğrenim için ön koşuldur
  • Bu sayede FFmpeg açık kaynak projesine doğrudan katkı sunma yeteneği geliştirilebilir
  • Discord kanalı üzerinden soru-cevap ve tartışma desteği sağlanır

FFmpeg Assembly Dili Derslerine Giriş

  • FFmpeg School of Assembly Language, programlamadaki en ilgi çekici, zorlayıcı ve ödüllendirici yolculuklardan birine başlamanızı sağlamak için hazırlanmış açık kaynaklı bir derstir
  • Bu ders sayesinde FFmpeg'te assembly dilinin nasıl yazıldığını gerçek kod üzerinden öğrenebilir, bilgisayarın içinde neler olup bittiğini sistemli biçimde anlayabilirsiniz

Gerekli Bilgi

  • C dili bilgisi, özellikle işaretçi kavramı, zorunludur
    • C bilmiyorsanız önce "The C Programming Language" kitabını çalışmanız gerekir
  • Lise düzeyinde matematik (skalerler ve vektörler, toplama, çarpma vb.) bilgisi önceden gereklidir

Ders Yapısı ve Kullanım Şekli

  • Bu GitHub deposunda adım adım dersler ve her derse karşılık gelen alıştırmalar yer alır (alıştırmalar henüz yüklenmemiştir)
  • Tüm süreci tamamladığınızda FFmpeg projesine doğrudan katkı sunabilecek pratik yetkinliğe sahip olursunuz

Topluluk Desteği

Çok Dilli Çeviri

  • Dersler Fransızca ve İspanyolca olarak da sunuluyor; bu da farklı dil topluluklarından geliştiriciler için erişilebilirliği artırıyor

1 yorum

 
GN⁺ 2025-08-19
Hacker News görüşleri
  • Sadece FFMPEG'in ölçeğini hayal etmek bile etkileyici; en küçük performans artışı bile binlerce, on binlerce saatlik işlemden tasarruf sağlayabiliyor, gerçekten çok faydalı bir proje
    • FFMPEG ekibinin performansa olan takıntısını takdire şayan buluyorum; keşke tüm projeler böyle bir yaklaşımla ele alınsa
    • Yine de geleneksel anlamda net bir API'si olmasını isterdim (komut odaklı değil, gerçekten kütüphane biçiminde); şu anki gibi kendine ait bir dil gibi görünen komut satırını anlamak kolay değil
  • Önceki tartışma 2025-02-22 tarihinde yapılmıştı, 222 yorum var; buradan görülebilir
  • Derleyicinin ürettiği optimize edilmemiş assembly yüzünden oluşan hotspot'ların pratikte nasıl bulunduğunu merak ediyorum; ayrıca mimariye özgü assembly yerine LLVM IR gibi bir ara gösterimi doğrudan yazmanın anlamlı olup olmadığını da merak ediyorum
    • Birçok kişinin düşündüğü sorunlar gerçek sorunlarla aynı değil; pratikte mesele “optimize edilmemiş assembly” değil, C derleyicisinden beklenebilecek seviye. Başlıca etkenler şunlar: döngülerin genel C uygulamaları var ve bunlara donanıma özel ek asm/SIMD sürümleri ekleniyor, ancak SIMD özellikleri platformdan platforma değiştiği için genelleştirmek zor, derleyici sürümü farkları yüzünden herkes en iyi uygulamadan yararlanamayabiliyor, C'nin bellek modeli ve char * kullanımı optimizasyonu engelliyor, intrinsic'ler ile auto-vectorization özellikleri bazen birbiriyle çatışıyor, ayrıca Intel C'de intrinsic'ler, Microsoft'un koyduğu karmaşık fonksiyon adları yüzünden bazen assembly'den daha zor okunuyor
    • Genelde vtune ya da uprof gibi araçlarla ISA seviyesinde benchmark hotspot'ları analiz ediliyor; ARM araçlarını pek bilmiyorum. LLVM IR gibi bir ara gösterimi insanların doğrudan yazmasının pratikte büyük bir anlamı yok; çoğu durumda sadece mimariye özgü sorunlar için doğrudan assembly yazılıyor. C/C++ derleyicileri genelde iyi optimize edilmiş kod üretir ama vektörleştirilmiş kodda algoritmanın kendisini değiştirmek gerekir ve intrinsic kullanımı kaçınılmaz hale gelir; bu durumda kod taşınabilirliğini kaybeder ve assembly gibi görünmeye başlar. Üstelik derleyicinin ürettiği kodun ek yükü de olur. Bu yüzden assembly'yi doğrudan yazıp register allocation ya da komut sırası gibi ayrıntılarla insanın bizzat ilgilenmesi daha iyi olabilir. Sonuçta elde yazılmış assembly'nin derleyicinin ürettiğinden daha iyi olup olmadığını ancak ölçerek anlayabilirsiniz; benchmark şart
    • LLVM IR'i doğrudan yazmanın pek anlamı yok. Amaç vektör koduysa önce vectorization yönergelerini (pragmas) denemek, olmazsa intrinsic'ler ya da ISPC gibi bir dil kullanmak daha verimli. IR yazarak elde edilen bir avantaj yok. Derleyicinin register allocation ya da komut seçimi sorunlarını kendiniz çözmek isteseniz bile, IR ile yazınca derleyici bunu sonunda yine kendi asıl koduna dönüştürüyor. Sonuç olarak IR, kararsız ve kullanımı daha zor bir katman eklemekten başka bir şey yapmıyor. En iyi elde yazılmış assembly için doğrudan assembly yazmak gerekiyor
  • Ne yazık ki örneklerin, NASM gibi gerçek bir assembler ile uygulamalı basit bir girişten başlamaması üzücü
  • Projenin yıllara dayanan deneyiminden süzülmüş içgörüler ya da püf noktaları bekliyordum, ama ffmpeg ile doğrudan bağlantılı bir his pek alamadım; birkaç bölüme bakınca daha çok genel bir assembly'ye giriş düzeyinde geldi
  • FFmpeg Assembly Lessons için gerekli matematik ders materyallerinin de GitHub deposuna eklenmesi iyi olabilir; tüm materyaller tek yerde olursa başlamak daha kolay olur gibi
    • Yazarı değilim ama okuyucunun yalnızca temel düzeyde C programlama bildiğini ve gerçekten video codec'lerine katkı vermek istediğini varsayarsak, Cooley-Tukey algoritması gibi konulara gelene kadar öğrenilmesi gereken epey arka plan bilgisi var; üstelik bunlar daha en temel şeyler
  • Bu assembly kodlarının farklı CPU'larda taşınabilirliği nasıl sağladığını merak ediyorum
    • Bence genel C ile çalışan işleme kısmı bir baseline görevi görüyor, ayrıca başlıca mimariler için elde yazılmış assembly sürümleri bulunuyor
    • Aslında yalnızca x86-64 hedefleniyor
  • Büyük ilgiyle okudum, alan odaklı öğreticilerin çok daha iyi olduğunu düşünüyorum
  • nasm'in makro önişlemcisinin fazlasıyla suistimal edildiği yerler var; bu da başka bir assembler'a taşımayı epey zorlaştırır gibi görünüyor
    • Neden özellikle başka bir assembler'a taşımak gereksin ki?
    • Bunun hangi kısımlarda yapıldığını merak ediyorum; ders kodunda aslında neredeyse hiç kod yok