• 検索結果がありません。

教育用プログラミング環境の構築-広島国際学院大学

N/A
N/A
Protected

Academic year: 2021

シェア "教育用プログラミング環境の構築-広島国際学院大学"

Copied!
5
0
0

読み込み中.... (全文を見る)

全文

(1)広島国際学院大学研究報告,第53巻(2020),9~13. 教育用プログラミング環境の構築 中村 学. (令和 2 年10月20日受理). Constructing an Educational Programming Environment Manabu NAKAMURA (Received October 20, 2020).   Our university uses Java for programming education. However, some functions are missing or undesirable. In this paper, I report on how to build a programming environment for programming education. I developed an annotation processor that checks whether a method overrides or implements a method declared in a supertype. It advises on the addition of the Override annotation. Also, in order to prevent users from executing non single-file source-code program as a single-file sourcecode program mistakenly, I replaced the‘java’ command with a script that displays an error message and doesn’ t execute the program when Java files are specified with the‘java’ command as an argument. Keyword:Programming Education, Java, Override Annotation, SingleFile Source-Code Program  本学生産工学科ではプログラミング教育の一部で Java を使用しているが,足 りない機能や望ましくない機能も存在する。本稿では,プログラミング教育の ためのプログラミング環境をどのように構築しているかを報告する。Override アノテーションが付加されていないメソッドに関してスーパータイプのメソッ ドをオーバーライド,実装しているかどうかを調べ,Override アノテーション の付加を助言するアノテーションプロセッサを作成した。また,単一ソース コードでないプログラムを間違えて単一ソースコードのプログラムとして実行 することを防ぐために,引数として Java ファイルが指定された場合にエラー メッセージを表示し,プログラムを実行しないシェルスクリプトを作成し, java コマンドを置き換えた。 キーワード:プログラミング教育,Java,Override アノテーション,単一 ソースコードのプログラム. 9.

