Nesneye yönelik bir program bir Sonlu Durum Makinesi olarak görülebilir mi?


13

Bu felsefi / temel bir soru olabilir, ama sadece açıklığa kavuşturmak istiyorum.

Anladığım kadarıyla, bir Sonlu Durum Makinesi, sistemin çıktısının sadece mevcut girişlere değil, aynı zamanda sistemin mevcut durumuna da bağlı olacağı bir sistemi modellemenin bir yoludur. Ek olarak, adından da anlaşılacağı gibi, bir sonlu durum makinesi, kendi durum ve davranışı ile sınırlı bir N sayıda duruma bölünebilir.

Bu doğruysa, veri ve fonksiyon üyelerine sahip her bir nesne, nesne yönelimli modelimizde bir durum olmamalı, herhangi bir nesne yönelimli tasarımı sonlu durum makinesi haline getirmemeli mi?

Nesne tasarımında bir FSM'nin yorumu bu değilse, insanlar yazılımda bir FSM uygularken tam olarak ne anlama gelir? bir şey mi kaçırıyorum?

Teşekkürler


6
Bilgisayar + yazılımı, belleği, disk alanını ve diğer depolama türlerini (internet gibi) kısıtladığınız sürece bir durum makinesidir. İnternet veya diğer harici donanımlarla arabirime izin verilir verilmez (sınırsız depolama alanı anlamına gelir), bu daha çok Turing makinesi gibi olur. Hiç 'Turing complete' ifadesini duydunuz mu? Her neyse, fonksiyonel programlar ve objeye yönelik olanlar montaj kodu olarak son bulur. Haskel'i (saf işlevsel bir dil) / monad'ları bilmiyorum, ama bununla bir Turing makinesi arasında ilginç bir ilişki olmalı.
İş

İşler noktasına ek olarak, herhangi bir determinizm türü hem devlet makinesini hem de Turing makinesi modellerini aşıyor. İnternette, senkronize olmayan birden fazla makineniz, kusurlu bağlantılar nedeniyle veri kaybı vb. Var. Tek çekirdekli basit bir bilgisayarda bile, kullanıcıdan belirleyici olmayan bir girdiniz var, ancak normalde bu sorunu görmezden geliyor ve tüm girdi önceden biliniyordu.
Steve314

@ Steve314: Resmi olarak, deterministik otomatalar tek bir durumda. Her giriş yeni bir duruma yol açar. Deterministik olmayan otomatalar için, her bir giriş birden fazla duruma yol açabilir. N durumlu deterministik olmayan bir otomat, 2 ^ N durumlu bir deterministik otomat ile taklit edilebilir.
kevin cline

@cline - Bu durumda, kesinlikle haklısın, ama aklımdaki şey, gerçek dünyadaki bir makinede meydana gelen eşzamanlılık ve zamanlama varyasyonu idi - biraz sıcak çalışan bir çekirdek gibi şeyler , verilerin okunan başlığın altında olduğu tam zaman vb. Bu, elbette tanımladığınız deterministik olmayan sonlu otomata modeline uyuyor, bu yüzden kesinlikle haklısınız - ancak durumların sayısı inanılmaz derecede büyük olacak. Sanırım sistem durumunun bir parçası olarak bu sıcaklıkları göz önünde bulundurarak sürekli önlemler almış olabilirim (sadece sonuçları değil).
Steve314

Yanıtlar:


16

Sonlu miktarda depolama alanına sahip bir makinede çalışan herhangi bir tek iş parçacıklı program, sonlu durum makinesi olarak modellenebilir. Sonlu durum makinesindeki belirli bir durum, yerel değişkenler, global değişkenler, yığın depolama, sanal bellekte değiştirilmekte olan veriler, hatta ilgili dosyaların içeriği gibi ilgili tüm depolama alanlarının belirli değerlerini temsil edecektir. Başka bir deyişle, bir olacak çok bile oldukça önemsiz programlar için, bu sonlu durum modelinde durumlarının.

