Tartışmaya katılanların X ve Y'nin farklı tanımlarını kullanmaları durumunda " X ve Y " tipindeki soruları cevaplamak zordur . Bazı tanımlar için cevap "evet", bazı tanımlar için cevap "hayır" olabilir. Özellikle cevap , farklı tanımların farklılık gösterdiği teknik ayrıntılara bağlıysa . Ayrıca bu tartışma bazı yanlış bilgiler içeriyor, lütfen daha uzun cevapları olan bir sabrınız olsun.
Bir " programlama dili " ile ne kastediyoruz ?
Basit bir cevap "programlar oluşturmak için kullanılan bir dil" olabilir. Elbette, fakat: ne tür programlar? Bazı program türlerini oluşturmak için kullanılabilecek , başka program türlerini kullanamayan bir dilden ne haber ? Aşırı olayları göstermek için iki özel örnek:
1) M adında hayali bir dil şöyle çalışır: Eğer program "m" tek harfini içeriyorsa, Mayın Tarlası oyununu yaratır. Geriye kalan her şey bir sözdizimi hatasıdır.
Sezgisel olarak, "programlama dili" derken demek istediğimiz bu değil . Ancak M'nin pazarlama departmanı , tanımı tanımlamak için teknik olarak yerine getirdiğini iddia edebilir , çünkü bir program oluşturmak için kullanılabilir. Elbette, derleyici sizin için bazı kritik parçalar yapar, fakat derleyiciler bunu yapar, değil mi? C dilinin bir derleyicisi aynı zamanda bazı basit kelimeleri düzinelerce işlemci talimatına çevirir. M derleyicisi daha da ileri gidiyor ve işinizi daha da kolaylaştırıyor.
2) Ünlü Turbo Pascal'ın orjinal versiyonunu kurarsanız, birçok çeşit program yazabilirsiniz. Ancak web tarayıcısında çalışan bir oyun yazamazsınız, çünkü gerekli API orada değildir.
Peki, Turbo Pascal'ı bir programlama dili yapan şey tam olarak nedir, ama M'de yok mu? Basitçe konuşursak, Pascal'da M'den daha fazlasını yapabilirsiniz . Ancak bir web tarayıcısında çalışan bir Mayın Tarlası oyununu oluşturan bir M.NET'in olduğunu hayal edin. Şimdi Pascal'ın yapabileceği ve M.NET'in yapamayacağı bir şeye sahibiz, ancak M.NET'in yapabileceği ve Pascal'ın yapabileceği bir şeye sahibiz. Neden Pascal'ın avantajlarını ve M.NET'in avantajlarını alakasız görelim?
Cevap, Pascal'a her türlü algoritmayı yazabilmenizdir , ancak M veya M.NET'te algoritmalar yazamazsınız. Elbette, M "m" komutunu, C ise "strcmp" komutunu derler. Fakat "strcmp" yi daha geniş bir bağlamda koyabilirsiniz, örneğin iki dosyayı satır satır karşılaştırabilir veya bin dizgiyi okuyabilir ve bunları alfabetik olarak sıralayabilirsiniz, ya da ... milyonlarca başka şey. Ve kesin olarak, verilen komutları bir programlama dilinin özünü oluşturan herhangi bir algoritmada kullanma yeteneğidir .
Tam olarak bir algoritma nedir ve daha da önemlisi “herhangi bir algoritma” nedir? Bilgisayar biliminde Turing-complete sözcüklerini kullanıyoruz . Buradaki fikir, her birinin hepsini simüle edebilecek bir dizi bilgisayar dili olduğudur . Bu dillerden biri Turing makinesidir, bu yüzden buna böyle denir. Pascal var, C var, Java var, Python var, Lisp var, Smalltalk var, hatta XSLT var. Bizim varsayımsal M ve M.NET orada değil . İyi bir bilgisayar bilimi kursu veren herhangi bir üniversitede bu konuda daha fazla bilgi edinebilirsiniz, ancak fikir Turing-tamamlanmış bir dilin her şeyi yapabileceğidir.gerekli minimum API'yi verirseniz, başka bir Turing-complete dilinin yapabildiğini (Bazı web tarayıcı API'lerini Pascal'a verirseniz, web tarayıcısında her türlü oyunu oluşturabilirsiniz. Web tarayıcı API'sini M'ye verirseniz, yine de yalnızca Mayın Tarlası'nı oluşturabilirsiniz.) Mecazi olarak Tüm API'leri bir programlama dilinden kaldırırsanız önemli olan kalır.
" Normal ifadeler " ile ne kastediyoruz ?
Farklı programlama dilleri bunları biraz farklı şekilde uygular. Ancak asıl fikir, düzenli ifadelerin normal diller olarak ifade edilmesiydi . Buradaki programlama dilleri hakkında değil, (sözde) insan dilleri hakkında konuştuğumuzu unutmayın. Sadece "ba", "baba", "bababa" sözcüklerinden oluşan bir dili konuşan egzotik bir kabile bulduğunuzu hayal edin. Bu dili sözlü olarak "bir veya daha fazla defa tekrarlanan heceli" ba "olarak ya da normal bir ifadeyi" (ba) + "olarak kullanarak tanımlayabilirsiniz.
Düzenli ifadelerin şunu ifade etmesi gerekir: "hiçbir şey", "bu mektup", "bunu, ardından", "bunu veya", "bunu, bir veya daha fazla kez tekrarlandı" ve "bunu değil". - Matematiksel tanım budur. Başka bir şey sadece önceki bileşenlerden yapılmış uygun bir kısayol. Örneğin, "bu, iki ya da üç kez tekrarlanan", "bu, ardından gelen, ardından (bu ya da hiçbir şey)" olarak çevrilebilir, ancak "ba {2,3}" yazmayı "baba" dan daha uygun (ba)?".
Gerçek hayatta, "normal ifadelerin" tipik bir uygulaması bundan daha fazlasını sağlar. Örneğin, matematiksel bir tanımını, bir "aba", "aabaa", "aaabaaa" dil ve benzeri kullanılarak - ardından "a" ların herhangi bir sayıda, bir "b", ardından aynı A" sayısına "s - normal bir dil değil . Bununla birlikte, günümüzde kullanılan birçok "normal ifade", "daha önce bulduğumuzla aynı" ek konseptini kullanarak, "(a +) b \ 1" olarak yazılmıştır. Bu ek kavramı kullanarak bazı harika şeyler yapabiliriz, örneğin asal harflerden oluşan sözcükleri tespit edebiliriz . Yine de, herhangi bir algoritma yapamıyoruz ... bir açıklama için neden,
Öyleyse, asıl konuya geri dönersek: düzenli ifadeler (ya: Chomsky hiyerarşisindeki normal dilleri tanımlayan ifadeler; ya da: eski, artı \ 1 işlemi olarak tanımlanır) bir programlama dili mi (turing-complete) Cevap hayır . Hayır, uygulayamaz herhangi algoritma düzenli ifadeler kullanarak ve uygulama yeteneği herhangi bir algoritma Bilgisayar okuyan insanlar genellikle dil programlama özü olarak anlaşılması şeydir.
Elbette, herkes farklı bir tanım üzerinde ısrar ederek cevabı değiştirebilir . Başlangıçta yazdığım gibi, teknik detaylar burada önemlidir. Onları yanlış anlarsan, yanlış bir cevap alırsın.
Eğer Ve eğer değil teknik detaylar ilgilenen, cevap olabilir: Eğer düzenli ifadeler (ve başka bir şey) bir program yapmak için kullanabilir miyim? Hayır. Peki neden ona programlama dili diyorsunuz? (Bununla birlikte, bunun gibi bir cevap burada indirildi ve silindi, bu yüzden bu daha uzun sürümü yazdım.)
EDIT: Ayrıca, herkes bazı yeni özelliklerle birlikte kendi "normal ifadeler" varyantını uygulayan bir kütüphane oluşturabilir. Bir anda, yeni özellikler tüm sistemin Turing-eksiksiz olması için yeterli olabilir . Önemsiz bir örnek, bazı yeni sözdizimleri kullanarak bir Turing-tamamlanmış dili gömmek olabilir; ama aynı zamanda daha az açık bir şekilde gerçekleşebilir. Belki zaten oldu.