1

Тема: source of бібліотечного классу

На форумах кілька разів зустрічав фразу "початковий код" для классу (наприклад, FileInputStream). Але в документації від Oracle я не зміг знайти потрібний розділ. Я розумію, що він мабуть написаний на C++, але все рівно я хотів би мати загальне уявлення як працюють бібліотечні класи "зсередини".Можливо , хтось підкаже , де його можна знайти.Буду дуже вдячний.

2

Re: source of бібліотечного классу

Якого біса він буде написаний на C++, якщо це Java? Звісно, бібліотеки теж на Java. Як вони скомпілюються в java-байткод, якщо будуть на C++?
Пошукайте файл src.zip у теці з JDK.

Подякували: fed_lviv, flatliner, leofun013

3

Re: source of бібліотечного классу

Ось хтось виклав, схоже воно: https://github.com/enjoyhot/jdk-online
Принаймні дві версії.

Подякували: 0xDADA11C71

4

Re: source of бібліотечного классу

src.zip (шукайте його там де у Вас JDK на ПК)

5 Востаннє редагувалося yaolegya (01.10.2020 21:54:56)

Re: source of бібліотечного классу

Добрий вечір.Дуже вдячний всім за відповіді.Знайшов потрібні файли в src.
Вибачаюсь, коли писав запитання було ще дуже багато інших справ і поспішаючи написав нісенітницю. Звичайно ці класи написані на Java.Я насправді мав на увазі інше.Коли створювалася ця мова, то перші команди повинні були бути написані на іншій мові програмування і я думаю, що вони збереглися.
Наприклад розглянемо метод available().Його б можна було реалізувати приблизно так(я початківець і можливо десь помиляюся):

1.     public int available() throws IOException
2.  {
3.  int x;
4.  FileInputStream IS = new FileInputStream(myFile.txt);
5. For (int i = 0; i<IS.Lenght(); i++)
6. {
7. x=i+1;
8. }
return x;
}

  Що ми бачимо в бібліотечних класах:
 
  1.В класі FileInputStream
      

1. public int available() throws IOException
2.    {
3.        return available0();
4.    }

 5.   private native int available0() throws IOException;
    

    І більше нічого , що стосується цього методу.
//____________________________________

   2.В класі FilterInputStream:
      

1.      public int available() throws IOException
2.      {
3.        return in.available();
4.      }

    І більше нічого , що стосується цього методу.
//____________________________________
   3.В класі InputStream
    
    

1.      public int available() throws IOException
2.      {
3.        return 0;
4.      }
     
     
   // This method should be overridden by subclasses.

    І більше нічого , що стосується цього методу.
   Фактично не зрозуміло, як же були пораховані ті байти.Те ж саме стосується і всіх інших методів і т.п..
Виникає думка , що в машині Java є коди , що відповідають кожній команді такій як available(), і вони вставляються в программу вже при створенні машинного коду.В усякому разі коди бібліотечних класів, які є в папці src не пояснюють механізм роботи програми.

6 Востаннє редагувалося yaolegya (01.10.2020 21:51:42)

Re: source of бібліотечного классу

Вибачте, в моєму попередньому прикладі помилка.Метод Length()  працює зі String , а не з потоками і цикл звичайно зайвий.І цей приклад корректно  працюватиме тільки для текстового файла, де є однобайтні символи.

1.     public int available() throws IOException
2.  {
3.  int x;
4.  FileInputStream IS = new FileInputStream("myFile.txt");
5. Scanner myscan = new Scanner( IS );
6. String mystring = myscan.useDelimiter("\\A").next();
7. x=mystring .Length(); 
return x;
}

7 Востаннє редагувалося koala (30.09.2020 19:39:01)

Re: source of бібліотечного классу

Гм. Мушу зізнатися, що Java я вчив 20 років тому, але схоже, що на цьому форумі майже ніхто її не знає (чи, принаймні, не пише про це).
Так, native означає, що виклик іде через JNI (Java Native Interface) на щось компільоване - наприклад, C. Якщо ми це й вивчали, то я точно вже не пам'ятаю.
Ось код OpenJDK на GitHub.
А ось конкретно потрібний вам файл: FileInputStream.c

Подякували: Dmitr, yaolegya, leofun013

8

Re: source of бібліотечного классу

Дозволив вам редагування повідомлень. Будь ласка, розміщайте код у тегах code (кнопка <>) і вирівнюйте його.

void Print()
{
  System.out.println("Таке читати значно зручніше, ніж ваші приклади");
}//еге ж?
Подякували: Dmitr, yaolegya, Si4karuk3

9

Re: source of бібліотечного классу

Десь чув (одна баба казала) що Java після компіляції перетворюється в davlik-код, який виконується аіртуальною машиною Java (Java Virtual Machine, JVM), тому без пакету Java на платформі програми не працюють (єдине виключення = платформи, побудовані на Java (Android)), то от ці класи мають перетворюватися компілятором в davlik-код, і є купа статтів по модингу цього коду. Source описує роботу davlik коду напевне тому треба спочатку перевести його в davlik (зкомпілювати) і сюди викласти, C++ чи інша мова оброблює davlik, Java тут ні до чого

10 Востаннє редагувалося wander (01.10.2020 16:03:44)

Re: source of бібліотечного классу

Dmitr написав:

Десь чув (одна баба казала) що Java після компіляції перетворюється в davlik-код, який виконується аіртуальною машиною Java (Java Virtual Machine, JVM), тому без пакету Java на платформі програми не працюють (єдине виключення = платформи, побудовані на Java (Android)), то от ці класи мають перетворюватися компілятором в davlik-код, і є купа статтів по модингу цього коду. Source описує роботу davlik коду напевне тому треба спочатку перевести його в davlik (зкомпілювати) і сюди викласти, C++ чи інша мова оброблює davlik, Java тут ні до чого