Programınızın sahip olduğu tek durum 32 bitlik bir tamsayı türünde tek bir genel değişken olsa bile, bu en az 2 ^ 32 (4 milyardan fazla) durum anlamına gelir. Ve bu program sayacı ve çağrı yığını bile hesaba katılmıyor.

Aşağı itilen otomat modeli bu tür şeyler için daha gerçekçi. Sonlu bir otomat gibi ama yerleşik bir yığın konseptine sahip. Yine de, çoğu programlama dilinde olduğu gibi bir çağrı yığını değildir.

Bir Wikipedia açıklaması var , ancak resmi tanım bölümünde saplanmayın.

Aşağı itmeli otomatalar genel hesaplamaları modellemek için kullanılır. Turing makineleri benzerdir , ancak IIRC aynı değildir - hesaplama yetenekleri eşdeğerdir .

Yukarıdaki hatayı işaret ettiği için Kevin Cline'a teşekkür ederiz - Wikipedia'nın da belirttiği gibi , aşağı itilen otomatalar sonlu durum makinelerinden daha güçlü, ancak Turing makinelerinden daha az güçlüdür.

I - Bu beyin osuruk nereden geldiğini gerçekten bilmiyorum do hassas dilbilgisi bağlamında özgür daha güçlü olduklarını bağlam biliyorum ve bu bağlam duyarlı dilbilgisi basit aşağı itilen Otomaton'u kullanılarak ayrıştırılamaz. Kesin olmayan, bağlamsız herhangi bir dilbilgisini doğrusal zamanda ayrıştırmak mümkün olsa da, bunu yapmak için genellikle (deterministik) bir push otomattan daha fazlasını gerektirir. Peki, aşağı itmeli bir otomatın Turing makinesine eşdeğer olduğuna nasıl inanabileceğim tuhaf.

Belki bazı ekstra makineler eklenmiş bir push-down otomatı düşünüyordum, ancak bu bir push-down otomatına eşdeğer olan sonlu bir otomat saymak gibi bir şey olurdu (sadece bir yığın ekleyin ve kullanın).

Aşağı itilen otomata ayrıştırmada önemlidir. Bu bağlamda onlara yeterince aşinayım, ama onları gerçekten bilgisayar bilimi hesaplama modelleri olarak hiç çalışmadım, bu yüzden zaten sahip olduğumdan çok daha fazla ayrıntı veremiyorum.

Tek bir OOP nesnesini sonlu durum makinesi olarak modellemek mümkündür. Makinenin durumu, tüm üye değişkenlerin durumları tarafından belirlenecektir. Normalde, yalnızca yöntem çağrıları arasında (sırasında değil) geçerli durumları sayarsınız. Yine, genellikle endişelenecek çok sayıda devletiniz olacaktır - bu teorik bir model olarak kullanabileceğiniz bir şeydir, ancak belki de önemsiz bir durum dışında tüm bu devletleri numaralandırmak istemezsiniz.

Bununla birlikte, bir sonlu durum makinesi kullanarak bir nesnenin durumunun bir yönünün modellenmesi oldukça yaygındır . Yaygın bir durum, oyun nesneleri için AI'dır.

Bu aynı zamanda, aşağı itmeli bir otomat modeli kullanarak bir ayrıştırıcıyı tanımlarken yapılan şeydir. Bir durum modelinde sınırlı bir durum kümesi olmasına rağmen, bu yalnızca ayrıştırıcının durumunun bir parçasını modeller; ek bilgiler bu durumun yanında ek değişkenlerde saklanır. Bu, örneğin 4 milyar-bir-tamsayı-durumu sorununu çözer — tüm bu durumları numaralandırmaz, sadece tamsayı değişkenini içerir. Bir bakıma hâlâ aşağı itilen otomat devletinin bir parçası, ama gerçekte bir diyagrama 4 milyar durum kabarcığı çizmekten çok daha yönetilebilir bir yaklaşım.


