سؤال

يمكنني أن أفعل شيئا مثل هذا في Haskell:

#!/usr/bin/runghc
main=putStrLn "Hello World"

ثم يمكنني تشغيله ./hello.hs

سؤالي هو، لماذا يتم تجاهل السطر الأول؟ تعليقات في Haskell تبدأ -- لكن الخط الأول لا يزال يتم تجاهله. انها حتى الأحمال في ghci. الحيلة تعمل أيضا مع بيثون و بيرل.

ولكن عندما أفعل شيئا مشابها في جافا:

#!/usr/local/jdk1.6.0_13/bin/javac
...

Javac يعطيني خطأ مترجم.

فكيف هذا العمل وكيف يمكنني الحصول عليه للعمل مع جافا؟

شكرا.

هل كانت مفيدة؟

المحلول

#! اسمه "كوخ"وهي طريقة UNIX لتنفيذ البرامج النصية. عندما تطلب من نظام التشغيل تنفيذ ملف، فهذا سيكون هذا ليس ملف .exe عادي، ويقوم #! في البداية بمثابة علامة سحرية تؤدي إلى نظام التشغيل لتنفيذ الأمر بعد #! والأسلاك حتى هذا الأمر يصبح هذا الملف حجة من هذا الأمر

إذا كان myfile.py

#!/usr/bin/python

تنفيذ هذا الملف لا يختلف كثيرا عن التشغيل

$ /usr/bin/python myfile.py

معرفتي هاشيل سيئة. ولكن بالنسبة لحالتك الخاصة، يبدو أن الأمر Runghc يقرأ ببساطة السطر الأول، ويقر أي حجج معينة على ذلك #! خط، يكتب بقية الملف إلى ملف مؤقت ويعمل GHC على ملف TEMP (الذي سيكون له أول جلدي جردت - انظر Runghc.hs في مصادر GHC لمزيد من المعلومات.)

إذا كنت تريد أن تفعل الشيء نفسه مع Javac، فيمكنك استخدام نفس النهج مثل Runghc. اكتب غلافا، الذي يأكل السطر الأول من الملف، يكتب بقية الملف إلى ملف TEMP ويعمل Javac على هذا الملف.

نصائح أخرى

إذا كان الملف الخاص بك hello.hs، والطريق الأول هو "#! / USR / BIN / RUNGHC"، ثم ستنفذ Shell:

/usr/bin/runghc hello.hs

يروي هذا السطر الأول بشكل أساسي قذيفة ما يجب استخدامه لتشغيل البرنامج النصي.

بالنسبة إلى مثال Java، يجب أن يكون الخط الأول قابل للتنفيذ أشواط البرنامج النصي، وليس ذلك compiles. النص.

سؤالي هو، لماذا يتم تجاهل السطر الأول؟ تبدأ التعليقات في Haskell - لكن الخط الأول لا يزال يبدو أنه يتم تجاهله. انها حتى الأحمال في ghci. الحيلة تعمل أيضا مع بيثون و بيرل.

يعمل "خدعة" في بيثون و بيرل بسبب # يبدأ تعليق في هذه اللغات، لذلك يرى المترجم هذا الخط كتعليق ويتجاهله. لذلك بالنسبة لهم، لا شيء خاص.

في haskell، # لا يبدأ التعليق، لذلك لن يعمل عادة. ومع ذلك، GGC (ربما أيضا تطبيقات أخرى، إذا كانت الذاكرة، فإن العناق فعل ذلك أيضا) لديه حالة خاصة لخطوط Shebang. إذا كان السطر الأول من الملف يبدأ #!, ، يتم التعامل معها كتعليق. تم دمج هذا الانحراف عن مواصفات اللغة بالضبط

$ chmod +x hello.hs
$ ./hello.hs

الشغل. لا يعمل مع javac لأنه لا توجد حالة خاصة مدمجة في خطوط Shebang.

تعمل Shebang فقط مع اللغات المترجمة فقط .... إنها لا تعني عموما شيئا للمترجم الذي سيتخرأ في معظم الحالات

السبب في أن هذا يعمل هو أن بيثون، بيرل، ويبدو أن Haskell، كل اللغات مفسورة. إنها طريقة UNIX القياسية لتعيين المترجم الذي سيتم تشغيل البرنامج النصي. Java هي لغة مجمعة، ولا يمكن تشغيلها مع مترجم فوري.

Javac هو مترجم، وليس مترجم فوري.

يفتقر إلى الوضع التفاعلي الذي أعتقد أنه ما يسبب "السحر". لن يعمل الشيء نفسه مع دول مجلس التعاون الخليجي لأنه يفتقر إلى نفس الميزة.

DMD (مترجم D) على سبيل المثال، مثال على مترجم يدعم التعبير يحتوي على هذا النوع من التحرير التفاعلي (#! / USR / BIN / DMD -RUN).

إنه موقع قابل للتنفيذ على جهاز الكمبيوتر الخاص بك لتفسير البرنامج النصي الخاص بك. Java هي لغة مترجمة، وبالتالي فهي لا تحتاج إلى مثل هذا البيان.

علاوة على ذلك، فإن النقطة هي أنه من التعليق الخاص، فإن البناء في جافا لن يكون قانونيا بهذه الطريقة لأن # ليست علامة تعليق قانونية. إذا كان البناء من هذا القبيل منطقيا ... الذي لا يفعله ... يبدو الأمر كذلك:

//!/usr/local/jdk1.6.0_13/bin/javac

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top