Видно або баба була трохи біснуватою, або ви слухали одним місцем. Це, як говориться "Чув дзвін, та не знає, де він".
По-перше, не davlik, а dalvik. По-друге, існує така платформа Android, так от, цей Андроїд використовує dalvik virtual machine для виконання Андроїд Додатків. Сама віртуальна машина dalvik грубо кажучи основана на JVM (з деякими погрішностями). Так от, на Андроїді, дійсно, Java-код має перетворитися у dalvik-код, проте не одразу.

Очевидно, що dalvik використовує зовсім інший байт-код, ніж Java. Тому Android SDK поставляється з так званим dex-компайлером, який власне займається перекладом байт-коду Java в байт-код dalvik, саме тому ви можете писати програми для Android на Java. По-третє, dalvik використовувався в Андроїді до версії 4.4, починаючи з версії 5.0 на зміну dalvik прийшов ART зі своєю AOT компіляцією.

До чого це я, вся ця штука з dalvik актуальна лише для Андроїда, та й то лише древніх версій.

Подякували: FakiNyan, leofun012

11

Re: source of бібліотечного классу

koala написав:

що на цьому форумі майже ніхто її не знає (чи, принаймні, не пише про це)

А як тре писати? Типу чекайте, чекайте я розбираюсь в цьому лайні? ))

Прихований текст

https://otvet.imgsmail.ru/download/150b93ad536fa2553f73fe4f152c5b69_i-181.jpg

Чи, що означає знає? )
Ну, я можу знайти, допустимо, gcd чи перебрати матрицю, але, здається, для цього знати саме Джаву не обов'язково?

Подякували: leofun011

12 Востаннє редагувалося P.Y. (02.10.2020 12:27:48)

Re: source of бібліотечного классу

koala написав:

Якого біса він буде написаний на C++, якщо це Java? Звісно, бібліотеки теж на Java. Як вони скомпілюються в java-байткод, якщо будуть на C++?
Пошукайте файл src.zip у теці з JDK.

Чому ж, частина коду може бути й на плюсах (чи іншій мові, що компілюється в машинний код) — Java це дозволяє, так можуть робити для покращення швидкодії чи доступу до якихось системних можливостей. Є там такий код чи нема — це вже конкретний проект треба дивитись, але з того, що це Java, ще не випливає, що там C++ узагалі нема.

Зате от ключове слово native чітко вказує на використання джавівською програмою модулів, скомпільованих у машинний код (які, вочевидь, писались не на джаві).

І так, якщо йдеться про базову системну бібліотеку Джави, то очевидно, що ні доступ до файлової системи, ні ряд інших дій системного характеру не робилися на голому байт-коді — в JVM просто нема таких команд. Тільки викликом нативних функцій з машинних бінарників.

Подякували: leofun011

13

Re: source of бібліотечного классу

Бібліотеки Java написані на Java, але вони можуть звертатися до нативних функцій, які надаються за допомогою C ABI через JNI, для використання ресурсів ОС. Тут потрібно розуміти різницю.

14

Re: source of бібліотечного классу

wander написав:

Бібліотеки Java написані на Java, але вони можуть звертатися до нативних функцій, які надаються за допомогою C ABI через JNI, для використання ресурсів ОС. Тут потрібно розуміти різницю.

Java-бібліотека може звертатись до API операційної системи безпосередньо, чи має бути проміжний код на С++, що забезпечує, наприклад, перетворення типів даних, якими обмінюються Java та ОС, може відрізнятися в реалізаціях на різних операційних системах, і т.д.? Коли ми бачимо, наприклад,

private native int available0() throws IOException;

то це пряме звернення до бібліотеки операційної системи, чи до проміжної нативної функції, яка вже звертається до ОС?

15

Re: source of бібліотечного классу

Я мав на увазі, що бібліотеки Java з усіма об'єктами, безумовно, написані на Java. Хоча для викликів конкретних функцій ОС доводиться лізти через інтерфейсні нативні функції, так.

16 Востаннє редагувалося wander (02.10.2020 17:52:47)

Re: source of бібліотечного классу

P.Y. написав:

Java-бібліотека може звертатись до API операційної системи безпосередньо, чи має бути проміжний код на С++, що забезпечує, наприклад, перетворення типів даних, якими обмінюються Java та ОС, може відрізнятися в реалізаціях на різних операційних системах, і т.д.?

Проміжний С++ код де має бути? Java вже надає, грубо кажучи, С інтерфейс, він же JNI. Своєю чергою, OC, також надає свій С інтерфейс. Склеюєте докупи і виходить, що достатньо .h + .c

P.Y. написав:

то це пряме звернення до бібліотеки операційної системи, чи до проміжної нативної функції, яка вже звертається до ОС?

Звернення буде до деякої С АРІ ф-ї завжди, а там вже, як та С АРІ ф-я реалізована, Бог його зна. У випадку виклику ОС ф-ї, її буде і викликати, в іншому випадку там може бути виклик з якоїсь С++ бібліотеки і т.д.
Ключове слово native означає лише те, що такий метод буде реалізовано в залежному від платформи коді (implemented in platform-dependent code), звичайно написаному іншою мовою програмування, та ж C/C++ чи щось інше.

Подякували: yaolegya1

17

Re: source of бібліотечного классу

Дякую за відповіді.Суть добре зрозумів.Заглиблюватися в деталі з моїм рівнем знань зарано.