'জাভা' কমান্ড জাভা প্রোগ্রামগুলি সংকলন করে?


145

ইন্টারনেটে বেশিরভাগ ওয়েবসাইট বলে:

" javacএকটি .javaফাইল সংকলন করতে কমান্ডটি ব্যবহার করুন। তারপরে javaকমান্ডটি ব্যবহার করে এটি চালান "

তবে আজ আমি একটি জাভা প্রোগ্রামটি চালানোর চেষ্টা করেছিলাম javacএবং আমি একটি অদ্ভুত ফলাফল পেয়েছি।

এখানে একটি ফাইলের বিষয়বস্তু রয়েছে hello.java:

public class Myclass {
 public static void main(String[] args){
    System.out.println("hello world");
  }
}

তারপরে আমি দৌড়েছি:

$ javac hello.java

যা আমাকে এই ত্রুটি দেয়:

hello.java:1: error: class Myclass is public, should be declared in a file named Myclass.java
public class Myclass {
       ^
1 error

কিন্তু আমি যখন এটি javacকমান্ড ব্যতীত চালাচ্ছি , এটি কোনও ত্রুটি ছাড়াই কার্যকর হয়েছিল।

$ java hello.java
hello world

javaকমান্ডটিও কি প্রোগ্রামটি সংকলন করে? যদি হ্যাঁ, আমাদের javacআদেশটি কেন দরকার ?

আমার জাভার সংস্করণটি হ'ল:

openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode)

11
আপনি কোন সংস্করণ ব্যবহার করছেন? আমি মনে করি তারা জাভা 9-তে জাভা কনসোল প্রবর্তন করেছিল এবং এটিই আপনার অভিজ্ঞতা হতে পারে।
ম্যাথিউউ

6
আপনার ক্লাসের নামটি ফাইলের নামের সাথে মিলাতে হবে - এটি জাভা স্ট্যান্ডার্ড। Myclass.javaকমান্ড লাইন থেকে কেবল ফাইলের নাম পরিবর্তন করুন এবং তারপরে এটি javac Myclass.javaচালান java Myclass
আনসংসে

6
হ্যাঁ, javacএখনও কম্পাইল ব্যবহৃত যদি আপনি সোর্স কোড স্থাপন করতে না চান, অথবা আপনি একটি ফাইল বেশী ( ডকুমেন্টেশন এর java: উৎস ফাইল বিকল্পের জন্য শুধু একটি একক উৎস ফাইল প্রোগ্রাম আরম্ভ করার জন্য ব্যবহার করা হয়।)
user85421

@ ম্যাথিউইউ "জাভা-রূপান্তর" এর আউটপুটটি হ'ল: ওপেনজেডক সংস্করণ "12.0.2" 2019-07-16 ওপেনজেডিকে রানটাইম এনভায়রনমেন্ট (বিল্ড 12.0.2 + 10) ওপেনজেডকে 64-বিট সার্ভার ভিএম (বিল্ড 12.0.2 + 10, মিশ্র) মোড)
মিলাদ

1
@ মিলাদ - এটি যা হয় - যাভিএম উত্সটি সংক্ষেপিত javacবাইটকোডে জাভা উত্সকে সংকলন করে এবং javaকমান্ডটি এটিটিকে জেভিএমের ক্লাসলোডারের মধ্যে লোড করে।
আনসংসে

উত্তর:


188

জাভা 11 এর আগে আপনার কোডটি চালানোর জন্য আপনাকে প্রথমে এটি সংকলন করতে হবে, তারপরে আপনি এটি চালাতে পারেন। এখানে একটি উদাহরণ:

javac test.java
java test

জাভা ১১-এর পরে, আপনি এখনও javac+ javaকরতে পারেন বা javaআপনার কোডটি সংকলন করতে এবং স্বয়ংক্রিয়ভাবে চালাতে আপনি নিজেই চালাতে পারেন । নোট করুন যে কোনও .classফাইল তৈরি করা হবে না। এখানে একটি উদাহরণ:

java test.java