1
"Tekli bir OOP nesnesini sonlu durum makinesi olarak modellemek mümkündür". Doğru, ama zayıf. Bu mümkün değil". Bu bir tanım meselesi. Bir programlama dilinin işi bir FSM'yi düzenli bir gösterimde ifade etmektir. OOP, çeşitli devletler için daha basit gösterime sahip bir FSM uygulamasıdır.
S.Lott

1
@ S.Lott - Evet, ancak çoğu insan bir OOP nesnesini en azından çoğu zaman bir FSM ifade etmiyor gibi düşünmüyor. "Durum makinesi" adını kullanmak, durum tasarım modeli veya durum kimliği üye değişkeni gibi belirli bir uygulama kullandığınız anlamına gelir. “Bir devlet makinesi olarak modelleme” sıklıkla, söz konusu sınıfın uygulanmasından farklı olarak şartname veya tasarım dokümantasyonu hakkında da bir şey ifade eder. Bu nedenle, bir sınıfı sonlu durum modeli olarak modellemek, öznel olarak sadece sınıf için kaynak kodunu sağlamaktan başka bir şey ifade eder.
Steve314

"insanlar düşünmez". Doğru. Ve derin bir sorun. Tüm programlar devlet makineleri. Bir sürü devletleri var. Bir programlama dili için "Turing Complete" testinin gerektirdiği şey budur. Bu çok, çok güçlü (ve mutlak) bir kuraldır. "Mümkün" olduğunu belirtmektense, daha çok "gerekli" ve "yeterli" gibidir.
S.Lott

1
-1: Aşağı itilen otomatalar Turing makineleri kadar güçlü DEĞİLDİR.
kevin cline

1
teşekkür - - Cline @kevin ve ne ben edildi düşünme !!! Bu biti çıkarmak için düzenlendi. Resmi çalışma hakkında söylediklerime rağmen, bundan daha iyi biliyorum ve o zamanlar daha iyi bilmeliydim.
Steve314

5

Mesele, bir şeyin "sonlu" olup olmadığı "sonlu durum makinesi" değildir. Sonlu durum makinesi, bir şeyin bir şey olarak düşünülebiliyorsa, bir şeyi anlamak için yararlı olabilecek zihinsel bir modeldir.

Tipik olarak sonlu durum makinesi modeli, normal bir dilbilgisi veya bilgisayarın talimat sıralayıcısı gibi az sayıda duruma sahip şeyler için geçerlidir.


1

Sorunuzu doğrudan cevaplamak için: neredeyse kesinlikle hayır. OOP için lambda kalkülüsünün ve / veya Kombinasyon Mantığının temelde işlevsel programlamanın veya Turing Makinelerinin sıradan eski zorunlu programlamanın şekli gibi resmi bir matematiksel teori görünmemektedir.

Daha fazla bilgi için bu yığın akışı sorusuna bakın .

Benim tahminim, altta yatan bir matematiksel teorinin olmaması, herkesin bir nesneyi gördüklerinde neden bir "nesnenin" ne olduğunu bilmesidir, ancak hiç kimse "nesneleri" başkasıyla aynı şekilde görmez.


0

Hayır, neredeyse hiç değil. Sonlu durum makinesi normalde yalnızca bir veri parçasını hatırlar: mevcut durumu.

Bir FSM'nin tipik bir uygulaması lexing veya ayrıştırmadır. Örneğin, lexing yaparken, mevcut durum ve giriş değeri açısından olası her giriş için eylemleri kodlamak oldukça kolaydır.

Örneğin, bir sayının rakamlarını okuduğumuz bir NUMBER durumumuz olabilir. Okuduğumuz bir sonraki karakter bir rakamsa, NUMBER durumunda kalırız. Boşluk veya sekme ise, sayıları döndürür ve ardından WHITE_SPACE durumuna veya bu siparişteki bir şeye ilerlerdik.

Şimdi, tipik bir FSM'de (özellikle yazılımda uygulanan bir) teknik olarak FSM'nin kendisi ile karıştırılmış bir FSM'ye tam olarak uymayan bitler ve parçalar ile sonuçlandığımız kesinlikle doğrudur. Örneğin, bir sayının rakamlarını okurken, sık sık ilk basamağın konumunu kaydedersiniz, böylece sonuna geldiğinizde sayının değerini kolayca hesaplayabilirsiniz.

