69 puan yazan kuroneko 2023-06-14 | 2 yorum | WhatsApp'ta paylaş
  • Kendi metin düzenleyicisini yapmak için, metin veri yapısını doğrudan oluşturma süreci.
  • Metin düzenleyicilerinde büyük dosyaları düzenleme, çoklu imleç, geri al/yinele gibi çeşitli özellikler nedeniyle bu yapıyı tasarlamak oldukça zordur.
  • Buna göre veri yapısında gerekli olan özellikler şunlardır.
    • Verimli ekleme/silme
    • Verimli geri al/yinele
    • UTF-8 kodlamasını kullanabilme
    • Verimli çoklu imleç düzenleme
  • Gap Buffer'ın uygulanması basittir, ancak geri al ve çoklu imleç özelliklerini uygulamak oldukça zordur.
  • Rope, büyük dosyaları küçük parçalara bölerek düzenlemeyi mümkün kıldığı için verimlidir; ancak geri alma işlevi için ek yük büyür ve bellek kullanımı beklenenden daha fazla artabilir.
  • Piece Table, Microsoft Word'de kullanılacak kadar verimli bir yapıdır; ancak çok fazla düzenleme yapıldığında performans düşebilir ve geri alma için bellek kullanımı artabilir.
  • Piece Tree, yukarıdaki tüm dezavantajları çözmek için VSCode ekibi tarafından metin düzenleyicileri için uygulanmış en iyi veri yapısıdır.
    • Rope ile Piece Table'ın yalnızca avantajları seçilerek uygulanmıştır.
    • Parçalar arasındaki bağlantı için RB Tree kullanıldığı için çok sayıda düzenleme olsa bile hâlâ verimlidir.
    • Ancak VSCode ekibinin uyguladığı sürüm değiştirilemez bir veri yapısı olmadığı için geri alma işlevinde bir miktar verimsizlik taşır.
  • Tüm sorunları çözmek için veri yapısına değiştirilemezlik eklenmiş yeni bir Piece Tree uygulanmasına karar verildi.
    • Geleneksel RB Tree'ye değiştirilemezlik kazandırılamadığı için, Bartosz Milewski'nin uyguladığı değiştirilemez RB Tree referans alınarak geliştirmeye başlandı.
    • VSCode ekibinin uyguladığı yapıyla farklar şunlardır.
      • Düzenleyicinin Carriage Return karakterini dikkate alması gereken durumlar az olduğu için CRLF ayrı olarak kaydedilmez.
      • Hata ayıklama için tüm tamponu bir yineleyici benzeri biçimde inceleyebilen bir API eklendi.
      • Veri yapısı değiştirilemez olduğu için geri al/yinele son derece basittir.
    • Silme işlevini uygulamak en zor kısımdı, ancak sonunda başarıyla tamamlandı.
  • Yeni yazılan veri yapısı fredbuf adıyla yayımlandı.

2 yorum

 
junghan0611 2023-06-15

Oo! Teşekkür ederim. Ne kadar değerli bir bilgi bu! Emacs’ı düzgün kullanmaya başladığımdan beri metin düzenleyicinin kendisine karşı epey ilgi duymaya başladım. Orijinal metne de sakin sakin bakmalıyım! :-)

 
cosine20 2023-06-14

Ayrıntılı şekilde özetlediğiniz için teşekkürler. Metin düzenleyicisinin veri yapısının nasıl uygulandığını ben de en az bir kez düşünmüştüm; demek ki bu tür veri yapıları kullanılıyormuş.