আপনি যদি চালান java -help, আপনি বিভিন্ন অনুমোদিত ব্যবহার দেখতে পাবেন। এটি আমার মেশিনে দেখতে কেমন লাগে তা এখানে। শেষটি হ'ল আপনি java [options] <sourcefile> [args]যা চালিয়েছেন: যা "একটি একক উত্স-ফাইল প্রোগ্রাম কার্যকর করবে"।

$ java -help
Usage: java [options] <mainclass> [args...]
           (to execute a class)
   or  java [options] -jar <jarfile> [args...]
           (to execute a jar file)
   or  java [options] -m <module>[/<mainclass>] [args...]
       java [options] --module <module>[/<mainclass>] [args...]
           (to execute the main class in a module)
   or  java [options] <sourcefile> [args]
           (to execute a single source-file program)

হালনাগাদ:

@ বিলক দ্বারা চিহ্নিত হিসাবে, ওপি এছাড়াও জিজ্ঞাসা করেছে:

আমাদের জাভাক কমান্ডের দরকার নেই কেন?

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



অতিরিক্ত বিবরণের জন্য @ কার্লোস হিউবার্গারকে ধন্যবাদ আমি প্রতিফলিত এটি জাভা 11. চালু হয় আমার উত্তর একটি ছোট সম্পাদনা
Kaan

7
@Spikatrix জাভা 8 যে (তারা বাদ 1.মধ্যে 1.8নতুন রিলিজের মধ্যে)
muru

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

2
এই উত্তরটি কীভাবে এই নতুন পদ্ধতির ফলাফল হিসাবে কোনও ফাইলের নাম বনাম শ্রেণীর নাম ত্রুটি হিসাবে প্রতিবেদন করা হয় তা চিহ্নিত করে না javac
সেব্রোকম

52

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

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

জাভা কমান্ডটি কার্যকর করার সময় আপনি সম্ভবত পূর্বে কিছু সংকলিত কোড চালাচ্ছিলেন বলে মনে হয়।


আপনাকে ধন্যবাদ, জাভা সংস্করণটি হ'ল: ওপেনজেডক সংস্করণ "12.0.2" 2019-07-16 ওপেনজেডিকে রানটাইম এনভায়রনমেন্ট (বিল্ড 12.0.2 + 10) ওপেনজেডকে 64-বিট সার্ভার ভিএম (বিল্ড 12.0.2 + 10, মিশ্র মোড)
মিলাদ

5
একক-ফাইল উত্স-কোড প্রোগ্রামগুলি চালু করতে উত্স-ফাইল মোড ব্যবহার করে পরীক্ষা করুন : "সংকলক জেএলএস এর শেষে সংজ্ঞায়িত alচ্ছিক বাধা প্রয়োগ করে না ?? .6..6, নামযুক্ত প্যাকেজের মধ্যে একটি প্রকার একটি ফাইলের মধ্যে থাকা উচিত যার নাম .java এক্সটেনশান অনুসারে প্রকারের নাম থেকে রচিত ""
ব্যবহারকারী 85421

2
জাভা স্ক্রিপ্টিং এপিআই এবং জাভা সিঙ্গল-ফাইল সোর্স-কোড প্রোগ্রাম লঞ্চ ( জেইপি 330 ) দুটি সম্পূর্ণ পৃথক এবং সম্পূর্ণ সম্পর্কযুক্ত নয়।
ডেভিড কনরাড

@ ডেভিডকনরাদ, সেই অনুসারে ভার্ভেইজ আপডেট হয়েছে। ধন্যবাদ।
ইভান

ইনপুটটির প্রশংসা করুন, @ টিজে ক্রাউডার। তবে, আমি মোটামুটি নিশ্চিত যে এটি লিখতে চেয়েছিলাম is এছাড়াও, আপনার লিঙ্কগুলিতে দ্বিতীয় সংজ্ঞা: বিভিন্ন জিনিসের বিস্তৃত বিস্তৃত অর্থ প্রচারমূলক
ইভান

6

