Время на прочтение
11 мин
Количество просмотров 14K
Принципы в заметке общие для почти любого языка программирования и системы исполнения, но акцент будет на jvm. Рассмотрим два основных подхода по модификации программы:
- манипуляции с исполняемым кодом программы после компиляции или во время загрузки кода;
- изменение исходного кода перед компиляцией.
Метафора, связанная с изображением в заметке: программа — это основное здание, а результат трансформации программы — вспомогательная конструкция.
Зачем модифицировать?
Начнем с вопроса зачем программе модифицировать другую программу. Метапрограммирование помогает уменьшить объем boilerplate кода в проекте и концентрироваться на главном, улучшить читаемость кода и решить задачи которые сложно решить другим способом.
Простейший пример в java — JavaBeans и get/set методы для доступа к полям класса, также примером может служить создание билдеров для класса, автореализации equals/hash в IDE и т.п.
Следующий пример — это логирование, автоматическое управление транзакциями. Все к чему привыкли при использовании Spring Framework и редко задумываемся как это реализовано. Но даже Spring создал сложности с конфигурацией и инициализацией фреймворка для новичков, что послужило причиной появления «магического» Spring Boot/Spring Roo. Но это отдельная тема, мы же вернемся к теме модификации программы.
Обфускация и минимизация кода, инструментирующие профилировщики и мир DevOps третий пример для чего нужно модифицировать программу. Думаю, что пропустил другие важные примеры, вы можете дополнить в комментариях.
Итак, зачем модифицировать программу мы определились, теперь рассмотрим, как это обычно делают.
Модификация исполняемых инструкций программы
Можно модифицировать байт-код программы и это самый распространенный способ. Делать это можно как сразу после компиляции, но перед сборкой jar, так и при загрузке класса. В первом случае это будет плагин системы сборки проекта, во втором специальный загрузчик классов или java агент, либо механизм hotswap в jvm. Подход с агентами и загрузчиками классов очень похож на самомодифицирующиеся программы в машинном коде и полиморфные вирусы.
Байт-код файла, который загружает jvm имеет структуру, описанную в официальной документации о формате класса
Приложение javap позволяет просматривать байт-код скомпилированного класса
Пример из официальной документации
Исходный текст класса:
import java.awt.*;
import java.applet.*;
public class DocFooter extends Applet {
String date;
String email;
public void init() {
resize(500,100);
date = getParameter("LAST_UPDATED");
email = getParameter("EMAIL");
}
public void paint(Graphics g) {
g.drawString(date + " by ",100, 15);
g.drawString(email,290,15);
}
}
Вывод javap на консоль для байт-кода этого класса:
Compiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public DocFooter();
Code:
0: aload_0
1: invokespecial #1 // Method java/applet/Applet."<init>":()V
4: return
public void init();
Code:
0: aload_0
1: sipush 500
4: bipush 100
6: invokevirtual #2 // Method resize:(II)V
9: aload_0
10: aload_0
11: ldc #3 // String LAST_UPDATED
13: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
16: putfield #5 // Field date:Ljava/lang/String;
19: aload_0
20: aload_0
21: ldc #6 // String EMAIL
23: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
26: putfield #7 // Field email:Ljava/lang/String;
29: return
public void paint(java.awt.Graphics);
Code:
0: aload_1
1: new #8 // class java/lang/StringBuilder
4: dup
5: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
8: aload_0
9: getfield #5 // Field date:Ljava/lang/String;
12: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: ldc #11 // String by
17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: bipush 100
25: bipush 15
27: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
30: aload_1
31: aload_0
32: getfield #7 // Field email:Ljava/lang/String;
35: sipush 290
38: bipush 15
40: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
43: return
}
Но модифицировать байт-код вручную имеет смысл только в учебных целях или если вы ниндзя, который любит создавать и преодолевать сложности. The Java Virtual Machine Specification отвечает на большинство вопросов на этом этапе.
В промышленном программировании работу с байт-кодом упрощают библиотеки ASM, javassist, BCEL, CGLIB. После парсинга байт кода, тот же ASM позволяет программисту работать с байт кодом как через Tree API, так и в событийной модели, используя шаблон visitor. Кроме анализа, возможна и модификация, добавление новых инструкций, полей, методов и т.п. В природе существуют и другие библиотеки работы с байт кодом, но их используют реже.
Пример использования API ASM для
анализа байт-кода
/***
* ASM examples: examples showing how ASM can be used
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.IincInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import org.objectweb.asm.tree.analysis.Analyzer;
import org.objectweb.asm.tree.analysis.BasicValue;
import org.objectweb.asm.tree.analysis.BasicVerifier;
import org.objectweb.asm.tree.analysis.Frame;
import org.objectweb.asm.tree.analysis.SourceInterpreter;
import org.objectweb.asm.tree.analysis.SourceValue;
import org.objectweb.asm.util.TraceMethodVisitor;
import org.objectweb.asm.util.Textifier;
/**
* @author Eric Bruneton
*/
public class Analysis implements Opcodes {
public static void main(final String[] args) throws Exception {
ClassReader cr = new ClassReader("Analysis");
ClassNode cn = new ClassNode();
cr.accept(cn, ClassReader.SKIP_DEBUG);
List<MethodNode> methods = cn.methods;
for (int i = 0; i < methods.size(); ++i) {
MethodNode method = methods.get(i);
if (method.instructions.size() > 0) {
if (!analyze(cn, method)) {
Analyzer<?> a = new Analyzer<BasicValue>(
new BasicVerifier());
try {
a.analyze(cn.name, method);
} catch (Exception ignored) {
}
final Frame<?>[] frames = a.getFrames();
Textifier t = new Textifier() {
@Override
public void visitMaxs(final int maxStack,
final int maxLocals) {
for (int i = 0; i < text.size(); ++i) {
StringBuilder s = new StringBuilder(
frames[i] == null ? "null"
: frames[i].toString());
while (s.length() < Math.max(20, maxStack
+ maxLocals + 1)) {
s.append(' ');
}
System.err.print(Integer.toString(i + 1000)
.substring(1)
+ " "
+ s
+ " : "
+ text.get(i));
}
System.err.println();
}
};
MethodVisitor mv = new TraceMethodVisitor(t);
for (int j = 0; j < method.instructions.size(); ++j) {
Object insn = method.instructions.get(j);
((AbstractInsnNode) insn).accept(mv);
}
mv.visitMaxs(0, 0);
}
}
}
}
/*
* Detects unused xSTORE instructions, i.e. xSTORE instructions without at
* least one xLOAD corresponding instruction in their successor instructions
* (in the control flow graph).
*/
public static boolean analyze(final ClassNode c, final MethodNode m)
throws Exception {
Analyzer<SourceValue> a = new Analyzer<SourceValue>(
new SourceInterpreter());
Frame<SourceValue>[] frames = a.analyze(c.name, m);
// for each xLOAD instruction, we find the xSTORE instructions that can
// produce the value loaded by this instruction, and we put them in
// 'stores'
Set<AbstractInsnNode> stores = new HashSet<AbstractInsnNode>();
for (int i = 0; i < m.instructions.size(); ++i) {
AbstractInsnNode insn = m.instructions.get(i);
int opcode = insn.getOpcode();
if ((opcode >= ILOAD && opcode <= ALOAD) || opcode == IINC) {
int var = opcode == IINC ? ((IincInsnNode) insn).var
: ((VarInsnNode) insn).var;
Frame<SourceValue> f = frames[i];
if (f != null) {
Set<AbstractInsnNode> s = f.getLocal(var).insns;
Iterator<AbstractInsnNode> j = s.iterator();
while (j.hasNext()) {
insn = j.next();
if (insn instanceof VarInsnNode) {
stores.add(insn);
}
}
}
}
}
// we then find all the xSTORE instructions that are not in 'stores'
boolean ok = true;
for (int i = 0; i < m.instructions.size(); ++i) {
AbstractInsnNode insn = m.instructions.get(i);
int opcode = insn.getOpcode();
if (opcode >= ISTORE && opcode <= ASTORE) {
if (!stores.contains(insn)) {
ok = false;
System.err.println("method " + m.name + ", instruction "
+ i + ": useless store instruction");
}
}
}
return ok;
}
/*
* Test for the above method, with three useless xSTORE instructions.
*/
public int test(int i, int j) {
i = i + 1; // ok, because i can be read after this point
if (j == 0) {
j = 1; // useless
} else {
try {
j = j - 1; // ok, because j can be accessed in the catch
int k = 0;
if (i > 0) {
k = i - 1;
}
return k;
} catch (Exception e) { // useless ASTORE (e is never used)
j = j + 1; // useless
}
}
return 0;
}
}
Аспектно-ориентированный подход можно считать высокоуровневым способом модификации программы. В реализации AspectJ на уровне агента, загрузчика классов или плагина вся «магия» АОП превращается в манипуляции с байт-кодом классов. Но как это видит программист при разработке отличается от того как модифицируется байт код «под капотом» с помощью того же ASM и BCEL. Если интересно, что фактически добавляет AspectJ в классы вашего приложения, можно включить дамп модифицированных классов и по локоть влезть в этот код, например, с помощью Java Decompiler.
В AspectJ разработчик определяет действия в виде классов, аннотируя их как аспекты и указывая в каких точках программы(Pointcut) их следует вызывать. Синтаксис определения pointcut выражений также достаточно высокоуровневый. Такой подход к модификации байт-кода более прост в использовании для программиста.
Подробнее показывал и рассказывал на примерах в цикле публикаций на хабре
Трансформация программы за счет модификации байт-кода имеет свои сильные и слабые стороны:
Плюсы | Минусы |
---|---|
подход работает при отсутствии исходных текстов программы | сложность анализа и модификации, при нетривиальных трансформациях |
независимость от компилятора | отсутствие информации, доступной только в исходном коде |
Трансформация AST исходного кода, метапрограммирование
Теория и практика трансформации исходного кода давно применяется в метапрограммировании, Prolog, Lisp, макросах и препроцессорах языков программирования.
При данном подходе исходный текст программы трансформируется либо дополняется другой программой перед компиляцией, а затем компилируется. Работать удобнее не с самим текстом программы, а с абстрактным синтаксическим деревом построенным из него (abstract syntax tree, AST).
Опять же, удобство метапрограммирования зависит от поддержки его в самом языке программирования. Существует шутка
В Лиспе, если охота аспектно-ориентированного программирования, нужно лишь настругать немного макросов, и готово. В Java, нужен Грегор Кичалес, создающий новую фирму, и месяцы и годы попыток заставить всё работать.
Петер Норвиг
Поэтому в jvm чуть сложнее, хоть механизм reflection и является частью языка и платформа может динамически загружать и исполнять байт-код. Сразу на ум приходят две технологии, которые используют кодогенерацию — JPA static metamodel generator и jaxb code generation. Другой пример — project Lombok, который позволяет автоматически реализовать, то что раньше генерировалось IDE или писалось вручную и поддерживалось разработчиками.
Аннотации проекта Lombok
val
Finally! Hassle-free final local variables.
@ NonNull
or: How I learned to stop worrying and love the NullPointerException.
@ Cleanup
Automatic resource management: Call your close() methods safely with no hassle.
@ Getter / @ Setter
Never write public int getFoo() {return foo;} again.
@ ToString
No need to start a debugger to see your fields: Just let lombok generate a toString for you!
@ EqualsAndHashCode
Equality made easy: Generates hashCode and equals implementations from the fields of your object.
@ NoArgsConstructor, @ RequiredArgsConstructor and @ AllArgsConstructor
Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.
@ Data
All together now: A shortcut for @ ToString, @ EqualsAndHashCode, @ Getter on all fields, and @ Setter on all non-final fields, and @ RequiredArgsConstructor!
@ Value
Immutable classes made very easy.
@ Builder
… and Bob’s your uncle: No-hassle fancy-pants APIs for object creation!
@ SneakyThrows
To boldly throw checked exceptions where no one has thrown them before!
@ Synchronized
synchronized done right: Don’t expose your locks.
@ Getter(lazy=true)
Laziness is a virtue!
@ Log
Captain’s Log, stardate 24435.7: «What was that line again?»
Реализовано в Lombok это с помощью модификации AST пользовательской программы и кодогенерации.
Схожая функциональность, со своими ограничениями, есть и в java для аннотаций с областью видимости compile time — Annotation Processing Tool.
В случае с парсингом java исходного кода, лучше чем javac и eclipse java compiller вряд ли кто справится. Есть альтернативы, такие как Spoon и JTransformer, но насколько полно они поддерживают спецификацию и сложные классы, даже нет желания проверять.
Раз уж речь идет о jvm, то трансформация исходного текста программы на Groovy является частью самого языка, подобные возможности есть и в языке Scala.
Итак, в модификации исходного кода программы есть слабые и сильные стороны:
Плюсы | Минусы |
---|---|
большее количество информации, чем в байт-коде | этап компиляции или интерпретации (память, время) |
возможности, подобные рефакторингу в IDE | требование к наличию исходных текстов, способа автоматически найти их для заданного класса/jar |
Трансформация AST кода и рекомпиляция во время выполнения
Самая хардкорная часть этой заметки — мысли про перекомпиляцию в рантайм. Модификация и компиляция AST java кода в момент выполнения может быть нужна, если требуются костыли: проект либо полный капролит, либо делать и поддерживать десятки форков разных версий очень трудоемко, либо если его менеджмент и разработчики считают его идеальным и не позволяют никому его модификацию, но при этом исходный текст есть в enterprise maven репозитарии. И этот подход нужен только если задачу невозможно или неудобно решать двумя ранее описанными классами трансформации программы.
С компиляцией все относительно просто. JavaCompiler API позволяет скомпилировать программу из исходного кода в момент выполнения, предоставляя интерфейс независимый от реализации. При изучении манифеста и исходных текстов eclipse EJC компилятора, обнаружил что и он поддерживает JavaCompiler API.
Но при анализе текста программы все равно нет публичного и универсального API для работы с AST. Т.е. придется работать либо с com.sun.source.tree.* либо org.eclipse.jdt.core.dom.*
Задача с поиском исходного текста класса легко решается, если проект публиковался в maven репозитарий вместе с артефактом типа source и в jar с классами есть файлы pom.properties или pom.xml, либо есть некий словарь соответствия названия/хеша артефакта исходному коду соответствующего jar файла и способ получить эти исходники во время работы программы.
Плюсы — для трансформации доступно больше информации, чем есть в байт-коде, применение не требует пересборки проекта и почти так же удобно как и применение AspectJ агента, но при этом трансформацию невозможно было выполнить средствами преобразования байт-кода, либо очень трудоемко.
Минусы такие же, как и у прошлого подхода: память, время, требование к наличию исходного текста программы и способа его найти для данного класса.
Примеры вышесказанного в виде кода ejc+maven будут в ближайшие месяцы, да и задача выбрана вполне жизненная. Сталкивались ли вы с подобным? Какие задачи из вашей практики можно было бы элегантно решить только с помощью трансформации java кода и рекомпиляции во время выполнения?
Кстати, возможности компилятора TinyCC и его размер доказывают, что такой подход возможен и для C программ.
В заметке мы рассмотрели несколько подходов по модификации программы, их сильные и слабые стороны. Модификация исполняемого кода более распространена, но не все задачи можно решить без наличия исходного кода программы и его последующей трансформации.
Скачать материал
Скачать материал
- Сейчас обучается 389 человек из 62 регионов
Описание презентации по отдельным слайдам:
-
1 слайд
Разработка модифицированной (авторизованной) учебной программы
По материалам для аттестации ОУ (выпуск 10)
© Dale Carnegie & Associates, Inc., 1996-2001 -
2 слайд
Модифицированную (авторизованную) учебную программу разрабатывают, если:
количество часов в учебном плане образовательного учреждения не совпадает с количеством часов в государственной учебной программе
в пояснительной записке к государственной учебной программе автор (или авторский коллектив) не указал на возможность её корректировки в плане изменения числа тем, перераспределения часов, отводимое на их изучение, последовательности их изложения
есть необходимость разработать интегрированный курс, включающий два и более предметов -
3 слайд
Модифицированную (авторизованную) учебную программу разрабатывают на основе государственной учебной программы (или программ) по предмету (предметам) с учетом государственных образовательных стандартов начального общего, основного общего или среднего (полного) общего образования (2004г.) или обязательного минимума содержания общего образования (1998г.).
-
4 слайд
Модифицированная (авторизованная) учебная программа должна быть рассмотрена не менее чем тремя экспертами (специалистами по данному предмету) и подписана ими при условии отсутствия замечаний или устранения их замечаний в ходе предварительной доработки учебной программы, а затем утверждена на педагогическом совете образовательного учреждения.
-
5 слайд
Структура модифицированной (авторизованной) учебной программы.
Пояснительная записка
Содержание обучения
Перечень практических работ
Требования к подготовке учащихся по предмету
Список рекомендуемой учебно-методической литературы -
6 слайд
Пояснительная записка
Указать цели и задачи обучения предмету;
государственную программу (или программы), на основе которой составлена данная программа;
причины ее составления;
отличие от государственной программы. -
7 слайд
Рекомендуем также дать таблицу тематического распределения часов:
-
8 слайд
Содержание обучения
Перечислить изучаемые разделы и темы с указанием числа часов по разделам и темам, которые будут изучаться при раскрытии этого раздела и темы. -
9 слайд
Перечень практических работ
При необходимости -
10 слайд
Требования к подготовке учащихся по предмету
Перечислить требования в соответствии с государственной учебной программой или государственными учебными программами (для интегрированного курса -
11 слайд
Список рекомендуемой учебно-методической литературы
Список литературы должен содержать используемый учителем учебно-методический комплект (УМК):
Учебник
Методические пособия и др. -
12 слайд
_______________Каневской район_____________
(территориальный, административный округ (город, район, поселок)
муниципальное общеобразовательное учреждение «Гимназия»
(полное наименование образовательного учреждения)
Утверждено
решение педсовета протокол №______
от «___»________________200 года
Председатель педсовета
____________________________Ф.И.О
МОДИФИЦИРОВАННАЯ (АВТОРИЗОВАННАЯ) ПРОГРАММА
по _____________________________________________________
(указать предмет)
Класс _______________________________________________
Учитель _______________________________________________
Программа разработана на основе__________________________
__________________________________________________________________
(указать государственную программу/программы, издательство, год издания)
ЭКСПЕРТЫ:____________________________________________________
(Специальность по диплому, должность, подпись, Ф.И.О.)
__________________________________________
(Специальность по диплому, должность, подпись, Ф.И.О.)
__________________________________________
(Специальность по диплому, должность, подпись, Ф.И.О.) -
13 слайд
Пояснительная записка
Содержание обучения
Перечень практических работ
Требования к подготовке учащихся по предмету
Список рекомендуемой учебно-методической литературы
-
14 слайд
Соответствие планирования учебного материала
и полноты его выполнения государственным требованиям
Территория __Каневской район__________________________
Учреждение муниципальное общеобразовательное учреждение «Гимназия»
Класс ____________________________
Наименование предмета ________________________________________
Наименование учебной программы с указанием “государственная”, “авторская” или “авторизованная”, органа, утвердившего ее, года издания: ______________________________________________________________ -
15 слайд
по _____________________________________________________
(указать предмет)
Класс ___________________________________________________________________
Учитель __________________________________________________________
Количество часов: всего ___________ часов; в неделю ___________ часов;Планирование составлено на основе ______________________________________________
_________________________________________________________________
(указать учебную программу)Согласовано
Замдиректора по УВР
___________________________
«___» ______________ 200__ года
________Каневской район________
(территориальный, административный округ (город, район, поселок)
муниципальное общеобразовательное учреждение «Гимназия» __
(название образовательного учреждения)КАЛЕНДАРНО-ТЕМАТИЧЕСКОЕ
ПЛАНИРОВАНИЕ -
Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:
6 257 905 материалов в базе
- Выберите категорию:
-
Выберите учебник и тему
- Выберите класс:
-
Тип материала:
-
Все материалы
-
Статьи
-
Научные работы
-
Видеоуроки
-
Презентации
-
Конспекты
-
Тесты
-
Рабочие программы
-
Другие методич. материалы
-
Найти материалы
Другие материалы
- 31.12.2020
- 4550
- 4
- 31.12.2020
- 4430
- 0
- 10.12.2020
- 4622
- 0
- 08.12.2020
- 4490
- 0
- 05.12.2020
- 4312
- 0
- 18.10.2020
- 4653
- 3
- 04.08.2020
- 5246
- 1
Вам будут интересны эти курсы:
-
Курс профессиональной переподготовки «Маркетинг: теория и методика обучения в образовательной организации»
-
Курс повышения квалификации «Методика написания учебной и научно-исследовательской работы в школе (доклад, реферат, эссе, статья) в процессе реализации метапредметных задач ФГОС ОО»
-
Курс повышения квалификации «Основы местного самоуправления и муниципальной службы»
-
Курс профессиональной переподготовки «Организация и предоставление туристских услуг»
-
Курс повышения квалификации «Основы управления проектами в условиях реализации ФГОС»
-
Курс повышения квалификации «Организация практики студентов в соответствии с требованиями ФГОС юридических направлений подготовки»
-
Курс профессиональной переподготовки «Организация деятельности по подбору и оценке персонала (рекрутинг)»
-
Курс повышения квалификации «Маркетинг в организации как средство привлечения новых клиентов»
-
Курс повышения квалификации «Правовое регулирование рекламной и PR-деятельности»
-
Курс профессиональной переподготовки «Организация деятельности помощника-референта руководителя со знанием иностранных языков»
-
Курс профессиональной переподготовки «Организация маркетинговой деятельности»
-
Курс профессиональной переподготовки «Гражданско-правовые дисциплины: теория и методика преподавания в образовательной организации»
1
Разработка модифицированной (авторизованной) учебной программы По материалам для аттестации ОУ (выпуск 10) © Dale Carnegie & Associates, Inc.,
2
Модифицированную (авторизованную) учебную программу разрабатывают, если: количество часов в учебном плане образовательного учреждения не совпадает с количеством часов в государственной учебной программе в пояснительной записке к государственной учебной программе автор (или авторский коллектив) не указал на возможность её корректировки в плане изменения числа тем, перераспределения часов, отводимое на их изучение, последовательности их изложения есть необходимость разработать интегрированный курс, включающий два и более предметов
3
Модифицированную (авторизованную) учебную программу разрабатывают на основе государственной учебной программы (или программ) по предмету (предметам) с учетом государственных образовательных стандартов начального общего, основного общего или среднего (полного) общего образования (2004г.) или обязательного минимума содержания общего образования (1998г.).
4
Модифицированная (авторизованная) учебная программа должна быть рассмотрена не менее чем тремя экспертами (специалистами по данному предмету) и подписана ими при условии отсутствия замечаний или устранения их замечаний в ходе предварительной доработки учебной программы, а затем утверждена на педагогическом совете образовательного учреждения.
5
Структура модифицированной (авторизованной) учебной программы. Пояснительная записка Содержание обучения Перечень практических работ Требования к подготовке учащихся по предмету Список рекомендуемой учебно- методической литературы
6
Пояснительная записка Указать цели и задачи обучения предмету; государственную программу (или программы), на основе которой составлена данная программа; причины ее составления; отличие от государственной программы.
7
Рекомендуем также дать таблицу тематического распределения часов: п/п Разделы, темы Количество часов государственная программа (программы) модифицирова нная (авторизован ная) программа
8
Содержание обучения Перечислить изучаемые разделы и темы с указанием числа часов по разделам и темам, которые будут изучаться при раскрытии этого раздела и темы.
9
Перечень практических работ При необходимости
10
Требования к подготовке учащихся по предмету Перечислить требования в соответствии с государственной учебной программой или государственными учебными программами (для интегрированного курса
11
Список рекомендуемой учебно- методической литературы Список литературы должен содержать используемый учителем учебно- методический комплект (УМК): Учебник Методические пособия и др.
12
_______________Каневской район_____________ (территориальный, административный округ (город, район, поселок) муниципальное общеобразовательное учреждение «Гимназия» (полное наименование образовательного учреждения) Утверждено решение педсовета протокол ______ от «___»________________200 года Председатель педсовета ____________________________Ф.И.О МОДИФИЦИРОВАННАЯ (АВТОРИЗОВАННАЯ) ПРОГРАММА по _____________________________________________________ (указать предмет) Класс _______________________________________________ Учитель _______________________________________________ Программа разработана на основе__________________________ _______________________________________________________________ ___ (указать государственную программу/программы, издательство, год издания) ЭКСПЕРТЫ:____________________________________________________ (Специальность по диплому, должность, подпись, Ф.И.О.) __________________________________________ (Специальность по диплому, должность, подпись, Ф.И.О.) __________________________________________ (Специальность по диплому, должность, подпись, Ф.И.О.)
13
Пояснительная записка Содержание обучения Перечень практических работ Требования к подготовке учащихся по предмету Список рекомендуемой учебно- методической литературы
14
Соответствие планирования учебного материала и полноты его выполнения государственным требованиям Территория __Каневской район__________________________ Учреждение муниципальное общеобразовательное учреждение «Гимназия» Класс ____________________________ Наименование предмета ________________________________________ Наименование учебной программы с указанием “государственная”, “авторская” или “авторизованная”, органа, утвердившего ее, года издания: ______________________________________________________________ Показатель качества ________________________ 1. Наличие тем (указать количество) 2. Объем часов на прохождение всех тем 3. Объем часов на прохождение каждой темы: Наличие практических работ (указать количество) Значения показателей качества Оцен ка ЭталонноеФактическое Предметная учебная программа Календарно- тематический план Журнал (на момент проверки) Госуд.Авториз.
15
по _____________________________________________________ (указать предмет) Класс ___________________________________________________________________ Учитель __________________________________________________________ Количество часов: всего ___________ часов; в неделю ___________ часов; Планирование составлено на основе ______________________________________________ _________________________________________________________________ (указать учебную программу) Согласовано Замдиректора по УВР ___________________________ «___» ______________ 200__ года ________Каневской район________ (территориальный, административный округ (город, район, поселок) муниципальное общеобразовательное учреждение «Гимназия» __ (название образовательного учреждения) КАЛЕНДАРНО-ТЕМАТИЧЕСКОЕ ПЛАНИРОВАНИЕ
16
Номер урока Содержание (разделы, темы) Количество часов Даты прове дения 1. Указать раздел1. Указать об- щее количест- во часов 2. Указать темы, которые будут изучаться при раскрытии данного раздела, а также практические и контрольные работы 2. Указать ко- личество ча- сов, отводи- мое на изуче- ние данной темы, а так- же на прове- дение практи- ческих и кон- трольных ра- бот
динамики характеризуются слабой связанностью подмоделей, поэтому для моделирования целесообразно использовать GRJD-вычисления. Эксперименты по получению результатов в GRID-среде планируются на дальнейших этапах разработки программного комплекса параллельного расчета
динамики систем тел. Предполагается разработка модуля декомпозиции сложных многотельных моделей для эффективного использования распределенных ресурсов GRID-среды. Это позволит осуществлять междисциплинарное моделирование с высокой детализацией.
СПИСОК ЛИТЕРАТУРЫ
1. Виттенбург, И.С. Динамика систем твердых тел [Текст]/И.С. Виттенбург.-М.: Мир.-1980.-294 с.
2. Официальный сайт пакета ФРУНД [Электронный ресурс].-2009.-Режим доступа: http://frund.vstu.ru.
3. Bayo, E. A modified Lagrangian formulation for the dynamic analysis of constrained mechanical systems [Текст]/Е. Bayo, J. Garcia de Jalon, M.A. Serna//Computer Methods in Applied Mechanics and Engineering.-1988.-Vol. 71.-Iss. 2.-P. 183-195.
4. Банах, Л.Я. Условия разбиения системы дифференциально-алгебраических уравнений на слабосвязанные подсистемы [Текст]/Л.Я. Банах, А.С. Го-робцов, О.К. Чесноков//Журнал вычислительной математики и математической физики.-2006.-№ 12.-C. 2223-2227.
5. Hockney, R. The communication challenge for MPP: Intel paragon and meiko CS-Parallel computing [Текст]Ж. Hockney//Parallel Computing archive.-1994.-Vol. 20. Iss. 3.-P. 389-398.
6. Pjesivac-Grbovic, J. Performance analysis of MPI collective operations [Текст]Л. Pjesivac-Grbovic, T. Angskun, G. Bosilca [et al.]//Cluster Computing.-2007. -Vol. 10.-P. 127-143.
7. Matsuda, M. The design and implementation of MPI collective operations for clusters in long-and-fast networks [Текст]/ M. Matsuda, T. Kudoh, Y. Kodama [et al.]//Cluster Computing.-2008.-Vol. 11.-Iss. 1.-P. 45-55.
8. Lucas, H.V. Hint Controlled Distribution with Parallel File Systems [TeKCT]/H.V. Lucas, T. Ludwig// European PVM/MPI Users Group Meeting.-2005.-P. 110-118.
9. Worringen, J. Improving generic non-contiguous file access for MPI-IO [Текст]Л. Worringen, J.L. Traft, H. Ritzdorf//Lecture Notes in Computer Science, Recent Advances in Parallel Virtual Machine and Message Passing Interface .-2003.-P. 309-318.
УДК 004.4’23, 004.4’24
В.М. Ицыксон, Д.А. Тимофеев
ТЕХНОЛОГИЯ МОДИФИКАЦИИ ПРОГРАММНОГО КОДА, ОСНОВАННАЯ НА ПАРАМЕТРИЗУЕМЫХ ШАБЛОНАХ
Различные модификации исходного кода -одни из самых частых действий разработчиков во время всего жизненного цикла программной системы. Целями модификации могут являться внесение новой функциональности, исправление ошибок, улучшение читаемости, повышение производительности, переход на другие библиотеки и т. п. В общем случае эту задачу сложно автоматизировать, поэтому разработчики обычно решают ее вручную. Она усложняется еще и тем, что сравнительно небольшие локальные изменения могут повлечь за собой необходимость обработки большого количества зависимого программного кода.
Если модификация программного кода представляет собой изменения с сохранением поведения (рефакторинги), то задача решается относительно легко с привлечением современной среды разработки, в которой данные модификации поддержаны и автоматизированы. Однако часто требуется вносить изменения, которые не могут быть выражены набором шаблонов рефакторинга. Кроме того, их иногда необходимо производить многократно в разных участках программы. Примером таких изменений может быть однотипная оптимизация циклов в программе.
Для автоматизации подобных операций программисту необходимо средство, позволяющее описать изначальное состояние программы до модификации и правила проведения преобразования. Существующие среды разработки таких средств не предоставляют.
Одним из способов решения указанной проблемы может быть использование существующих универсальных средств для различного рода трансформаций кода, таких как Stratego/XT [1], ASF+SDF [2], TXL [3] и т. п. Эти системы являются универсальными преобразователями структурированных текстов, управляемыми грамматикой. С их помощью можно описать довольно сложные преобразования программ, написанных на различных языках программирования.
Однако, на наш взгляд, им присущи существенные недостатки:
сложность языка трансформаций; необходимость повторного описания грамматики целевого языка в терминах, определяемых используемым средством трансформации;
сложность интеграции с существующими средами разработки с сохранением необходимого уровня интерактивности;
необходимость описания операций преобразования программы в терминах ее модельного представления (например, в терминах абстрактного синтаксического дерева (АСД) или грамматики целевого языка);
трудоемкость и затратность внедрения в текущий процесс разработки программного обеспечения.
Предлагаемый подход. В данной статье описывается подход, упрощающий процесс описания и осуществления модификаций программного кода, ориентированный на конечного разработчика, не являющегося экспертом в области теории языков программирования. В основе этого подхода лежит
язык шаблонов, позволяющий описывать параметризуемые шаблоны кода «до» и «после» модификации. На основе данных шаблонов генерируется список операций, необходимых для модификации программного кода. Поиск участков кода, для которых необходимо произвести изменения, осуществляется с использованием шаблона «до». После завершения поиска и изменения необходимых участков, происходит запись программного кода в форматированном виде обратно в файл. На рис. 1 представлена общая схема предлагаемого подхода.
Ниже более подробно рассматриваются основные этапы осуществления модификаций кода, применяемые в этом подходе.
Язык шаблонов. Указанные выше инструменты, такие как Stratego, TXL и т. п., используют сложный язык описания трансформаций. Для того, чтобы упростить работу разработчика, необходимо создать декларативный язык описания модификаций программного кода, который является максимально близким к целевому языку программирования. В таком случае синтаксис языка трансформаций в основных чертах повторяет синтаксис языка программирования. Благодаря этому он более легок в изучении и применении.
В качестве основных требований к данному языку можно выделить следующие:
необходимость оперирования шаблонами «до» и «после» модификации;
возможность параметризации шаблонов; наличие элементов регулярных выражений для осуществления более гибкого поиска участков кода;
иерархичность языка – не должно быть ограничений на количество вложенных конструкций.
Выбор в пользу использования шаблонов «до» и «после» обоснован тем, что в данном случае возможно осуществить автоматическое определение списка операций, необходимых для при-
Рис. 1. Общая схема подхода
ведения шаблона «до» к виду шаблона «после». Этот список впоследствии может быть использован для преобразования участков кода, найденных на основе шаблона «до».
В статье описывается разработанный язык шаблонов для языка программирования Java 1.5. Язык Java выбран как один из самых распростра-
Шаблон «до»:
ненных в настоящее время языков программирования. Формальная спецификация языка шаблонов не приведена из-за ограниченного объема статьи.
В листинге 1 дан пример параметризованных шаблонов для преобразования цикла «for» в цикл «while».
Шаблон «после»:
for( }
#var; #cond; #upd) { #expr;
#var;
while(#cond) #expr; #upd;
}
Листинг 1: Пример параметризованных шаблонов для преобразования
Используя такие шаблоны можно за одну операцию трансформировать все операторы «for» в «while» и обратно. Шаблон «до»:
В листинге 2 приведены шаблоны для оптимизации цикла «&г» в том случае, если условие выражения «й» является константным.
Шаблон «после»:
£ог( ^аг; #соп^ #ир^ { 1£(“Ьгие) { #ехрг;
}
} }
Листинг 2: Пример шаблонов для оптимизации
Как видно из рассмотренных примеров, разработанный язык шаблонов является достаточно прозрачным и простым в изучении.
Параметры в приведенных выше шаблонах выступают в роли элементов-«заполнителей», которые во время поиска заполняются найденными конструкциями языка программирования. Изменение местоположения параметра в шаблоне «после» позволяет указать место перемещения
if(true) {
for(#var; #cond; #upd) { #expr;
}
данных конструкции, а отсутствие параметра -необходимость удаления. Возможность использования элементов регулярных выражений при описании параметров позволяет увеличить гибкость поиска. В листинге 3 приведены примеры настраиваемого параметра. В данном случае ограничение на число конструкций, которыми может владеть параметр, настраивается с помощью числовых аргументов, задаваемых после его имени.
#EXPR:1; – количество конструкций языка = 1;
#EXPR:1-5; – количество конструкций языка от 1 до 5; #EXPR:1-; – количество конструкций языка больше 1;
Листинг 3: Примеры настраиваемого параметра
Для того, чтобы сделать шаблоны модификации более универсальными, в создаваемый язык введены элементы, позволяющие находить несколько интересующих конструкций в исходном
коде. В качестве примера в листинге 4 приведен шаблон для поиска всех методов в классе, описанном на языке Java.
#method() { #EXPR; if(a < b)
{
this.a = b;
}
#EXPR;
}
Листинг 4: Пример шаблона для поиска методов
Рис. 2. АСД участка кода, отвечающего за объявление переменной
Модельное представление программы. Для
осуществления операций поиска необходимых участков кода и их последующей модификации необходимо выбрать промежуточное представление программного кода, наиболее пригодное для проведения поиска и модификаций. В качестве основного представления было выбрано абстрактное синтаксическое дерево [4] (далее -АСД) в силу следующих его свойств:
расширяемость – в случае необходимости в АСД может быть включена дополнительная информация (например, различные семантические свойства, комментарии и т. п.);
эффективность – существуют эффективные алгоритмы обработки деревьев;
адаптивность – возможность настраивания уровня детализации при генерации АСД.
На рис. 2 представлен пример возможного АСД для участка кода, отвечающего за объявление переменной.
Еще одним достоинством древовидного представления является большое число свободно распространяемых парсеров, управляемых грамматикой языка, позволяющих автоматизировать процедуру построения АСД.
Модельное представление шаблонов. В качестве промежуточного представления шаблонов также используется АСД. Для его построения используется парсер, который создается на основе
расширеннои грамматики целевого языка программирования. В результирующем АСД имеются узлы двух типов:
простые узлы, соответствующие конструкциям целевого языка программирования (например, «for» или «if»);
параметрические узлы, соответствующие шаблонным элементам (например, «#var» или «#expr:1»).
Так как синтаксис языка шаблонов близок к синтаксису целевого языка, при реализации можно применять единый парсер, используемый для формирования и АСД исходной программы, и АСД шаблонов.
На рис. 3 представлено АСД, построенное для шаблона, позволяющего выбрать определенную конструкцию объявления переменной независимо от инициализирующей конструкции.
Автоматическое определение операций модификации. Для того чтобы этап получения списка операций, необходимых для модификации программного кода, осуществлялся в автоматическом режиме, можно применить алгоритм определения изменений в иерархических структурах данных, описанный в [5].
Данный алгоритм работает с упорядоченными деревьями, в которых узлы поименованы (имеют идентификатор типа узла) и имеют значения. Принимая на вход дерево «до» и «после» изменений,
Рис. 3. АСД шаблона, позволяющего выбирать определенную конструкцию объявления переменной
алгоритм на выходе генерирует последовательность операций удаления узлов, перемещения узлов, добавления новых узлов или обновления значений узлов. Эти операции полностью покрывают совокупность изменений, который могут произойти в программном коде, представленном в виде АСД.
На рис. 4 представлены четыре типа операций, которые извлекаются с использованием алгоритма получения дифференциальной разности деревьев:
Insert. Операция вставки нового узла. Узел G
добавляется на первую позицию списка дочерних узлов узла B.
Move. Операция перемещения узла. Узел D перемещается на вторую позицию списка дочерних узлов узла B.
Update. Операция обновления значения узла. Значение «Value» узла C изменяется на значение «NewValue».
Delete. Операция удаления узла. Узел Е удаляется из списка дочерних узлов узла C.
Полное описание алгоритма рассмотрено в [5].
Рис. 4. Операции, извлекаемые с использованием алгоритма получения дифференциальной разности деревьев
Рис. 5. АСД шаблонов «до» и «после» модификации
В качестве примера рассмотрим преобразование АСД шаблонов «до» и «после», представленных на рис. 5.
Результатом работы алгоритма построения разницы деревьев является последовательность операций модификации деревьев, представленная ниже.
1. Insert: node EXPR in node DECLARATOR in 1 position.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
2. Insert: node DOT in node EXPR in 0 position.
3. Insert: node Settings in node DOT in 0 position.
4. Insert: node DEFAULT_CONSTANT_ VALUE in node DOT in 1 position.
5. Delete: node EXPR.
6. Delete: node SELECTOR.
7. Delete: node #initializer.
Применение указанной последовательности операций к дереву «до» приводит к получению дерева «после». Аналогичным образом полученная последовательность может применяться и к частям дерева исходной программы, соответствующим шаблону «до».
Поиск участков кода. Поиск участков программного кода, подлежащих изменениям, осу-
#ехрг
Рис. 6. Пример соответствий, построенных для параметров шаблона
ществляется в АСД исходной программы с использованием шаблона «до» модификации. Задача алгоритма поиска найти в дереве исходного кода поддеревья, соответствующие шаблону «до».
При этом используются следующие критерии соответствия.
1. Для простых узлов шаблонов:
типы и значения узлов дерева шаблона и дерева исходного кода совпадают;
выполняются критерии соответствия для всех дочерних узлов дерева шаблона и дерева исходного кода.
2. Для параметрических узлов шаблонов:
параметрический узел дерева шаблона соответствует последовательности узлов дерева исходного кода, при этом размер последовательности определяется регулярным выражением параметрического узла.
Во время поиска осуществляется построение соответствий между узлами АСД шаблона и узлами найденного поддерева АСД исходного кода. Так как параметрам шаблона может соответствовать неограниченное количество узлов, то для них строятся соответствующие списки, которые хранят найденные конструкции. На рис. 6 представлен пример построенных соответствий.
Модификация абстрактного синтаксического дерева. Все операции модификации осуществляются над АСД исходного кода путем последовательного применения операций, полученных при использовании алгоритма, описанного выше.
Операции модификации применяются во время поиска участков кода, удовлетворяющих шаблону «до», при первом же совпадении. На основе построенных соответствий между узлами исходного АСД и АСД шаблона «до» происходит проверка количества найденных узлов на соответствие количеству, указанному в свойствах параметров шаблона. В случае нахождения несоответствий поиск продолжается далее. Участки кода, которые были изменены, помечаются специальным образом для исключения их повторного нахождения. Затем поиск продолжается повторно от корня АСД. Поиск заканчивается, когда все узлы АСД проверены на соответствие шаблону «до».
Реализация. В рамках описанного подхода был разработан прототип системы модификации программного кода на основе параметризуемых шаблонов для языка Java 1.5. Для получения АСД исходного кода и шаблонов модификации используется парсер, созданный генератором парсеров ANTLR v3 [6]. Этот парсер работает на основе модифицированной грамматики языка Java 1.5. Так как модификация исходного кода осуществляется над промежуточным представлением, в качестве которого используется АСД, то при формировании текста измененного программного кода на языке Java необходимо осуществить преобразование АСД в программы на целевом языке. В разработанном прототипе используется промежуточное преобразование АСД в DOM-модель, использование которой упрощает формирование структуры и оформления (форматирования) программного кода.
Для удобства программистов, разработанный программный модуль оформлен в виде плагина для среды разработки Eclipse 3.5 [7].
Разработанная технология модификации программного кода может служить основой поддержки таких этапов жизненного цикла программного обеспечения, как разработка, тестирование и сопровождение. Использование автоматизированных преобразований существенно снижает количество ошибок, вносимых разработчиком на перечисленных этапах, и позволяет сократить время, затрачиваемое на проведение рефакторин-гов и оптимизаций.
Направления развития технологии связаны с расширением языка шаблонов в сторону поддержки семантических особенностей целевого языка и введения контекстно-чувствительной трансформации. Благодаря универсальному внутреннему представлению программы и шаблонов технология легко адаптируется к другим языкам программирования, таким как C/C++ и C#.
Работа выполнена в рамках госконтракта № П2226 ФЦП «Научные и научно-педагогические кадры инновационной России на 2009-2013 гг.».
СПИСОК ЛИТЕРАТУРЫ
1. Stratego/XT [Электронный ресурс]/Ъйр:// strategoxt.org/
2. ASF+SDF [Электронный ресур^/httpV/www. meta-environment.org/
3. The TXL Programming Language [Электронный ресур^/httpV/www.txl.ca/
4. Aho, A.V. Compilers: Principles, Techniques, and Tools [Текст]/А^. Aho, R. Sethi, J.D. Ullman.-1986.
5. Chawathe, S.S. Change detection in hierarchically structured information [TeKCT]/S.S. Chawathe, A. Rajaraman, H. Garcia-Molina [et al.]//Proc. of the 1996 ACM SIGMOD International Conf. on Management of Data.-1996.-P. 493-504.
6. ANTLR Parser Generator [Электронный ресурс]/ http://www. antlr.org/
7. Eclipse.org Home. The Eclipse Foundation [Электронный pecypc]/http://www. eclipse.org/
Обновлено: 19.05.2023
Принципы в заметке общие для почти любого языка программирования и системы исполнения, но акцент будет на jvm. Рассмотрим два основных подхода по модификации программы:
- манипуляции с исполняемым кодом программы после компиляции или во время загрузки кода;
- изменение исходного кода перед компиляцией.
Зачем модифицировать?
Начнем с вопроса зачем программе модифицировать другую программу. Метапрограммирование помогает уменьшить объем boilerplate кода в проекте и концентрироваться на главном, улучшить читаемость кода и решить задачи которые сложно решить другим способом.
Простейший пример в java — JavaBeans и get/set методы для доступа к полям класса, также примером может служить создание билдеров для класса, автореализации equals/hash в IDE и т.п.
Обфускация и минимизация кода, инструментирующие профилировщики и мир DevOps третий пример для чего нужно модифицировать программу. Думаю, что пропустил другие важные примеры, вы можете дополнить в комментариях.
Итак, зачем модифицировать программу мы определились, теперь рассмотрим, как это обычно делают.
Модификация исполняемых инструкций программы
Можно модифицировать байт-код программы и это самый распространенный способ. Делать это можно как сразу после компиляции, но перед сборкой jar, так и при загрузке класса. В первом случае это будет плагин системы сборки проекта, во втором специальный загрузчик классов или java агент, либо механизм hotswap в jvm. Подход с агентами и загрузчиками классов очень похож на самомодифицирующиеся программы в машинном коде и полиморфные вирусы.
Байт-код файла, который загружает jvm имеет структуру, описанную в официальной документации о формате класса
Приложение javap позволяет просматривать байт-код скомпилированного класса
Исходный текст класса:
Вывод javap на консоль для байт-кода этого класса:
Но модифицировать байт-код вручную имеет смысл только в учебных целях или если вы ниндзя, который любит создавать и преодолевать сложности. The Java Virtual Machine Specification отвечает на большинство вопросов на этом этапе.
В промышленном программировании работу с байт-кодом упрощают библиотеки ASM, javassist, BCEL, CGLIB. После парсинга байт кода, тот же ASM позволяет программисту работать с байт кодом как через Tree API, так и в событийной модели, используя шаблон visitor. Кроме анализа, возможна и модификация, добавление новых инструкций, полей, методов и т.п. В природе существуют и другие библиотеки работы с байт кодом, но их используют реже.
Пример использования API ASM для
В AspectJ разработчик определяет действия в виде классов, аннотируя их как аспекты и указывая в каких точках программы(Pointcut) их следует вызывать. Синтаксис определения pointcut выражений также достаточно высокоуровневый. Такой подход к модификации байт-кода более прост в использовании для программиста.
Трансформация программы за счет модификации байт-кода имеет свои сильные и слабые стороны:
Плюсы | Минусы |
---|---|
подход работает при отсутствии исходных текстов программы | сложность анализа и модификации, при нетривиальных трансформациях |
независимость от компилятора | отсутствие информации, доступной только в исходном коде |
Трансформация AST исходного кода, метапрограммирование
Теория и практика трансформации исходного кода давно применяется в метапрограммировании, Prolog, Lisp, макросах и препроцессорах языков программирования.
При данном подходе исходный текст программы трансформируется либо дополняется другой программой перед компиляцией, а затем компилируется. Работать удобнее не с самим текстом программы, а с абстрактным синтаксическим деревом построенным из него (abstract syntax tree, AST).
Опять же, удобство метапрограммирования зависит от поддержки его в самом языке программирования. Существует шутка
В Лиспе, если охота аспектно-ориентированного программирования, нужно лишь настругать немного макросов, и готово. В Java, нужен Грегор Кичалес, создающий новую фирму, и месяцы и годы попыток заставить всё работать.
Поэтому в jvm чуть сложнее, хоть механизм reflection и является частью языка и платформа может динамически загружать и исполнять байт-код. Сразу на ум приходят две технологии, которые используют кодогенерацию — JPA static metamodel generator и jaxb code generation. Другой пример — project Lombok, который позволяет автоматически реализовать, то что раньше генерировалось IDE или писалось вручную и поддерживалось разработчиками.
Реализовано в Lombok это с помощью модификации AST пользовательской программы и кодогенерации.
Схожая функциональность, со своими ограничениями, есть и в java для аннотаций с областью видимости compile time — Annotation Processing Tool.
В случае с парсингом java исходного кода, лучше чем javac и eclipse java compiller вряд ли кто справится. Есть альтернативы, такие как Spoon и JTransformer, но насколько полно они поддерживают спецификацию и сложные классы, даже нет желания проверять.
Раз уж речь идет о jvm, то трансформация исходного текста программы на Groovy является частью самого языка, подобные возможности есть и в языке Scala.
Итак, в модификации исходного кода программы есть слабые и сильные стороны:
Плюсы | Минусы |
---|---|
большее количество информации, чем в байт-коде | этап компиляции или интерпретации (память, время) |
возможности, подобные рефакторингу в IDE | требование к наличию исходных текстов, способа автоматически найти их для заданного класса/jar |
Трансформация AST кода и рекомпиляция во время выполнения
Самая хардкорная часть этой заметки — мысли про перекомпиляцию в рантайм. Модификация и компиляция AST java кода в момент выполнения может быть нужна, если требуются костыли: проект либо полный капролит, либо делать и поддерживать десятки форков разных версий очень трудоемко, либо если его менеджмент и разработчики считают его идеальным и не позволяют никому его модификацию, но при этом исходный текст есть в enterprise maven репозитарии. И этот подход нужен только если задачу невозможно или неудобно решать двумя ранее описанными классами трансформации программы.
С компиляцией все относительно просто. JavaCompiler API позволяет скомпилировать программу из исходного кода в момент выполнения, предоставляя интерфейс независимый от реализации. При изучении манифеста и исходных текстов eclipse EJC компилятора, обнаружил что и он поддерживает JavaCompiler API.
Но при анализе текста программы все равно нет публичного и универсального API для работы с AST. Т.е. придется работать либо с com.sun.source.tree.* либо org.eclipse.jdt.core.dom.*
Задача с поиском исходного текста класса легко решается, если проект публиковался в maven репозитарий вместе с артефактом типа source и в jar с классами есть файлы pom.properties или pom.xml, либо есть некий словарь соответствия названия/хеша артефакта исходному коду соответствующего jar файла и способ получить эти исходники во время работы программы.
Плюсы — для трансформации доступно больше информации, чем есть в байт-коде, применение не требует пересборки проекта и почти так же удобно как и применение AspectJ агента, но при этом трансформацию невозможно было выполнить средствами преобразования байт-кода, либо очень трудоемко.
Минусы такие же, как и у прошлого подхода: память, время, требование к наличию исходного текста программы и способа его найти для данного класса.
Примеры вышесказанного в виде кода ejc+maven будут в ближайшие месяцы, да и задача выбрана вполне жизненная. Сталкивались ли вы с подобным? Какие задачи из вашей практики можно было бы элегантно решить только с помощью трансформации java кода и рекомпиляции во время выполнения?
Кстати, возможности компилятора TinyCC и его размер доказывают, что такой подход возможен и для C программ.
В заметке мы рассмотрели несколько подходов по модификации программы, их сильные и слабые стороны. Модификация исполняемого кода более распространена, но не все задачи можно решить без наличия исходного кода программы и его последующей трансформации.
Рабочая программа по русскому языку составлена в соответствии сфедеральным компонентом государственного стандарта общего образования, одобренного совместным решением коллегии Минобразования России и Президиума РАО от 23.12.2003 г. № 21/12 и утвержденного приказом Минобрнауки РФ от 05.03.2004 г. № 1089 и приказом Министерства образования и науки Российской Федерации от 30 августа 2010 года № 889 «О внесении изменений в федеральный базисный учебный план и примерные учебные планы для образовательных учреждений Российской Федерации, реализующих программы общего образования, утвержденные приказом Министерства образования Российской Федерации от 9 марта 2004 года № 1312.
За основу рабочей программы взята авторская программа по русскому языку для 5 – 9 классов М.Т.Баранова, Т.А.Ладыженской, Н.М.Шанского, которая полностью соответствует новым образовательным стандартам по русскому языку и входит в состав УМК.
Изменения, внесённые в авторскую учебную программу и их обоснование
В авторской программе по русскому языку для 5 – 9 классов М.Т.Баранова, Т.А.Ладыженской, Н.М.Шанского на изучение русского языка в 8 классе отведено 102 часов, а в рабочей программе – 105 часов, так как в базисном учебном плане на изучение русского языка в 8 классе отводится 3 часов в неделю, а в учебном году 35 рабочих недель.
Перечень изучаемых тем по предмету, уроков по развитию речи в полном объеме совпадают с авторской программой, увеличено количество часов за счет уроков повторения.
Содержание | Часов в авторской программе | Часов в рабочей программе |
Введение | ||
Повторение пройденного в 5-7 классах | 6+2 | 5+2 |
Словосочетание | ||
Простое предложение | 3+1 | 1+1 |
Главные члены предложения | 6+2 | |
Второстепенные члены предложения | 6+2 | 8+4 |
Простые односоставные предложения | 9+2 | 8+3 |
Неполные предложения | ||
Однородные члены предложения | 12+2 | 8+3 |
Обращения, вводные слова и междометия | 9+2 | |
Обособленные члены предложения | 18+2 | 13+6 |
Прямая и косвенная речь | 6+1 | 5+4 |
Повторение и систематизация пройденного в 8 классе | 5+1 | 16+2 |
Итого |
Реализовать поставленные цели предполагается посредством использования учебно-методического комплекта:
Место предмета в учебном плане.
Федеральный базисный учебный план для образовательных учреждений Российской Федерации предусматривает обязательное изучение русского (родного) языка в VIII классе – 105 часов(3 часа в неделю).
Общая характеристика предмета
Содержание обучения русскому языку отобрано и структурировано на основе компетентностного подхода. В соответствии с этим в VIII классе формируются и развиваются коммуникативная, языковая, лингвистическая (языковедческая) и культуроведческая компетенции.
Коммуникативная компетенция – овладение всеми видами речевой деятельности и основами культуры устной и письменной речи, базовыми умениями и навыками использования языка в жизненно важных для данного возраста сферах и ситуациях общения.
Языковая и лингвистическая (языковедческая) компетенции – освоение необходимых знаний о языке как знаковой системе и общественном явлении, его устройстве, развитии и функционировании; овладение основными нормами русского литературного языка; обогащение словарного запаса и грамматического строя речи учащихся; формирование способности к анализу и оценке языковых явлений и фактов, необходимых знаний о лингвистике как науке и ученых-русистах; умение пользоваться различными лингвистическими словарями.
Культуроведческая компетенция – осознание языка как формы выражения национальной культуры, взаимосвязи языка и истории народа, национально-культурной специфики русского языка, владение нормами русского речевого этикета, культурой межнационального общения.
Курс русского языка для VIII класса направлен на совершенствование речевой деятельности учащихся на основе овладения знаниями об устройстве русского языка и особенностях его употребления в разных условиях общения, на базе усвоения основных норм русского литературного языка, речевого этикета. Учитывая то, что сегодня обучение русскому языку происходит в сложных условиях, когда снижается общая культура населения, расшатываются нормы литературного языка, в программе усилен аспект культуры речи. Содержание обучения ориентировано на развитие личности ученика, воспитание культурного человека, владеющего нормами литературного языка, способного свободно выражать свои мысли и чувства в устной и письменной форме, соблюдать этические нормы общения. Рабочая программа предусматривает формирование таких жизненно важных умений, как различные виды чтения, информационная переработка текстов, поиск информации в различных источниках, а также способность передавать ее в соответствии с условиями общения.
Доминирующей идеей курса является интенсивное речевое и интеллектуальное развитие учащихся. Русский язык представлен в программе перечнем не только тех дидактических единиц, которые отражают устройство языка, но и тех, которые обеспечивают речевую деятельность. Каждый тематический блок программы включает перечень лингвистических понятий, обозначающих языковые и речевые явления, указывает на особенности функционирования этих явлений и называет основные виды учебной деятельности, которые отрабатываются в процессе изучения данных понятий. Таким образом, программа создает условия для реализации деятельностного подхода к изучению русского языка в школе.
Цели обучения
Курс русского языка направлен на достижение следующих целей, обеспечивающих реализацию личностно-ориентированного, когнитивно-коммуникативного, деятельностного подходов к обучению родному языку:
· воспитание гражданственности и патриотизма, сознательного отношения к языку как явлению культуры, основному средству общения и получения знаний в разных сферах человеческой деятельности; воспитание интереса и любви к русскому языку;
· совершенствование речемыслительной деятельности, коммуникативных умений и навыков, обеспечивающих свободное владение русским литературным языком в разных сферах и ситуациях его использования; обогащение словарного запаса и грамматического строя речи учащихся; развитие готовности и способности к речевому взаимодействию и взаимопониманию, потребности к речевому самосовершенствованию;
· освоение знаний о русском языке, его устройстве и функционировании в различных сферах и ситуациях общения; о стилистических ресурсах русского языка; об основных нормах русского литературного языка; о русском речевом этикете;
· формирование умений опознавать, анализировать, классифицировать языковые факты, оценивать их с точки зрения нормативности, соответствия ситуации и сфере общения; умений работать с текстом, осуществлять информационный поиск, извлекать и преобразовывать необходимую информацию.
Одна из основных задач – организация работы по овладению учащимися прочными и осознанными знаниями.
Специальной задачей преподавания русского языка является формирование языковой, коммуникативной и лингвистической компетенции учащихся.
Программа предусматривает поурочное усвоение материала, для чего значительное место отводится повторению.
Одно из основных направлений – организация работы по овладению учащимися прочными и осознанными знаниями.
Усвоение теоретических сведений осуществляется в практической деятельности учащихся при анализе, сопоставлении и группировке фактов языка, при проведении различных видов разбора.
Специальной целью преподавания русского языка в школе является формирование языковой, коммуникативной и лингвистической компетенции учащихся.
Языковая компетенция реализуется в процессе решения следующих познавательных задач: формирования у учащихся научно-лингвистического мировоззрения, вооружения их основами знаний о родном языке, развития языкового и эстетического идеала.
Коммуникативная компетенция реализуется в процессе решения следующих практических задач: формирование прочных орфографических и пунктуационных умений и навыков; овладения нормами русского литературного языка и обогащения словарного запаса и грамматического строя речи учащихся; обучение школьников умению связно излагать свои мысли в устной и письменной форме.
Изучение каждого раздела, каждой темы содействует развитию логического мышления и речи учащихся. Развитие речи учащихся на уроках русского предполагает совершенствование всех видов речевой деятельности (говорения, слушания, чтения и письма).
Система оценивания в конце изучения каждой темы предусматриваются зачетные уроки, тестирование, творческие и контрольные работы.
Содержание образования
Введение (1 ч)
Функции русского языка в современном мире
Оценка обучающих работ
Обучающие работы (различные упражнения и диктанты неконтрольного характера) оцениваются более строго, чем контрольные работы.
При оценке обучающих работ учитываются:
1) степень самостоятельности учащегося;
2) этап обучения;
4) четкость, аккуратность, каллиграфическая правильность письма.
Первая и вторая работа, как классная, так и домашняя, при закреплении определенного умения или навыка проверяется, но по усмотрению учителя может не оцениваться.
Самостоятельные работы, выполненные без предшествовавшего анализа возможных ошибок, оцениваются по нормам для контрольных работ соответствующего или близкого вида.
Рабочая программа
По русскому языку
Для 8 класса
Пояснительная записка
Рабочая программа по русскому языку составлена в соответствии сфедеральным компонентом государственного стандарта общего образования, одобренного совместным решением коллегии Минобразования России и Президиума РАО от 23.12.2003 г. № 21/12 и утвержденного приказом Минобрнауки РФ от 05.03.2004 г. № 1089 и приказом Министерства образования и науки Российской Федерации от 30 августа 2010 года № 889 «О внесении изменений в федеральный базисный учебный план и примерные учебные планы для образовательных учреждений Российской Федерации, реализующих программы общего образования, утвержденные приказом Министерства образования Российской Федерации от 9 марта 2004 года № 1312.
За основу рабочей программы взята авторская программа по русскому языку для 5 – 9 классов М.Т.Баранова, Т.А.Ладыженской, Н.М.Шанского, которая полностью соответствует новым образовательным стандартам по русскому языку и входит в состав УМК.
Изменения, внесённые в авторскую учебную программу и их обоснование
В авторской программе по русскому языку для 5 – 9 классов М.Т.Баранова, Т.А.Ладыженской, Н.М.Шанского на изучение русского языка в 8 классе отведено 102 часов, а в рабочей программе – 105 часов, так как в базисном учебном плане на изучение русского языка в 8 классе отводится 3 часов в неделю, а в учебном году 35 рабочих недель.
Перечень изучаемых тем по предмету, уроков по развитию речи в полном объеме совпадают с авторской программой, увеличено количество часов за счет уроков повторения.
Содержание | Часов в авторской программе | Часов в рабочей программе |
Введение | ||
Повторение пройденного в 5-7 классах | 6+2 | 5+2 |
Словосочетание | ||
Простое предложение | 3+1 | 1+1 |
Главные члены предложения | 6+2 | |
Второстепенные члены предложения | 6+2 | 8+4 |
Простые односоставные предложения | 9+2 | 8+3 |
Неполные предложения | ||
Однородные члены предложения | 12+2 | 8+3 |
Обращения, вводные слова и междометия | 9+2 | |
Обособленные члены предложения | 18+2 | 13+6 |
Прямая и косвенная речь | 6+1 | 5+4 |
Повторение и систематизация пройденного в 8 классе | 5+1 | 16+2 |
Итого |
Реализовать поставленные цели предполагается посредством использования учебно-методического комплекта:
Место предмета в учебном плане.
Федеральный базисный учебный план для образовательных учреждений Российской Федерации предусматривает обязательное изучение русского (родного) языка в VIII классе – 105 часов(3 часа в неделю).
Свидетельство и скидка на обучение каждому участнику
Зарегистрироваться 15–17 марта 2022 г.
Большую часть программ мы с вами получаем в готовом виде. Но даже при большом желании ее изменить не получится – практически все программы остаются интеллектуальной собственностью разработчика и защищены законом об авторском праве. Впрочем, дело не в законах: ведь куда легче найти подходящую программу, чем вносить изменения в готовый продукт. Впрочем, существуют как минимум две категории программ, где пересборка и модификация всячески приветствуются, если не авторами, то благодарными пользователями.
Программы, распространяющиеся по принципу Open Source (открытых исходников): они изначально построены таким образом, чтобы вносить в них изменения мог бы любой желающий. Open Source-программы давно появились на платформе Windows, и их гораздо больше, чем вы думаете:
Почтовый клиент Thunderbird.
Офисный набор Open Office.
Файлообменный клиент eMule.
2. Portable-версии
Правда, большая часть включенных в набор приложений предпочитает общаться с нами на английском языке. Но это вряд ли будет серьезной проблемой.
В целом программы достаточно сложно подвергнуть классификации, поскольку существует множество критериев, по которым можно ее провести (например, бывают лицензионные и пиратские). Однако все же можно разделить все программы на несколько основных групп. Программы здесь объединяются по принципу цели, то есть что именно с помощью программы из этой группы можно сделать.
А вот и современная windows 8. изменился дизайн и создана она, в основном, для мобильных устройств (хреновато работает со старыми программами).
Свеженькая windows 10 (windows 9 не было и сразу скакнули в десятку). Система новая и не проверенная. Говорят — меню Пуск вернули.
Однако для того, чтобы осуществить более тонкое управление, каждую операционную систему разработчик дополняет целым рядом утилит. Так называется весь ворох полезных программ, которые позволяют улучшить функционирование большинства операционных систем. Такие программы могут быть установлены вместе с операционной системой, а могут и быть найдены в Интернете. Однако не стоит устанавливать все подряд – большое количество утилит приведет к замедлению системы, только разумное их применение позволит добиться лучших результатов.
Однако помимо программ, работающих на благо компьютера и системы, есть отдельный вид программ, которые предназначены для обслуживания пользователя. Такие прикладные программы гораздо более разнообразны, так как потребности человека куда более широки, чем у операционной системы. Прикладные программы также делятся на несколько подвидов.
Офисные программы – это приложения, которые позволяют создавать и редактировать разнообразные графические, текстовые документы, базы данных и прочие файлы, которые используются офисными работниками во время работы. В таких файлах содержатся данные о деятельности компании, ее финансовом состоянии. Чем сложнее предприятие, тем сложнее данные и программное обеспечение для работы с ними. Типичный представитель — пакет Microsoft Office. Он платный, но пытливый ум всегда найдет в интернете и расколотую(сиречь пиратскую) версию.
Модификация программ учебных предметов. При составлении адаптированной образовательной программы по общеобразовательным предметам для детей с особыми образовательными потребностями необходимо предусмотреть: частичное выполнение общей учебной программы в соответствии с возможностями учащегося, снизить объем и глубину изучаемого материала; пересмотреть учебные достижения по каждому предмету (кроме тех, которые не вызывают затруднений у ученика), требования к достижениям должны быть четко сформулированы; снизить требования к усвоению второстепенного материала, оставив неизменными требования к основному материалу учебного курса; определить время, необходимое для изучения каждой темы; предусмотреть, в случае необходимости, пропедевтические периоды.
Разработка программ
Читайте также:
- Исторические формы общности людей кратко
- Эволюция форм российской монархии 9 17 век кратко
- Духовно нравственные мероприятия в школе
- Схемы выполнения упражнений по физкультуре в детском саду
- Мероприятия в октябре в школе