Düşük bir seviyede veri yapısı kalıcı değilse ne olacağını anlamak istiyorum.
Veri yapısı olarak devasa bir boşluğa ( 2450 bayt hacmine sahip " Mersenne twister " gibi) takma numara üreticisine bakalım . Rastgele bir sayıyı bir kereden fazla kullanmak istemiyoruz, bu yüzden bunu değişmez kalıcı bir veri yapısı olarak uygulamak için çok az neden var gibi görünüyor. Şimdi aşağıdaki kodda neyin yanlış gidebileceğini kendimize soralım:
mt_gen = CreateMersenneTwisterPRNGen(seed)
integral = MonteCarloIntegral_Bulk(mt_gen) + MonteCarloIntegral_Boundary(mt_gen)
Çoğu programlama dilleri sırayı belirtmeyen MonteCarloIntegral_Bulk
ve MonteCarloIntegral_Boundary
değerlendirilecektir. Her ikisi de değişken bir mt_gen'e bir argüman olarak gönderme yaparsa, bu hesaplamanın sonucu platforma bağlı olabilir. Daha da kötüsü, sonucun farklı işlemler arasında hiçbir zaman tekrarlanamayacağı platformlar olabilir.
Birisi mt_gen için etkin bir değişken veri yapısı tasarlayabilir, öyle ki, herhangi bir uygulamanın harmanlanması "doğru" bir sonuç verir MonteCarloIntegral_Bulk
ve MonteCarloIntegral_Boundary
verir, ancak farklı bir harmanlama genel olarak farklı bir "doğru" sonuç verir. Bu tekrar üretilemezlik karşılık gelen işlevi "saflaştırır" yapar ve ayrıca başka bazı problemlere de yol açar.
Sabit olmayan bir sıralı yürütme emri uygulanarak tekrarlanamazlıktan kaçınılabilir. Ancak bu durumda kod, herhangi bir zamanda yalnızca mt_gen'e tek bir referansın ulaşabileceği şekilde düzenlenebilir. Yazılı bir işlevsel programlama dilinde, bu kısıtlamayı zorlamak için benzersizlik türleri kullanılabilir, böylece saf işlevsel programlama dilleri bağlamında da güvenli değiştirilebilir güncellemeler sağlanır. Bütün bunlar kulağa hoş ve zekice gelebilir, ancak en azından teoride Monte Carlo simülasyonları utanç verici bir şekilde paralelve bizim "çözümümüz" sadece bu mülkü mahvetti. Bu sadece teorik bir problem değil, aynı zamanda gerçek bir pratik meseledir. Bununla birlikte, sözde rasgele sayı üretecimizi ve ürettiği rasgele sayıların sırasını değiştirmemiz (sunduğu işlevsellik) ve hiçbir programlama dili bizim için otomatik olarak yapamaz. (Tabii ki zaten gerekli işlevselliği sunan farklı bir sözde rasgele sayı kütüphanesi kullanabiliriz.)
Düşük seviyede, yürütme sırası sıralı ve sabit değilse, değişken veri yapıları kolayca tekrarlanamazlığa (ve dolayısıyla safsızlığa) yol açar. Bu sorunların üstesinden gelmek için tipik bir zorunlu strateji, değişebilir veri yapılarının değiştiği sabit yürütme sırasına sahip sıralı aşamalara ve tüm paylaşılabilir değişken veri yapılarının sabit kaldığı, keyfi yürütme sırasına sahip paralel aşamalara sahip olmaktır.
Andrej Bauer değişken veri yapıları için takma israf sorununu gündeme getirdi. İlginçtir ki, Fortran ve C gibi farklı emir dilleri, işlev argümanlarının izin verilen takma isimleri konusunda farklı varsayımlara sahiptir ve çoğu programcı, dillerinin bir takma modeline sahip olduğunun farkında değildir.
Ölçülebilirlik ve değer anlambilimi biraz abartılabilir. Daha da önemlisi, programlama dilinizin tip sistemi ve mantıksal çerçevesinin (soyut makine modeli, takma model, eşzamanlılık modeli veya bellek yönetimi modeli gibi), "verimli" verilerle "güvenle" çalışması için yeterli desteği sağlamasıdır. yapıları. "Hareketli anlambilim" in C ++ 11'e getirilmesi, teorik açıdan saflık ve "güvenlik" anlamında dev bir adım gibi görünebilir, ancak pratikte bunun tam tersi de geçerlidir. Tip sistemi ve dilin mantıksal çerçevesi, yeni anlambilimle ilişkili tehlikenin büyük kısımlarını kaldırmak için genişletildi. (Pürüzlü kenarlar kalsa bile, bu "daha iyi" bir durumla geliştirilemeyeceği anlamına gelmez
Uday Reddy, matematiğin hiçbir zaman değişken veri nesneleriyle çalışmadığı ve fonksiyonel programlar için tip sistemlerinin değişmez veri nesneleri için iyi bir şekilde geliştirildiği sorununu gündeme getirdi. Bu bana Jean-Yves Girard'ın matematiğin doğrusal mantığı motive etmeye çalıştığında değişken nesnelerle çalışmak için kullanılmadığını açıklamasını hatırlattı.
Biri, "etkin" değişken olmayan kalıcı veri yapılarıyla "güvenli bir şekilde" çalışmayı mümkün kılmak üzere, işlevsel programlama dillerinin tip sisteminin ve mantıksal çerçevesinin nasıl genişletilebileceğini sorabilir. Buradaki bir problem, klasik mantık ve boolean cebirlerinin değişken veri yapılarıyla çalışmak için en iyi mantıksal çerçeve olmayabilir. Belki de doğrusal mantık ve değişmeli monoidler bu görev için daha uygun olabilir mi? Belki de fonksiyonel programlama dilleri için Philip Wadler'in lineer mantık üzerine tür sistemi olarak söylediklerini okumalıyım ? Fakat doğrusal mantık bu problemi çözemezse bile, bu, işlevsel bir programlama dilinin tip sisteminin ve mantıksal çerçevesinin "güvenli" ve "verimli" olmasını sağlayacak şekilde genişletilemeyeceği anlamına gelmez.