এই ত্রুটি কেন দেওয়া হয়েছে তার উত্তর দেওয়ার জন্য, ফাইলের শ্রেণির নামটি অবশ্যই ফাইলের সাথে মেলে basename

Codeতিহ্যগতভাবে এই কোডটি ব্যবহার করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে javac; javaক্রম:

  1. ক্লাসটির নাম পরিবর্তন করুন public class Helloবা

  2. নাম পরিবর্তন hello.javaকরুন myclass.java

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


5

হ্যাঁ, তবে আপনি সম্ভবত যেভাবে বোঝাচ্ছেন সেভাবে নয়।

আপনি যখন javacএকটি .class ফাইলটিতে জাভা ফাইলটি সংকলন করতে কমান্ডটি ব্যবহার করেন তখন আউটপুটটিকে বাইটকোড বলা হয়। জাভা ভার্চুয়াল মেশিনের স্পেসিফিকেশনের উপর ভিত্তি করে তাত্ত্বিক সিপিইউয়ের জন্য বাইটকোড একটি মেশিন কোড (নেটিভ নির্দেশাবলী)।

এই ভার্চুয়াল সিপিইউ স্পেসিফিকেশনটি গড় প্রকারের সিপিইউগুলির ধরণের যা স্পেসিফিকেশনটি লেখার সময় প্রচলিত ছিল। এ কারণে এটি বিভিন্ন ধরণের সিপিইউয়ের নিকটবর্তী এবং একাধিক সিপিইউ প্রকারভেদে একই জাভা .ক্লাস ফাইলগুলি চালানো সহজ করে তোলে।

যখন জাভা প্রথম চালু করা হয়েছিল তখন javaকমান্ডটি। ক্লাস ফাইলটি পড়ত এবং বাইকোডের নির্দেশাবলী একবারে ব্যাখ্যা করত এবং তারপরে এটি আসলে সিপিইউ যা চলছিল তার সমতুল্য স্থানীয় নির্দেশিকায় ম্যাপ করে। এটি কাজ করেছে তবে বিশেষভাবে দ্রুত ছিল না। এই জাস্ট ইন টাইম (জেআইটি) সংকলনটি জাভা রানটাইমের সাথে যুক্ত করা হয়েছিল।

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

সম্পাদনা করুন (নিচে ভোটারদের সন্তুষ্ট করতে):

সুতরাং আপনার নির্দিষ্ট ক্ষেত্রে (যেমন আপনি ভি 11 এর চেয়ে নতুন জেআরই চালাচ্ছেন) কোডটি কমপক্ষে দু'বার সংকলিত হয়েছে

  1. বাইকোডে একক। জাভা ফাইল হিসাবে
  2. বাইটকোডকে ব্যাখ্যা করার সাথে সাথে জেআইটি সংকলকটির মাধ্যমে (যদিও হ্যালো ওয়ার্ল্ডের জন্য এটি সম্ভবত সংকলিত নেটিভ কোডের কোনওটি চালানোর জন্য সময় পাবে না)

7
এটি প্রশ্নের উত্তর দেয় না।
ডেভিড কনরাড

2
@ ডেভিডকনরড তবে এটি হয়! "" জাভা "কমান্ড জাভা প্রোগ্রামগুলি সংকলন করে?" হার্ডলিব এখানে যে কারণে দেয় তার জন্য একটি দুর্দান্ত "হ্যাঁ": এটি কেবলমাত্র স্থানীয় সময় নির্দেশিকা বাইট কোডটি সংকলন করে (মানসম্পন্ন সেটিংস সহ নন-তুচ্ছ প্রোগ্রামগুলির জন্য)।
পিটার - মনিকা পুনরায়

সংকলন এখন বাধ্যতামূলক? Icallyতিহাসিকভাবে জাভা বাইট কোডটি ব্যাখ্যা করা যেতে পারে; জেআইটি সংকলন alচ্ছিক ছিল।
এমএসএলটাররা ২:21

mixed-modeভার্সন আউটপুট
প্রদর্শিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.