(2) 10. 中村 学. 1.はじめに  本学生産工学科ではプログラミング教育の一部で Java を使用しているが,足りない機能や望ま しくない機能も存在する。本稿では,プログラミング教育のためのプログラミング環境をどのよう に構築しているかを報告する。様々な機能を持ち,複雑な統合開発環境は使用せず,エディタ,端 末,Oracle OpenJDK1)を使用している(以下では,Oracle OpenJDK,Oracle JDK2)を区別せず, 単に JDK と書く) 。学生に最新の JDK を使用してもらうために,筆者のホームディレクトリに JDK をインストールし,それを使用するようにそれぞれの学生に 1 度だけ設定をしてもらってい る。そのため,JDK のアップデート,カスタマイズなどは容易である。 2.Override アノテーション  Override アノテーション(@Override)により,JDK 5.0(2004年 9 月にリリース)でスーパー クラスのメソッドをオーバーライドすることを宣言できるようになり,JDK 6(2006年12月にリ リース)でスーパータイプのメソッドをオーバーライド,実装することを宣言できるように拡張さ れた3)。スーパータイプのメソッドをオーバーライド,実装することを宣言したメソッドがスー パータイプのメソッドをオーバーライド,実装していない場合は,コンパイルエラーとなり,間違 いを見付けることができる(図 1 ,2 。図 1 の C 2 クラスのequal()メソッドの Override アノテー ションを削除すると,コンパイルエラーは発生しない)。スーパータイプのメソッドをオーバーラ イド,実装している全てのメソッドに Override アノテーションを付加すべきであるが,2020年 9 月 現 在,JDK に は Override ア ノ テ ー シ ョ ン の 付 加 を 助 言 す る 機 能 は 実 装 さ れ て い な い4)。 Eclipse5) は3.6(2010年 6 月にリリース)で,NetBeans6) は7.1(2012年 1 月にリリース)でOverride アノテーションの付加を助言する機能が実装されている。本研究では,Override アノテーション が付加されていないメソッドに関してスーパータイプのメソッドをオーバーライド,実装している かどうかを調べ,Override アノテーションの付加を助言するアノテーションプロセッサを作成し た7)。筆者のホームディレクトリにインストールした JDK の javac コマンドをこのアノテーション プロセッサを起動するシェルスクリプトに置き換えた(図 3 )。これにより,学生は Override ア ノテーションを適切に使用できるようになり,オーバーライド,Override アノテーションに関す る理解も深まったと思われる。 3.単一ソースコードのプログラムの実行  JDK 11(2018年 9 月にリリース)以降では,単一ソースコードのプログラム( 1 つのJavaファ イルのみからなるプログラム)は明示的にコンパイルせずに実行できるようになった8)。しかし, 単一ソースコードでないプログラム(図 4 , 5 )は依然として明示的にコンパイルする必要があ る。単一ソースコードでないプログラムを図 6 のように間違えて単一ソースコードのプログラムと して実行すると(あるいは,単にコンパイル方法を間違えた場合),他のファイルのクラスにアク セスできない(図 7 のように正しくコンパイル,実行すればアクセスできる)。単一ソースコード でないプログラムを図 7 のように正しくコンパイルした後に,図8のように間違えて単一ソース コードのプログラムとして実行すると,図 6 と異なり,他のファイルのクラスの public フィール ドにアクセスできるものの,protected フィールドにアクセスできない。このようなエラーメッ セージ,挙動は学生には難解であろう(学生に単一ソースコードのプログラムの実行に関する説明.

(3) 教育用プログラミング環境の構築. 11. はしていないが,実行方法を間違え,このような状況に遭遇した学生から質問されたことがあ る)。そのため,本研究では,引数として Java ファイルが指定された場合にエラーメッセージを 表示し,プログラムを実行しないシェルスクリプトを作成し,筆者のホームディレクトリにインス トールした JDK の java コマンドをこれで置き換えた(図 9 )。単一ソースコードのプログラムを ずに実行できる機能をオフにするスイッチなどはないようである。これにより,学生は適切にコン コンパイルせずに実行できる機能をオフにするスイッチなどはないようである。これにより,学生 パイルできるようになったと思われる。 は適切にコンパイルできるようになったと思われる。 ずに実行できる機能をオフにするスイッチなどはないようである。これにより,学生は適切にコン パイルできるようになったと思われる。 abstract class C1 { public abstract void cm1(); abstract class C1 { } public abstract void cm1(); } interface I1 { void im1(); interface I1 { } void im1(); } public class C2 extends C1 implements I1 { // @Override public classvoid C2 extends public cm1() { C1 implements I1 { // } @Override public void cm1() { } @Override public void im1() { @Override } public void im1() { } @Override. //OK //OK //OK(JDK 5.0 ではエラー) //OK(JDK 5.0 ではエラー) //エラー. public boolean equal(Object that) { @Override return this == that; public boolean equal(Object that) { } return this == that; } @Override. //エラー. //OK. public boolean equals(Object that) { @Override //OK return this == that; public boolean equals(Object that) { } return this == that; } } 図 1 C2.java 図 1  C 2. java } $ javac C2.java 図 1 C2.java C2.java:18: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません $ javac C2.java @Override //エラー C2.java:18: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません ^ @Override //エラー エラー1 個 ^ 図 2 C2.java のコンパイル エラー1 個 C2.java のコンパイル 図図22 C 2. java のコンパイル.

(4) 12. 中村 学. $ javac C2.java C2.java:11: 警告:@Override を付けてください $ javac C2.java $ javac C2.java public void cm1() { C2.java:11: 警告:@Override を付けてください C2.java:11: 警告:@Override を付けてください ^ $ javac C2.java public void cm1() { public void cm1() { C2.java:18: エラー: C2.java:11: 警告:@Override を付けてください ^ メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません ^ @Override //エラー public void cm1() { C2.java:18: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません C2.java:18: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません ^ ^ @Override //エラー @Override //エラー エラー1 C2.java:18: ^ 個 エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません ^ 警告 1 個 @Override //エラー エラー1 個 エラー1 C2.java のコンパイル 警告^1 個個 図図33 C 2. java のコンパイル 警告 1 個 エラー1 個 public class C3 { 図 3 C2.java のコンパイル 図 3 =C2.java のコンパイル 警告 1 個classstatic public "C3.publicField"; public C3 { String publicField public classstatic C3static { String 図 3 =C2.java protected String protectedField = のコンパイル "C3.protectedField"; public publicField "C3.publicField"; public static String publicField = "C3.publicField"; } public class C3 { protected static String protectedField = "C3.protectedField"; protected static String protectedField "C3.protectedField"; public static String publicField =図"C3.publicField"; 4 =C3.java } } protected String protectedField =C3.java "C3.protectedField"; public class C4static { 図 44  C 図 3. java 図 4 C3.java } public static void main(String[] args) { public class C4 { public class C4 { void main(String[] args) 図 4 {C3.java System.out.println(C3.publicField); public static public static void main(String[] args) { System.out.println(C3.protectedField); public class C4 { System.out.println(C3.publicField); System.out.println(C3.publicField); } public static void main(String[] args) { System.out.println(C3.protectedField); System.out.println(C3.protectedField); } System.out.println(C3.publicField); } } System.out.println(C3.protectedField); 図 5 C4.java } } C4.java $} java 図 5 C4.java 図 55  C C4.java } C4.java:3: エラー: シンボルを見つけられません $ java C4.java 図 4. java $ java C4.java 図 5 C4.java System.out.println(C3.publicField); C4.java:3: エラー: シンボルを見つけられません C4.java:3: エラー: シンボルを見つけられません ^ $ java C4.java System.out.println(C3.publicField); System.out.println(C3.publicField); シンボル: 変数 C3 C4.java:3: エラー: シンボルを見つけられません ^ ^ 場所: クラス C4 C3 System.out.println(C3.publicField); シンボル: 変数 シンボル: 変数 C3 C4.java:4: エラー: シンボルを見つけられません ^ 場所: クラス C4 場所: クラス C4 C3 System.out.println(C3.protectedField); シンボル: 変数 C4.java:4: エラー: シンボルを見つけられません C4.java:4: エラー: ^ 場所: クラス C4 シンボルを見つけられません System.out.println(C3.protectedField); System.out.println(C3.protectedField); シンボル: 変数 C3 C4.java:4: エラー: シンボルを見つけられません ^ ^ 場所: クラス C4 C3 System.out.println(C3.protectedField); シンボル: 変数 シンボル: エラー2 ^ 場所: 個 クラス変数 C4 C3 場所: 個 クラス変数 C4 C3 エラー: コンパイルが失敗しました シンボル: エラー2 エラー2 個 場所: クラス C4 図 6 C4.java の実行 エラー: コンパイルが失敗しました エラー: コンパイルが失敗しました 図 6 C4.java の実行 エラー2 個. エラー: コンパイルが失敗しました. 図6. C4.java の実行. 図6. C4.java の実行. 図 6  C 4. java の実行 $ javac C4.java $ java C4 C3.publicField C3.protectedField 図7. C4.java のコンパイルと実行. 図 7  C 4. java のコンパイルと実行. $ java C4.java C3.publicField Exception in thread "main" java.lang.IllegalAccessError: class C4 tried to access protect ed field C3.protectedField (C4 is in unnamed module of loader com.sun.tools.javac.launche r.Main$MemoryClassLoader @24b1d79b; C3 is in unnamed module of loader 'app') at C4.main(C4.java:4) 図8. C4.java の実行.

(5) $ javac C4.java $ javac C4.java java C4 $ java C4 C3.publicField C3.publicField C3.protectedField C3.protectedField. 教育用プログラミング環境の構築. 図7 図7. 13. C4.java のコンパイルと実行 C4.java のコンパイルと実行. $ java C4.java $ java C4.java C3.publicField C3.publicField Exception in thread "main" java.lang.IllegalAccessError: class C4 tried to access protect Exception in thread "main" java.lang.IllegalAccessError: classcom.sun.tools.javac.launche C4 tried to access protect ed field C3.protectedField (C4 is in unnamed module of loader ed field C3.protectedField (C4 is inC3unnamed module of loader r.Main$MemoryClassLoader @24b1d79b; is in unnamed module of com.sun.tools.javac.launche loader 'app') r.Main$MemoryClassLoader @24b1d79b; C3 is in unnamed module of loader 'app') at C4.main(C4.java:4) at C4.main(C4.java:4) 図 8 C4.java の実行 図 8  C 4. java の実行 図 8 C4.java の実行 $ java C4.java $.java javaを付けないでください C4.java .java を付けないでください 図 9 C4.java の実行 図 9 C4.java の実行 図 9  C 4. java の実行. 4. おわりに 4.本稿では,プログラミング教育のためのプログラミング環境をどのように構築しているかを報告 おわりに 4.おわりに 本稿では,プログラミング教育のためのプログラミング環境をどのように構築しているかを報告 した。これにより,学生の理解も深まったと思われる。今後もプログラミング教育のためのプログ  本稿では,プログラミング教育のためのプログラミング環境をどのように構築しているかを報告 した。これにより,学生の理解も深まったと思われる。今後もプログラミング教育のためのプログ ラミング環境を改善していく。 した。これにより,学生の理解も深まったと思われる。今後もプログラミング教育のためのプログ ラミング環境を改善していく。 謝辞 ラミング環境を改善していく。 謝本研究の経費の一部は「平成 辞 26 年度サタケ技術振興財団研究助成金」および「令和 2 年度サタ 本研究の経費の一部は「平成 26 年度サタケ技術振興財団研究助成金」および「令和 2 年度サタ ケ技術振興財団研究助成金」より支弁されたものである。 謝 辞 ケ技術振興財団研究助成金」より支弁されたものである。  本研究の経費の一部は「平成26年度サタケ技術振興財団研究助成金」および「令和 2 年度サタケ 参考文献 参 考 文 献 1) Oracle and/or its affiliates, “Oracle OpenJDK,” http://jdk.java.net/, 2020 技術振興財団研究助成金」より支弁されたものである。 1) Oracle and/or its affiliates, “Oracle JDK,” OpenJDK,” http://jdk.java.net/, 2020 2) https://www.oracle.com/java/technologie 2) Oracle and/or its affiliates, “Oracle JDK,” https://www.oracle.com/java/technologie s/javase-downloads.html, 2020 参 考 文 献 s/javase-downloads.html, 2020 3) Oracle and/or its affiliates, “@Override should be generalized from ‘superclass’ t 3)‘supertype,’ Oracle and/or affiliates, “@Override should be generalized from o ”its https://bugs.openjdk.java.net/browse/JDK-5008260, 2004‘superclass’ t o ‘supertype,’ ” https://bugs.openjdk.java.net/browse/JDK-5008260, 2004 4) Oracle and/or and/or its affiliates, “Warning for overriding methods not using @Override an 1) Oracle its affiliates, “Oracle OpenJDK,” http://jdk.java.net/, 2020 4) Oracle and/or its affiliates, “Warning for overriding methods notation,” https://bugs.openjdk.java.net/browse/JDK-6329722, 2005not using @Override an 2) Oracle and/or its affiliates,“Oracle JDK,”https://www.oracle.com/java/technologies/ notation,” https://bugs.openjdk.java.net/browse/JDK-6329722, 2005 2020 5) Eclipse Foundation, Inc., “Eclipse,” https://www.eclipse.org/, javase-downloads.html, 2020 5) The Eclipse Foundation, Inc., “Eclipse,” https://www.eclipse.org/, 20202020 6) Apache Software Foundation, “NetBeans,” https://netbeans.org/, 6) 中村学, The Apache Software Foundation, “NetBeans,” https://netbeans.org/, 2020 7) “Annotation, Part 2,” http://www.hkg.ac.jp/~nakamura/Java/TnE/020.html, 202 to 3) Oracle and/or its affiliates, “@Override should be generalized from ‘superclass’ 7) 中村学, “Annotation, Part 2,” http://www.hkg.ac.jp/~nakamura/Java/TnE/020.html, 202 0 ‘supertype,’”https://bugs.openjdk.java.net/browse/JDK-5008260, 2004 0 8) Oracle and/or its affiliates, “JEP 330: Launch Single-File Source-Code Programs,” h 4) Oracle and/or its affiliates,“Warning for overriding methods not using @Override 8) Oracle and/or its affiliates, “JEP ttps://openjdk.java.net/jeps/330, 2018 330: Launch Single-File Source-Code Programs,” h annotation,” https://bugs.openjdk.java.net/browse/JDK︲6329722, 2005 ttps://openjdk.java.net/jeps/330, 2018. 5) Eclipse Foundation, Inc.,“Eclipse,”https://www.eclipse.org/, 2020 6) The Apache Software Foundation,“NetBeans,”https://netbeans.org/, 2020 7) 中村学,“Annotation, Part 2,”http://www.hkg.ac.jp/~nakamura/Java/TnE/020.html, 2020 8) Oracle and/or its affiliates,“JEP 330: Launch Single-File Source-Code Programs,”https:// openjdk.java.net/jeps/330, 2018.

(6)

図 4  C3.java public class C4 {

参照

関連したドキュメント

活用のエキスパート教員による学力向上を意 図した授業設計・学習環境設計,日本教育工

大学設置基準の大綱化以来,大学における教育 研究水準の維持向上のため,各大学の自己点検評

わかりやすい解説により、今言われているデジタル化の変革と

取組の方向 安全・安心な教育環境を整備する 重点施策 学校改築・リフレッシュ改修の実施 推進計画 学校の改築.

全体構想において、施設整備については、良好

小・中学校における環境教育を通して、子供 たちに省エネなど環境に配慮した行動の実践 をさせることにより、CO 2

小学校における環境教育の中で、子供たちに家庭 における省エネなど環境に配慮した行動の実践を させることにより、CO 2

 大学図書館では、教育・研究・学習をサポートする図書・資料の提供に加えて、この数年にわ