FSM'nin kendisinin bazı sınırlamaları vardır - sayma mekanizması yoktur. Örneğin, bir yorumu başlatmak için " /" ve bir yorumu sonlandırmak için "/ " kullanılan bir dili düşünün . Lexer muhtemelen bir '/ ' jetonu gördüğünde girdiği COMMENT durumuna sahip olacaktır . Bu noktada (COMMENT2 gibi başka bir durum eklemekten yoksun) başka bir "/ " algılamak ve bunun iç içe bir yorumla uğraştığını anlamak için hiçbir yolu yoktur . Daha ziyade, yorum durumunda, yorum durumunu */bırakmasını söyler ve diğer her şey onu yorum durumunda bırakır.

Belirtildiği gibi, kesinlikle olabilir böyle devam eder ki, bir comment3 devlet, ve - comment2 iç içe geçmiş bir yorum için devlet bulunmaktadır. Bununla birlikte, bir noktada, daha fazla durum eklemekten bıkacaksınız ve bu, yorumlar için izin verdiğiniz maksimum yuvalama derinliğini belirleyecektir. Başka bir ayrıştırıcı formuyla (yani, saf hal makinesi değil, ancak sayılmasına izin verecek bir hafızası olan bir şeyle), sadece yuvalama derinliğinizi doğrudan takip edebilirsiniz, böylece yakın bir yorum jetonuna ulaşıncaya kadar YORUM durumunda kalırsınız. ilkini dengeler, böylece sayacınız 0'a geri döner ve COMMENT durumundan ayrılırsınız.

Ancak dediğim gibi, böyle bir sayaç eklediğinizde, sahip olduğunuz şey artık gerçek anlamda bir FSM değildir. Aynı zamanda, bir spesifik olarak yeterince yakın sadece daha fazla durumlarını ekleyerek sayaç taklit olabilir - oldukça yakın aslında.

Bununla birlikte, tipik bir durumda, birisi yazılımda bir FSM uygulaması hakkında konuştuğunda, bunu makul bir şekilde "saf" tutacaktır . Özellikle, yazılım sadece mevcut duruma ve girişin değerine bağlı olarak akım girişine tepki verecektir. Reaksiyon başka bir şeye bağlıysa, genellikle buna bir devlet makinesi demezler (en azından ne hakkında konuştuklarını biliyorlarsa).


"mevcut durumu" çok fazla bilgi içerebilir. Bir FSM, sayılacağı her sayı için durumlara sahip olarak önemsiz bir şekilde sayabilir. Sonludur (Turing Machine'den farklı olarak), ancak hala mükemmel bir şekilde sayabilir. Bence daha iyi bir örneğe ihtiyacın olabilir.
S.Lott

Cep telefonunuzdaki yazılım, birçok veriyi hatırlayan ve mevcut duruma göre yorumlayan korkunç derecede karmaşık bir durum makinesidir.
Mawg, Monica

-2

Kabul edilen cevabın tamamen doğru olduğuna inanmıyorum.

Turing Complete dilinde yazılmış keyfi bir programı, nesne yönelimli olsun olmasın, bir Sonlu Durum Makinesi olarak modelleyemezsiniz. Java, C ++ veya Smalltalk gibi hemen hemen tüm modern bilgisayar dilleri Turing Complete'dir.

Örneğin, Sonlu Durum Makineleri bir değişkeni n'ye yazamayacağı için, bir nesnenin n örneğini ve ardından başka bir nesnenin n örneğini izlediğiniz bir nesne dizisini tanımak için bir Sonlu Durum Makinesi oluşturamazsınız. Sadece girişi okuyabilir ve bir duruma geçebilirler.


bu sadece 3 yıl önce yayınlanan cevaplarda yapılan ve açıklanan noktaları tekrarlar, örneğin bu
gnat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.