এমন কি কোনও ডিজাইনের নিদর্শন রয়েছে যা কেবল পাইথনের মতো গতিময় টাইপ করা ভাষায় সম্ভব?


30

আমি একটি সম্পর্কিত প্রশ্ন পড়েছি কি পাইথনের মতো গতিশীল ভাষায় এমন কোনও ডিজাইনের নিদর্শন রয়েছে যা অপ্রয়োজনীয়? এবং উইকিকিউট.আর.জে এই উক্তিটির কথা মনে পড়ে গেল

ডায়নামিক টাইপিংয়ের দুর্দান্ত জিনিসটি হ'ল এটি আপনাকে গণনাযোগ্য এমন কোনও কিছু প্রকাশ করতে দেয়। এবং টাইপ সিস্টেমগুলি নয় - টাইপ সিস্টেমগুলি সাধারণত নির্ধারণযোগ্য এবং তারা আপনাকে একটি উপসেটে সীমাবদ্ধ করে। স্ট্যাটিক টাইপ সিস্টেমগুলির পক্ষে থাকা লোকেরা বলে "এটি ভাল, এটি যথেষ্ট ভাল; আপনি যে আকর্ষণীয় প্রোগ্রামগুলি লিখতে চান তা ধরণের হিসাবে কাজ করবে "। তবে এটি হাস্যকর - একবার আপনার টাইপ সিস্টেম পরে গেলে আপনি কী কী মজাদার প্রোগ্রামগুলি তা জানেন না।

--- সফ্টওয়্যার ইঞ্জিনিয়ারিং রেডিও পর্ব 140: গিলাদ ব্রাচার সাথে নিউজপেইক এবং প্লাগেবল প্রকার

আমি অবাক হই, এমন কোনও দরকারী নকশার নিদর্শন বা কৌশল রয়েছে যা উদ্ধৃতিটির সূত্র ব্যবহার করে "ধরণের হিসাবে কাজ করে না"?


3
আমি ডাবল প্রেরণ এবং ভিজিটর প্যাটার্নটি স্থিতিযুক্ত টাইপ করা ভাষাগুলিতে সম্পাদন করা খুব কঠিন বলে খুঁজে পেয়েছি তবে গতিশীল ভাষায় সহজেই সাধ্যযোগ্য। উদাহরণস্বরূপ এই উত্তরটি (এবং প্রশ্ন) দেখুন: প্রোগ্রামারস.সটাকেক্সচেঞ্জ
২৮৮153/122079

7
অবশ্যই. রানটাইমে নতুন ক্লাস তৈরির সাথে জড়িত যে কোনও প্যাটার্ন উদাহরণস্বরূপ। (এটি জাভাতেও সম্ভব, তবে সি ++ তে নয়; গতিশীলতার একটি সহচরী স্কেল রয়েছে)।
ব্যবহারকারী 253751

1
এটি আপনার টাইপ সিস্টেমটি কতটা পরিশীলিত তার উপর অনেকটা নির্ভর করবে :-) কার্যকরী ভাষা সাধারণত এটিতে বেশ ভাল করে good
বার্গি

1
প্রত্যেকে হাসকেল বা ওসিএএমএল এর পরিবর্তে জাভা এবং সি # এর মতো টাইপ সিস্টেমে কথা বলে মনে হচ্ছে। একটি শক্তিশালী টাইপ সিস্টেম সহ একটি ভাষা গতিশীল ভাষার মতো সংক্ষিপ্ত হতে পারে তবে ধরণের সুরক্ষা রাখতে পারে।
অ্যান্ড্রু বলেছেন মোনিকা

@ ইমিবিস এটি ভুল। স্ট্যাটিক টাইপ সিস্টেমগুলি রান-টাইমে একেবারে নতুন, "ডায়নামিক" ক্লাস তৈরি করতে পারে। প্রোগ্রামিং ভাষার জন্য ব্যবহারিক ভিত্তির অধ্যায় 33 দেখুন।
গার্ডেনহেড

উত্তর:


4

প্রথম শ্রেণির প্রকার

ডায়নামিক টাইপিংয়ের অর্থ আপনার প্রথম-শ্রেণীর প্রকার রয়েছে: আপনি রানটাইমের সময় ভাষার নিজস্ব প্রকারগুলি সহ পরীক্ষা-নিরীক্ষা করতে, তৈরি করতে এবং সংরক্ষণ করতে পারেন। এর অর্থ হ'ল মানগুলি টাইপ করা হয়, ভেরিয়েবল নয় ।

স্ট্যাটিকালি টাইপ করা ভাষা এমন কোড তৈরি করতে পারে যা গতিশীল ধরণের উপরও নির্ভর করে, যেমন পদ্ধতি প্রেরণ, টাইপ ক্লাস ইত্যাদি but তবে এমনভাবে যা রানটাইমের কাছে সাধারণত অদৃশ্য। সর্বোপরি, তারা আপনাকে অন্তর্মুখি সম্পাদনের জন্য কিছু উপায় দেয়। বিকল্পভাবে, আপনি মানগুলি হিসাবে ধরণগুলি অনুকরণ করতে পারেন তবে তারপরে আপনার একটি অ্যাড-হক ডায়নামিক টাইপ সিস্টেম রয়েছে।

তবে ডায়নামিক টাইপ সিস্টেমে খুব কমই কেবল প্রথম-শ্রেণীর প্রকার থাকে। আপনার কাছে প্রথম শ্রেণির প্রতীক, প্রথম শ্রেণির প্যাকেজ, প্রথম শ্রেণির .... সব কিছু থাকতে পারে। এটি সংযোজকটির ভাষা এবং স্ট্যাটিকালি টাইপ করা ভাষায় রানটাইম ভাষার মধ্যে পৃথকীকরণের বিপরীতে। সংকলক বা দোভাষা রানটাইম করতে পারে তাও করতে পারে।

এখন, আসুন সম্মত হন যে প্রকারের অনুক্রমটি একটি ভাল জিনিস এবং এটি আমার কোডটি চালানোর আগে পরীক্ষা করে নেওয়া পছন্দ করি। যাইহোক, আমি রানটাইম সময়ে কোড উত্পাদন এবং সংকলন করতে সক্ষম হতে পছন্দ করি। এবং আমি কম্পাইল-সময়ে জিনিসগুলি পূর্ববর্তী করতে পছন্দ করি। গতিশীলভাবে টাইপ করা ভাষায়, এটি একই ভাষা দিয়ে করা হয়। ওসিএএমএলে আপনার মডিউল / ফান্টকার টাইপ সিস্টেম রয়েছে, যা মূল টাইপ সিস্টেমের থেকে পৃথক, যা প্রিপ্রসেসর ভাষা থেকে পৃথক। সি ++ তে আপনার টেমপ্লেট ল্যাঙ্গুয়েজ রয়েছে যার মূল ভাষার সাথে কোনও সম্পর্ক নেই যা সাধারণত সম্পাদনের সময় প্রকারভেদে অজ্ঞ থাকে। আর যে জরিমানা ঐ ভাষায় কারণ তারা আরো অনেক কিছুর জন্য চাই না।

শেষ পর্যন্ত, আপনি কী ধরণের সফ্টওয়্যার বিকাশ করতে পারবেন তা বাস্তবে পরিবর্তিত হয় না , তবে আপনি কীভাবে তাদের বিকাশ করতে পারেন এবং তা শক্ত বা না তা প্রকাশের পরিবর্তন ঘটে ।

প্যাটার্নস

গতিশীল ধরণের উপর নির্ভর করে এমন প্যাটার্নগুলি হ'ল নিখরচায় যা গতিশীল পরিবেশের সাথে জড়িত: ওপেন ক্লাস, প্রেরণ, মেমরির উপাত্তগুলির ডাটাবেস, সিরিয়ালাইজেশন ইত্যাদি Simple সাধারণ জিনিসগুলি যেমন জেনেরিক ধারকগুলি কাজ করে কারণ কোনও ভেক্টর এটির ধরণের অবজেক্টগুলির ধরণ সম্পর্কে রানটাইমে ভুলে যায় না run (প্যারামেট্রিক ধরণের প্রয়োজন নেই)।

আমি প্রচলিত কোডের মূল্যায়ন সাধারণ উপায়ে এবং সম্ভাব্য স্ট্যাটিক বিশ্লেষণের উদাহরণগুলি (এটি এসবিসিএল) উপস্থাপন করার চেষ্টা করেছি। স্যান্ডবক্স উদাহরণটি পৃথক ফাইল থেকে প্রাপ্ত লিস্প কোডের একটি ক্ষুদ্র উপসেটটি সংকলন করে । যুক্তিসঙ্গতভাবে নিরাপদ হওয়ার জন্য, আমি পঠনযোগ্যকে পরিবর্তন করেছি, কেবলমাত্র মানক চিহ্নগুলির একটি উপসেটকে অনুমতি দেই এবং সময়সীমা সহ জিনিসগুলি মোড়ানো করি।

;;
;; Fetching systems, installing them, etc. 
;; ASDF and QL provide provide resp. a Make-like facility 
;; and system management inside the runtime: those are
;; not distinct programs.
;; Reflexivity allows to develop dedicated tools: for example,
;; being able to find the transitive reduction of dependencies
;; to parallelize builds. 
;; https://gitlab.common-lisp.net/xcvb/asdf-dependency-grovel
;;
(ql:quickload 'trivial-timeout)

;;
;; Readtables are part of the runtime.
;; See also NAMED-READTABLES.
;;
(defparameter *safe-readtable* (copy-readtable *readtable*))
(set-macro-character #\# nil t *safe-readtable*)
(set-macro-character #\: (lambda (&rest args)
                           (declare (ignore args))
                           (error "Colon character disabled."))
                     nil
                     *safe-readtable*)

;; eval-when is necessary when compiling the whole file.
;; This makes the result of the form available in the compile-time
;; environment. 
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defvar +WHITELISTED-LISP-SYMBOLS+ 
    '(+ - * / lambda labels mod rem expt round 
      truncate floor ceiling values multiple-value-bind)))

;;
;; Read-time evaluation #.+WHITELISTED-LISP-SYMBOLS+
;; The same language is used to control the reader.
;;
(defpackage :sandbox
  (:import-from
   :common-lisp . #.+WHITELISTED-LISP-SYMBOLS+)
  (:export . #.+WHITELISTED-LISP-SYMBOLS+))

(declaim (inline read-sandbox))

(defun read-sandbox (stream &key (timeout 3))
  (declare (type (integer 0 10) timeout))
  (trivial-timeout:with-timeout (timeout)
    (let ((*read-eval* nil)
          (*readtable* *safe-readtable*)
          ;;
          ;; Packages are first-class: no possible name collision.
          ;;
          (package (make-package (gensym "SANDBOX") :use '(:sandbox))))
      (unwind-protect
           (let ((*package* package))
             (loop
                with stop = (gensym)
                for read = (read stream nil stop)
                until (eq read stop)
                ;;
                ;; Eval at runtime
                ;;
                for value = (eval read)
                ;;
                ;; Type checking
                ;;
                unless (functionp value)
                do (error "Not a function")
                ;; 
                ;; Compile at run-time
                ;;
                collect (compile nil value)))
        (delete-package package)))))

;;
;; Static type checking.
;; warning: Constant 50 conflicts with its asserted type (MOD 11)
;;
(defun read-sandbox-file (file)
  (with-open-file (in file)
    (read-sandbox in :timeout 50)))

;; get it right, this time
(defun read-sandbox-file (file)
  (with-open-file (in file)
    (read-sandbox in)))

#| /tmp/plugin.lisp
(lambda (x) (+ (* 3 x) 100))
(lambda (a b c) (* a b))
|#

(read-sandbox-file #P"/tmp/plugin.lisp")

;; 
;; caught COMMON-LISP:STYLE-WARNING:
;;   The variable C is defined but never used.
;;

(#<FUNCTION (LAMBDA (#:X)) {10068B008B}>
 #<FUNCTION (LAMBDA (#:A #:B #:C)) {10068D484B}>)

উপরের কিছুই অন্য ভাষার সাথে করা "অসম্ভব" নয়। ব্লেন্ডারে প্লাগ-ইন পন্থা, মিউজিক সফ্টওয়্যার বা ফ্লাই রিকম্পিলেশন ইত্যাদি স্ট্যাটিকালি সংকলিত ভাষাগুলির জন্য আইডিইগুলিতে বাইরের সরঞ্জামগুলির পরিবর্তে গতিশীল ভাষাগুলি এমন সরঞ্জামগুলিকে পছন্দ করে যা ইতিমধ্যে উপস্থিত তথ্যের ব্যবহার করে। এফওওর সব পরিচিত কলার? বারের সব সাবক্লাস? ক্লাস ZOT দ্বারা বিশেষায়িত সমস্ত পদ্ধতি? এটি হ'ল অভ্যন্তরীণ তথ্য। প্রকারগুলি এর আরও একটি দিক।


(আরও দেখুন: সিএফএফআই )


39

সংক্ষিপ্ত উত্তর: না, কারণ টিউরিং সমতা।

দীর্ঘ উত্তর: এই লোকটি ট্রল হচ্ছে। যদিও এটি সত্য যে টাইপ সিস্টেমগুলি "আপনাকে একটি উপসেটে সীমাবদ্ধ রাখে", সেই উপসেটের বাইরের স্টাফটি সংজ্ঞা অনুসারে কাজ করে না এমন স্টাফ।

আপনি যে কোনও টিউরিং-সম্পূর্ণ প্রোগ্রামিং ল্যাঙ্গুয়েজে (যা সাধারণ-উদ্দেশ্য প্রোগ্রামিংয়ের জন্য ডিজাইন করা ভাষা, এবং প্রচুর পরিমাণে নয়) এটি করতে সক্ষম হচ্ছেন, এটি পরিষ্কার করার জন্য এটি বেশ কম বার এবং একটি সিস্টেম টুরিং- হওয়ার কয়েকটি উদাহরণ রয়েছে there অনিচ্ছাকৃতভাবে সম্পূর্ণ করুন) আপনি অন্য কোনও টিউরিং-সম্পূর্ণ প্রোগ্রামিং ভাষায় করতে সক্ষম। এটিকে "টিউরিং সমতুল্য" বলা হয় এবং এর অর্থ যা বোঝায় কেবল তার অর্থ। গুরুত্বপূর্ণভাবে, এর অর্থ এই নয় যে আপনি অন্য জিনিসটি অন্য ভাষায় যেমন সহজেই করতে পারেন - কেউ কেউ যুক্তি দেখিয়েছেন যে এটিই প্রথম স্থানটিতে একটি নতুন প্রোগ্রামিং ভাষা তৈরির পুরো বিষয়টি: আপনাকে নির্দিষ্ট কিছু করার আরও ভাল উপায় দেওয়ার জন্য বিদ্যমান ভাষাগুলি এমন জিনিসগুলিকে চুষে ফেলে।

একটি গতিশীল টাইপ সিস্টেম, উদাহরণস্বরূপ, সমস্ত ভেরিয়েবল, প্যারামিটার এবং রিটার্ন মানগুলি বেস Objectটাইপ হিসাবে ঘোষণা করে এবং তারপরে নির্দিষ্ট ডেটা অ্যাক্সেস করার জন্য প্রতিবিম্ব ব্যবহার করে স্ট্যাটিক ওও টাইপ সিস্টেমের শীর্ষে অনুকরণ করা যায়, সুতরাং যখন আপনি এটি উপলব্ধি করেন আপনি দেখতে পাচ্ছেন যে গতিশীল ভাষায় আপনি আক্ষরিক কিছুই করতে পারবেন না যা আপনি অচল ভাষায় করতে পারবেন না। তবে সেভাবে করা অবশ্যই একটি বিশাল গণ্ডগোল হবে।

উদ্ধৃতিটির লোকটি সঠিক যে স্থির ধরনের আপনি যা করতে পারেন তা সীমাবদ্ধ করে তবে এটি একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, সমস্যা নয়। রাস্তার লাইনগুলি আপনি নিজের গাড়িতে যা করতে পারেন তা সীমাবদ্ধ করে তবে আপনি সেগুলি প্রতিবন্ধী বা সহায়ক বলে মনে করেন? (আমি জানি যে আমি কোনও ব্যস্ত, জটিল রাস্তায় গাড়ি চালাতে চাই না যেখানে গাড়িগুলি তাদের পাশের দিকে রাখার জন্য বিপরীত দিকে যেতে বলছে না এবং যেখানে আমি গাড়ি চালাচ্ছি সেদিকে না আসুন!) এমন বিধিগুলি স্থাপন করে যা স্পষ্টভাবে বর্ণনা করেছে যে অবৈধ আচরণ হিসাবে বিবেচিত এবং তা নিশ্চিত হবে না যে, আপনি একটি বাজে ক্র্যাশ হওয়ার সম্ভাবনা হ্রাস করে।

এছাড়াও, তিনি অন্যদিকে ভুল পথে চালাচ্ছেন। এটি এমন নয় যে "আপনি যে সমস্ত আকর্ষণীয় প্রোগ্রাম লিখতে চান তা টাইপ হিসাবে কাজ করবে", বরং "আপনি যে সমস্ত আকর্ষণীয় প্রোগ্রাম লিখতে চান তাতে ধরণের প্রয়োজন হবে ।" জটিলতার একটি নির্দিষ্ট স্তরের বাইরে গেলে, দুটি কারণে আপনাকে লাইনে রাখার জন্য টাইপ সিস্টেম ব্যতীত কোডবেস বজায় রাখা খুব কঠিন হয়ে যায়।

প্রথমত, কারণ কোনও প্রকার টিকা নেই এমন কোডটি পড়া শক্ত। নিম্নলিখিত পাইথন বিবেচনা করুন:

def sendData(self, value):
   self.connection.send(serialize(value.someProperty))

আপনি কীভাবে ডেটা দেখতে দেখতে প্রত্যাশা করবেন যে সংযোগের অন্য প্রান্তের সিস্টেমটি পায়? এবং যদি এটি এমন কোনও কিছু পেয়ে থাকে যা পুরোপুরি ভুল দেখায়, কী হচ্ছে তা কীভাবে আপনি আবিষ্কার করবেন?

এটি সব কাঠামোর উপর নির্ভর করে value.someProperty। তবে দেখতে কেমন লাগে? ভাল প্রশ্ন! কি ডাকছে sendData()? এটা কি পাস? সেই পরিবর্তনশীলটি দেখতে কেমন? এটা কোথা থেকে এসেছে? যদি এটি স্থানীয় না হয় তবে valueকী চলছে তা ট্র্যাক করার জন্য আপনাকে পুরো ইতিহাসটি সন্ধান করতে হবে। হতে পারে আপনি অন্য কোনও কিছু দিয়ে যাচ্ছেন যার একটি somePropertyসম্পত্তি আছে তবে এটি যা মনে করে তা তা করে না?

এখন এটি টাইপ টীকাগুলির সাথে দেখুন, যেমন আপনি বু ভাষায় দেখতে পাবেন, যা খুব অনুরূপ সিনট্যাক্স ব্যবহার করে তবে স্ট্যাটিকালি টাইপ করা হয়:

def SendData(value as MyDataType):
   self.Connection.Send(Serialize(value.SomeProperty))

যদি কোনও সমস্যা হয়ে থাকে, হঠাৎ আপনার ডিবাগিংয়ের কাজটি কেবল মাত্রার একটি সহজ আদেশ পেয়েছে: এর সংজ্ঞাটি দেখুন MyDataType! এছাড়াও, খারাপ আচরণ হওয়ার সম্ভাবনা কারণ আপনি কিছু অসম্পূর্ণ প্রকারটি পাশ করেছেন যা একই নামে সম্পত্তি রয়েছে হঠাৎ শূন্যে চলে যায়, কারণ টাইপ সিস্টেম আপনাকে ভুল করতে দেয় না।

দ্বিতীয় কারণটি প্রথমটিতে তৈরি করে: একটি বৃহত এবং জটিল প্রকল্পে, আপনি সম্ভবত একাধিক অবদানকারী পেয়েছেন। (এবং যদি তা না হয় তবে আপনি এটি নিজেকে দীর্ঘ সময় ধরে গড়ে তুলছেন, যা মূলত একই জিনিস 3 বছর আগে আপনি লিখেছেন কোডটি পড়ার চেষ্টা করুন আপনি যদি বিশ্বাস না করেন!) এর অর্থ হল আপনি জানেন না কী ছিল সেই ব্যক্তির মাথার মধ্য দিয়ে যাচ্ছেন যে তারা কোডটি লেখার সময় প্রায় কোনও অংশই লিখেছিল, কারণ আপনি সেখানে ছিলেন না, বা মনে রাখবেন না এটি অনেক আগে আপনার নিজের কোড ছিল কিনা। প্রকারের ঘোষণাপত্রগুলি আপনাকে কোডটির উদ্দেশ্য কী তা বুঝতে সাহায্য করে!

উদ্ধৃতিতে থাকা লোকটির মতো লোকেরা প্রায়শই সীমাহীন হার্ডওয়্যার রিসোর্সগুলিকে এমন একটি পৃথিবীতে "সংকলককে সহায়তা করা" বা "দক্ষতার বিষয়ে সমস্ত কিছু" হিসাবে স্ট্যাটিক টাইপিংয়ের সুবিধাগুলির সম্পর্কে দুর্ব্যবহার করে। তবে আমি যেমনটি দেখিয়েছি, যদিও এই সুবিধাগুলি অবশ্যই রয়েছে তবে প্রাথমিক উপকারটি হ'ল মানব উপাদানসমূহ, বিশেষত কোড পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের ক্ষেত্রে। (যুক্ত দক্ষতা অবশ্যই একটি দুর্দান্ত বোনাস, যদিও!)


24
"এই লোকটি ট্রল হচ্ছে" " - আমি নিশ্চিত নই যে কোনও বিজ্ঞাপন হোমিনেম আক্রমণ আপনার অন্যথায় ভালভাবে উপস্থাপিত ক্ষেত্রে সহায়তা করবে। এবং যদিও আমি ভাল করেই জানি যে কর্তৃপক্ষের পক্ষ থেকে যুক্তিটি অ্যাড হোমনেমের মতো সমান ত্রুটিপূর্ণ ত্রুটিযুক্ত তবুও আমি এটি উল্লেখ করতে চাই যে গিলাদ ব্রাচা সম্ভবত বেশিরভাগ ভাষা এবং (এই আলোচনার জন্য সর্বাধিক প্রাসঙ্গিক) বেশিরভাগ স্থিতিশীল ধরণের সিস্টেমগুলি তৈরি করেছেন। একটি ছোট অংশ: তিনি নিউজপিয়াকের একমাত্র ডিজাইনার, ডার্টের সহ-ডিজাইনার, জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন এবং জাভা ভার্চুয়াল মেশিন স্পেসিফিকেশনের সহ-লেখক, জাভা এবং জেভিএমের নকশায় কাজ করেছেন, ডিজাইন করেছেন ...
জার্গ ডব্লু মিটাগ

10
স্ট্রংটালক (স্মলটালকের জন্য একটি স্ট্যাটিক টাইপ সিস্টেম), ডার্ট টাইপ সিস্টেম, নিউজপ্যাক টাইপ সিস্টেম, তার আধুনিকতার উপর পিএইচডি থিসিস প্রতিটি আধুনিক মডিউল সিস্টেমের ভিত্তি (যেমন জাভা 9, ইসমাস্ক্রিপ্ট 2015, স্কালা, ডার্ট, নিউজপ্যাক, আইওকে) , সেফ), মিক্সিন সম্পর্কিত তাঁর কাগজগুলি সেগুলি সম্পর্কে আমরা কীভাবে চিন্তা করি সেভাবে বিপ্লব ঘটায়। এখন, যে নেই না মানে সে অধিকার, কিন্তু আমি না পরিকল্পিত থাকার একাধিক স্ট্যাটিক টাইপ ব্যবস্থা তাকে একটি বিট আরো তোলে একটি "দানব" চেয়ে মনে হয়।
Jörg ডব্লু মিটাগ

17
"যদিও এটি সত্য যে টাইপ সিস্টেমগুলি" আপনাকে একটি উপসেটে সীমাবদ্ধ করে, "সেই উপসেটের বাইরের স্টাফটি সংজ্ঞা অনুসারে কাজ করে না এমন জিনিস" " - এটা ভুল. আমরা হ্যালটিং সমস্যার অনিশ্চয়তা, ধানের উপপাদ্য এবং অন্যান্য অনিশ্চয়তা এবং অবিচ্ছেদের ফলাফলের অজানা ফলাফল থেকে জানি যে স্ট্যাটিক প্রকারের পরীক্ষক সেগুলি টাইপ-সেফ বা টাইপ-অনিরাপদ কিনা তা সব প্রোগ্রামের জন্য সিদ্ধান্ত নিতে পারে না। এটি সেই প্রোগ্রামগুলি গ্রহণ করতে পারে না (এর মধ্যে কয়েকটি টাইপ-অনিরাপদ), সুতরাং কেবলমাত্র বুদ্ধিমান পছন্দ হ'ল এগুলিকে প্রত্যাখ্যান করা (তবে এর মধ্যে কয়েকটি টাইপ-নিরাপদ)। বিকল্পভাবে, ভাষাটি ডিজাইন করতে হবে ...
জার্গ ডব্লু মিতাগ

9
... প্রোগ্রামার পক্ষে সেই অঘটনীত প্রোগ্রামগুলি লিখতে অসম্ভব করে দেওয়ার উপায়, তবে আবার, সেগুলির মধ্যে কিছু আসলে টাইপ-নিরাপদ। সুতরাং, আপনি এটি কীভাবে টুকরো টুকরো টুকরো টানুন না কেন: প্রোগ্রামারকে টাইপ-নিরাপদ প্রোগ্রামগুলি লেখার হাত থেকে বাধা দেওয়া হয়। এবং যেহেতু সেখানে প্রকৃতপক্ষে অসীম অনেকগুলি রয়েছে (সাধারণত) তাই আমরা প্রায় নিশ্চিত হতে পারি যে তাদের মধ্যে কমপক্ষে কিছুগুলি কেবল কাজ করে না এমন জিনিসগুলিই দরকারী, তবে দরকারীও।
Jörg ডব্লু মিটাগ

8
@ ম্যাসনভিয়েল: স্থিতিশীল প্রকারের পরীক্ষার প্রসঙ্গে যথাযথভাবে হ্যালটিং সমস্যাটি উপস্থিত হয়। প্রোগ্রামারকে নির্দিষ্ট ধরণের প্রোগ্রাম লিখতে বাধা দেওয়ার জন্য যদি ভাষা সাবধানে ডিজাইন করা না হয়, স্থির প্রকারের পরীক্ষা করা দ্রুত হ্যালটিং সমস্যা সমাধানের সমতুল্য হয়ে ওঠে। হয় আপনি যে প্রোগ্রামগুলিকে লেখার অনুমতি নেই তা লেখার অনুমতি নেই কারণ তারা টাইপ চেকারকে বিভ্রান্ত করতে পারে বা আপনি যে প্রোগ্রামগুলি লেখার জন্য অনুমতিপ্রাপ্ত হন তা শেষ করেন তবে তারা চেক টাইপ করতে অসীম সময় নেয়।
Jörg ডব্লু মিটাগ

27

আমি 'প্যাটার্ন' অংশটি একপাশে যাচ্ছি কারণ আমি মনে করি এটি কোন প্যাটার্নটি কী বা কী নয় এর সংজ্ঞায় রূপান্তরিত হয় এবং আমি সেই বিতর্কের প্রতি আগ্রহ হারিয়ে ফেলেছি। আমি যা বলব তা হ'ল এমন কিছু জিনিস রয়েছে যা আপনি কিছু ভাষায় করতে পারেন যা আপনি অন্যের মধ্যে করতে পারেন না। আমাকে পরিষ্কার হতে দিন, আমি বলছি না যে এমন সমস্যা রয়েছে যা আপনি এক ভাষায় সমাধান করতে পারেন যা আপনি অন্য ভাষায় সমাধান করতে পারবেন না। ম্যাসন ইতিমধ্যে টুরিংয়ের সম্পূর্ণতা নির্দেশ করেছেন।

উদাহরণস্বরূপ, আমি পাইগনে একটি ক্লাস লিখেছি যা একটি এক্সএমএল ডোম উপাদান জড়ায় এবং এটি প্রথম শ্রেণীর বস্তুতে পরিণত করে। এটি হল, আপনি কোডটি লিখতে পারেন:

doc.header.status.text()

পার্স করা এক্সএমএল অবজেক্ট থেকে আপনার সেই পথের বিষয়বস্তু রয়েছে। পরিষ্কার পরিচ্ছন্ন, আইএমও। এবং যদি কোনও মাথা নোড না থাকে তবে এটি কেবল একটি ডামি অবজেক্টগুলিকে ফিরিয়ে দেয় যা ডামি অবজেক্টগুলি ব্যতীত কিছুই নেই (সমস্ত ভাবে কচ্ছপ হয়)) জাভাতে এটি করার কোনও আসল উপায় নেই। এক্সএমএলটির কাঠামোর কিছু জ্ঞানের ভিত্তিতে আপনাকে সময়ের আগে একটি ক্লাস তৈরি করতে হবে। এটি একটি ভাল ধারণা কিনা তা বাদ দিয়ে এই ধরণের জিনিসটি আপনার গতিময় ভাষায় সমস্যাগুলি সমাধান করার উপায়টিকে সত্যিই পরিবর্তন করে। আমি বলছি না যে এটি এমনভাবে পরিবর্তিত হয় যা অগত্যা সবসময় আরও ভাল is গতিশীল পদ্ধতির জন্য কয়েকটি নির্দিষ্ট ব্যয় রয়েছে এবং ম্যাসনের উত্তরটি একটি শালীন ওভারভিউ দেয়। তারা ভাল পছন্দ কিনা তা অনেক কারণের উপর নির্ভর করে।

একটি পার্শ্ব নোট অন, আপনি করতে পারেন জাভা এই কাজ কারণ আপনি একটি নির্মাণ করতে পারেন জাভা পাইথন ইন্টারপ্রেটার । নির্দিষ্ট ভাষায় একটি নির্দিষ্ট সমস্যা সমাধানের অর্থ দোভাষী বা এর সদৃশ কিছু তৈরির অর্থ হতে পারে যখন লোকেরা টুরিং সম্পূর্ণতার বিষয়ে কথা বলেন তখন প্রায়শই তা উপেক্ষা করা হয়।


4
আপনি জাভাতে এটি করতে পারবেন না কারণ জাভা খুব খারাপভাবে ডিজাইন করা হয়েছে। এটি ব্যবহার করা সি # তে এত কঠিন হবে না IDynamicMetaObjectProvider, এবং এটি বু-তে মারা গেছে। ( এখানে গিটহাবের স্ট্যান্ডার্ড উত্স গাছের অংশ হিসাবে অন্তর্ভুক্ত 100 টিরও কম লাইনের একটি বাস্তবায়ন , কারণ এটি এত সহজ!)
ম্যাসন হুইলার

6
@ ম্যাসনওহেলার "IDynamicMetaObjectProvider"? এটি কি সি # এর dynamicকীওয়ার্ডের সাথে সম্পর্কিত ? ... যা কার্যকরভাবে কেবল সি # তে গতিশীল টাইপিংয়ের উপর নির্ভর করে? আমি সঠিক হলে আপনার যুক্তি বৈধ কিনা তা নিশ্চিত নন।
jpmc26

9
@ ম্যাসনওহিলার আপনি শব্দার্থবিজ্ঞানের মধ্যে পড়ছেন। মিনটিয়া সম্পর্কে বিতর্ক না করে (আমরা এখানে এসই-তে গাণিতিক আনুষ্ঠানিকতা বিকাশ করছি না), গতিশীল টাইপিং হ'ল প্রকারগুলি সম্পর্কে পূর্ববর্তী সময়কালীন সিদ্ধান্তের অনুশীলন, বিশেষত যাচাইকরণ যা প্রতিটি ধরণের নির্দিষ্ট সদস্যদের প্রোগ্রামটি প্রবেশ করে। এটি dynamicসি # তে লক্ষ্য অর্জন করে। "প্রতিবিম্ব এবং অভিধানের অনুসন্ধানগুলি" রানটাইম সময়ে ঘটে, সংকলনের সময় নয়। আমি সত্যিই নিশ্চিত নই যে আপনি কীভাবে একটি কেস তৈরি করতে পারেন যা এটি ভাষায় ডায়নামিক টাইপ যুক্ত করে না । আমার বক্তব্যটি হ'ল জিমির শেষ অনুচ্ছেদে এটি অন্তর্ভুক্ত।
jpmc26

44
জাভার বিশাল অনুরাগী না হওয়া সত্ত্বেও, আমিও সাহস করে বলতে পারি যে জাভাটিকে "খারাপভাবে নকশাকৃত" বলা বিশেষত কারণ এটি গতিশীল টাইপিং যুক্ত করে নি ... অত্যধিক সংবেদনশীল।
jpmc26

5
সামান্য আরও সুবিধাজনক বাক্য গঠন ছাড়াও এটি অভিধান থেকে কীভাবে আলাদা?
থিওডোরোস চ্যাটজিগিয়ানানাকিস

10

উক্তিটি সঠিক, তবে সত্যই সংক্ষিপ্ত। আসুন এটিকে ভেঙে দেখি কেন:

ডায়নামিক টাইপিংয়ের দুর্দান্ত জিনিসটি হ'ল এটি আপনাকে গণনাযোগ্য এমন কোনও কিছু প্রকাশ করতে দেয়।

ভাল, বেশ না। ডায়নামিক টাইপিংয়ের সাথে একটি ভাষা আপনাকে যতক্ষণ না এটির টিউরিং সম্পূর্ণ হয় , ততক্ষণ যা কিছু প্রকাশ করতে দেয় which টাইপ সিস্টেম নিজেই আপনাকে সমস্ত কিছু প্রকাশ করতে দেয় না। আসুন তবে তাকে এখানে সন্দেহের সুবিধা দিন।

এবং টাইপ সিস্টেমগুলি নয় - টাইপ সিস্টেমগুলি সাধারণত নির্ধারণযোগ্য এবং তারা আপনাকে একটি উপসেটে সীমাবদ্ধ করে।

এটি সত্য, তবে লক্ষ্য করুন যে আমরা এখন দৃ firm়তার সাথে টাইপ সিস্টেমটি কী অনুমতি দেয় তা নিয়ে কথা বলছি , কোনও টাইপ সিস্টেম ব্যবহার করে এমন ভাষা ব্যবহার করে না । সংকলনের সময় স্টাফ গণনা করতে কোনও টাইপ সিস্টেম ব্যবহার করা সম্ভব হলেও এটি সাধারণত টুরিং সম্পূর্ণ হয় না (যেমন টাইপ সিস্টেমটি সাধারণত নির্ধারিত হয়) তবে প্রায় কোনও স্থিতিকভাবে টাইপ করা ভাষাও তার রানটাইমে সম্পূর্ণ টুরিং হয় (নির্ভরশীলভাবে টাইপ করা ভাষাগুলি হয়) না, তবে আমি বিশ্বাস করি না যে আমরা এখানে তাদের সম্পর্কে কথা বলছি)।

স্ট্যাটিক টাইপ সিস্টেমগুলির পক্ষে থাকা লোকেরা বলে "এটি ভাল, এটি যথেষ্ট ভাল; আপনি যে আকর্ষণীয় প্রোগ্রামগুলি লিখতে চান তা ধরণের হিসাবে কাজ করবে "। তবে এটি হাস্যকর - একবার আপনার টাইপ সিস্টেম পরে গেলে আপনি কী কী মজাদার প্রোগ্রামগুলি তা জানেন না।

সমস্যাটি হ'ল ডায়নামিকালি টাইপ করা ভাষাগুলির স্ট্যাটিক টাইপ থাকে। কখনও কখনও সবকিছু স্ট্রিং হয় এবং আরও সাধারণভাবে কিছু ট্যাগযুক্ত ইউনিয়ন থাকে যেখানে প্রতিটি জিনিস হয় সম্পত্তিগুলির একটি ব্যাগ বা কোনও আন্ত বা ডাবলের মতো মান। সমস্যাটি হ'ল স্থির ভাষাগুলিও এটি করতে পারে, historতিহাসিকভাবে এটি করা কিছুটা জটিল ছিল, তবে আধুনিক স্ট্যাটিক্যালি টাইপ করা ভাষাগুলি গতিশীল টাইপের ভাষা ব্যবহার করার মতো করে তুলনামূলকভাবে সহজ করে তোলে, তবে কীভাবে পার্থক্য থাকতে পারে? প্রোগ্রামার একটি আকর্ষণীয় প্রোগ্রাম হিসাবে দেখতে পারেন কি? স্ট্যাটিক ভাষাগুলিতে ঠিক একই রকম ট্যাগযুক্ত ইউনিয়ন এবং অন্যান্য ধরণের রয়েছে।

শিরোনামে প্রশ্নের উত্তর দেওয়ার জন্য: না, এমন কোনও নকশার নিদর্শন নেই যা স্থিরভাবে টাইপ করা ভাষায় প্রয়োগ করা যায় না, কারণ আপনি এগুলি পেতে সর্বদা যথেষ্ট গতিশীল সিস্টেম প্রয়োগ করতে পারেন। গতিশীল ভাষায় আপনি 'ফ্রি' এর জন্য পান এমন নিদর্শন থাকতে পারে; এই বা জন্য ঐ ভাষার মূল্যবান আপ নির্বাণ অধিকারী না হতে পারে YMMV


2
আপনি কেবল হ্যাঁ বা না উত্তর দিয়েছেন কিনা তা সম্পর্কে আমি নিশ্চিত নই। আমার কাছে আর না বলে মনে হচ্ছে।
ব্যবহারকারী 7610

1
@ থিডোরোস চ্যাটিজিগিয়ানানাকিস হ্যাঁ, আর কীভাবে গতিশীল ভাষা প্রয়োগ করা হবে? প্রথমত, আপনি কোনও মহাকাশচারী স্থপতি হয়ে যাবেন যদি আপনি কখনও ডায়নামিক ক্লাস সিস্টেম বা অন্য কোনও কিছু জড়িত প্রয়োগ করতে চান। দ্বিতীয়ত, সম্ভবত এটির ডিবাজযোগ্য, পুরোপুরি আত্ম-পরিবেশনযোগ্য, পারফরম্যান্ট করার সংস্থান আপনার কাছে নেই (ধীরে ধীরে কীভাবে ভাষা প্রয়োগ করা হয় তা "কেবল একটি অভিধান ব্যবহার করুন")। তৃতীয়ত, কিছু গতিশীল বৈশিষ্ট্য শ্রেষ্ঠ যখন শুধু একটি লাইব্রেরি রূপে পুরো ভাষায় একত্রিত হচ্ছে, ব্যবহৃত হয়: মনে উদাহরণস্বরূপ আবর্জনা সংগ্রহ (সেখানে হয় লাইব্রেরি হিসাবে GCs, কিন্তু তারা সাধারণত ব্যবহার করা হয় না)।
coredump

1
@ থিডোরোস আমি ইতিমধ্যে এখানে লিঙ্কযুক্ত কাগজ অনুসারে, 2.5% কাঠামো ছাড়া (পাইথন মডিউলগুলিতে গবেষণাগুলি দেখেছি) সহজেই টাইপ করা ভাষায় প্রকাশ করা যেতে পারে। সম্ভবত 2.5% গতিশীল টাইপিংয়ের জন্য মূল্য প্রদান করে। এটাই মূলত আমার প্রশ্নটি সম্পর্কে ছিল। neverworkintheory.org/2016/06/13/polymorphism-in-python.html
user7610

3
@ জিরিডানেক যতদূর আমি বলতে পারি, এমন কোনও কিছুই নেই যা স্থিরভাবে টাইপ করা ভাষাকে পলিমারফিক কল স্পট থাকতে এবং প্রক্রিয়াটিতে স্থির টাইপিং বজায় রাখতে বাধা দেয়। মাল্টি-মেথডগুলির স্ট্যাটিক টাইপ চেকিং দেখুন । হতে পারে আমি আপনার লিঙ্কটি ভুল বুঝছি।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

1
"গতিশীল টাইপিংয়ের সাথে একটি ভাষা আপনাকে ত্যুরিংয়ের সম্পূর্ণ হওয়া অবধি যেকোন কিছু প্রকাশ করতে দেয় যা বেশিরভাগটি হয়" "এটি অবশ্যই সত্য বক্তব্য হলেও এটি সত্যই " সত্যিকারের জগতকে "ধরে রাখতে পারে না কারণ পাঠ্যটির পরিমাণ আছে লেখার জন্য অত্যন্ত বড় হতে পারে।
ড্যানিয়েল জোর

4

এমন কিছু জিনিস রয়েছে যা আপনি কেবল গতিময় টাইপ করা ভাষায় করতে পারেন। তবে তারা অগত্যা ভাল ডিজাইন হবে না ।

আপনি প্রথমে একটি পূর্ণসংখ্যা 5 নির্ধারণ করতে পারেন তারপরে একটি স্ট্রিং 'five'বা কোনও Catঅবজেক্ট একই ভেরিয়েবলের জন্য। তবে আপনি কেবল আপনার কোডের পাঠকের পক্ষে কী ঘটছে, প্রতিটি ভেরিয়েবলের উদ্দেশ্য কী তা নির্ধারণের জন্য এটি আরও শক্ত করে তুলছেন।

আপনি একটি লাইব্রেরি রুবি শ্রেণিতে একটি নতুন পদ্ধতি যুক্ত করতে পারেন এবং এর ব্যক্তিগত ক্ষেত্রগুলি অ্যাক্সেস করতে পারেন। এমন কেস থাকতে পারে যেখানে এই ধরনের হ্যাক কার্যকর হতে পারে তবে এটি এনক্যাপসুলেশন লঙ্ঘন হতে পারে। (কেবলমাত্র পাবলিক ইন্টারফেসের উপর নির্ভরশীল পদ্ধতিগুলি যুক্ত করা আমার আপত্তি নেই, তবে এটি এমন কিছু নয় যা স্ট্যাটিকালি টাইপ করা সি # এক্সটেনশন পদ্ধতিগুলি করতে পারে না))

এর সাথে আরও কিছু অতিরিক্ত ডেটা পাস করার জন্য আপনি কারও ক্লাসের একটি অবজেক্টে একটি নতুন ক্ষেত্র যুক্ত করতে পারেন। তবে কেবলমাত্র একটি নতুন কাঠামো তৈরি করতে, বা মূল ধরণের প্রসারিত করার জন্য এটি আরও ভাল নকশা।

সাধারণত, আপনি আপনার কোডটি যত বেশি সংগঠিত রাখতে চান, তত পরিবর্তনশীল টাইপ সংজ্ঞা পরিবর্তন করতে বা একই ধরণের বিভিন্ন ধরণের মান নির্ধারণ করতে সক্ষম হওয়া থেকে আপনার কম সুবিধা নেওয়া উচিত। তবে আপনার কোডটি স্থিতিযুক্ত টাইপিত ভাষায় আপনি কী অর্জন করতে পারেন তার থেকে আলাদা নয়।

গতিশীল ভাষাগুলিতে কোনটি ভাল, তা হ'ল সিনট্যাকটিক চিনি। উদাহরণস্বরূপ, একটি ডিসিরিয়ালাইজড জেএসওএন অবজেক্ট পড়ার সময় আপনি নীড়যুক্ত মানটিকে কেবল হিসাবে উল্লেখ করতে পারেন obj.data.article[0].content- বলার চেয়ে অনেক বেশি পরিষ্কার obj.getJSONObject("data").getJSONArray("article").getJSONObject(0).getString("content")

রুবি ডেভেলপাররা বিশেষত যাদুবিদ্যার বিষয়ে দীর্ঘক্ষণ কথা বলতে পারেন method_missingযা বাস্তবায়নের মাধ্যমে অর্জন করা যায় , এটি এমন একটি পদ্ধতি যা আপনাকে অঘোষিত পদ্ধতিতে চেষ্টার কলগুলি পরিচালনা করতে দেয়। উদাহরণস্বরূপ, অ্যাক্টিভেকর্ড ওআরএম এটি ব্যবহার করে যাতে আপনি কোনও পদ্ধতি User.find_by_email('joe@example.com')ঘোষণা না করেই কল করতে পারেন find_by_email। অবশ্যই এটি এমন কিছু নয় যা UserRepository.FindBy("email", "joe@example.com")স্থিরভাবে টাইপিত ভাষায় যেমন অর্জন করা যায়নি তবে আপনি এটির ঝরঝরে অস্বীকার করতে পারবেন না।


4
এমন কিছু জিনিস রয়েছে যা আপনি কেবল স্থিতিযুক্ত টাইপ করা ভাষায় করতে পারেন। তবে তারা অগত্যা ভাল ডিজাইন হবে না।
coredump

2
সিনট্যাকটিক চিনির বিষয়ে বিন্দুটি ডায়নামিক টাইপিং এবং ভাল, সিনট্যাক্সের সাথে খুব সামান্যই আছে।

@ লেফ্ট্রাউন্ডেবাউট প্যাটার্নগুলির সিনট্যাক্সের সাথে সমস্ত কিছুই রয়েছে। টাইপ সিস্টেমগুলির এর সাথেও অনেক কিছু করার আছে।
ব্যবহারকারী 253751

4

ডায়নামিক প্রক্সি প্যাটার্ন হ'ল প্রক্সির জন্য প্রতি প্রকারের এক শ্রেণির প্রয়োজন ছাড়াই প্রক্সি অবজেক্টগুলি বাস্তবায়নের জন্য একটি শর্টকাট।

class Proxy(object):
    def __init__(self, obj):
        self.__target = obj

    def __getattr__(self, attr):
        return getattr(self.__target, attr)

এটি ব্যবহার Proxy(someObject)করে, একটি নতুন অবজেক্ট তৈরি করে যা একইরকম আচরণ করেsomeObject । স্পষ্টতই আপনি কোনওভাবে অতিরিক্ত কার্যকারিতা যুক্ত করতে চাইবেন তবে এটি থেকে কার্যকর ভিত্তি। একটি সম্পূর্ণ অচল ভাষায়, আপনি প্রক্সি করতে চান প্রতি প্রকারের জন্য একটি প্রক্সি ক্লাস লিখতে হবে বা ডায়নামিক কোড জেনারেশন ব্যবহার করতে হবে (যা স্বীকার করে বলা যায় যে অনেকগুলি স্থির ভাষার স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত রয়েছে, মূলত কারণ তাদের ডিজাইনাররা অবগত আছেন সমস্যাগুলি এই কারণে করতে সক্ষম হচ্ছে না)।

গতিশীল ভাষার আর একটি ব্যবহারের ক্ষেত্রে তথাকথিত "বানর প্যাচিং"। বিভিন্ন উপায়ে, এটি কোনও প্যাটার্নের পরিবর্তে একটি অ্যান্টি-প্যাটার্ন, তবে সাবধানতার সাথে করা হলে এটি দরকারী উপায়ে ব্যবহার করা যেতে পারে। এবং যদিও কোনও তাত্ত্বিক কারণ নেই যেখানে বাঁদর প্যাচিং কোনও স্থির ভাষায় প্রয়োগ করা যায়নি, আমি বাস্তবে এটি কখনও দেখিনি।


আমি মনে করি আমি গোতে এটি অনুকরণ করতে সক্ষম হতে পারি। এমন একটি পদ্ধতির সেট রয়েছে যা সমস্ত প্রক্সাইড অবজেক্টের অবশ্যই থাকতে হবে (অন্যথায় হাঁসের কোঁক না ফেলা হতে পারে এবং সমস্ত আলাদা হয়ে যায়)। আমি এই পদ্ধতিগুলির সাথে একটি গো ইন্টারফেস তৈরি করতে পারি। আমাকে এ সম্পর্কে আরও চিন্তা করতে হবে, তবে আমি মনে করি আমার মনে যা আছে তা কাজ করবে।
ব্যবহারকারী 7610

আপনি রিয়েলপ্রক্সি এবং জেনেরিকগুলির সাথে কোনও। নেট ভাষায় অনুরূপ কিছু করতে পারেন।
লিটলইউক

@ লিটলইউক - রিয়েলপ্রক্সি রানটাইম কোড জেনারেশন ব্যবহার করে - যেমন আমি বলি, অনেক আধুনিক স্থির ভাষায় এর মতো কাজ রয়েছে তবে এটি গতিশীল ভাষায় এখনও সহজ।
জুলে

সি # এক্সটেনশন পদ্ধতিগুলি বানর প্যাচিংকে নিরাপদ বানানোর মতো ধরণের। আপনি বিদ্যমান পদ্ধতিগুলি পরিবর্তন করতে পারবেন না, তবে আপনি নতুন যুক্ত করতে পারেন।
অ্যান্ড্রু বলেছেন মোনিকা

3

হ্যাঁ , অনেকগুলি নিদর্শন এবং কৌশল রয়েছে যা কেবলমাত্র গতিশীল টাইপিত ভাষায় সম্ভব।

বানর প্যাচিং এমন একটি কৌশল যা রানটাইমের সময় সম্পত্তি বা পদ্ধতিতে বস্তু বা ক্লাসে যুক্ত করা হয়। স্থিতিযুক্ত টাইপ করা ভাষায় এই কৌশলটি সম্ভব নয় কারণ এর অর্থ টাইপ এবং ক্রিয়াকলাপগুলি সংকলন সময়ে যাচাই করা যায় না। বা অন্য উপায়ে বলতে গেলে, যদি কোনও ভাষা বানর-প্যাচিং সমর্থন করে তবে তা সংজ্ঞা অনুসারে একটি গতিশীল ভাষা।

এটি প্রমাণিত হতে পারে যে কোনও ভাষা যদি বানর প্যাচিংকে সমর্থন করে (বা রানটাইমের সময় প্রকার পরিবর্তন করতে অনুরূপ কৌশলগুলি) তবে এটি স্ট্যাটিকালি টাইপ চেক করা যায় না। সুতরাং এটি বর্তমানে বিদ্যমান ভাষাগুলিতে কেবল সীমাবদ্ধতা নয়, এটি স্ট্যাটিক টাইপিংয়ের মৌলিক সীমাবদ্ধতা।

সুতরাং উদ্ধৃতিটি অবশ্যই সঠিক - স্থিতিযুক্ত ভাষার চেয়ে গতিশীল ভাষায় আরও বেশি কিছু সম্ভব। অন্যদিকে, নির্দিষ্ট ধরণের বিশ্লেষণ কেবলমাত্র স্থিতিযুক্ত ভাষায় সম্ভব। উদাহরণস্বরূপ আপনি সর্বদা জানেন যে প্রদত্ত প্রকারে কোন ক্রিয়াকলাপ অনুমোদিত, যা আপনাকে সংকলন প্রকারে অবৈধ ক্রিয়াকলাপ সনাক্ত করতে দেয়। রানটাইমগুলিতে অপারেশনগুলি যুক্ত করা বা অপসারণ করা যায় এমন কোনও গতিশীল ভাষায় এই জাতীয় যাচাইকরণ সম্ভব নয়।

এই কারণেই স্থির এবং গতিশীল ভাষার মধ্যে দ্বন্দ্বের কোনও সুস্পষ্ট "সেরা" নেই। স্থির ভাষাগুলি সংকলনের সময় বিভিন্ন ধরণের শক্তির বিনিময়ে রানটাইমের সময় নির্দিষ্ট শক্তি ছেড়ে দেয়, যা তারা বিশ্বাস করে যে বাগের সংখ্যা হ্রাস করে এবং উন্নয়নকে সহজ করে তোলে। কেউ কেউ বিশ্বাস করেন যে বাণিজ্য বন্ধের পক্ষে মূল্যবান, অন্যেরা তা করেন না।

অন্যান্য উত্তরগুলি বলেছে যে টিউরিং-ইকুয়ালেন্সের অর্থ একটি ভাষায় যা কিছু সম্ভব সব ভাষায়ই সম্ভব। কিন্তু এটি অনুসরণ করে না। একটি অচল ভাষায় বানর-প্যাচিংয়ের মতো কিছু সমর্থন করার জন্য, আপনাকে মূলত স্থিতিক ভাষার ভিতরে একটি গতিশীল উপ-ভাষা প্রয়োগ করতে হবে। এটি অবশ্যই সম্ভব, তবে আমি যুক্তি দেব যে আপনি তখন একটি এম্বেডেড ডায়নামিক ভাষায় প্রোগ্রামিং করছেন, যেহেতু আপনি হোস্ট ভাষায় বিদ্যমান স্ট্যাটিক টাইপ চেকিংও হারাবেন।

সি # যেহেতু সংস্করণ 4 গতিশীল টাইপ করা অবজেক্টগুলিকে সমর্থন করে # স্পষ্টতই ভাষা ডিজাইনাররা উভয় প্রকারের টাইপিংয়ের ক্ষেত্রে সুবিধা বোধ করেন। তবে এটি এটিও দেখায় যে আপনার কেক থাকতে পারে না এবং আমিও খেতে পারি না: আপনি যখন সি # তে ডায়নামিক অবজেক্ট ব্যবহার করেন আপনি বানর প্যাচিংয়ের মতো কিছু করার ক্ষমতা অর্জন করেন তবে এই বিষয়গুলির সাথে মিথস্ক্রিয়া করার জন্য আপনি স্থির ধরনের বৈধতা যাচাইও করেন।


আপনার দ্বিতীয় থেকে শেষ অনুচ্ছেদে +1 করা আমি মনে করি এটিই একটি গুরুত্বপূর্ণ যুক্তি। আমি এখনও তর্ক করব যে পার্থক্য রয়েছে যদিও স্থির প্রকারের সাথে আপনার কোথায় এবং কীভাবে বানর প্যাচ
জে কে

2

আমি অবাক হই, এমন কোনও দরকারী নকশার নিদর্শন বা কৌশল রয়েছে যা উদ্ধৃতিটির সূত্র ব্যবহার করে "ধরণের হিসাবে কাজ করে না"?

হ্যা এবং না.

এমন একটি পরিস্থিতি রয়েছে যাতে প্রোগ্রামার আরও সংক্ষিপ্ততার সাথে একটি সংকলক সহ একটি পরিবর্তনকের প্রকারটি জানে। সংকলকটি জেনে থাকতে পারে যে কোনও জিনিস একটি অবজেক্ট, তবে প্রোগ্রামার জানতে পারবে (প্রোগ্রামটির আক্রমণকারীদের কারণে) যে এটি আসলে একটি স্ট্রিং।

আমাকে এর কয়েকটি উদাহরণ দেখা যাক:

Map<Class<?>, Function<?, String>> someMap;
someMap.get(object.getClass()).apply(object);

আমি জানি যে someMap.get(T.class)এটি আবার ফিরে আসবে Function<T, String>, কারণ আমি কীভাবে কিছু ম্যাপ তৈরি করেছি। তবে জাভা কেবলমাত্র নিশ্চিত যে আমি একটি ফাংশন পেয়েছি।

আরেকটি উদাহরণ:

data = parseJSON(someJson)
validate(data, someJsonSchema);
print(data.properties.rowCount);

আমি জানি যে ডেটা.প্রপ্রেটিস.্রোকাউন্ট একটি বৈধ রেফারেন্স এবং পূর্ণসংখ্যা হবে, কারণ আমি স্কিমার বিরুদ্ধে ডেটা বৈধ করে দিয়েছি। যদি সেই ক্ষেত্রটি অনুপস্থিত থাকে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলা হত। তবে একটি সংকলক কেবলমাত্র এটিই জানতে পারে যে হয় হয় ব্যতিক্রম ছুঁড়ে ফেলেছে বা জেনেরিক JSONValue কোনও ধরণের প্রদান করে।

আরেকটি উদাহরণ:

x, y, z = struct.unpack("II6s", data)

"II6s" ডেটাটি তিনটি ভেরিয়েবলকে এনকোড করার উপায়টিকে সংজ্ঞায়িত করে। যেহেতু আমি ফর্ম্যাটটি নির্দিষ্ট করেছি, তাই আমি জানি যে কোন প্রকারটি ফিরে আসবে। একটি সংকলক কেবলমাত্র এটি জানত যে এটি একটি টিপল দেয়।

এই সমস্ত উদাহরণগুলির একত্রীকরণ থিমটি হ'ল প্রোগ্রামার প্রকারটি জানে, তবে একটি জাভা স্তরের টাইপ সিস্টেম এটি প্রতিফলিত করতে সক্ষম হবে না। সংকলকটি প্রকারগুলি জানতে পারবে না, এবং এইভাবে একটি স্ট্যাটিকালি টাইপ করা ভাষা আমাকে তাদের কল করতে দেয় না, অন্যদিকে একটি গতিশীল টাইপ করা ভাষা will

এটি এখানে আসল মূল উক্তিটি:

ডায়নামিক টাইপিংয়ের দুর্দান্ত জিনিসটি হ'ল এটি আপনাকে গণনাযোগ্য এমন কোনও কিছু প্রকাশ করতে দেয়। এবং টাইপ সিস্টেমগুলি নয় - টাইপ সিস্টেমগুলি সাধারণত নির্ধারণযোগ্য এবং তারা আপনাকে একটি উপসেটে সীমাবদ্ধ করে।

ডায়নামিক টাইপিংয়ের সময় আমি সবচেয়ে বেশি উদ্ভূত টাইপটি ব্যবহার করতে পারি যা সম্পর্কে আমি জানি, কেবলমাত্র আমার ভাষার টাইপ সিস্টেমটিই সবচেয়ে বেশি উদ্ভূত টাইপটি জানে না। উপরের সমস্ত ক্ষেত্রে আমার কাছে কোড রয়েছে যা শব্দার্থগতভাবে সঠিক, তবে একটি স্ট্যাটিক টাইপিং সিস্টেম দ্বারা প্রত্যাখ্যাত হবে।

তবে আপনার প্রশ্নে ফিরে আসতে:

আমি অবাক হই, এমন কোনও দরকারী নকশার নিদর্শন বা কৌশল রয়েছে যা উদ্ধৃতিটির সূত্র ব্যবহার করে "ধরণের হিসাবে কাজ করে না"?

উপরের উদাহরণগুলির যে কোনও, এবং প্রকৃতপক্ষে গতিশীল টাইপিংয়ের কোনও উদাহরণ যথাযথ ক্যাসট যুক্ত করে স্থির টাইপিংয়ে বৈধ হতে পারে। আপনি যদি কোনও টাইপ জানেন তবে আপনার সংকলকটি না করে, কেবল মূল্য castালাই করে সংকলককে বলুন। সুতরাং, কিছু স্তরে, আপনি গতিশীল টাইপ ব্যবহার করে কোনও অতিরিক্ত নিদর্শন পেতে যাচ্ছেন না। স্থিরভাবে টাইপ করা কোডটি ব্যবহার করার জন্য আপনাকে আরও কাস্ট করতে হবে।

ডায়নামিক টাইপিংয়ের সুবিধা হ'ল আপনি যে ধরণের কৌশলগুলি তাদের বৈধতা সম্পর্কে আপনার টাইপ সিস্টেমকে বোঝাতে চান তা ভেবে বিরক্ত না করে কেবল এই প্যাটার্নগুলি ব্যবহার করতে পারেন। এটি উপলব্ধ নিদর্শনগুলিকে পরিবর্তন করে না, এটি সম্ভবত তাদের কার্যকর করা সহজতর করে কারণ আপনার টাইপ সিস্টেমটিকে কীভাবে প্যাটার্নটি সনাক্ত করতে হবে বা টাইপ সিস্টেমটিকে বিকৃত করতে ক্যাসট যুক্ত করতে হবে তা নির্ধারণ করার দরকার নেই।


1
জাভা কেন কাট অফ পয়েন্টে আপনাকে 'আরও উন্নত / জটিল টাইপ সিস্টেমে' যাওয়া উচিত নয়?
জে কে।

2
@ জে কে, আপনি কি ভাবছেন যে আমি যা বলছি তা নিয়ে যায়? আরও উন্নত / জটিল টাইপ সিস্টেমটি সার্থক ছিল কি না সে বিষয়ে আমি স্পষ্টতই পক্ষ নেওয়ার বিষয়টি এড়িয়ে গেছি।
উইনস্টন ইওয়ার্ট

2
এর কয়েকটি ভয়াবহ উদাহরণ, এবং অন্যগুলি টাইপ বনাম অ-টাইপ না করে আরও ভাষার সিদ্ধান্ত বলে মনে হয়। আমি বিশেষত বিভ্রান্ত হয়ে পড়েছি কেন লোকেরা মনে করে টাইপ করা ভাষাগুলিতে ডিসরিয়ালাইজেশন এত জটিল। টাইপ করা ফলাফলটি হবে data = parseJSON<SomeSchema>(someJson); print(data.properties.rowCount); এবং যদি কারও কাছে ডিসিরিয়ালাইজ করার জন্য ক্লাস না পাওয়া যায় তবে আমরা ফিরে যেতে পারি data = parseJSON(someJson); print(data["properties.rowCount"]);- যা এখনও টাইপ করা হয় এবং একই অভিপ্রায়টি প্রকাশ করে।
এনপিএসএফ 3000

2
@ এনপিএসএফ 3000, পার্সজেএসএন ফাংশন কীভাবে কাজ করবে? মনে হয় এটি প্রতিচ্ছবি বা ম্যাক্রোগ ব্যবহার করবে। স্থিতী ভাষায় কীভাবে ডেটা ["Properties.rowCount"] টাইপ করা যায়? এটি কীভাবে জানতে পারে যে ফলস্বরূপ মানটি একটি পূর্ণসংখ্যা হয়?
উইনস্টন ইওয়ার্ট

2
@ এনপিএসএফ 3000, আপনি যদি এটির পূর্ণসংখ্যাকে না জানেন তবে আপনি কীভাবে এটি ব্যবহারের পরিকল্পনা করছেন? আপনি কীভাবে জেএসএনে একটি অ্যারে ছিল তা না জেনে তালিকায় থাকা উপাদানগুলির লুপিংয়ের পরিকল্পনা করবেন? আমার উদাহরণের বিষয়টি হ'ল আমি জানতাম যে data.propertiesএটি একটি বস্তু এবং আমি জানতাম যে data.properties.rowCountএটি একটি পূর্ণসংখ্যা এবং আমি কেবল তাদের কোড ব্যবহার করতে কোড লিখতে পারি। আপনার প্রস্তাবিত data["properties.rowCount"]একই জিনিস সরবরাহ করে না।
উইনস্টন ইওয়ার্ট

1

অবজেক্টিভ-সি (ডায়নামিকালি টাইপ করা) থেকে কয়েকটি উদাহরণ যা সি ++ (স্ট্যাটিকালি টাইপড) এ সম্ভব নয়:

  • বেশ কয়েকটি স্বতন্ত্র শ্রেণীর বস্তু একই পাত্রে রেখে দেওয়া।
    অবশ্যই, পরবর্তী সময়ে ধারকটির বিষয়বস্তু ব্যাখ্যা করার জন্য এটি রানটাইম ধরণের পরিদর্শন প্রয়োজন, এবং স্থির টাইপিংয়ের বেশিরভাগ বন্ধুরা আপত্তি জানাবে যে আপনি এটি প্রথম স্থানে করা উচিত নয়। তবে আমি খুঁজে পেয়েছি যে, ধর্মীয় বিতর্ক বাদেও এটি কার্যকর হতে পারে।

  • সাবক্ল্যাসিং ছাড়াই একটি শ্রেণি প্রসারিত করা হচ্ছে।
    অবজেক্টিভ-সি তে, আপনি ভাষা শ্রেণিবদ্ধ পছন্দগুলি সহ বিদ্যমান ক্লাসগুলির জন্য নতুন সদস্য ফাংশন সংজ্ঞায়িত করতে পারেন NSString। উদাহরণস্বরূপ, আপনি একটি পদ্ধতি যুক্ত করতে পারেন stripPrefixIfPresent:, যাতে আপনি বলতে পারেন [@"foo/bar/baz" stripPrefixIfPresent:@"foo/"]( NSSringআক্ষরিকের ব্যবহারটি নোট করুন @"")।

  • অবজেক্ট-ভিত্তিক কলব্যাকের ব্যবহার।
    জাভা এবং সি ++ এর মতো স্ট্যাটিকালি টাইপ করা ভাষাগুলিতে আপনাকে কোনও গ্রন্থাগারকে কোনও ব্যবহারকারী-সরবরাহ করা অবজেক্টের স্বেচ্ছাসেবক সদস্যকে কল করার অনুমতি দেওয়ার জন্য যথেষ্ট দৈর্ঘ্যে যেতে হবে। জাভাতে, ওয়ার্কআরআন্ড হ'ল ইন্টারফেস / অ্যাডাপ্টার জুটি এবং বেনাম বর্গ, সি ++ এ ওয়ার্কআউন্ডটি সাধারণত টেমপ্লেট ভিত্তিক হয়, যা বোঝায় যে গ্রন্থাগার কোডটি ব্যবহারকারীর কোডের সাথে প্রকাশ করতে হবে। অবজেক্টিভ-সি-তে আপনি কেবল অবজেক্ট রেফারেন্স প্লাস লাইব্রেরিতে পদ্ধতিটির জন্য নির্বাচককে পাস করেন এবং লাইব্রেরিটি কেবল এবং সরাসরি কলব্যাকের জন্য আবেদন করতে পারে।


আমি অকার্যকর * এ কাস্টিং করে সি ++ এ প্রথম করতে পারি, তবে এটি টাইপ সিস্টেমটিকে বিরত করছে, সুতরাং এটি গণনা করে না। আমি টাইপ সিস্টেমের মধ্যে পুরোপুরি এক্সটেনশন পদ্ধতিতে সি # তে দ্বিতীয়টি করতে পারি। তৃতীয়টির জন্য, আমি মনে করি "পদ্ধতির জন্য নির্বাচক" ল্যাম্বডা হতে পারে, সুতরাং ল্যাম্বডাস সহ যে কোনও স্ট্যাটিকভাবে টাইপ করা ভাষা একই কাজ করতে পারে, যদি আমি সঠিকভাবে বুঝতে পারি। আমি ওজজির সাথে পরিচিত নই।
ব্যবহারকারী 7610

1
@ জিরিডানেক "আমি সিটি ++ এ প্রথম বাতিল করতে পারি" "ঠিক তাই নয়, যে উপাদানগুলির উপাদানগুলি পড়ে সেগুলির আসল প্রকারটি পুনরুদ্ধার করার কোনও উপায় নেই। আপনার টাইপ ট্যাগ লাগবে। তদুপরি, আমি মনে করি না যে "আমি << ভাষা> এ এটি করতে পারি" এটিকে দেখার উপযুক্ত / উত্পাদনশীল উপায়, কারণ আপনি সর্বদা সেগুলি অনুকরণ করতে পারেন। কী গুরুত্বপূর্ণ তা হল বাস্তবায়নের বনাম বাস্তবায়নের জটিলতায় লাভ। এছাড়াও, আপনি মনে করছেন যে কোনও ভাষার যদি স্থির এবং গতিশীল উভয় ক্ষমতা থাকে (জাভা, সি #), তবে এটি ভাষাগুলির "স্থিতিশীল" পরিবারের সাথে একচেটিয়াভাবে অন্তর্গত।
coredump

1
@ জিরিডানেক void*একাই গতিশীল টাইপিং নয়, এটি টাইপিংয়ের অভাব। তবে হ্যাঁ, ডায়নামিক_কাস্ট, ভার্চুয়াল টেবিল ইত্যাদি সি ++ খাঁটি স্থিরভাবে টাইপ না করে। এটা কি খারাপ?
coredump

1
এটি সুপারিশ করে যে প্রয়োজন হলে টাইপ সিস্টেমটি বিভক্ত করার বিকল্পটি দরকারী। যখন আপনার প্রয়োজন হবে তখন একটি পালানোর হ্যাচ হচ্ছে। বা কেউ এটি দরকারী হিসাবে বিবেচনা। অন্যথায় তারা এটিকে ভাষায় রাখবে না।
ব্যবহারকারী 7610

2
@ জিরিডানেক আমার মনে হয়, আপনি আপনার শেষ মন্তব্যে খুব সুন্দরভাবে পেরে গেছেন। যত্নের সাথে ব্যবহার করা হলে এই পালানোর হ্যাচগুলি অত্যন্ত কার্যকর হতে পারে। তবুও, দুর্দান্ত শক্তির সাথে মহান দায়বদ্ধতা আসে এবং প্রচুর লোকেরা এটির অপব্যবহার করে ... সুতরাং, জেনেরিক বেস শ্রেণীর জন্য পয়েন্টার ব্যবহার করা আরও ভাল বলে মনে হয় যে অন্যান্য সমস্ত শ্রেণি সংজ্ঞা অনুসারে উত্পন্ন হয়েছে (যেমন রয়েছে তেমন উদ্দেশ্য-সি এবং জাভা উভয় ক্ষেত্রে), এবং আরটিটিআই-র উপর নির্ভর করে void*কিছু নির্দিষ্ট বিষয়বস্তুর জন্য কাস্ট করা বাদ দিয়ে কেসগুলি বাদ দিতে। প্রাক্তন একটি রানটাইম ত্রুটি তৈরি করে যদি আপনি গণ্ডগোল করেন তবে পরবর্তীকালে অনির্ধারিত আচরণের ফলাফল হয়।
16:48 এ 16:48
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.